BASIC4MCU | 질문게시판 | 외부인터럽트 LED 제어
페이지 정보
작성자 rhythm 작성일2021-06-08 17:23 조회18,798회 댓글7건본문
인터럽트 사용하여 스위치 2개로 LED 시프트 시키려구 하는데 스위치 1개로는 왼쪽 쉬프트까진 했는데
나머지 1개로 오른쪽 쉬프트가 안되는데 혹시 봐주실 수 있나요?
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define DEBOUNCING_DELAY 20
void msec_delay(int n);
static int index=0;
static unsigned char pattern[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
int main()
{
DDRA = 0xFF;
PORTA = pattern[0];
PORTB = pattern[0];
DDRD = 0x00;
DDRB=0xFF; PORTB=0xFF;
DDRD=0x00; PORTD=0xFF;
EICRA = (1<<ISC01);
EIMSK = (1<<INT0);
EIMSK = (1<<INT1);
sei();
while(1)
{ PORTA = pattern[index];PORTB = pattern[index]; }
}
ISR(INT0_vect)
{
if(++index==8) index=0;
msec_delay(DEBOUNCING_DELAY);
while(~PIND & 0x01);
msec_delay(DEBOUNCING_DELAY);
EIFR = (1<<INTF0);
}
ISR(INT1_vect)
{
if(--index==0) index=8;
msec_delay(DEBOUNCING_DELAY);
while(~PIND & 0x01);
msec_delay(DEBOUNCING_DELAY);
EIFR = (1<<INTF1);
}
void msec_delay(int n)
{
for(; n >0; n--)
_delay_ms(1);
}
댓글 7
조회수 18,798master님의 댓글
master 작성일
EIMSK=(1<<INT0); EIMSK=(1<<INT1);
이렇게 실행하면 나중에 선언한 INT1만 실행 됩니다.
EIMSK=(1<<INT0) | (1<<INT1);
이런식으로 실행해야하죠
master님의 댓글
master 작성일
//
ISR(INT1_vect){
if(--index==0)index=8;
msec_delay(DEBOUNCING_DELAY);
while(~PIND & 0x01); // <--- INT1은 PD1이고 0x01이 아닌 0x02로 & 해야 합니다
msec_delay(DEBOUNCING_DELAY);
EIFR=(1<<INTF1);
}
master님의 댓글
master 작성일
volatile int index=0;
인터럽트에서 사용하는 전역 변수는 volatile 형을 사용해야 합니다.(코드비젼은 volatile 없어도 됨)
master님의 댓글
master 작성일
if(--index==0)index=8;
index는 0~7 범위여야 하는데 8이 나오면 안됩니다.
master님의 댓글
master 작성일
EICRA=(1<<ISC01);
INT0만 폴링엣지로 설정하면 안되고 INT1도 설정해줘야 합니다.
rhythm님의 댓글
rhythm
그러면 EICRA=(1<<ISC01) | (1<<ISC11) ; 로 바꾸면 될까요??
master님의 댓글
master 작성일
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
volatile int index=0;
//
ISR(INT0_vect){
if(++index>=8)index=0;
_delay_ms(20); while(~PIND&1); _delay_ms(20);
EIFR=1;
}
//
ISR(INT1_vect){
if(--index>=8)index=7;
_delay_ms(20); while(~PIND&2); _delay_ms(20);
EIFR=2;
}
//
int main(){
PORTA=PORTB=pattern[0]; DDRA=0xFF; DDRB=0xFF; PORTD=0xFF;
EICRA=0xAA; EIMSK=3;
sei();
while(1)PORTA=PORTB=~(1<<index);
}