串口助手发送数据,mega16接收然后改变PORTA 问题表现为PORTA始终为初始化的值0xff,似乎不能发生中断 若改用软件查询则可以实现预期效果
#include <avr/io.h> #include <avr/delay.h> #include <avr/interrupt.h> volatile unsigned char flag_rxc; //串口接收完成标志 //接收完成中断服务程序 ISR(USART_RXC_vect){ flag_rxc = 1; //置位接收完成标志等待主程序处理 } //初始化 void init(void){ //IO口初始化 DDRA = 0xff; //PA输出0 PORTA = 0x00; DDRC = 0xff; //PC输出0 PORTC = 0x00; DDRB = 0x10; //PB7~5用于ISP,PB4输出0,PB3~1输入且上拉使能 PORTB = 0x0f; DDRD = 0x0c; //PD7~4输入且上拉使能,PD3~2输出0,PD1~0用于USART PORTD = 0xf0; //串口初始化 //UCSRA: RXC | TXC |UDRE | FE | DOR | PE | U2X |MPCM //UCSRB: RXCIE|TXCIE|UDRIE|RXEN |TXEN |UCSZ2|RXB8 |TXB8 //UCSRC: URSEL|UMSEL|UPM1 |UPM0 |USBS |UCSZ1|UCSZ0|UCPOL UCSRB = 0x00; //禁止中断,禁止发送接收数据 UCSRA = 0x00; //正常波特率,接收器正常接收 UCSRC = 0x86; //异步模式,8位数据位,1位停止位,无效验位 UBRRL = 0x47; //波特率9600 UBRRH = 0x00; //115200:0x0003,19200:0x0017,9600:0x002f,4800:0x005f,2400:0x00bf UCSRB = 0x90; //允许RXC中断,允许接收 sei(); //开全局中断 } // int main(void){ init(); //初始化 PORTA=0xff; _delay_ms(1000); while(1){ //主循环 if(flag_rxc){ PORTA=0x08; } } return 0; }
|