timberg 发表于 2013-4-9 22:17:51

奇怪,中断执行,主程序不执行,为什么? 不能再简单的代码

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宏,
每发送一个字符, 中断会进去三次,为啥呢?

timberg 发表于 2013-4-10 10:28:36

自问自答
已经解决
添加 volatile
页: [1]
查看完整版本: 奇怪,中断执行,主程序不执行,为什么? 不能再简单的代码