|
Контроллер впадает в ступор.., UART |
|
|
|
Apr 12 2012, 12:04
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 10-10-07
Пользователь №: 31 217

|
Имеется проект для IAR'a под Атмегу32А, он компилится и работает нормально.. Решил перенести проект в AVR Studio 5.1, не сразу, но получилось, компилится нормально, без ошибок и предупреждений. Однако в железе работать не хочет, микроконтроллер впадает в ступор  Опытным путем выяснилось, что происходит это во время инициализации UART, а именно после записи в регистр UCSRB. Причем контроллеру не нравится запись именно бита UDRIE - если его оставить нулем, то ступора не будет (но при этом не будет работать правильно железо) Сам исходник большой, наверно нет смысла его тут приводить, а функция инициализации UART'a выглядит вот так : Код void InitUART() {
UCSRA=0x00;
UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UDRIE);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH=0; UBRRL=12;//BAUD=57692.31 (+0.16%) <-baudrate for Fosc=12 MHz и 6 MHz. UART_RxBufIndex=0; } Даташит на Мегу32А читал, насколько понял, есть особенность только при записи в регистры UCSRC и UBRRH, в остальном все нормально.. Что делать, не понимаю  Помогите пжлста..
|
|
|
|
|
 |
Ответов
|
Apr 12 2012, 12:41
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 10-10-07
Пользователь №: 31 217

|
Цитата(kolobok0 @ Apr 12 2012, 15:24)  если Вы бы пошли дальше в своих рассуждениях, то достаточно комментировать вашу супер-пупер секретную мигалку светодиодами по блочно и смотреть когда эффект исчезнет(или проявится). дальше делите подозрительный блок лапополам и повторяете тест. и так вы дойдёте до действительно проблемного куска кода. и он будет не в этих строчках скорее всего. У меня есть пищалка, включается программно, чтобы определять переход устройства из одного состояния в другое. Ее и использовал для определения проблемного места. Если включать пищалку до записи в регистр UCSRB - пищит, если после записи в этот регистр - уже не пищит. Цитата(kolobok0 @ Apr 12 2012, 15:24)  если напрячь телепатию - то скорее всего идёт выше инициализация неких прерываний, обработчиков и иже. попробуйте отключить всё кроме вызова этой функции и вы увидите что она тут не причём. Выше идет вот это (сразу после этих строк вызов InitUART) : Код SREG=0x80; GICR=0x00; GIFR=0x00; MCUCR = 0x80; MCUCSR=0x00; WDTCR=0x10; SFIOR=0x00; DDRA =0x00; // if '1' --> PORTAn --> OUT; if '0' --> PORTAn --> IN DDRB =0xFF; // if '1' --> PORTBn --> OUT; if '0' --> PORTBn --> IN DDRC =0xFF; // if '1' --> PORTCn --> OUT; if '0' --> PORTCn --> IN DDRD =0x0C; // if '1' --> PORTDn --> OUT; if '0' --> PORTDn --> IN
//****************************************************************************** PORTA=0xDF; // ножку 5 порта А переводим в Z-состояние, на остальных Pull-up //****************************************************************************** PORTB=0x00; PORTC=0xFF; PORTD=PORTD | 0xFC;
SPCR=0x00;//F0; SPSR=0x01; //------- Настройка таймера TIMER0 -------------------------------------- ASSR = 0x00; TIMSK = 0x42; TCNT0 = 0x00; TCCR0 = 0x0D; //------- Кварцевый резонатор 12 МГц -------------------------------------- OCR0 = 11;
|
|
|
|
|
Apr 12 2012, 12:57
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Charoit @ Apr 12 2012, 15:41)  Если включать пищалку до записи в регистр UCSRB - пищит, если после записи в этот регистр - уже не пищит. Контроллер после записи в этот регистр уходит в прерывание UDR. Сразу. Ибо глобально прерывания разрешены, а UDR пуст. Обработчик прерывания написан? Имя его правильное? Он располагается по правильному адресу? Посмотрите в дизассемблере, куда указывает вектор этого прерывания? Что делает обработчик этого прерывания, если учесть, что у вас еще нет данных для передачи? Очень странным выглядит взведение UDRIE в инициализации - обычно его взводят перед отправкой данных, чтобы в обработчике осуществить загрузку UDR из буфера передачи, и сбрасывают после опустошения буфера.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 12 2012, 13:04
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 10-10-07
Пользователь №: 31 217

|
Цитата(Сергей Борщ @ Apr 12 2012, 15:57)  Контроллер после записи в этот регистр уходит в прерывание UDR. Сразу. Ибо глобально прерывания разрешены, а UDR пуст. Обработчик прерывания написан? Имя его правильное? Он располагается по правильному адресу? Посмотрите в дизассемблере, куда указывает вектор этого прерывания? Что делает обработчик этого прерывания, если учесть, что у вас еще нет данных для передачи? Очень странным выглядит взведение UDRIE в инициализации - обычно его взводят перед отправкой данных, чтобы в обработчике осуществить загрузку UDR из буфера передачи, и сбрасывают после опустошения буфера. Обработчик прерывания (USART__UDRE_vect - правильно понимаю?) не написан.. Взведение бита UDRIE сделано потому, что так было в исходнике, который мне достался по наследству, как уже писал выше, этот проект изначально был сделан в IAR'e, я же решил его перенести в среду AVR Studio. Удивительно, что этот же код работает после IAR'а - hex-файл прошил в контроллер, все функционирует..
|
|
|
|
Сообщений в этой теме
Charoit Контроллер впадает в ступор.. Apr 12 2012, 12:04 Navovvol Что значит в ступор? где он зацикливается ? на пре... Apr 12 2012, 12:20 Charoit Цитата(Navovvol @ Apr 12 2012, 15:20) Что... Apr 12 2012, 12:33 kolobok0 Цитата(Charoit @ Apr 12 2012, 16:04) ...С... Apr 12 2012, 12:24 prottoss Цитата(Charoit @ Apr 12 2012, 18:33) По м... Apr 12 2012, 12:39    Сергей Борщ QUOTE (_Артём_ @ Apr 12 2012, 16:41) В IA... Apr 12 2012, 22:14     _Артём_ Цитата(Сергей Борщ @ Apr 13 2012, 01:14) ... Apr 13 2012, 00:05   hd44780 Цитата(Charoit @ Apr 12 2012, 16:04) Обра... Apr 12 2012, 14:14    fox2trot Цитата(hd44780 @ Apr 12 2012, 18:14) Оень... Apr 12 2012, 16:34    Charoit Цитата(hd44780 @ Apr 12 2012, 17:14) Оень... Apr 12 2012, 17:47     hd44780 Цитата(Charoit @ Apr 12 2012, 20:47) Если... Apr 13 2012, 08:32 ILYAUL Взять и написать обработчик UDR одной строкой - ту... Apr 12 2012, 22:25
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|