求助:中断问题
下边的这个程序是用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;
}
} 这个貌似编译器优化产生的。此类问题不少,搜一下就出来了。 典型的volatile问题。 把num定义成volatile就可以,原因百度一下 谢谢,+了volatile 还真是可以了 可以是可以了,还是不知道为什么,下次可能还会出现类似的问题。
页:
[1]