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