2016-11-07 155 views
0

任何人都可以找出爲什麼我的外部中斷0不起作用嗎?我正在使用帶有ATmega164P的AVR STK 500板。是否因爲D2引腳有兩個功能?外部中斷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。

10.2.2 EIMSK - 外部中斷屏蔽寄存器

當INT2:0位寫一個,而且狀態寄存器SREG的I位設置(1)時,相應的外部引腳中斷使能。在外部中斷控制寄存器, EICRA,所述中斷檢測控制位定義了外部中斷是否在上升或下降感測到的邊沿或電平激活。

所以,你必須設置

EIMSK |= (1 << INT0); 

,使INT0和潛在EICRA定義要在反應什麼信號邊沿。

+1

這個'EIMSK | =(1 << INT0)',將是設置該位的更透明的方式。 –

+0

@BenceKaulics:當然,原諒我展示了不良的編碼實踐:) –

+0

這只是一個改進要求做出很好的回答更好。 :) –