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
Pin Change Interrupt
- External interrupt가 부족할 때 사용
- 한 묶음의 pin 중 하나라도 핀의 논리 상태가 변하면 interrupt 발생
◦ ex) PCINT7..PCINT0 pin 상태가 변하면 PCI0 interrupt 발생
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 |