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

[复制链接]
9266|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的典型应用场景啊
雷影少年 发表于 2012-8-29 11:31 | 显示全部楼层
第一次看的需要使用volatile的例子,学习了~:$
efen 发表于 2012-8-29 11:33 | 显示全部楼层
在中断的全局变量前须加volatile
suse-lj 发表于 2012-8-29 20:21 | 显示全部楼层
我还从来没有用过Volatile,今天学习了
 楼主| darcyju 发表于 2012-8-29 23:07 | 显示全部楼层
验证,真是volatile的问题
964938881 发表于 2014-12-7 22:35 | 显示全部楼层
我也遇到同样问题,的确是volatile 的问题
diweo 发表于 2014-12-8 08:14 | 显示全部楼层
本帖最后由 diweo 于 2014-12-8 08:15 编辑

新手必然碰到的典型问题。
因为一般的C教程都是面向PC的,所以都不讲中断的。
yarnn 发表于 2015-12-22 12:00 | 显示全部楼层
学习了,记号一个
#DEFINE_NAME 发表于 2015-12-22 12:27 | 显示全部楼层
学习了                           
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部