tree844 发表于 2022-1-11 21:44

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

本帖最后由 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.html?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;   这样写有没有试过啊?我也不知道能不能成功。

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
反汇编开一下一目了然。   根据以往经验,多数是类型转换的问题。强制转换一下数据类型 ...

看不懂汇编。。。{:cry:}
我试过这样:
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
在赋值过程中不能这样计算

那应该怎么算呢?
页: [1] 2
查看完整版本: 在使用MPLAB X IDE(XC8编译器)时候的疑问