Доброго времени суток!
Я новичок в девайсостроении и у меня аналогичный, как мне кажется, случай, только у меня, по-моему, не «глобальное разрешение прерываний».
Помогите, пожалуйста, разобраться в следующем:
В моём устройстве используется МК 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…»
Помогите понять, что именно я упустил из виду.
Заранее благодарен.