| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Глючит uasart в mega16
12.06.2013, 23:57
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Глючит uasart в mega16
|
Цитата:
|
|
void USART_Init(unsigned int ubrr) { unsigned char a; UCSRB = 0x00; //disable while setting baud rate while( (UCSRA & (1‹‹RXC)) ) a=UDR; while( (UCSRA & (1‹‹TXC)) ) ; UCSRA = 0x00; //0x02 UCSRC = 0xA6; //parity: Even, char size: 8 bit UBRRL = 0b00110011; //set baud rate lo UBRRH = 0x00; //set baud rate hi /* Enable receiver and transmitter */ UCSRB = (1‹‹RXEN)|(1‹‹TXEN)|(1‹‹RXCIE); /* Set frame format: 8data, 1stop bit, Parity Disabled, Asynchronous Operation*/ UCSRC = (1‹‹URSEL)|(0‹‹USBS)|(3‹‹UCSZ0); }
|
На сколько я помню, UCSRC нельзя изменять после разрешения работы UARTа. Попробуйте заменить "мою" строчку "UCSRC = 0xA6;" на свою "UCSRC = (1‹‹URSEL)|(0‹‹USBS)|(3‹‹UCSZ0);" (обязательно до "UCSRB = (1‹‹RXEN)|(1‹‹TXEN)|(1‹‹RXCIE);").
В FUSE отключите JTAG, если его порт попадает на используемые вами выводы меги могут быть и такие глюки. А в функцию передачи очередного байта, добавить проверку "while(!(UCSRA & (1‹‹UDRE)) ) ;" - не помешает.
Кстати, кракозябры приходят только как "эхо" в ответ на передачу, или всегда?..
Последний раз редактировалось vynt; 13.06.2013 в 00:07.
|
|
|
|
13.06.2013, 00:05
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Глючит uasart в mega16
Далее... Циклы в инициализации посмешили слегка. Смысла в них 0. Для переинициализации не после ресета, достаточно отключить модуль уарт. Принятой практикой является включение модуля после его полной настройки. Ну и в цифрах: 9600, 1 стоп, без чётности, 8 бит символ будет выглядеть так:
UCSRB = 0x00; //disable while setting
UCSRA = 0x00;
UCSRC = 0x86; //set char size 8 bit
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98; //rxen, txen, rxcie
|
|
|
|
13.06.2013, 00:10
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Глючит uasart в mega16
Сообщение от vynt
|
|
UCSRC нельзя изменять после разрешения работы UARTа.
|
Можно. Ограничений нет, в даташите в примере инициализации кстати, так и делается. Это просто общепринятая практика, с моей точки зрения логичная - сначала настроил всё, потом включил.
|
|
|
|
13.06.2013, 00:13
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Глючит uasart в mega16
Сообщение от vynt
|
|
В FUSE отключите JTAG, если его порт попадает на используемые вами выводы меги могут быть и такие глюки.
|
В 16й меге джтаг в портС. Он не мешает уарту.
|
|
|
|
13.06.2013, 00:20
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Глючит uasart в mega16
Сообщение от Someone
|
|
Циклы в инициализации посмешили слегка.
|
Зря смеётесь...
Открываете датащит на любую мегу, глава USART - USART Initialization - читаем второй абзац... Краткий не дословный перевод: если во время повторной инициализации (читаем, после сброса например вачдога, или после долгого CLI, да мало ли...) в буфере приёмника находятся непрочитанные данные, прерывания приёмника не будет происходить. И это правда! Что самое ужасное, испытал на практике, на завершённом казалось бы устройстве, в серийном производстве несколько лет... Сколько ж эти две строчки мне нервов потрепали...
з.ы.
пока я их не добавил
|
|
|
|
13.06.2013, 00:26
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Глючит uasart в mega16
Сообщение от Someone
|
|
Можно. Ограничений нет, в даташите в примере инициализации кстати, так и делается. Это просто общепринятая практика, с моей точки зрения логичная - сначала настроил всё, потом включил.
|
после разрешения работы и прерываний (которая разрешается регистром UCSRB) что ещё может разрешить UCSRC?..
По поводу примеров ещё... Вы заметили? В датащите, не в одном примере не используются прерывания, потому эти строчки там действительно и не нужны, т.к. принцип чтения/записи там иной, а именно такой же как и собственно эти "две смешные строчки"...
Последний раз редактировалось vynt; 13.06.2013 в 00:40.
|
|
|
|
13.06.2013, 01:20
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Глючит uasart в mega16
Сообщение от Someone
|
UCSRB = 0x00; //disable while setting
UCSRA = 0x00;
UCSRC = 0x86; //set char size 8 bit
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98; //rxen, txen, rxcie
|
Если кварц внешний и действительно точно 8МГц, и фьюзы выставлены верно (а они похоже выставлены на внутренний кварц, который может "поплыть" и от питания и от температуры), то с этими настройками UART должен работать.
Остаётся ещё возможная причина - залезание собственных переменных в область памяти спец.регистров (в те же настройки UART), или туда же попадает стек. Хотя... перечитал всё сначала, и даже в протеусе просимулировал с Вашим хексом, не поленился... МК в терминал мусор не даёт, значит скорость выставлена нормально!!! Нужно смотреть осциллографом уровни сигналов на RX ножке MK, TX от терминала отключить! (не знаю что там за преобразователь TTL-RS232, он может глючить при параллельном подключении нескольких абонентов)
Последний раз редактировалось vynt; 13.06.2013 в 01:44.
|
|
|
|
13.06.2013, 06:24
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Глючит uasart в mega16
Сообщение от vynt
|
|
Остаётся ещё возможная причина - залезание собственных переменных в область памяти спец.регистров (в те же настройки UART), или туда же попадает стек.
|
В AVR это крайне маловероятно - доступ разный, эт не STM.
Может, кто-то гадит в буфер? УАРТ заполняет нормально, а потом туда же влазит мусор (скажем, тот же стек)?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 13.06.2013 в 06:30.
|
|
|
|
13.06.2013, 08:59
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Глючит uasart в mega16
Сообщение от akegor
|
|
Может, кто-то гадит в буфер? УАРТ заполняет нормально, а потом туда же влазит мусор (скажем, тот же стек)?
|
Думаю, проблема не в программе. UART настроен верно. Передаёт то что нужно. Принимает нужное количество байт. Могу посоветовать временно отключить модем и преобразователь RS232, а TX МК направить на собственный RX, мигать светодиодом при совпадении переданного и принятого (достаточно передавать один символ, скорее всего мигать будет). Искать причину в преобразователе RS232 и далее (если с частотой всё ОК)
Последний раз редактировалось vynt; 13.06.2013 в 09:02.
|
|
|
|
13.06.2013, 09:31
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Глючит uasart в mega16
Сообщение от vynt
|
|
И это правда!
|
Дык и не спорю.  . Но если дальше читать даташит, там в разделе flush написано:
The receiver buffer FIFO will be flushed when the Receiver is disabled, i.e., the buffer
will be emptied of its contents. Unread data will be lost.
Иными словами, при выключении и последующем включении всё придёт в исходное состояние, о чём я и сказал в посте.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:08.
|
|