使用PIC18 C18库中的延迟函数实现长延迟

使用PIC18 C18库中的延迟函数实现长延迟,c,delay,pic18,c18,C,Delay,Pic18,C18,我使用的是Fosc=10MHz的PIC18。所以如果我使用Delay10KTCYx(250),我得到10000 x 250 x 4 x(1/10e6)=1秒 如何使用C18中的延迟功能实现很长的延迟,比如20秒?我想只用二十行Delay10KTCYx(250)。还有其他更高效、更优雅的方式吗 提前谢谢 强烈建议您避免使用内置的延迟函数,如Delay10KTCYx() 你为什么会问 这些延迟函数非常不准确,它们可能导致代码以意外的方式编译。这里有一个这样的例子,使用Delay10KTCYx()函数

我使用的是Fosc=10MHz的PIC18。所以如果我使用Delay10KTCYx(250),我得到10000 x 250 x 4 x(1/10e6)=1秒

如何使用C18中的延迟功能实现很长的延迟,比如20秒?我想只用二十行Delay10KTCYx(250)。还有其他更高效、更优雅的方式吗


提前谢谢

强烈建议您避免使用内置的延迟函数,如Delay10KTCYx()

你为什么会问

这些延迟函数非常不准确,它们可能导致代码以意外的方式编译。这里有一个这样的例子,使用Delay10KTCYx()函数可能会导致问题

假设您有一个只有两个硬件定时器中断的PIC18微处理器。(通常他们有更多,但我们只说只有两个)

现在,假设您手动设置第一个硬件定时器中断,精确地每秒闪烁一次,以驱动心跳监视器LED。假设你设置了第二个硬件定时器中断,每50毫秒中断一次,因为你想在50毫秒的时间内读取一些数字或模拟数据

现在,最后,让我们假设在主程序中,您希望延迟100000个时钟周期。因此,您在主程序中调用Delay10KTCYx(10)。你认为会发生什么事?PIC18如何神奇地计数100000个时钟周期

有两件事会发生。它可能“劫持”您的另一个硬件计时器中断,以获得精确的100000个时钟周期。这可能会导致心跳传感器在1秒钟内不计时,或者导致数字或模拟读数在50毫秒以外的某个时间发生

或者,delay函数将只调用一组Nop(),并声明1 Nop()=1个时钟周期。没有考虑的是Delay10KTCYx(10)函数本身的“开销”。它必须增加一个计数器来跟踪事物,而且增加计时器肯定需要超过一个时钟周期。由于Delay10KTCYx(10)不断循环,它无法精确提供100000个时钟周期。取决于许多因素,您可能会得到比预期更多或更少的时钟周期

Delay10KTCYx(10)仅在需要“近似”时间时使用。如果您已经将硬件定时器中断用于其他目的,则不应使用预屏蔽延迟功能。当使用Delay10KTCYx(10)进行很长的延迟时,编译器甚至可能无法成功编译

我强烈建议您设置一个计时器中断,以在已知间隔中断硬件。比如说50000个时钟周期。然后,每次硬件中断时,在该计时器中断的ISR代码中,增加一个计数器,并再次将计时器重置为0个周期。当有足够的50000个时钟周期过期到等于20秒时(或者换句话说,在您的示例中,200个计时器以每个中断50000个周期的速度中断),请重置计数器。基本上,我的建议是,您应该始终手动处理PIC中的时间,而不是依赖预屏蔽延迟功能,而是构建自己的延迟功能,集成到芯片的硬件计时器中。是的,这将是额外的工作-“但为什么我不能使用这个简单而漂亮的内置延迟功能,如果它会破坏我的程序,他们为什么还要把它放在那里?”-但这应该成为第二天性。就像您应该在启动时手动配置PIC18中的每个寄存器一样,无论您是否在使用它,以防止意外事件发生


您将从您的PIC18中获得更精确的计时和更可预测的行为。使用预屏蔽延迟函数会导致灾难。。。这可能有用。。。它可能适用于几个项目。。。但是你的代码迟早会出问题,你会感到奇怪,我保证罪魁祸首是预先设置好的延迟函数。

要创建很长的时间,请使用内部计时器。这有助于避免应用程序中的阻塞,您可以检查运行时间。关于如何设置定时器及其中断,请参考PIC数据表


如果你想要一个非常高精度的1s时间,我建议还考虑一个外部RTC设备或者一个内部RTC,如果微的有一个。<代码> >(int i=0;i<20;i+++){Delay-1ySe-();} /代码> @ H2CO3,那么我能为(int i=0,i<20;i++){Delay10ktCyx(250);}写一个while循环吗?为什么不能?(但为什么“在一段时间内循环”?for循环还不够吗?它已经完全符合您的要求了…)实际上,我正在运行一个校准例程,需要旋转传感器20秒。所以基本上我有一个while(1)循环,它进入校准模式,延迟20秒旋转传感器,退出校准模式,延迟50秒,然后循环再次开始。问题是什么?