使用中の AVR は ATmega2560 です。
生成されるパルス幅が 1 秒の入力信号があります。
この信号は、AVR (INT0) の外部割り込みピンに接続されています。
INT0 は次のように初期化されます。
コード:
DDRD &= ~(1 << PD0);
PORTD |= (1 << PD0);
EIMSK = 1 << INT0; // enable
EICRA |= (1 << ISC00) | (1 << ISC01); // trigger on rising edge
sei(); //global interrupts
この外部割り込みに対する ISR の使命は、a) どのエッジ (最初のケースは立ち上がりである必要があるか) を把握し、b) どのエッジに基づいてアクションを実行することです。
ISR は次のようになります。
コード:
ISR(INT0_vect)
{
if(EICRA == 0x02)
{
// falling edge detected
doFallingEdgeFunction_lightLED0();
// quickly change the trigger to capture opposite edge
EICRA |= (1 << ISC00) | (1 << ISC01); // trigger on rising edge
}
else if(EICRA == 0x03)
{
doRisingEdgeFunction_lightLED1();
// change trigger on falling edge
EICRA = (1 << ISC01);
EICRA &= ~(1 << ISC00);
}
}
エッジを検出できます。正しい LED が点灯しますが、何らかの理由で ISR のエッジ割り込みビットを変更すると、入力信号が 1 秒幅ではなく 0.1 秒幅に減少します。
スコープでは、元の信号がミラーリングされていますが、幅が 10 分の 1 になっています。「切り替えトリガー」の項目を削除すると、信号は問題ありません。