реклама на сайте
подробности

 
 
> Контроллер впадает в ступор.., UART
Charoit
сообщение Apr 12 2012, 12:04
Сообщение #1


Участник
*

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



Имеется проект для IAR'a под Атмегу32А, он компилится и работает нормально..

Решил перенести проект в AVR Studio 5.1, не сразу, но получилось, компилится нормально, без ошибок и предупреждений. Однако в железе работать не хочет, микроконтроллер впадает в ступор sad.gif

Опытным путем выяснилось, что происходит это во время инициализации 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, в остальном все нормально..

Что делать, не понимаю sad.gif Помогите пжлста..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Charoit
сообщение Apr 12 2012, 12:41
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 12 2012, 12:57
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Charoit
сообщение Apr 12 2012, 13:04
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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-файл прошил в контроллер, все функционирует..
Go to the top of the page
 
+Quote Post
hd44780
сообщение Apr 12 2012, 14:14
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(Charoit @ Apr 12 2012, 16:04) *
Обработчик прерывания (USART__UDRE_vect - правильно понимаю?) не написан..


Оень плохая практика включать прерывания, на которые не реализованы обработчики. Более того, раз обработчика нету, значит программе то прерывание вообще не нужно.
Либо уберите тот бит, либо реализуйте обработчик.
Иначе всегда будете зависеть от каких-то "подковёрных" особенностей разных компиляторов.
И даже не факт, что выйдет какая-то другая версия IARа и в ней будет всё по-старому ....

Сообщение отредактировал hd44780 - Apr 12 2012, 14:17


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - _Артём_   Цитата(Charoit @ Apr 12 2012, 16:04) Удив...   Apr 12 2012, 13:41
||- - Сергей Борщ   QUOTE (_Артём_ @ Apr 12 2012, 16:41) В IA...   Apr 12 2012, 22:14
||- - _Артём_   Цитата(Сергей Борщ @ Apr 13 2012, 01:14) ...   Apr 13 2012, 00:05
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 15:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016