2016-11-09 5 views
0

Я нахожусь в классе микропроцессоров, и мы пишем наши собственные функции задержки, которые на самом деле точны. Наш профессор дал нам, что я предполагаю, функция задержки на 4 мс. Я действительно не понимаю, как перенести это на задержку 0,25 с или на 1 с, которые необходимы для моей домашней работы.Функция пользовательской задержки с использованием arduino IDE

Данная функция выглядит следующим образом (Предположим, что _BV() определяется как _BV (х) 1 < < (х)):

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; 
} 

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

+0

Значит, вы также будете использовать регистры AVR в своем эскизе? – cagdas

ответ

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

Это должно вам начать работу.