atmega16,全局变量num在main()里初始化为2,timer定时器 每来一次中断,变量num加1,为何通
全局变量num在main()里初始化为2,timer定时器 每来一次中断,变量num加1,为何通过串口送出的数据,只有 23 而不能 随着定时器 中断次数的增加而不停的增加?main.h 里如下定义
extern uchar num;
main.c里如下写的程序
uchar num;
void main(void)
{
num = 2;
while(1)
{
delay_Xs(50);
WDR();
}
}
timer.c如下:
#pragma interrupt_handler Int_TCCR1A: 7
void Int_TCCR1A(void)
{
num ++;
SendData=num;
send_data(num);
}
usart.c如下:
void send_data(uchar data)
{
while( !( UCSRA & (1<<UDRE)) ) ;
UDR=data;
delay_nus(1000);
} 用"volatile uchar num;"方法来定义,看看结果怎样? volatile uchar num; 凡是中断里面调用过的变量都应该加上volatile。
num, SendData,data 。。。。。
另外send_data函数中不要调用延时函数。因为send_data还在中断里面。 凡是中断里面调用过的变量都应该加上volatile。
对volatile用法的误解。 to大家
加上volatile
还是不行啊? 是main()函数中的这 一句
WDTCR |= ((1 << WDTOE) | (1 << WDE)); /*启动时序*/
WDTCR = ((1<< WDE) | (1 << WDP2) | (1 <<WDP1)); /*设定周期为1S*/
造成的,但原因是什么?
但这句 只是 初始化 看门狗,我已经在 while(1)里 将 WDR()这句 注释掉了啊?
main()
{
WDTCR |= ((1 << WDTOE) | (1 << WDE)); /*启动时序*/
WDTCR = ((1<< WDE) | (1 << WDP2) | (1 <<WDP1)); /*设定周期为1S*/
while(1)
{
delay();
//WDR();
}
}
看门狗还没学太明白,请大家指点 ,是不是 看门狗定时器 哪里设定不对?
现在 明确的是 不是 volatile的事,但在avr单片机上volatile 应该使用 在什么场合呢 楼主为什么非要在中断里完成num++呢?
页:
[1]