打印

中断服务程序中不能修改全局变量?

[复制链接]
8658|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
darcyju|  楼主 | 2012-8-28 23:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用ATmega16 单片机想测量按键从按下到松开的时间,用AVR stdio4编程。用外部中断0确定第一次和最后一次按键电平变化,用定时器1计量时间。但发现一个问题,就是在中断服务程序中,修改全局变量count时,main函数中的count值不会变化。测试后发现,中断服务程序修改的全局变量只能在中断程序中显示改变,而在main函数中,不显示改变。各位大神,请问怎么解决?

#define F_CPU 8000000UL
#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
#include"TypeRedefinition.h"
extern uint8 Count = 123;
uint8 Time = 0;
uint8 SwichTimer = 0;
uint8 SwichDis = 0;
uint8 Display[3] = {1,2,3};
//共阳
const uint8 SEG_CODE[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int main()
{
uint8 i;
DDRC = 0x0f;
DDRA = 0xff;
DDRD &= ~(1 << 2) ;
PORTA = 0xff;
PORTD |= (1 << 2) ; //IO初始化

TCCR0 = 0x05;  //预分频:1024
MCUCR = 0x01;  //INT0下降沿触发触发,0x00低电平,0x01逻辑电平变化,
        //0x02下降沿,0x03上升沿
GICR = 0x40;   //INT0中断使能
sei();
while(1)
{
  
  if(SwichDis == 1)
  {
     
   Time = Count*128/1000;
   Display[0] = Time/100;
   Display[1] = Time%100/10;
   Display[2] = Time%100%10;  //将Time转换为可显示的Display[]
   
   for(i = 0;i < 3;i ++)   //显示Display[]
   {
    PORTC = ~(1 << i);
    PORTA = SEG_CODE[Display[i]];
    _delay_ms(2);
   }
  
  }
   
}
}
ISR(INT0_vect)
{
if(SwichTimer == 0)
{
  TCNT0 = 0;
  SwichTimer = 1;
}
else
{
  Count = 223;
  //Count = TCNT0;
  SwichDis = 1;
}
}

相关帖子

沙发
nevermore008| | 2012-8-29 07:08 | 只看该作者
按键为神马要用中断,按键要消抖啊,中断程序中用到的全局变量最好定义为volatile

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
darcyju + 1
板凳
huangqi412| | 2012-8-29 07:49 | 只看该作者
volatile

使用特权

评论回复
地板
原野之狼| | 2012-8-29 10:05 | 只看该作者
这就是volatile的典型应用场景啊

使用特权

评论回复
5
雷影少年| | 2012-8-29 11:31 | 只看该作者
第一次看的需要使用volatile的例子,学习了~:$

使用特权

评论回复
6
efen| | 2012-8-29 11:33 | 只看该作者
在中断的全局变量前须加volatile

使用特权

评论回复
7
suse-lj| | 2012-8-29 20:21 | 只看该作者
我还从来没有用过Volatile,今天学习了

使用特权

评论回复
8
darcyju|  楼主 | 2012-8-29 23:07 | 只看该作者
验证,真是volatile的问题

使用特权

评论回复
9
964938881| | 2014-12-7 22:35 | 只看该作者
我也遇到同样问题,的确是volatile 的问题

使用特权

评论回复
10
diweo| | 2014-12-8 08:14 | 只看该作者
本帖最后由 diweo 于 2014-12-8 08:15 编辑

新手必然碰到的典型问题。
因为一般的C教程都是面向PC的,所以都不讲中断的。

使用特权

评论回复
11
yarnn| | 2015-12-22 12:00 | 只看该作者
学习了,记号一个

使用特权

评论回复
12
#DEFINE_NAME| | 2015-12-22 12:27 | 只看该作者
学习了                           

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

1

粉丝