본문 바로가기

하드웨어/atmega128

atmega128 - interrupt 사용하여 택트버튼으로 LED 켜기 #13

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로 설정하면 된다. 

 

 


 

https://www.youtube.com/watch?v=JYhAW1V338k&t=74s

 

택트의 올바른 위치와 사용법

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;
}