2016-02-17 61 views
2

當一個5v輸入提供給int0時,應該發生一個外部中斷向量。 中斷應更改一個易失性整數標誌,以允許指示燈連接到PORTB上的某個引腳。在Atmel工作室中編譯沒有錯誤。當5v電源發送到int0引腳時,問題不會發生變化。這是中斷不觸發嗎?ATMEGA328P外部中斷avr gcc不會發生

#include <avr/io.h> 
#include <stdio.h> 

#define F_CPU 16000000UL 
#include <util/delay.h> 
#include <avr/interrupt.h> 

volatile int pwm_flag=0; 



int main(void) 

{ 

DDRD &= ~(1 << DDD2);  // Clear the PD2 pin 
// PD2 (PCINT0 pin) is now an input 

PORTD |= (1 << PORTD2); // turn On the Pull-up 
// PD2 is now an input with pull-up enabled 

EICRA |= (1 << ISC00)|(1 << ISC10); // set INT0 to trigger on  Rising  edge 
EIMSK |= (1 << INT0);  // Turns on INT0 
sei();     // turn on interrupts 
DDRB = 0xFF; 
PORTB = 0x00; 

while(1) 
    { 
    if(pwm_flag==1)//if flag is raised 
     { 
     PORTB = 0xFF;//turn on all pins of portb 

     pwm_flag=0;//reset flag to 0 
     } 

    } 
} 

ISR (INT0_vect) 
    { 
    /* interrupt code here */ 

    pwm_flag =1;//raise flag 
    } 

回答

1

問題是,當一個5V電源被髮送到INT0引腳發生沒有變化。

如何發送5V到INT0引腳?您的代碼將INT0引腳設置爲輸入,並帶有上拉電阻,所以除非您將其短接到地面它的電壓爲5V

另外,你是什麼意思沒有發生變化? LED是打開還是關閉?

另一件事是,行:對適當的銷的任何邏輯變化發生

EICRA |= (1 << ISC00)|(1 << ISC10); 

套既INT0和INT1。 名稱爲ISC0x控制位INT0的位,稱爲ISC1x的位用於配置INT1。在你的代碼的混合都和你結束了以下配置:

ISC01 | ISC00 | meaning 
------------------------------------------------------------------------- 
    0 |  1 | any logical change on INT0 generates an interrupt request 

ISC11 | ISC10 | meaning 
------------------------------------------------------------------------- 
    0 |  1 | any logical change on INT1 generates an interrupt request 
0

如果你試圖從PORTB引腳提供5V電源的LED那麼也許這是你的問題。大多數微控制器引腳可以吸收比他們所能提供的更多的電流。也許你的LED沒有獲得它所需要的電流?

您的接線應如下所示: 將LED的正腳連接到5V。負腿連接到一個100-500歐姆的小電阻。將電阻的另一端連接到PORTB上的引腳。

現在您可以將PORTB寫入0x00來打開LED或0xFF來將其關閉。

要測試LED是否正常工作,請在PORTB的低電平和高電平之間測試主循環中的LED,並在兩者之間注意延遲。

如果可行。然後測試你的ISR。如果ISR不起作用,那麼ISR就是問題所在。

請記住,在您當前的EICRA配置中,您正在上升沿觸發中斷。所以如果引腳已經很高,不會發生中斷。

我在下面更改了您的代碼,因此LOW處於ON狀態,HIGH處於OFF狀態。

int main(void){ 
    DDRD &= ~(1 << DDD2); // set PD2 DDR as input 
    PORTD |= (1 << PORTD2); // set PD2 as input pull-up 

    EICRA |= (1 << ISC00)|(1 << ISC10); // set INT0 to trigger on rising edge 
    EIMSK |= (1 << INT0); // Turns on INT0 

    DDRB = 0xFF; // set PORTB as all outputs 
    PORTB = 0xFF; // set PORTB high 

    sei(); // turn on interrupts 

    while(1){ 
     if(pwm_flag!=0){ // check flag 
      PORTB = 0x00; // set PORTB low 
      pwm_flag=0; // reset flag 
    } 
} 

ISR (INT0_vect){ 
    pwm_flag = 1; // raise flag 
} 
+0

AVR可以爲LED提供充足的電流。 – JimmyB

+0

對於一個小的是的,但我仍然認爲最好的做法是沉入電流而不是提供電流。 – DeeCee

+0

這是個人偏好還是一般性建議? - 儘管如此,AVR的數據表顯示「端口B輸出緩衝器具有對稱的驅動特性,同時具有高吸收和源功能。」所以在這方面沒有太多的錯誤要做。 – JimmyB