2016-11-07 7 views
0

아무도 내 외부 인터럽트 0 작동하지 않는 이유를 알아낼 수 있습니까? 나는 AVR STK 500 보드에 ATmega164P를 사용하고 있습니다. 핀 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를보십시오. 0 비트가 하나는 상태 레지스터 (SREG)의 I 비트에 기록됩니다 설정 (하나)의 : 외부 인터럽트가 등록 INT2가

마스크 - EIMSK가

10.2.2 해당 외부 핀 인터럽트가 활성화됩니다. 외부 인터럽트 제어 레지스터의 인터럽트 감지 제어 비트 인 EICRA는 외부 인터럽트가 상승 에지 또는 하강 에지에서 감지되는지 또는 레벨 감지에서 감지되는지를 정의합니다.

그래서 당신은

EIMSK |= (1 << INT0); 

는 INT0를 사용하도록 설정해야 잠재적 EICRA 당신이에 반응 원하는 신호 에지 정의합니다.

+1

이'EIMSK | = (1 << INT0)'은 그 비트를 설정하는보다 투명한 방법이 될 것입니다. –

+0

@BenceKaulics : Absolutely, 나에게 나쁜 코딩 실습을 보여주는 나를 용서해주십시오. –

+0

그것은 좋은 대답을 좋게하는 개선 요청이었습니다. :) –