打印
[PIC®/AVR®/dsPIC®产品]

在使用MPLAB X IDE(XC8编译器)时候的疑问

[复制链接]
2279|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tree844|  楼主 | 2022-1-11 21:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pzsh 于 2022-1-12 14:25 编辑

硬件:PIC16F877A
我在写一个音乐播放器的例程,发现一个不解的现象:
/*************************/
给TMR1赋值时,直接写成如下:
(F是unsigned int的变量)
TMR1H = (65535 - F) / 256;
TMR1L = (65535 - F) % 256;   
定时的结果不准,在Watch中查看时,甚至连计算结果,也就是赋入 TMR1H 和 TMR2L 的数值都不对。
/*************************/
如果赋值之前提前进行计算,即增加两个中间变量
unsigned char temH,temL;
然后赋值
temH = (65535 - F) / 256;
temL = (65535 - F) % 256;   
TMR1H = temH;
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配置一下,再看看自动产生的代码的运行效果,不知道可不可以 ...

这款单片机比较老,好像我安装的插件不能使用,不知道安装老版本的行不行。

使用特权

评论回复
5
弓长月月鸟| | 2022-1-12 22:20 | 只看该作者
TMR1H = (unsigned char)(65535 - F) / 256;

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

使用特权

评论回复
评论
tree844 2022-1-14 21:38 回复TA
我刚刚试过了,不行。 应该就是这一步的计算所需时间特别长(远超过正常计算),但是提前计算再赋值,则正常。 
6
lcczg| | 2022-1-14 11:13 | 只看该作者
应该是类型转换问题。

使用特权

评论回复
7
tree844|  楼主 | 2022-1-14 20:21 | 只看该作者
lcczg 发表于 2022-1-14 11:13
应该是类型转换问题。

能不能详细说说?

使用特权

评论回复
8
lcczg| | 2022-1-19 16:48 | 只看该作者
int 和 char型混用,编译器蒙了。试试强制类型转换。

使用特权

评论回复
9
xiuxiu6581772| | 2022-1-19 16:51 | 只看该作者
反汇编开一下一目了然。   根据以往经验,多数是类型转换的问题。强制转换一下数据类型

使用特权

评论回复
10
ynwa| | 2022-1-20 11:00 | 只看该作者
你看看编译时候有没有提示警告之类的,或者调试一下赋值的过程。应该是F变量的类型被编译器自动改成char了。所以F最大只能到256。

使用特权

评论回复
11
tree844|  楼主 | 2022-1-20 14:46 | 只看该作者
lcczg 发表于 2022-1-19 16:48
int 和 char型混用,编译器蒙了。试试强制类型转换。

我试过这样的写法:
TMR1H = (unsigned char)(65535 - F) / 256;
还是没用。

使用特权

评论回复
12
tree844|  楼主 | 2022-1-20 14:47 | 只看该作者
xiuxiu6581772 发表于 2022-1-19 16:51
反汇编开一下一目了然。   根据以往经验,多数是类型转换的问题。强制转换一下数据类型 ...

看不懂汇编。。。
我试过这样:
TMR1H = (unsigned char)(65535 - F) / 256;
不行。

使用特权

评论回复
13
tree844|  楼主 | 2022-1-20 14:50 | 只看该作者
ynwa 发表于 2022-1-20 11:00
你看看编译时候有没有提示警告之类的,或者调试一下赋值的过程。应该是F变量的类型被编译器自动改成char了 ...

赋值过程中,这个计算结果就是不对的。我也觉得可能是你说的这样,但是从C语言的语法上来说,这样有什么不对呢?

使用特权

评论回复
14
tpgf| | 2022-2-4 19:09 | 只看该作者
跟系统的位数有关系吗

使用特权

评论回复
15
guanjiaer| | 2022-2-4 19:12 | 只看该作者
这个软件使用汇编效率高不高啊

使用特权

评论回复
16
heimaojingzhang| | 2022-2-4 19:19 | 只看该作者
在赋值过程中不能这样计算

使用特权

评论回复
17
keaibukelian| | 2022-2-4 19:25 | 只看该作者
应该关系还是很紧密的

使用特权

评论回复
18
labasi| | 2022-2-4 19:30 | 只看该作者
直接做除法太耗费资源

使用特权

评论回复
19
paotangsan| | 2022-2-4 19:38 | 只看该作者
特殊的可以使用左移右移

使用特权

评论回复
20
tree844|  楼主 | 2022-2-9 09:39 | 只看该作者
heimaojingzhang 发表于 2022-2-4 19:19
在赋值过程中不能这样计算

那应该怎么算呢?

使用特权

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

本版积分规则

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

13

主题

243

帖子

3

粉丝