搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 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
}




这是中断
  1. SIGNAL(USART_RX_vect){
  2.         c = UDR0;
  3.         usart_send_byte(c);
  4.         if(!cmd_finished){
  5.                 switch_led();
  6.                 cmd_finished = 1;
  7.         }
  8.         return;
  9. }
复制代码
这是 main 函数
  1. int main(void){
  2.         cmd_finished = 0;
  3.         DDRB |= _BV(LED);
  4.         init_usart();
  5.         sp("hello, test");
  6.         sei();
  7.         while(1){
  8.                 if(cmd_finished){
  9.                         //cli();
  10.                         cmd_finished=0;
  11.                         //sei();
  12.                 }
  13.         }
  14.         return 0;
  15. }
复制代码
现象, 每次从PC发送一个字符,立即收到同样的回应,
进了中断, 但是 switch_led() 只有 reset 之后会执行一次,
以后再也不执行, 也就是说, main 中的 while 中的 if,
从来都是跳过去没有执行的, 为什么?


更离奇的是, 如果不是用SIGNAL而是用ISR宏,
每发送一个字符, 中断会进去三次,为啥呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-4-10 10:28:36 | 显示全部楼层
自问自答
已经解决
添加 volatile
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表