728x90
3가지 셋팅을 해줘야 인터럽트를 사용할 수 있다.
인터럽트 셋팅 1) sreg 상태 레지스터의 인터럽트 비트 켜기
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
기능 | I | T | H | S | V | N | Z | C |
인터럽트 비트는 7이다.
SREG |= 0x80 을 해줘야한다.
인터럽트 셋팅 2) EIMSK 레지스터에 사용할 인터럽트 비트 활성화
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
기능 | INT7 | INT6 | INT5 | INT4 | INT3 | INT2 | INT1 | INT0 |
내가 사용할 인터럽트는 INT4, INT5이므로
EIMSK = 0x30; 으로 셋팅해줘야한다.
인터럽트 셋팅 3) 트리거 조건 설정
트리거 조건 설정하는 레지스터는 두가지다.
EICRA, EICRB
EICRA는 INT0~INT3 담당
EICRB는 INT4~INT7 담당
INT4, INT5를 사용하기 때문에 EICRB를 세팅해줘야한다.
추가로 눌렀다 뗐을 때냐
눌르고 있을 때냐
뗐을 때냐
트리거 조건이 있다.
아래 표를 보면 된다.
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
기능 | ISC71 | ISC70 | ISC61 | ISC60 | ISC51 | ISC50 | ISC41 | ISC40 |
나는 누르는 순간 발생하기 위해 다음과 같이 셋팅한다.
EICRB = 0x00;
만약 INT4 에서
상승에지에서 인터럽트 발생을 시키고싶다 = 버튼을 눌렀다 떼는 순간
ISC41, ISC40 모두 1로 설정하면 된다.
택트의 올바른 위치와 사용법
A에 GND
B에는 PE4 (INT4)를 결선한다.
버튼을 누를 때 인터럽트 발생
/*
* Course2.c
*
* Created: 2025-07-12 오후 6:11:34
* Author : gnsdl
*/
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
void setup() {
DDRA = 0xff;
DDRB = 1; // PB0 출력
DDRE = 0; // PE4 입력
PORTE = 48; // PE4 내부 풀업 켜기 (0b00110000)
EIMSK = 0x30; // INT4 인터럽트 활성화 (0b00110000)
EICRB = 0x00; // INT4(PE4) 저레벨 감지
sei(); // 전역 인터럽트 허용
}
int main() {
setup();
while (1) {
// 계속 대기
}
}
ISR (INT4_vect)
{
PORTA = 0x10;
}
ISR (INT5_vect)
{
PORTA = 0x00;
}
'하드웨어 > atmega128' 카테고리의 다른 글
atmega128 - interrupt 사용하여 택트버튼으로 FND 1부터 4 테스트 #14 (1) | 2025.07.26 |
---|---|
atmeaga - esp8266 펌웨어 올리기 (0) | 2025.03.27 |
atmega128 - ESP8266 모듈 baud rate 변경 #11 (0) | 2025.03.27 |
atmega128 - ESP8266 모듈을 이용해 웹서버에 get request보내기 #10 (0) | 2025.03.26 |
atmega128 - 터미널 테스트 출력 #9 (0) | 2025.03.17 |