打印
[51单片机]

关于在定时器中断里面调用函数的问题

[复制链接]
8593|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
daocaorenchao|  楼主 | 2014-3-11 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做一个项目,用的51单片机,很久没用51单片机了,一用就出问题了,将一个旋转编码开关的函数key_deal()放在大循环里面时,左旋和右旋都能在显示屏上正常显示,按键按一下,显示数字加1,显示正常;但是放在中断里面调用函数时,左旋和右旋加1是正常的,但是按键按一下后,就一直加1,为什么同一个函数在大循环里面执行和在中断里面执行的结果不一样?求高手和遇到过类似问题的人帮忙解答...谢谢..还有一个,用这个void timer0() interrupt 1和这个void Timer0_isr(void) interrupt 1 using 1效果也不一样,这是为什么?

相关帖子

沙发
ayb_ice| | 2014-3-11 20:31 | 只看该作者
程序问题

使用特权

评论回复
板凳
草民| | 2014-3-11 21:11 | 只看该作者
可能是程序冲突了

使用特权

评论回复
地板
dirtwillfly| | 2014-3-11 22:16 | 只看该作者
估计是逻辑变了

使用特权

评论回复
5
daocaorenchao|  楼主 | 2014-3-12 07:59 | 只看该作者
ayb_ice 发表于 2014-3-11 20:31
程序问题

这个知道是程序问题,但是不知道到底是什么问题,能详细解释一下吗?

使用特权

评论回复
6
daocaorenchao|  楼主 | 2014-3-12 07:59 | 只看该作者
草民 发表于 2014-3-11 21:11
可能是程序冲突了

程序冲突了这么解决?第一次遇到这样的问题...

使用特权

评论回复
7
daocaorenchao|  楼主 | 2014-3-12 08:00 | 只看该作者
dirtwillfly 发表于 2014-3-11 22:16
估计是逻辑变了

这个怎么去判别?怎么去解决?求指教...

使用特权

评论回复
8
xlsbz| | 2014-3-12 08:07 | 只看该作者
using 1  别用啊。本论坛 搜搜帖子就知道了。

使用特权

评论回复
9
ayb_ice| | 2014-3-12 09:49 | 只看该作者
可能情况

中断不要使用using关键字(不懂using细节最好不要用)

临界代码问题,可以关中断解决,开始前开中断,完成后再开中断,或使用#pragma disable

使用特权

评论回复
10
daocaorenchao|  楼主 | 2014-3-13 08:05 | 只看该作者
xlsbz 发表于 2014-3-12 08:07
using 1  别用啊。本论坛 搜搜帖子就知道了。

试过了,不用的时候还是不一样哦

使用特权

评论回复
11
daocaorenchao|  楼主 | 2014-3-13 08:55 | 只看该作者
ayb_ice 发表于 2014-3-12 09:49
可能情况

中断不要使用using关键字(不懂using细节最好不要用)

试过了,效果还是一样...

使用特权

评论回复
12
daocaorenchao|  楼主 | 2014-3-13 08:58 | 只看该作者
dwh000 发表于 2014-3-12 10:29
以前遇到过这个情况.把自己的经验和理解说说.
c语言中断最好不要切换寄存器工作组,因为中断中很多时候会用 ...

虽然说出了原因,但是我还是不知道该怎么解决...我的函数调用也尽可能简介了,但是结果还是一样的...

使用特权

评论回复
13
ethunter| | 2014-3-13 09:13 | 只看该作者
中断啊好只做接受数据,不做数据处理,而且中断中的代码越简洁越好

使用特权

评论回复
14
mmuuss586| | 2014-3-13 09:13 | 只看该作者

还没解决啊,程序发给别人,让谁看一下啊。

使用特权

评论回复
15
daocaorenchao|  楼主 | 2014-3-13 09:20 | 只看该作者
关于这个问题的工程

test2.2.zip

83.69 KB

使用特权

评论回复
16
daocaorenchao|  楼主 | 2014-3-13 09:21 | 只看该作者
mmuuss586 发表于 2014-3-13 09:13
还没解决啊,程序发给别人,让谁看一下啊。

前几天忙其他的,没搞这个问题哦,也没想出解决办法,尝试很多次了...

使用特权

评论回复
17
ayb_ice| | 2014-3-13 10:52 | 只看该作者
中断里有时调用函数
pulse_BZ1(3000);
这个函数开销太大,可能会超50MS,会导致中断一退出又进入中断

中断里居然还有while(!KEY1){;}这样的代码

这样的程序能正常绝对是奇迹

使用特权

评论回复
18
ayb_ice| | 2014-3-13 10:57 | 只看该作者
中断里的代码

/////////////检测//////////////////////
U8 GetKey()
{         
     GNDA=0;
         GNDB=0;
         Last_BMB_status=PINB;//初始状态:编码B 的状态给上一个状态**
         while(!PINA)//BMA为低电平时
           {
             Current_BMB_status=PINB;//编码B的状态给出现在的状态
                 keyflag=1;//标志位置为1说明编码开关被旋转了
           }

while(!PINA)这代码有严重问题

使用特权

评论回复
19
xlsbz| | 2014-3-13 21:04 | 只看该作者
daocaorenchao 发表于 2014-3-13 08:05
试过了,不用的时候还是不一样哦

2708c3a0-ef52-472c-a19e-f5d574a880a6.pdf (138.59 KB)
我以前理解的关于using的。有空你可以瞅瞅

至于你的其他问题。你自己帮自己吧

使用特权

评论回复
20
lhchen922| | 2014-3-13 21:09 | 只看该作者
中断里调用函数还没处理完,下个中断又来了。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

81

帖子

0

粉丝