原创 [博客大赛]单片机中断服务程序中的变量要小心使用

2013-4-28 14:39 2852 14 22 分类: 工程师职场

单片机中断服务程序中的变量要小心使用

wxleasyland@sina.com

2013.4

 

STC单片机STC12C5160S2,是1T的单片机。把T0,T1的中断都用上了:

 

void t0(void) interrupt 1 using 0

{

  dispcnt++; //切换不同的显示

  。。。。

}

 

void t1(void) interrupt 3

{

  tcnt++;

} //END INTERRUPT

 

tcnt用于累计一秒的计数量3600次。

在主程序中循环判断:

       if(tcnt>=3600)       //3600次,表示过了一秒钟,晶体11.0592

       {

           tcnt-=3600;  

           加一秒

}

结果发现:走时严重不准!!越走越快!!一小时能快上10~20%,无规律性。即tcnt越加越多。

怎么看程序都是对的,找了很久找不到原因!!

以为是using 0的问题,造成中断服务程序变量混乱,结果不是,把using 0去掉,一样不行!!

以为是T1中断触发不正确,但加一个端口翻转,测端口频率,也正确。

T1与T2中断服务程序不能同时存在?晕了。。。

把tcnt-=3600;这句改成tcnt=0;   咦,走时正确了!!

难道单片机做tcnt的减法不行???

后来用串口监控tcnt,发现tcnt会变成负值,即对于unsigned int来说,值忽然变大了,造成多了额外的秒。

查看汇编,发现tcnt做减法时会被分解成多条语句。

知道了!原来做减法时,要多条汇编语句,有可能做到一半语句,会被T1中断程序中断掉,中断程序中又是使用了tcnt作加法,这样导致最后减法做出来的值不正确!!

而tcnt=0;这句比较简单,即使被中断中断掉,最后也是清0,故就没有影响。

改成:

       ET1=0;

       if(tcnt>=3600)       //3600次,表示过了一秒钟,晶体11.0592

       {

           tcnt-=3600;  

ET1=1;

           加一秒

}

else   ET1=1

正常了!

 

结论:

在主程序中,如果用到了中断程序中的变量,则要先禁用掉中断,用完这个变量再打开中断,避免中断干扰造成值计算错误。

 

 

 

文章评论8条评论)

登录后参与讨论

用户431210 2014-12-28 17:28

刘坚鸿的文章上也有这样的介绍,但是汇编上,我还真是没见过!

wxleasyland 2013-5-28 10:39

我的T1中断是不能禁止的,所以中断执行时间需要越短越好,这样才不会影响到别的时序操作,比如读取DS18B20等。

chen_zs2012_704941858 2013-5-7 08:32

学习了

用户1554268 2013-5-6 21:21

very good

fulingda_311004677 2013-5-6 12:46

这个问题在很多讲汇编语言程序设计的书中都会提到,但是讲C编程的书中就很少提到;我更喜欢用另一种办法,就是在T1中断中当tcnt==3600时,设置一个标志位,然后tcnt清零,主程序循环判断那个标志即可;

用户377235 2013-4-29 18:27

GOOD

用户403664 2013-4-28 14:40

好文,为了让更多人关注,应该编辑一下参加博客大赛!

用户377235 2013-4-28 08:33

OK学习OK学习OK学习OK学习

相关推荐阅读
wxleasyland 2016-06-23 20:35
简单翻译W25Q64BV数据手册(Winbond串行闪存SPI总线)
百度文库 http://wenku.baidu.com/view/7bfd82fd5901020206409c1b...
wxleasyland 2016-06-22 17:33
安卓手机中加入busybox命令,打包tar,HC-KTOOL备份EFS的efs.tar.gz长度为0解决
安卓手机中加入busybox命令,打包tar,HC-KTOOL备份EFS的efs.tar.gz长度为0解决 wxleasyland@sina.com 2016.6.17 I9300手机,4....
wxleasyland 2016-06-19 21:17
电脑机箱USB扩展面板失灵原因查找
wxleasyland@sina.com 2016.6   山寨电脑机箱前面的2个USB口扩展面板,是通过排线接到主板上的插座的。 用得好好的,中间有搞了搞电脑,后来就发现有一个...
wxleasyland 2016-06-17 13:44
I9300手机解锁亮屏慢,是Exynos处理器的原因
I9300手机解锁亮屏慢,是Exynos处理器的原因 三星I9300手机,全新刷的官方系统,没有装任何软件。 按电源键或HOME键,亮屏慢,需要1~2秒屏幕才亮起来,找遍网上,没有解法。 后...
wxleasyland 2016-06-16 13:48
华硕主板FW status recovery error故障修复,双BIOS功能分析
华硕主板FW status recovery error故障修复,双BIOS功能分析 wxleasyland@sina.com 2016.6   最近买了一个二手华硕主板P8B75...
wxleasyland 2016-05-01 19:47
WINDOWS(WIN7等)用U盘安装方便(非WINPE)、XP需PE
WINDOWS(WIN7等)用U盘安装方便(非WINPE)、XP需PE 2016年5月1日     一、在WINDOWS中安装WINDOWS 在已运行的WINDOWS中,点击硬...
我要评论
8
14
关闭 站长推荐上一条 /2 下一条