2016-07-10 24 views
0

を有効にする前に起こった変化から起こります。私は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()を呼び出すことは、理想的にはこのコードで割り込みを発生させるべきではありません。

+0

多くHWデバイスにかかわらず、グローバル割込み状態の個々のイベント(例えば、変更のInport)の割り込み状態を設定します。次に、グローバル割り込み状態を有効にすると、古いイベントの割り込みが発生します。割り込みを有効にする前に古いイベントをクリア/確認する必要があります。それがどのように行われたかは、マニュアルに書かれています。 – 4386427

+1

データシートを少し見てみると、これは間違っていると思います。 'EIFR&=〜(1 << INTF1);'この行はINTF1に '0 'を書き込みます。しかし、 '1'を書いてフラグをクリアする必要があるようです。 'EIFR | =(1 << INTF1);を試してください。 – 4386427

答えて

0

4386427が正しいです。ビットはゼロに設定することでクリアされます。それは私を捨てたので私には直観に反しているようだが、今はうまくいく。

EIFR |= (1<<INTF1); 
0

EIFR &= ~(1<<INTF1)が間違っています。

これを行うための正しい方法はEIFR = 1<<INTF1です。

データシートは言う:フラグがそれに「1」を書き込むことでクリアされます。

関連する問題