PIC18F延迟

时间:2012-04-12 04:04:13

标签: c delay microcontroller pic18 mplab

我正在使用带有HiTech ANSI C编译器的PIC18F14K50和MPLAB v8.43。除了延迟功能之外,我的PIC代码终于启动并运行。这对我的应用程序至关重要 - 我需要它在某些状态下持续一定的毫秒,秒或分钟。

我一直试图找到一个解决方案大约2周,但到目前为止都没有成功。我放弃了并在循环中用asm("nop");编写了我自己的延迟函数,但是这给出了非常不可预测的结果。如果我告诉它等待半秒或5秒,它就足够准确。但是一旦我告诉它要等待更长时间 - 比如10分钟,延迟只持续大约10到20秒,而2分钟就会眨眼短于500毫秒延迟。

以下是我的配置保险丝和wait()功能:

#include <htc.h>

__CONFIG(1, FOSC_IRC   & FCMEN_OFF & IESO_OFF & XINST_OFF);
__CONFIG(2, PWRTEN_OFF & BOREN_OFF & WDTEN_OFF);
__CONFIG(3, MCLRE_OFF);
__CONFIG(4, STVREN_ON  & LVP_OFF   & DEBUG_OFF);
__CONFIG(5, 0xFFFF);
__CONFIG(6, 0xFFFF);
__CONFIG(7, 0xFFFF);

void wait(int ms)
{
  for (int i = 0; i < ms; i++)
    for (int j = 0; j < 12; j++)
      asm("nop");
}

就像我说的那样,如果我将wait(500)调到wait(30000)那么我会在我感兴趣的宽容范围内得到半秒到30秒的延迟 - 但是如果我打电话给{{1}然后我没有像我期望的那样得到10分钟的延迟,而是大约10-15秒,而wait(600000)没有给出2分钟的延迟,而是快速眨眼。

理想情况下,我想让内置的wait(120000)函数正常工作,并在__delay_ms()内调用,但是我没有取得任何成功。如果我尝试wait(),那么我的MPLAB会抱怨没有这样的文件或目录。如果我在我的HiTech样本中查看delay.h,有一个#include <delay.h>已定义且DelayUs(unsigned char)我没有尝试过,但是当我尝试将extern直接放入我的C代码时,链接时我得到一个未定义的符号错误。

短到中延迟与长延迟之间的差异毫无意义。我唯一的解释是编译器已经优化了NOP或其他东西。

就像我说的那样,它是带有上述配置保险丝的PIC18F14K50。我没有很多PIC的经验,但我认为在这个设置下它以4MHz的速度运行。

我很高兴来自库或宏的外部函数,或者带有NOP的手写函数。我所需要的只是在每分钟左右的时间内精确到达。

3 个答案:

答案 0 :(得分:4)

PIC是16位微控制器吗?我的猜测是你在等待的值上溢出,这会在2 ^ 15之后溢出(32,767是有符号16位int的最大值)。

答案 1 :(得分:3)

如果您将int变量更改为unsigned,则最多可以达到65535毫秒。要高于此值,您需要使用long作为参数类型,并将循环嵌套得更深。

答案 2 :(得分:1)

更好的长期解决方案是编写延迟功能,该功能使用芯片中的一个内置硬件定时器。如果你有其他中断触发和使用一些CPU周期

,那么你的NOP延迟在长时间内是不准确的
相关问题