3

私はATMega8515を持っており、タイマー割り込みをセットアップして、プロセスに時間がかかりすぎると停止するようにしようとしています。

タイマーを次のように設定します。

void init_software_interupt(double time)
{
    OCR1A = time;
    TCCR1A = 0;
    TCCR1B = 0;
    TCCR1B |= (1 << WGM12);
    TCCR1B |= (1<<CS10);
    TCCR1B |= (1<<CS12);
    TIMSK |= (1 << OCIE1A);
    sei();
}

これはうまくいきます。クロック秒を 8MHz クロックの 7812 と計算したところ、1 秒ごとに出力されるとまったく同じように動作します。

//Timer Interupt
int seconds = 0;
ISR(TIMER1_COMPA_vect){
    seconds++;
    printf("in timer overflow: %d seconds have passed\r\n",seconds);
    in_progress = FALSE;
}

問題は、関数 unlock_door() を 1 秒のオーバーフロー カウントに 750 ミリ秒呼び出すと、操作に 250 ミリ秒しかかからないことです。これは十分な長さではありません。

関数を呼び出す前に出力比較レジスタを設定しようとしましたが、影響はないようです:

OCR1A = 7812;
unlock_door();

ただし、現在のオーバーフローは変更されません。

関数を呼び出す前にオーバーフロー タイマーをリセットして、確実に 1 秒かかるようにするにはどうすればよいですか?

4

1 に答える 1

3

オーバーフロー割り込みではなく、比較割り込みを使用しているようです。OCR1Aカウンターが比較されている値をTCNT1格納し、実際のタイマー値を格納していると思います。試す:

TCNT1 = 0;
unlock_door();

ちなみに、 AVRタイマーに関する良い記事があります。それは「AVR タイマーの初心者向けガイド」と呼ばれていますが、リファレンスとしても非常にうまく機能します。

于 2013-11-10T17:43:48.337 に答える