본문 바로가기
EmbeddedSystem/AVR

[AVR] External Interrupts 2

by TSpoons 2024. 10. 15.

Interrupt Vector Table

  • 메모리에서 ISR의 주소가 적혀있는 데이터셋

interrupt Vecto table의 위치(주소)는 정해져 있고, 주소값은 빌드(중 linking) 시 주소값이 해당 주소의 쓰여진다.

그 주소값은 인터럽트 핸들러의 함수 위치이다.

Interrupt Vector Table in AVR

  • AVR은 인터럽트 핸들러 함수의 주소가 저장되어 있는게 아니라 명령어(Assembly어)가 저장되어 있다.

#include <avr/interrupt.h>

ISR(INT7_vect){ 
    PORTC ^= 0X03;
    // 함수 정의(ISR()) :  이 함수가 ISR임을 compiler가 인지
    // 인터텁트 벡터(INT7_vect) 어떤 interrupt handler인지 compiler에게 알려줌
}

.lss file

https://www.fourwalledcubicle.com/LSSClassifier.php

Pin Change Interrupt

  • External interrupt가 부족할 때 사용
  • 한 묶음의 pin 중 하나라도 핀의 논리 상태가 변하면 interrupt 발생
    ◦ ex) PCINT7..PCINT0 pin 상태가 변하면 PCI0 interrupt 발생

atmega1281 - PCINT

 

PCICR - Pin Change Interrupt Control Register

- PCIEn bit가 1이면 PCINTn 활성화

PCMSK – Pin Change Mask Registers (0, 1, 2)

- 해당 bit가 1이면 핀의 인터럽트가 enable

PCIFR – Pin Change Interrupt Flag Register

- PCMSK 레지스터에서 값이 1인 bit에 대응되는 pin들 중 어느 하나라도 상태가 변하면 이 레지스터의 bit는 1

 

INT vs PCINT

  • INT의 경우 pin 하나가 ISR 하나에 일대일대응
  • PCINT의 경우 여러 pin이 하나의 ISR에 대응
    => ISR에서 어떤 pin의 상태 변화가 interrupt를 일으켰는지를 찾아서처리해야 함(How?)

 

#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t last_pin_state = 0; // 이전 상태를 저장하는 전역 변수(컴파일러 최적화를 방지)

void setup() {
    // PORTC를 출력으로 설정
    DDRC |= 0x03; // PC0, PC1을 출력으로 설정
    PORTC &= ~0x03; // 초기 상태를 LOW로 설정

    // 핀 변화 인터럽트 설정
    PCICR |= _BV(PCIE0); // PCIE0를 활성화하여 PCINT0~PCINT7 핀에서 인터럽트 발생
    PCMSK |= _BV(PCINT0) | _BV(PCINT1); // PCINT0과 PCINT1 핀에 대해 인터럽트 마스크 설정

    // 전역 인터럽트 활성화
    sei();

ISR(PCINT0_vect) {
    // 상태 레지스터를 읽어 어떤 핀에서 변화가 발생했는지 확인
    uint8_t pin_state = PINB; // 예: PINB 레지스터를 읽어 상태 확인
    uint8_t changed_pins = pin_state ^ last_pin_state;
    
    PORTC ^= (1 << PC0); // PC0 토글
    last_pin_state = pin_state;
    }
}

int main(void) {
    setup();

    while (1) {
        // 메인 루프에서 다른 작업 수행 가능
    }
}

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

[AVR] Timer / Counter  (0) 2024.11.05
[AVR] Microchip studio Tutorial  (1) 2024.10.24
[AVR] External Interrupt  (0) 2024.10.14
[AVR] atmega1281 - switch로 LED 점멸 제어  (0) 2024.10.02
[AVR] atmega1281 - switch / delay 함수  (1) 2024.09.30