我正在使用 Hi-Tech C 编译器对 PIC16F876 进行编程。我处于必须使用延迟的地步,每次程序运行时的持续时间都不同。
我想要这个功能
__delay_us()
但是,
此函数只接受,如手册所述; “文字常量”参数。我原以为,在计算了延迟的持续时间后 => duration 我可以使用:
__delay_us(D);
只要像这样分配D:
#define D duration //where duration is an unsigned long
但是,方法不起作用。似乎每当我使用#define 时,如果我分配的值是可变的,编译器就会抛出错误?? (没想到会这样,我还以为变量的当前值会在赋值的时候变成常量。。)
如果我分配一个实际数字,例如:
#define D 20
这工作正常,但我希望能够更改 D 的值。
我可以猜到为什么这不起作用:高科技 C 编译器无法为延迟生成汇编代码,除非它确切地知道它是什么(在编译器时)。
我不能使用带有例如 1us 延迟的循环,因为单步执行循环所需的时间会改变延迟(我需要它非常准确)。
我唯一的选择是编写一个汇编函数并将持续时间的值传递给它吗?
最佳答案
如果您的 Controller 频率较低(~10 MHz),那么依赖于用 C 编写的延迟函数将不准确(如您所述)和可靠。
您应该使用汇编代码来获得适当的延迟。
在汇编级别,您可以微调延迟,因为您知道每条指令所需的时间(机器周期和所需的 T 状态数)。您也可以在 Controller 的数据表中找到相同的内容。
根据编译器的不同,您可以使用 #asm - #endasm
指令或 asm
关键字,或在编译器手册。
附言:我曾研究过微 Controller ,我知道当您需要向 LCD 提供 1 微秒的 ON 脉冲时会有多困难。
关于c - 文字常量的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19493673/