Страница 1 из 1
Mega64 uart1
Добавлено: Пт янв 06, 2017 18:03:53
Али777
Добрый день уважаемые коты. Первый раз разбираюсь с мегой 64. Не могу включить uart1.
В протеусе все работает. А на железе ничего. Выставил фьюзы такие: -U lfuse:w:
0xe4:m -U hfuse:w:
0x99:m -U efuse:w:
0xff:m Частота 8 Mhz, отключен режим совместимости Mega103. В терминал ничего не приходит. Проверил пины RX TX, изменял напряжение, высокое, низкое, все норм. Да и ешо уменя питание только на одной паре vcc gnd, вторая пара vcc gnd весит в воздухе.
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile char command=2;
void uart1_orange_init(void)
{
UBRR1H=0;
UBRR1L=51;
UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);
UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10);
}
void uart1_orange_transmit (unsigned char data)
{
while (!( UCSR1A & (1<<UDRE1)));
UDR1 = data;
}
int main(void)
{
uart1_orange_init();
sei();
while(1)
{
uart1_orange_transmit('D');
_delay_ms(100);
}
}
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 18:17:16
Z_h_e
Порт, на котором UART TX весит, как выход настроили? Это у Вас не весь код?
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 18:28:00
Али777
Блин весь код.
Добавлено after 6 minutes 26 seconds:
Z_h_e писал(а):Порт, на котором UART TX весит, как выход настроили? Это у Вас не весь код?
Настроил выход
DDRD=0xFF;
Все равно ничего.
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 18:31:32
ddimochka
Во-первых попробуйте идентичные настройки для USART0. Если все работает, то, скорее всего не отключен режим совместимости с ATmega 103. Убедитесь еще раз.
Добавлено after 2 minutes 37 seconds:
И еще вот что попробуйте. Уберите while из функции для передачи данных. Просто ради эксперимента
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 18:50:13
Али777
На uart0 летит стабильная 'D', как и нужно. Фьюз биты проверил. Extended fuses = FF; Удалил sei(); Вместе с ней летят кракозябры.
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 19:09:46
Z_h_e
Может со схемой что не так? Например у Вас на RX весит внешняя 1, а Вы весь порт Д как выход настраиваете. С питанием может что не так, из-за того что где-то что-то ошибочно подключено.
Можете проверить не перезагружается ли МК, "мигнув" каким-нибудь пином при старте МК.
---------------
Вы разрешили прерывания как по приему, так и при передаче. А где обработчики прерываний?
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 19:22:04
Али777
Z_h_e писал(а):
Вы разрешили прерывания как по приему, так и при передаче. А где обработчики прерываний?
Да прерывания пока не нужны. Я ж отправляю только. Может правда изза того что подключена одна пара vcc gnd?
Да нет RX TX весят свободны, к ним только конвертер цепляется uart-usb.
Добавлено after 7 minutes 22 seconds:
Z_h_e писал(а):
Можете проверить не перезагружается ли МК, "мигнув" каким-нибудь пином при старте МК.
Я уже целым свободным портом мигал. все норм.
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 19:28:58
Z_h_e
Но МК перейдет по вектору прерывания, если оно разрешено.
Компилятор какую-нибудь заглушку скомпиллит, раз обработчик не назначен.
Вот например такой будет обработчик по умолчанию
, т.е. Ваш обработчик прерывания уйдет на адрес 0, но это не будет сбросом. Это будет хуже.
Добавлено after 4 minutes 49 seconds:
Вот такую хоть затычку поставте, если прерывания зачем то разрешили.
Код: Выделить всё
ISR (BADISR_vect)
{
// как то просемафорить об ошибочном прерывании
}
Такая вещь
иногда может быть нужна при отладке (мне ни разу не понадобилась).
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 19:31:12
Али777
Сейчас код немного изменился. Прерывания запретил.
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile char command=2;
void uart1_orange_init(void)
{
UBRR1H=0;
UBRR1L=51;
UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);
UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10);
}
void uart1_orange_transmit (unsigned char data)
{
while (!( UCSR1A & (1<<UDRE1)));
UDR1 = data;
}
void uart0_orange_init(void)
{
UBRR0H =0;
UBRR0L=51;
UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE1);
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00);
}
void uart0_orange_transmit (unsigned char data)
{
while (!( UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
int main(void)
{
uart0_orange_init();
uart1_orange_init();
while(1)
{
uart0_orange_transmit('D');
uart1_orange_transmit('D');
_delay_ms(100);
}
}
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 19:38:39
Z_h_e
Ну попробуйте "помигать" портом G. Если и им не получится, то точно мега103.
Добавлено after 2 minutes 51 second:
Али777 писал(а):Сейчас код немного изменился.
Ну а где настройка портов как выход?
Re: Mega64 uart1
Добавлено: Пт янв 06, 2017 19:43:57
Али777
Без настроек на выход uart0 отравляет норм.
Сейчас проверил atmega103 совместимость. Поменял фьюзы. Отключился uart0. Вернул обратно.
Все. Тупиковая ситуация. Пойду спрошу на атмеловском форуме, avrfreaks.com
Может быть ножки подгорели внутри именно там где они управляются от uarta

Re: Mega64 uart1
Добавлено: Сб янв 07, 2017 14:42:05
Али777
Нашел причину. Отходили контакты контроллера. Придавил пальцем заработало. Тут же мультиметром прозвонил. Все звониться а сигнала небыло. Перепоял.
Теперь другая проблема. Когда объявляю sei(), после инициализации. Чип сразу перестает выполнять функции. В чем может быть дело?
Re: Mega64 uart1
Добавлено: Сб янв 07, 2017 15:30:50
dr.doc
Z_h_e писал(а): Спойлер
ISR (BADISR_vect)
{
// как то просемафорить об ошибочном прерывании
}
У Вас не видно в коде выхода из прерывания. Контроллер улетает в него и отсюда все проблемы...
Re: Mega64 uart1
Добавлено: Сб янв 07, 2017 16:32:43
Али777
Вот в этом коде как ставишь sei() ничего не работает. Без него значения обрабатываются.
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile char command=2;
void uart1_orange_init(void)
{
UBRR1H=0;
UBRR1L=51;
UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);
UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10);
}
void uart1_orange_transmit (unsigned char data)
{
while (!( UCSR1A & (1<<UDRE1)));
UDR1 = data;
}
void uart0_orange_init(void)
{
UBRR0H =0;
UBRR0L=51;
UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE1);
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00);
}
void uart0_orange_transmit (unsigned char data)
{
while (!( UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
unsigned char uart1_getc(void)
{
while((UCSR1A&(1<<RXC1))==0);
return UDR1;
}
int main(void)
{
DDRB|=(1<<1);
uart0_orange_init();
uart1_orange_init();
sei();
char c;
while(1)
{
c = uart1_getc();
if(c=='A') {PORTB|=(1<<0); }
if(c=='B') {PORTB&=~(1<<0);}
}
}
Re: Mega64 uart1
Добавлено: Сб янв 07, 2017 17:08:13
Z_h_e
Я же Вам писал, что у Вас происходит.
Re: Mega64 uart1
Добавлено: Сб янв 07, 2017 22:11:41
Али777
Z_h_e писал(а):Я же Вам писал, что у Вас происходит.
Я действительно не знал что если я установил rxcie и txcie то необходимо их обрабатывать, Вы ведь про это писали?
Re: Mega64 uart1
Добавлено: Сб янв 07, 2017 22:25:59
Z_h_e
Почитайте о прерываниях вообще. Что это и как на них реагирует МК на физическом уровне. Это не так сложно и литературы полно.
Re: Mega64 uart1
Добавлено: Вс янв 08, 2017 18:14:59
Alkul
Я не понял вот этого
Али777 писал(а):Может правда изза того что подключена одна пара vcc gnd?
Вы подали питание не на все выводы VCC и GND?
Если так, то МК и не обязан корректно работать. Вы что, экономите на чем-то, что-ли?
Питание должно быть подано на
ВСЕ выводы VCC, а "земля" должна быть подведена
КО ВСЕМ выводам GND. Более того, питание должно быть подано даже на вывод AVCC, даже если Вы не используете аналоговую периферию МК.