我正在使用Hi-Tech C编译器对PIC16F876进行编程。我必须使用延迟,每次程序运行时,其持续时间都不同。
我想要的功能
__delay_us()
然而,
此功能仅接受,如手册中所述; “文字常数”论点。我曾经想过,在计算延迟的持续时间后=>我可以使用的持续时间:
__delay_us(D);
只要D被分配如此:
#define D duration //where duration is an unsigned long
但是,方法不起作用。似乎我什么时候使用#define,如果我分配的值是可变的,编译器会抛出错误? (我不希望这样,我会认为变量的当前值在赋值时会变成常量。)
如果我指定一个实际数字,例如:
#define D 20
这很好用,但我希望能够改变D的值。
我可以猜到为什么这不起作用:Hi-tech C编译器无法为延迟生成汇编代码,除非它确切知道它是什么(在编译时)。
我不能使用一个循环,例如1us延迟,因为步进循环所需的时间会改变延迟(我需要它非常准确)。
我唯一的选择是编写汇编函数并将持续时间值传递给它吗?
答案 0 :(得分:2)
如果您的控制器具有低频率(~10 MHz),那么它将不准确(如您所述)并且可靠地依赖于用C语言编写的延迟功能。
你应该使用汇编代码来获得适当的延迟。
在装配级别,您可以微调延迟,因为您将知道每条指令所需的时间(机器周期和所需的T状态数)。您也可以在控制器的数据表中找到相同的内容。
根据编译器的不同,您可以使用#asm - #endasm
指令或asm
关键字或编译器手册中指定的任何其他方式在C程序中插入汇编代码段。
P.S。 :我从事过微控制器工作,我知道当你需要向LCD提供1微秒的ON脉冲时会有多困难。