を有効にする前に起こった変化から起こります。私はINT1をソフトウェア割り込みとして使用しようとしています。私はINT1の関連するPORTD3を外部情報に応じてハイまたはローに手動で設定します。私が欲しいのは、デバイスの起動時にピンをハイまたはローに設定してから、ピンをハイにしてから割り込みを有効にすると割り込みを発生させることなく、ピン上で割り込みをイネーブルにすることです。割り込みは、割り込みが、私はAtmega328pマイクロコントローラとArduinoの宇野を使用してい
私が割り込みを有効に場所は関係するように見えるdoes notの - 私はいくつかの点で、ピンの状態を変更した場合、その有効に一度割り込みが発生します。 (かかわらずPORTD3が高く設定された場所の、PORTD3が高い場合に割り込みが発生します)とすぐにグローバル割り込みがSEIの呼び出し(で有効になっているよう
int main(void)
{
DDRD |= (1<<DDD7)|(1<<DDD3);//7 for siren 3 for software int1
USART_Init(MYUBRR);//Initialize USART
while(door!='C' && door!='O'){//get door state on startup
door = getDoorState();
}
if(door=='O')
PORTD |= 1<<PORTD3;
else
PORTD &= ~(1<<PORTD3);
EIFR &= ~(1<<INTF1);//clear flag bit before enable, I'd heard this may help????
EIMSK |= (1<<INT1);//enable door switch interrupt
EICRA |= (1<<ISC00)|(1<<ISC10);//int1 and int0 set for any logical change
sei();//global interrupt enable
while (1)
{}
}
場合や、SEI:ここでは、コードのスニペットです)です。 sei()を呼び出すことは、理想的にはこのコードで割り込みを発生させるべきではありません。
多くHWデバイスにかかわらず、グローバル割込み状態の個々のイベント(例えば、変更のInport)の割り込み状態を設定します。次に、グローバル割り込み状態を有効にすると、古いイベントの割り込みが発生します。割り込みを有効にする前に古いイベントをクリア/確認する必要があります。それがどのように行われたかは、マニュアルに書かれています。 – 4386427
データシートを少し見てみると、これは間違っていると思います。 'EIFR&=〜(1 << INTF1);'この行はINTF1に '0 'を書き込みます。しかし、 '1'を書いてフラグをクリアする必要があるようです。 'EIFR | =(1 << INTF1);を試してください。 – 4386427