[PIC®/AVR®/dsPIC®产品] 在使用MPLAB X IDE(XC8编译器)时候的疑问

[复制链接]
 楼主| tree844 发表于 2022-1-11 21:44 | 显示全部楼层 |阅读模式
本帖最后由 pzsh 于 2022-1-12 14:25 编辑

硬件:PIC16F877A
我在写一个音乐播放器的例程,发现一个不解的现象:
/*************************/
给TMR1赋值时,直接写成如下:
(F是unsigned int的变量)
  1. TMR1H = (65535 - F) / 256;
  2. TMR1L = (65535 - F) % 256;   
定时的结果不准,在Watch中查看时,甚至连计算结果,也就是赋入 TMR1H 和 TMR2L 的数值都不对。
/*************************/
如果赋值之前提前进行计算,即增加两个中间变量
  1. unsigned char temH,temL;
然后赋值
  1. temH = (65535 - F) / 256;
  2. temL = (65535 - F) % 256;   
  3. TMR1H = temH;
  4. TMR1L = temL;
这样的计算结果就正确了。
/*************************/
我不知道这是C语言的知识还是MPLAB X IDE或者XC8编译器的问题,各位高手有知道的吗?

 楼主| tree844 发表于 2022-1-11 21:52 | 显示全部楼层
之前也有类似的问题,我总感觉是编译器的问题而不是硬件,看我之前发的帖子:
https://bbs.21ic.com/forum.php?mod=viewthread&tid=3184096&page=1#pid12541694
pzsh 发表于 2022-1-12 14:24 | 显示全部楼层
尝试一下用MCC配置一下,再看看自动产生的代码的运行效果,不知道可不可以
 楼主| tree844 发表于 2022-1-12 20:27 | 显示全部楼层
pzsh 发表于 2022-1-12 14:24
尝试一下用MCC配置一下,再看看自动产生的代码的运行效果,不知道可不可以 ...

这款单片机比较老,好像我安装的插件不能使用,不知道安装老版本的行不行。
弓长月月鸟 发表于 2022-1-12 22:20 | 显示全部楼层
TMR1H = (unsigned char)(65535 - F) / 256;

TMR1L = (unsigned char)(65535 - F) % 256;     这样写有没有试过啊?我也不知道能不能成功。

评论

我刚刚试过了,不行。 应该就是这一步的计算所需时间特别长(远超过正常计算),但是提前计算再赋值,则正常。  发表于 2022-1-14 21:38
lcczg 发表于 2022-1-14 11:13 | 显示全部楼层
应该是类型转换问题。
 楼主| tree844 发表于 2022-1-14 20:21 | 显示全部楼层
lcczg 发表于 2022-1-14 11:13
应该是类型转换问题。

能不能详细说说?
lcczg 发表于 2022-1-19 16:48 | 显示全部楼层
int 和 char型混用,编译器蒙了。试试强制类型转换。
xiuxiu6581772 发表于 2022-1-19 16:51 | 显示全部楼层
反汇编开一下一目了然。   根据以往经验,多数是类型转换的问题。强制转换一下数据类型
ynwa 发表于 2022-1-20 11:00 | 显示全部楼层
你看看编译时候有没有提示警告之类的,或者调试一下赋值的过程。应该是F变量的类型被编译器自动改成char了。所以F最大只能到256。
 楼主| tree844 发表于 2022-1-20 14:46 | 显示全部楼层
lcczg 发表于 2022-1-19 16:48
int 和 char型混用,编译器蒙了。试试强制类型转换。

我试过这样的写法:
TMR1H = (unsigned char)(65535 - F) / 256;
还是没用。
 楼主| tree844 发表于 2022-1-20 14:47 | 显示全部楼层
xiuxiu6581772 发表于 2022-1-19 16:51
反汇编开一下一目了然。   根据以往经验,多数是类型转换的问题。强制转换一下数据类型 ...

看不懂汇编。。。
我试过这样:
TMR1H = (unsigned char)(65535 - F) / 256;
不行。
 楼主| tree844 发表于 2022-1-20 14:50 | 显示全部楼层
ynwa 发表于 2022-1-20 11:00
你看看编译时候有没有提示警告之类的,或者调试一下赋值的过程。应该是F变量的类型被编译器自动改成char了 ...

赋值过程中,这个计算结果就是不对的。我也觉得可能是你说的这样,但是从C语言的语法上来说,这样有什么不对呢?
tpgf 发表于 2022-2-4 19:09 | 显示全部楼层
跟系统的位数有关系吗
guanjiaer 发表于 2022-2-4 19:12 | 显示全部楼层
这个软件使用汇编效率高不高啊
heimaojingzhang 发表于 2022-2-4 19:19 | 显示全部楼层
在赋值过程中不能这样计算
keaibukelian 发表于 2022-2-4 19:25 | 显示全部楼层
应该关系还是很紧密的
labasi 发表于 2022-2-4 19:30 | 显示全部楼层
直接做除法太耗费资源
paotangsan 发表于 2022-2-4 19:38 | 显示全部楼层
特殊的可以使用左移右移
 楼主| tree844 发表于 2022-2-9 09:39 | 显示全部楼层
heimaojingzhang 发表于 2022-2-4 19:19
在赋值过程中不能这样计算

那应该怎么算呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:莫等闲、白了少年头,空悲切!

13

主题

243

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部