|
mcu=atmega328p
f_cpu=16000000
编译器=avr-gcc
cmd_finished 是一个全局变量, char
这是初始化
void init_usart(void){
UBRR0L = UBRRVAL;
UBRR0H = ( UBRRVAL >> 8 );
UCSR0B =((1 << RXCIE0)| //接收完成中断
(0 << TXCIE0)| //发送完成中断
(0 << UDRIE0)| //寄存器为空中断
(1 << RXEN0 )| // 接收使能
(1 << TXEN0 )| // 发送使能
(0 << UCSZ02)| // 8-bit
(0 << RXB80) |
(0 << TXB80));
UCSR0C =((0 << UMSEL01)| // 异步
(0 << UMSEL00)|
(0 << UPM01) | //无校验位
(0 << UPM00) |
(0 << USBS0 ) | // 1 停止位
(1 << UCSZ01) | // 8-bit
(1 << UCSZ00) | // 8-bit
(0 << UCPOL0)); // clock polarity, synchronous mode only
}
这是中断- SIGNAL(USART_RX_vect){
- c = UDR0;
- usart_send_byte(c);
- if(!cmd_finished){
- switch_led();
- cmd_finished = 1;
- }
- return;
- }
复制代码 这是 main 函数- int main(void){
- cmd_finished = 0;
- DDRB |= _BV(LED);
- init_usart();
- sp("hello, test");
- sei();
- while(1){
- if(cmd_finished){
- //cli();
- cmd_finished=0;
- //sei();
- }
- }
- return 0;
- }
复制代码 现象, 每次从PC发送一个字符,立即收到同样的回应,
进了中断, 但是 switch_led() 只有 reset 之后会执行一次,
以后再也不执行, 也就是说, main 中的 while 中的 if,
从来都是跳过去没有执行的, 为什么?
更离奇的是, 如果不是用SIGNAL而是用ISR宏,
每发送一个字符, 中断会进去三次,为啥呢? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|