Пользовательская функция задержки с использованием arduino IDE

Я учусь в классе микропроцессоров, и мы пишем собственные функции задержки, которые действительно точны. Наш профессор дал нам, как я предполагаю, функцию задержки 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;
}

Я просто запутался, как я беру свой профессорский код и переношу его на то, что мне нужно делать. Любая помощь приветствуется!


person Bradley Weiand    schedule 09.11.2016    source источник
comment
Так вы будете использовать регистры AVR в своем скетче?   -  person cagdas    schedule 09.11.2016


Ответы (1)


Я могу дать вам краткий обзор того, что делает предоставленный код.

(Это по памяти, так что не верьте мне на слово. И вы не упомянули тип вашего контроллера. Вам придется подробно просмотреть регистры.)

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 и вы работаете на частоте 10 МГц, вы получите
t = (1 / (10000000/с)) * 100 = 10 мкс.

Это должно помочь вам начать.

person Rev    schedule 09.11.2016