avr中的循环计时器功能?

Posted

技术标签:

【中文标题】avr中的循环计时器功能?【英文标题】:Looping timer function in avr? 【发布时间】:2015-08-25 17:15:42 【问题描述】:

我最近不得不使用 avr 库和无延迟库制作一个 Arduino 项目。在那我必须创建一个延迟函数的实现。

在互联网上搜索后,我在很多地方都找到了这个特定的代码。 我得到的唯一解释是它以一种经过校准的方式消磨时间。

void delay_ms(int ms) 
   int delay_count = F_CPU / 17500;//Where is this 17500 comming from
   volatile int i;

   while (ms != 0) 
     for (i=0; i != delay_count; i++);
     ms--;
  

我无法理解以下是如何工作的(尽管它确实完成了这项工作),即我们如何确定延迟计数为 F_cpu/17500。这个数字是从哪里来的。

【问题讨论】:

【参考方案1】:

延迟函数最好在汇编中完成,因为您必须知道代码需要多少指令周期才能知道如何重复它以实现总延迟。

我没有测试您的代码,但这个值 (17500) 旨在达到 1 毫秒的延迟。

例如,如果F_CPU = 1000000so delay_count = 57,要达到 1ms,它计数 57 计数一个简单的计算你会发现每个计数将花费 17us,这个值是编译到汇编时循环所用的时间。

当然,不同的编译器版本会产生不同的汇编代码,这意味着延迟不准确。

我给你的建议是使用标准的avr/delay.h 库。我看不出你为什么不能使用它的任何理由?但是如果你必须创建另一个,那么你应该学习组装!

【讨论】:

以上是关于avr中的循环计时器功能?的主要内容,如果未能解决你的问题,请参考以下文章

AVR单片机教程——定时器中断

AVR/Arduino:读取定时器切换端口引脚

Avr-gcc:定时器/计数器中断与 UART 冲突?

AVR CTC 模式下的 16 位定时器

使用定时器中断闪烁 LED(atmega 128)

尽管启用了后台功能,但计时器仍会停止