私は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 秒かかるようにするにはどうすればよいですか?