2016-11-07 2 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.

10.2.2 EIMSK - Внешнее прерывание в регистр маски

Когда INT2: 0 бит записывается в один и I-бит в регистре состояния (SREG) установлен (один), то соответствующее внешнее прерывание контакта включено. Биты управления чувствительностью прерывания в Регистре управления внешним прерыванием, EICRA, определяет, будет ли внешнее прерывание активировано на восходящем или спадающем фронте или уровне.

Таким образом, вы должны установить

EIMSK |= (1 << INT0); 

, чтобы позволить INT0 и потенциально EICRA определить, какой сигнал края вы хотите реагировать на.

+1

Этот 'EIMSK | = (1 << INT0)', был бы более прозрачным способом установки этого бита. –

+0

@BenceKaulics: Абсолютно, простите, я демонстрирую плохую практику кодирования :) –

+0

Это был просто запрос на улучшение, чтобы лучше дать хороший ответ. :) –

Смежные вопросы