文字常量的问题

时间:2013-10-21 11:47:42

标签: c embedded c-preprocessor

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

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

1 个答案:

答案 0 :(得分:2)

如果您的控制器具有低频率(~10 MHz),那么它将不准确(如您所述)并且可靠地依赖于用C语言编写的延迟功能。

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

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

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

P.S。 :我从事过微控制器工作,我知道当你需要向LCD提供1微秒的ON脉冲时会有多困难。