BASIC4MCU | 질문게시판 | Atmega128 인터럽트 이용한 LED 질문 드립니다.
페이지 정보
작성자 호2 작성일2021-11-19 05:35 조회11,735회 댓글5건본문
외부 스위치를 2개 설치해서 그 스위치 중 한 개를 눌렀을 때 LED on, 부저 on되며
다른 한 개를 누르면 LED off, 부저 off가 되어야 합니다. 아래와 같이 작성하였는데
스위치가 불량한건지 아니면 제가 코드를 잘못 작성한건지
첫 번째 외부 스위치를 누르면 LED가 계속 켜지는 경우도 있고 누르는 순간만 켜지는 경우가 있습니다.
만약 LED가 계속 켜지는 경우라면 다른 외부 스위치를 눌렀을 때 LED가 꺼져야하는데 그렇게 되지가 않네요....
어떤게 문제인지 궁금합니다.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
DDRE = 0xFF;
PORTE = 0x00; // led off
DDRB = 0x0F;
PORTB = 0x01; // buzz off
//set external interrupt
cli();
EIMSK = 0x03;
EICRA = 0x0A;
sei();
while(1)
{
}
}
ISR(INT0_vect)
{
PORTE ^= 0x0F; // LED on
PORTB = 0x00; // buzz on
}
ISR(INT1_vect)
{
PORTE = 0x00; // led off
PORTB = 0x01; // buzz off
}
댓글 5
조회수 11,735master님의 댓글
master 작성일
PORTE ^= 0x0F; // LED on
이 코드는 PE0~PE3을 비트반전(토글) 시키고 있습니다.
PORTE = 0x0F; // LED on
xor 연산자를 빼고 이렇게 작성하셔야겠죠
호2님의 댓글
호2
정말 감사합니다. 이해했습니다.
master님의 댓글
master 작성일
만약 PD0,PD1에 풀업저항을 사용하고 있지 않다면
메인함수 초기에 다음 코드를 추가하세요
PORTD=0x03; // 내부 풀업저항 사용(PD0,PD1)
호2님의 댓글
호2
내부 풀업저항을 사용한 방법은 이해했습니다. 감사합니다.
다만 제가 배우고 있는 곳에서 알려준대로 브레드보드에 10[㏀]의 풀업저항을 연결하였는데 INT0번에 해당하는 스위치를 누르는 순간에만 LED가 ON될때도 있고 계속 ON될때도 있습니다.(원래는 계속 ON되어야 합니다.) 혹시 어떤것이 문제인지 알 수 있을까요?
master님의 댓글
master
채터링이 있으면 누를 때와 뗄 때 여러번 신호가 들어가게 됩니다.
신호가 홀수번이면 정상동작하는 것처럼 보이게되고, 짝수번이면 동작하지 않은 것처럼 보이게 됩니다.
스위치에 병렬로 104(0.1uF)~10uF 정도의 커패시터를 연결하세요
풀업저항과 함께 적분회로처럼 동작해서 스위치 채터링을 감쇄시킵니다.