german010 发表于 2009-4-11 18:53:35

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);
}

ratrat 发表于 2009-4-11 20:02:11

用"volatile uchar num;"方法来定义,看看结果怎样?

lanshuitianxia 发表于 2009-4-11 20:03:40

volatile uchar num;

igoal 发表于 2009-4-11 20:09:02

凡是中断里面调用过的变量都应该加上volatile。
num, SendData,data 。。。。。
另外send_data函数中不要调用延时函数。因为send_data还在中断里面。

void_c 发表于 2009-4-11 20:39:41

凡是中断里面调用过的变量都应该加上volatile。

对volatile用法的误解。

german010 发表于 2009-4-11 21:16:35

to大家
加上volatile
还是不行啊?

german010 发表于 2009-4-11 21:52:30

是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 应该使用 在什么场合呢

djingm1234 发表于 2012-11-26 21:31:15

楼主为什么非要在中断里完成num++呢?
页: [1]
查看完整版本: atmega16,全局变量num在main()里初始化为2,timer定时器 每来一次中断,变量num加1,为何通