PIC编程中发现俩个问题 提醒新人 1,中断变量注意再注意 2 if语句关系表达式的写法

2020-02-09 09:28发布

关于第一个问题 我自己也不太清楚  语句是别人帮我改的 他大概说是因为中断变量如果占用了通用寄存器RO(类似) 为了提高速度 往往单片机这么做  那么你原先函数中的变量在通用寄存器的值可能在被中断打断后  他原来的值就回不来了。


我的事例:、
我在AD中断中
原来的语句

AD_Result_power=(ADRES*300)/256;

经过同事改后:
AD_Result_power=ADRES;       {ADRES是AD结果寄存器}
AD_Result_power=(AD_Result_power*300)/256;

这样结果就正确了   请高人指点  (可能需要清楚编译器原理,不同编译器还不一样)



关于第二点:



我的
if(120>a>0)   这样是完全错误的 反正我在PIC中不行

但是我改为if(a>0&a<120)   这样就行了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
millwood0
1楼-- · 2020-02-09 14:03
"这样结果就正确了   请高人指点  (可能需要清楚编译器原理,不同编译器还不一样) "

read a decent C book on "type promotion".

"但是我改为if(a>0&a<120)   这样就行了"

when in doubt, always use brackets.

from the look of it, you shouldn't code at all.
hemjidn
2楼-- · 2020-02-09 16:41
ADRES是只读不写吧?
改下习惯硬件寄存器不是变量就先赋值吧哪怕是临时变量,其实临时变量不一定多占用内存或闪存的……
120>a>0是写给人看的
snoopyzz
3楼-- · 2020-02-09 19:19
 精彩回答 2  元偷偷看……
zhangf1021
4楼-- · 2020-02-09 22:11
LZ,120>a>0中>是逻辑运算符,结果是0或1,也就是说120>a的结果是1或者0,然后120>a的结果再去和0比较,当然有问题
而且正确的应该是&&而不是&,&是位运算符,&&是逻辑运算符
liansh
5楼-- · 2020-02-09 23:18
通用寄存器RO,这个应该是W0吧。
中断有个叫现场保护的概念,都会在进入中断前保护WREG,退出时恢复的。如果中断没有嵌套应该不会出现W被改掉的问题。

AD_Result_power=(ADRES*300)/256;这种方法如果你看汇编的话其实ADRES会先送给W然后才做运算,不会有只读的问题,我觉得问题是出在*300这个问题上,256*300=76800,INT和CHAR型都会溢出。如果是C18这种不会自动转换数据类型的编译器出来的结果肯定是错的。
joychainleo
6楼-- · 2020-02-10 04:24
回复【4楼】zhangf1021
-----------------------------------------------------------------------

回复【1楼】millwood0
-----------------------------------------------------------------------

4楼说的是结果,很感激,让我知道错的原因。
大神说的是路径方法  millwood0 (我个人奉之为偶像了)
回复【5楼】liansh
-----------------------------------------------------------------------
PIC中通用寄存器跟51名称不同,另外你说的溢出,我也用计算器算过。
long型的都试过。不是溢出的问题。就是没做现场保护的问题。

一周热门 更多>