4

我正在使用 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 延迟的循环,因为单步执行循环所需的时间会改变延迟(我需要它非常准确)。

我唯一的选择是编写一个汇编函数并将持续时间的值传递给它吗?

4

1 回答 1

2

如果您的控制器频率较低(~10 MHz),那么依赖于用 C 编写的延迟函数将是不准确的(如您所说)和可靠的。

应该使用汇编代码来获得适当的延迟。

在汇编级别,您可以微调延迟,因为您将知道每条指令所需的时间(机器周期和所需的 T 状态数)。您也可以在控制器的数据表中找到相同的内容。

根据编译器,您可以使用#asm - #endasm指令或asm关键字或编译器手册中指定的任何其他方式在 C 程序中插入汇编代码片段。

PS:我从事过微控制器工作,我知道当您需要向 LCD 提供 1 微秒的 ON 脉冲时会变得多么困难。

于 2013-10-21T12:10:25.440 回答