0

私はマイクロコントローラが初めてです。次のコードは、方形波の周期を測定します。私は理解していないいくつかの行をマークしました。コードは次のとおりです。

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_CAPT_vect)
{
    int counter_value = ICR1; //16 bit value
    PORTB = (counter_value >> 7); // What has been done here?
    TCNT1 = 0; // why this line?

}

int main(void)
{
DDRB = 0xFF;
TCCR1A = 0x00;
TCCR1B = 0b11000010;
TIMSK = 0b00100000;
sei();
while(1);
cli();
}

それらの行で実際に何が行われたのでしょうか?

4

1 に答える 1

0
ISR(TIMER1_CAPT_vect)
{
    int counter_value = ICR1; //16 bit value
    PORTB = (counter_value >> 7); // What has been done here?

PORTB8本の出力ラインのセットです。おそらく、それらはあなたが言及していないデバイスにバスで接続されています。おそらく、2 進数を表示するための LED のセットでさえあります。

カウンタの結果は 16 ビットです。最上位ビットを取得するには、結果を右にシフトして下位ビットを破棄します。(この操作は精度を失いますが、出力は 16 ではなく 8 ビットしかありません。) なぜシフトが 8 ではなく 7 なのか、またはカウンターの unsigned 値が最初に signed int として保存される理由については、私は知りません。知りません。間違いだと思います。PORTB = (ICR1 >> 8);代わりにやったでしょう。

    TCNT1 = 0; // why this line?

キャプチャの時間を記録して送信したのでPORTB、次のキャプチャのためにタイマーをリセットします。

}
于 2016-01-29T19:52:53.473 に答える