Стоит внешний кварц на 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
}
#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
}
Запускаю терминал, выставляю настройки порта нужные, отправляю один байт - индикатор не горит.
Осцилографом посмотрел, байт до контроллера доходит, но прерывание так и не срабатывает.
Сама программа при этом запускается и работает нормально (другой светодиод моргает). Что нужно еще установить (включить)?
Спасибо.
З.Ы. Как сделать так, чтобы код в посте был компактный (с прокруткой), а не занимал большую часть поста?