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

 
 
> Прерывание UART
Timofey
сообщение Jun 1 2010, 05:09
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Контроллер - Mega32 16AU
Стоит внешний кварц на 16 МГц
CKSEL=0F (выбран внешний кварц)
Среда программирования IAR for AVR 5.30
Проблема: никак не могу включить прерывание по приему хотя бы одного байта
Код
#include <iom32.h>

#define FOSC              16000000
#define UBRR_9600         (((FOSC/16)/9600)-1)


#pragma vector=USART_RXC_vect
__interrupt void Receive_Byte(void);

__interrupt void Receive_Byte(void)
{
   unsigned char _data;
   PORTD&=~AVR_PIO_D_OK; //по приему хотя бы одного байта, должен загореться индикатор
   while ( !(UCSRA & (1<<RXC)) );
   _data = UDR;
}

void Init_UART (void)
{  
   Set_DE(0);
   UBRRH = (unsigned char)(UBRR_9600>>8);
   UBRRL = (unsigned char)(UBRR_9600);
  
   UCSRB = ((1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE));
  
   UCSRC = ((1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1)|(1<<UPM0));//8bit,stop-bit 1, part - ODD  
}

Запускаю терминал, выставляю настройки порта нужные, отправляю один байт - индикатор не горит.
Осцилографом посмотрел, байт до контроллера доходит, но прерывание так и не срабатывает.
Сама программа при этом запускается и работает нормально (другой светодиод моргает). Что нужно еще установить (включить)?
Спасибо.

З.Ы. Как сделать так, чтобы код в посте был компактный (с прокруткой), а не занимал большую часть поста?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Timofey
сообщение Jun 1 2010, 07:56
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Все, заработало. Всем спасибо. Тема закрыта.
Go to the top of the page
 
+Quote Post
Karaox
сообщение Sep 13 2010, 09:19
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 6-01-10
Пользователь №: 54 649



Доброго времени суток!
Я новичок в девайсостроении и у меня аналогичный, как мне кажется, случай, только у меня, по-моему, не «глобальное разрешение прерываний».
Помогите, пожалуйста, разобраться в следующем:
В моём устройстве используется МК ATMega8L, который связывается по SPI с некоторым сторонним устройством, и по USART с BlueTooth модулем BlueNiceCom IV от AMBER wireless (AMB2300). Ноги USART’a соединены: крест накрест TX_BT (на ВТ-модуле) <--> RXD (на МК), RX_BT <--> TXD, CTS_BT <--> RTS, RTS_BT <--> CTS. RTS (output, active low), CTS (input, active low) – на МК выделенные мной ножки для контроля протокола. СTS на МК фактически не используется.
К МК написана прошивка на базе WinAVR 4.1.1 (WinAVR 20070122).
МК работает от внутреннего калибруемого RC осциллятора на частоте 2 МГц, конфигурационные биты и калибрующее значение для внутреннего генератора читаются и шьются (как и прошивка) программатором ChipProg-ISP без проблем и ругани со стороны программатора.
На старте МК RTS на МК выставляется в low, после чего инициализируется USART следующим кодом:

CODE
cli();

//9600 на 2000 кГц;
UBRRH = 0;
UBRRL = 12;

UCSRB = (1<<RXEN) | (1<<TXEN);
UCSRB = UCSRB | (1<<RXCIE);

sei();


Скорость, я вроде, установил правильно – проверял по таблице в Datasheet’е ATMega8L, остальные параметра как я понимаю всё тот же Datasheet автоматически выставляются в 8-битовый кадр без чётности и 1 стоп битом, чего собственно и хочется.

Далее устройство работает – по прерыванию таймера2 в SPI выдаётся сигнал и принимающее устройство его читает и реагирует как надо, т.е. правильно. Тут проблем нет.
Но вот при попытке связаться с этой конструкцией через BlueTooth’у с компа происходит следующее: после отсылки с компа через терминальную программу (порт, формат кадра, чётность и т.п. настроены правильно) на ножке RXD МК (и естественно на TX_BT) я осциллографом вижу приходящие биты, но вот прерывания приёма в МК НЕ ВОЗНИКАЕТ! (по прерыванию приёма МК должен перевести одну из свободных ног в высокое состояние – чего не происходит):

Код в прерывании:


CODE
ISR(USART_RXC_vect)
{

PORT_TEST = PORT_TEST | (1<<NUM_TEST); //Тестовая нога;

PORT_RTS = PORT_RTS | (1<<NUM_RTS);

/*код обработки принятого байта*/

PORT_RTS = PORT_RTS & ~(1<<NUM_RTS);
}


При этом имена прерываний заданы правильно (проверял по инструкции к WinAVR) и компилятор не ругается на то, что это «похоже на misspelled interrupt name…»

Помогите понять, что именно я упустил из виду.
Заранее благодарен.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Timofey   Прерывание UART   Jun 1 2010, 05:09
- - MrYuran   А разрешить прерывания не забыли? Цитата(Timofey ...   Jun 1 2010, 05:33
- - Timofey   Включил и прерывания и приемник с передатчиком Код...   Jun 1 2010, 06:14
|- - Сергей Борщ   Цитата(Timofey @ Jun 1 2010, 09:14) Включ...   Jun 1 2010, 06:31
|- - MrYuran   Цитата(Timofey @ Jun 1 2010, 10:14) Включ...   Jun 1 2010, 07:11
- - GDI   В симуляторе проверьте, все ли регистры реально пр...   Jun 1 2010, 06:31
|- - Timofey   Цитата(Сергей Борщ @ Jun 1 2010, 12:31) ...   Jun 1 2010, 06:42
- - mempfis_   Код __interrupt void Receive_Byte(void) {...   Jun 1 2010, 06:35
|- - defunct   Цитата(Karaox @ Sep 13 2010, 12:19) Помог...   Sep 13 2010, 15:20
|- - =GM=   Karaox, чтобы сработало Receive Complete interrupt...   Sep 13 2010, 15:41
|- - defunct   Цитата(=GM= @ Sep 13 2010, 18:41) RTS (це...   Sep 14 2010, 03:51
|- - Karaox   Благодарю за ответы. to defunct: в datasheet’е п...   Sep 14 2010, 04:28
|- - defunct   Цитата(Karaox @ Sep 14 2010, 07:28) Как н...   Sep 14 2010, 04:52
|- - Karaox   Большое спасибо, За советы. Я разобрался в своём в...   Oct 25 2010, 16:59
- - ArtemKAD   ЦитатаВиной было то, что я упустил из виду хрестом...   Oct 26 2010, 10:37
|- - Karaox   Цитата(ArtemKAD @ Oct 26 2010, 14:37) Но ...   Oct 26 2010, 19:30
- - ArtemKAD   Цитатат.е. первые N пакетов и «устанавливает табли...   Oct 26 2010, 19:43
- - Karaox   Цитата(ArtemKAD @ Oct 26 2010, 23:43) Дос...   Nov 25 2010, 11:37
- - Палыч   Цитата(Karaox @ Nov 25 2010, 14:37) Никак...   Nov 25 2010, 15:37
- - Karaox   Цитата(Палыч @ Nov 25 2010, 18:37) Вот по...   Nov 26 2010, 10:10


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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 10:58
Рейтинг@Mail.ru


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