1

使用中の 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 になっています。「切り替えトリガー」の項目を削除すると、信号は問題ありません。

4

1 に答える 1