在使用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编译器的问题,各位高手有知道的吗?
之前也有类似的问题,我总感觉是编译器的问题而不是硬件,看我之前发的帖子:
https://bbs.21ic.com/forum.html?mod=viewthread&tid=3184096&page=1#pid12541694 尝试一下用MCC配置一下,再看看自动产生的代码的运行效果,不知道可不可以 pzsh 发表于 2022-1-12 14:24
尝试一下用MCC配置一下,再看看自动产生的代码的运行效果,不知道可不可以 ...
这款单片机比较老,好像我安装的插件不能使用,不知道安装老版本的行不行。 TMR1H = (unsigned char)(65535 - F) / 256;
TMR1L = (unsigned char)(65535 - F) % 256; 这样写有没有试过啊?我也不知道能不能成功。 应该是类型转换问题。 lcczg 发表于 2022-1-14 11:13
应该是类型转换问题。
能不能详细说说? int 和 char型混用,编译器蒙了。试试强制类型转换。
反汇编开一下一目了然。 根据以往经验,多数是类型转换的问题。强制转换一下数据类型 你看看编译时候有没有提示警告之类的,或者调试一下赋值的过程。应该是F变量的类型被编译器自动改成char了。所以F最大只能到256。 lcczg 发表于 2022-1-19 16:48
int 和 char型混用,编译器蒙了。试试强制类型转换。
我试过这样的写法:
TMR1H = (unsigned char)(65535 - F) / 256;
还是没用。 xiuxiu6581772 发表于 2022-1-19 16:51
反汇编开一下一目了然。 根据以往经验,多数是类型转换的问题。强制转换一下数据类型 ...
看不懂汇编。。。{:cry:}
我试过这样:
TMR1H = (unsigned char)(65535 - F) / 256;
不行。 ynwa 发表于 2022-1-20 11:00
你看看编译时候有没有提示警告之类的,或者调试一下赋值的过程。应该是F变量的类型被编译器自动改成char了 ...
赋值过程中,这个计算结果就是不对的。我也觉得可能是你说的这样,但是从C语言的语法上来说,这样有什么不对呢? 跟系统的位数有关系吗 这个软件使用汇编效率高不高啊 在赋值过程中不能这样计算 应该关系还是很紧密的 直接做除法太耗费资源 特殊的可以使用左移右移
heimaojingzhang 发表于 2022-2-4 19:19
在赋值过程中不能这样计算
那应该怎么算呢?
页:
[1]
2