본문 바로가기

Atmega128/AVR Atmega128

volatile 지시어에 의한 변수 선언과 요청/응답 인터페이스

#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개를 번갈아가며 누르면 작동 (단일 스위치는 작동하지 않는다.)

 

'Atmega128 > AVR Atmega128' 카테고리의 다른 글

AVR Studio 4 .elf파일 누락  (0) 2024.08.13
B포트를 이용한 LED 점멸  (0) 2024.07.12