【问题标题】:delay function in for PIC18F4550PIC18F4550 的延迟功能
【发布时间】:2017-08-10 11:15:49
【问题描述】:

PIC18F4550在C编程中是否可以使用延迟函数,类似于Arduino中的delay()delayMicroseconds()

能找到的延迟函数有Delay10KTCYx()Delay10TCYx()等,很难产生我们想要的延迟,最低延迟甚至不是毫秒。

请寻求您的帮助。谢谢

【问题讨论】:

  • 最好的方法是使用定时器。所有其他方法在非常简单的 uC 上都可以正常工作,但在更体面的 uC 上却失败了。无论如何都应该避免硬编码延迟,因为这是一种非常非常糟糕的编程习惯。

标签: c embedded mplab pic18


【解决方案1】:

在进行微控制器编程时,应尽可能使用片上硬件定时器。通常有几个,也许还有一个实时时钟。与其寻找一些忙延迟功能,不如寻找围绕 MCU 中存在的硬件计时器的驱动程序或 HAL。

此外,如果您需要优于 1 毫秒的分辨率,请注意“延迟”功能往往不准确。

Busy-delay() 函数/循环主要是一种快速而肮脏的业余解决方案。它们很糟糕,因为:

  • 它们消耗 100% 的 CPU,从而消耗 100% 的电力。
  • 它们与编译器及其设置紧密耦合。不同的优化级别可能会打破这种延迟。
  • 它们与系统时钟紧密耦合,而片上定时器驱动程序通常指定使用哪个时钟作为参数并相应地调整预缩放。
  • 它们通常不是很准确。
  • 总体而言,它们不一定具有确定性行为。

【讨论】:

  • 我认为这对这款小型微型电脑来说是一个糟糕的建议(PIC18F4550;32K 闪存,2K SRAM,不是通常用于更高级别操作系统的东西)。在程序设置硬件的启动时,延迟可以用作特定的硬件需求,在程序执行期间,几微秒的延迟也是最佳实践,不需要任何“外部”资源(例如计时器)。定时器的基本频率通常也是系统时钟,所以也没有胜利。当然延迟需要是汇编程序(可能生成)。
  • @Jubatian 不,这个建议非常适用于裸机 MCU。对于任何类型的任何 MCU 程序,您都将需要某种通用定时器。这最好通过 RTC 或其中一个定时器外设来实现。一旦你有了这个,你就可以很容易地实现一个像delay(ms)这样的函数。对于我们解决方案的更短延迟,您需要使用专用的片上定时器。是的,源将是系统时钟,但如果您的计时器驱动程序知道系统时钟和所需的频率,它可以相应地选择预分频器设置 - 这是一个很大的胜利。
  • 对于正确生成的延迟代码也是如此(预分频器设置和生成的代码都是编译时间!),无需使用宝贵的计时器(在如此小的微型计算机上也很少见!)。延迟代码会产生保证的最小延迟(IT 中断可能会延长它,但如果整个过程对它很敏感,那么它是在延迟中触发还是在其他地方触发都没有关系)。您的建议对过程控制有好处,确实在任何事情上都强烈推荐它,但是 OP 要求的更像是微秒范围内的特殊硬件接口。
  • 而且您仍然应该更正答案中提到为什么忙延迟功能不好的部分。如果你延迟使用计时器,那仍然是一个繁忙的延迟,只是轮询计时器直到它达到目标,所以这些点是错误的,没有说明。
  • @Jubatian 另一个主要区别是硬件计时器将继续运行。 “烧毁”的业余事物将冻结并等待中断执行。这意味着硬件计时器版本最坏的情况下会有 1 个 ISR 调用的不准确性,而业余的东西将有 n 个 ISR 调用的不准确性。业余爱好者中断的典型情况是 SPI 上的 LCD 初始化代码,您需要延迟但 SPI/DMA 会产生中断。
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多