2016-11-07 25 views
0

誰かが私の外部割り込み0が機能しない理由を理解できますか?私はそれにATmega164PとAVR STK 500ボードを使用しています。それはピンD2に2つの機能があるからですか?外部割り込み0は機能しません

#include <asf.h> 
#include <avr/interrupt.h> 
#include <avr/io.h> 

#define F_CPU 8000000UL 
#include <util/delay.h> 

ISR(INT0_vect) 
{ 
    PORTB = 1; 
    for(int i = 0; i < 7; i++) 
    { 
     _delay_ms(500); 
     PORTB << 1; 
    } 
} 

int main (void) 
{ 
    board_init(); 

    sei(); 

    PORTD = 0xFF; 
    DDRD = 0x00; 
    PORTB = 0x00; 
    DDRB = 0xFF; 

    while(1) 
    { 
     PORTB = PIND; 
    } 
} 
+1

board_init()は何をしますか?あなたはセットアップ/外部割り込みを有効にしていますか? –

+2

ISR内部で「遅延」しないでください。 – JimmyB

+0

JimmyBの声明を強調するために、ISR内に遅延を入れないでください。 –

答えて

3

私は外部割り込みを有効にしないと思います。

データシートのセクション10.2を見てください。 0ビットが1とステータスレジスタ(SREG)中のIビットに書き込まれている設定されている(1):外部割り込みレジスタINT2が

マスク - EIMSKが

10.2.2対応する外部ピン割り込みがイネーブルされます。外部割り込み制御レジスタの割り込み検出制御ビット EICRAは、外部割り込みが立ち上がりエッジまたは立ち下がりエッジでアクティブにされるか、またはレベル検出されるかを定義します。

だからあなたはあなたがで反応したい信号のエッジを定義するためにINT0、潜在的にEICRAを有効にするために

EIMSK |= (1 << INT0); 

を設定する必要があります。

+1

この 'EIMSK | =(1 << INT0)'は、そのビットを設定するより透過的な方法です。 –

+0

@BenceKaulics:間違いなく、悪いコーディング練習を実証してくれたことを御了承ください:) –

+0

良い答えをより良くするための改善要求でした。 :) –

関連する問題