Atmega128/AVR Atmega128
volatile 지시어에 의한 변수 선언과 요청/응답 인터페이스
펭킹
2024. 7. 12. 15:51
#include <avr/io.h>
#include <avr/interrupt.h>
#define NUM_EVENT 5
#define REQUEST 1
#define NOT_REQUEST -1
#define REPLY 0
volatile int req_INT0 = REQUEST, req_INT1 = NOT_REQUEST;
// INT0 인터럽트 서비스 루틴
ISR(INT0_vect)
{
static long event = 0;
if(req_INT0 == REQUEST){
event++;
if(event >= NUM_EVENT){
event = 0;
req_INT0 = REPLY;
}
}
}
// INT1 인터럽트 서비스 루틴
ISR(INT1_vect)
{
static long event = 0;
if(req_INT1 == REQUEST){
event++;
if(event >= NUM_EVENT){
event = 0;
req_INT1 = REPLY;
}
}
}
int main(void){
// 외부 인터럽트 INT0 및 INT1 활성화
EIMSK |= (1 << INT0) | (1 << INT1);
// 인터럽트 감지 방식 설정: INT0 및 INT1의 하강 에지에서 인터럽트 발생
EICRA |= (1 << ISC01) | (1 << ISC11);
// PD0 및 PD1에 풀업 저항 활성화 (필요한 경우)
PORTD |= (1 << PD0) | (1 << PD1);
// PA0을 출력으로 설정
DDRA |= (1 << PA0);
// 전역 인터럽트 활성화
sei();
while(1){
if(req_INT0 == REPLY){
PORTA ^= (1 << PA0); // LED 토글
req_INT0 = NOT_REQUEST; // INT0 요청 초기화
req_INT1 = REQUEST; // INT1 요청 설정
} else if(req_INT1 == REPLY){
PORTA ^= (1 << PA0); // LED 토글
req_INT0 = REQUEST; // INT0 요청 설정
req_INT1 = NOT_REQUEST; // INT1 요청 초기화
}
}
}
스위치 2개를 번갈아가며 누르면 작동 (단일 스위치는 작동하지 않는다.)