fanlanyou 发表于 2009-9-27 09:42:15

求助:中断问题

下边的这个程序是用winavr20090313+avrstudio4.13中的GCC编译,编译程序没有任何错误或警告。这个程序是通过定时器1的溢出中断将num调用到主函数中运行,但是调用不到。。。。。
如果将主函数中的代码放入中断函数中,能够进入中断,且是正确的。。但是我主要想将中断函数中设置的标志位能在主函数中使用,请各位大虾帮帮忙,先谢谢啦。

//包含所需头文件
#include <avr/io.h>
#include <avr/interrupt.h>
/*------宏定义------*/
#define uchar unsigned char
#define uint unsigned int
#define BIT(x) (1<<(x))
#define NOP() asm("nop")
#define WDR()asm("wdr")
uchar num;
uint flag;
//端口初始化
void port_init(void)
{
PORTB = 0xFF;
DDRB= 0xFF;
}

//定时T1初始化
void timer1_init(void)
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x04;//中断允许
TCNT1H = 0xE7;
TCNT1L = 0x96;//初始值
TCCR1A = 0x00;
TCCR1B = 0x03;//启动定时器
}

//定时器T1溢出中断服务程序
ISR(TIMER1_OVF_vect,ISR_BLOCK)
{
TCNT1H = 0xE7; //重装值高位
TCNT1L = 0x96; //重装值低位
flag++;
if(flag==2)
{
num=~num;
flag=0;
}
}

void init_devices(void)
{
cli(); //禁止所有中断
MCUCR= 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR   = 0x00;
port_init();
timer1_init();
sei();//开全局中断
}
//主函数
int main(void)
{
init_devices();
num=0xff;
flag=0;
while(1)
{
PORTB=num;
}
}

w418781840 发表于 2009-9-27 17:54:30

这个貌似编译器优化产生的。此类问题不少,搜一下就出来了。

yyccaa 发表于 2009-9-27 20:50:29

典型的volatile问题。

qzf368 发表于 2009-9-27 22:05:16

把num定义成volatile就可以,原因百度一下

fanlanyou 发表于 2009-9-30 08:25:18

谢谢,+了volatile 还真是可以了

machao 发表于 2009-10-8 16:30:49

可以是可以了,还是不知道为什么,下次可能还会出现类似的问题。
页: [1]
查看完整版本: 求助:中断问题