avr中的循环计时器功能?

时间:2015-08-25 17:15:43

标签: timer arduino avr avr-gcc atmel

我最近不得不使用 avr 库并且没有延迟lib来制作 Arduino 项目。因为我必须创建延迟函数的实现。

在网上搜索后,我在很多地方找到了这个特殊的代码。 我得到的唯一解释是它以 callibrated方式杀死时间

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 个答案:

答案 0 :(得分:0)

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

我没有对您的代码进行测试,但此值(17500)的设计延迟时间为1毫秒。

例如,如果F_CPU = 1000000如此delay_count = 57,要达到1毫秒计数57计算一个简单的计算,你可以发现每个计数需要17us,这个值是编译成汇编时循环的时间。

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

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