奇怪,中断执行,主程序不执行,为什么? 不能再简单的代码
mcu=atmega328pf_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宏,
每发送一个字符, 中断会进去三次,为啥呢? 自问自答
已经解决
添加 volatile
页:
[1]