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

 
 
> Контроллер впадает в ступор.., 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
_Артём_
сообщение Apr 12 2012, 13:41
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Charoit @ Apr 12 2012, 16:04) *
Удивительно, что этот же код работает после IAR'а - hex-файл прошил в контроллер, все функционирует..

В IAR-е возможно все неиспользуемые прерывания заполняются RETI.
В AVRGCC jmp BAD_VECTOR.
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
||- - Сергей Борщ   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


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

 


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


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