我使用以下代码测试在ATtiny2131微控制器中工作的usart中断:
#include<avr/io.h> // for reading data to I/O ports
#include<util/delay.h> // for setting delays
#include<avr/interrupt.h> // for setting interrupt service routines
void USART_initialize() {
//int baud_rate = (unsigned int)(((16000000)/(16*baud_value))-1);
UCSRC &= ~(1<<UMSEL); // MODE OF COMMUNICATION (SYNCHRONOUS --> (USMEL = 1), ASYNCHRONOUS --> (USMEL = 0))
UBRRH = (unsigned char)(103 >> 8); // SETTING BAUD
UBRRL = (unsigned char)(103); // RATE
UCSRA &= ~(1<<U2X); // NORMAL ASYNCHRONOUS MODE OF COMMUNICATION
UCSRB = (1<<RXEN)|(1<<TXEN); // ENABLE RECEIVER & TRANSMITTER
UCSRC |= (3<<UCSZ0); //
UCSRB &= ~(UCSZ2); // 8-BIT DATA
//UCSRC |= (1<<UPM1); // EVEN PARITY
//UCSRC &= ~(1<<UPM0);
UCSRC &= ~(1<<UPM1);
UCSRC &= ~(1<<UPM0);
UCSRC |= (1<<USBS); // 1 STOP BIT
sei(); // ENABLE GLOBAL INTERRUPT
UCSRC |= (1<<7); // ENABLE RECEIVE COMPLETE INTERRUPT
}
int main(void) {
USART_initialize();
while(1) {
UCSRA |= (1<<RXC);
_delay_ms(1000);
}
return(0);
}
ISR(USART0_RX_vect) {
PORTD |= (1<<5);
_delay_ms(1000);
PORTD &= ~(1<<5);
_delay_ms(1000);
int data = UDR;
}代码应该每秒钟在PD5上闪烁一次,但是它没有做任何事情,我不明白为什么。
请帮帮忙。
发布于 2015-03-25 06:27:46
RXCIE在UCSRB,而不是UCSRC。
发布于 2015-03-25 06:29:13
RXC位的UCSRA是只读的.它由接收缓冲区的状态设置和清除。您不能手动写入它来创建您自己的中断。
https://stackoverflow.com/questions/29242154
复制相似问题