2017-08-10 125 views
0

在C编程中是否有任何延迟功能可用于PIC18F4550,类似于Arduino中的delay()delayMicroseconds()PIC18F4550延迟功能

可以找到的延迟函数是Delay10KTCYx(),Delay10TCYx()等,这很难生成我们所需的延迟,最低的延迟甚至不是毫秒。

请寻求你的协助。谢谢

+3

http://thinkinbinary.blogspot.nl/2013/04/generating-time-delays.html – Lanting

+2

最好的方法是使用计时器。所有其他方法在一个非常简单的uC上运行良好,但在更合适的uC上运行失败。作为一种非常糟糕的编程习惯,应尽量避免硬编码延迟。 –

回答

1

在进行微控制器编程时,如果可能的话,应该总是使用片上硬件定时器。通常有几个,也许是一个实时时钟。与其寻找一些繁忙延迟功能,您应该在MCU中的硬件定时器周围寻找驱动程序或HAL。另外,如果你需要好于1ms的分辨率,那么请注意“延迟”功能往往是不准确的。

繁忙延迟()函数/循环大多是一个肮脏的业余解决方案的快速&。他们是坏的,因为:

  • 它们消耗100%的CPU,从而100%的功率。
  • 它们对编译器及其设置有紧密的耦合。不同的优化级别可能会打破延迟。
  • 它们与系统时钟紧密耦合,而片上定时器驱动器通常指定将哪个时钟用作参数并相应地调整预调整。
  • 它们通常不是很准确。
  • 总的来说,他们不一定有确定性的行为。
+0

我认为这对于这个小型微型存储器(PIC18F4550; 32K闪存,2K SRAM,而不是通常用于更高级别的操作系统的东西)是一个不好的建议。在程序设置硬件时的启动时,可能会因程序执行期间的特定硬件需求而延迟几个微秒,延迟也是最佳实践,不需要任何“外部”资源(例如计时器)。定时器的基本频率通常也是系统时钟,所以在那里也不会赢。当然,延迟需要是一个汇编程序(可能产生)。 – Jubatian

+0

@Jubatian不,这个建议适用于裸机。对于任何类型的MCU程序,您都需要某种通用计时器。这最好通过RTC或其中一个定时器外设实现。一旦你有了这个,你可以很容易地实现一个像'delay(ms)'这样的函数。为了缩短我们解决方案的延迟时间,您需要使用专用的片上定时器。是的,源代码是系统时钟,但是如果你的定时器驱动程序知道系统时钟和所需的频率,它可以相应地选择预定标器设置 - 这是一个很大的胜利。 – Lundin

+0

对于正确生成的延迟代码(预分频器设置和生成的代码都是编译时间!),不使用宝贵的定时器(在这种小型微型计算机上也很少见)。延迟代码产生一个保证的最小延迟(IT中断可以延长它,但是如果整个过程对它敏感,则无论延迟还是其他地方发生都没关系)。你所建议的对过程控制是有好处的,在任何情况下都确实极力推荐它,但OP要求的更像是在微秒范围内与特殊HW接口连接。 – Jubatian