2016-11-09 10 views
0

私はマイクロプロセッサークラスで、私たちは実際に正確な独自の遅延関数を書いています。私たちの教授は、4msの遅延機能を私に与えました。私は宿題に必要な.25秒か1秒の遅れにそれを転送する方法を本当に理解していません。arduino IDEを使用したカスタム遅延関数

所定の関数は、以下の通りである((_BVを想定)は(X)(X)1 < < _BVのように定義される):

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; 

I以外は宿題を完了するために必要なコードを書いています2つの遅延機能。ここで

は、私がこれまで持っているものです。

#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に設定し、あなたが
トン=(/ sの1 /(10000000))を得た10MHzで実行された場合* 100 = 10US

これは、あなたが始める必要があります。

関連する問題