使用arduino IDE的自定义延迟功能

时间:2016-11-09 02:51:08

标签: c arduino avr

我在微处理器类中,我们正在编写自己的延迟函数,这些函数实际上是准确的。我们的教授给了我们一个4毫秒的延迟函数。我真的不明白如何将其转移到0.25秒或1秒的延迟,这些都是我的作业所必需的。

给定的函数如下(假设_BV()定义为_BV(x)1<<(x)):

DDRB |= _BV(1);
TCCR1A |= _BV(COM1A0);
TCNT1 = 0;
OCR1A = 100;
TIFR1 = _BV(OCF1A);
TCCR1B |= _BV(CS10);
while((TIFR1 & _BV(OCF1A)) == 0);

TIFR1 = _BV(OCF1A);
OCR1A = 100 + 64000;
while((TIFR1 & _BV(OCF1A)) == 0);
TCCR1B = 0;
TCCR1A = 0;

除了两个延迟函数之外,我已经编写了完成作业所需的代码。

这是我到目前为止所做的:

#include <avr/io.h>

uint8_t numIN;

void setup() {
  Serial.begin(9600);

  DDRB |= _BV(5);
}

void loop() {
  int i;

  numIN = 10;

  Serial.println("Enter a number between 0 and 9.");

  do {
    while (Serial.available() > 0)
    {
      numIN = Serial.read() - '0';
      if (numIN < 0 || numIN > 9)
      {
        Serial.println("Input Error!");
      }
    }
  } while (numIN < 0 || numIN > 9);

  Serial.print("You entered ");
  Serial.println(numIN);

  if (isEven(numIN))
  {
    for (i = 0; i < 5; i++)
    {
      PORTB |= _BV(5);
      delay(1000); //temporary
      //delay_Sec();
      PORTB &= ~_BV(5);
      delay(1000); //temporary
      //delay_Sec();
    }
  }

  else
  {
    for (i = 0; i < 5; i++)
    {
      PORTB |= _BV(5);
      delay(250); //temporary
      //delay_quarterSec();
      PORTB &= ~_BV(5);
      delay(250); //temporary
      //delay_quarterSec();
        }
  }
}

void delay_quarterSec(void)
{
  //need to finish
}

void delay_Sec(void)
{
  //need to finish
}

boolean isEven(int num)
{
  if (num & _BV(0))
    return false;

  else
    return true;
}

我很困惑我如何接受教授的代码并将其转移到我需要做的事情上。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

我可以快速概述一下所提供代码的作用。

(这是来自内存,所以不要相信我的话。而且你没有提到你的控制器类型。你必须详细查阅寄存器。)

DDRB |= _BV(1);         // set the compare match output pin to output
TCCR1A |= _BV(COM1A0);  // enable output compare PIN toggle
TCNT1 = 0;              // set counter start value to 0
OCR1A = 100;            // set compare match value to 100 (the actual delay)
TIFR1 = _BV(OCF1A);     // clear the output compare flag 
TCCR1B |= _BV(CS10);    // enable the timer by setting the pre-scaler
while((TIFR1 & _BV(OCF1A)) == 0);  // wait until the timer counted to 100 (compare flag is set again)

所以实际的延迟取决于:

  • 预分频器的设置
  • 控制器的时钟速度
  • OCR1A的价值

例:
如果预分频器设置为1并且你以10MHz运行,那么你就得到了 t =(1 /(10000000 / s))* 100 = 10us

这应该让你开始。