인터럽트는 모두34종이 있는데 이것들은 모두 외부 인터럽트에 해당하며 차단 가능하다.
인터럽트를 구분해 보면 외부 핀 8개, 타이머0 2개, 타이머1 5개, 타이머2 2개, 타이머3 5개, USART0 3개, USART1 3개, 기타 6개이다.
◆ 외부 인터럽트 벡터
Vector NO. | Program Address | IAR Source | Interrupt Definition |
2 | 0x0002 | #pragma vector = EXT_INT0_vect | External Interrupt Request 0 |
3 | 0x0004 | #pragma vector = EXT_INT1_vect | External Interrupt Request 1 |
4 | 0x0006 | #pragma vector = EXT_INT2_vect | External Interrupt Request 2 |
5 | 0x0008 | #pragma vector = EXT_INT3_vect | External Interrupt Request 3 |
6 | 0x000A | #pragma vector = EXT_INT4_vect | External Interrupt Request 4 |
7 | 0x000C | #pragma vector = EXT_INT5_vect | External Interrupt Request 5 |
8 | 0x000E | #pragma vector = EXT_INT6_vect | External Interrupt Request 6 |
9 | 0x0010 | #pragma vector = EXT_INT7_vect | External Interrupt Request 7 |
◆ 인터럽트 레지스터
SREG(AVR Status Register) : 상태 레지스터
이 레지스터는 마이크로 프로세서가 연산을 수행한 후에 연산 결과를 표시하는 레지스터이다.
이 레지스터는 전체 8비트로 이루어져 있으며 각각의 비트들은 읽고 쓸 수 있는 비트이다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
I | T | H | S | V | N | Z | C |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
- I(Global Interrupt Enable) ->전체 인터럽트 인에이블 비트
AVR 마이크로 프로세서의 모든 인터럽트를 사용하기 위해서는 반드시 1로 세트 하여야 한다.
- T(Bit Copy Storage)
- H(Half Carry Flag)
- S(Sign Bit, S=N+V)
- V(Two's Complement Overflow Flag)
- N(Negative Flag)
- Z(Zero Flag)
- C(Carry Flag)
SP(Stack Pointer) : 스택 포인터
이 레지스터는 입출력 번지에서 16비트 레지스터로 구성되어 있다.
이 16비트들은 $0060 ~ $025F 영역에서 SRAM의 128바이트를 어드레싱(번지 지정) 하는데 사용된다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
SP15 | SP14 | SP13 | SP12 | SP11 | SP10 | SP9 | SP8 |
SP7 | SP6 | SP5 | SP4 | SP3 | SP2 | SP1 | SP0 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
스택 포인터는 서브루틴과 인터럽트 스택들이 위치하고 있는 데이터 SRAM 스택 영역을 가리킨다.
이 데이터 SRAM 안에 스택 영역은 어떠한 서브루틴 호출들이 실행되거나 인터럽트가 인에이블되기 전에 프로그램에 의해 정의 되어져야만 한다.
스택 포인터는 $0060보다 상위 포인터에서 세트 되어야만 한다.
MCUCR(MCU Control Register) : MCU 제어 레지스터
이 레지스터는 MCU의 제어를 위한 레지스터이다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
SRE | SRW10 | SE | SM1 | SM0 | SM2 | IVSEL | IVCE |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
- SRE(External SRAM/XMEM Enable)
- SRW10(Walt State Select Bit)
- SE(Sleep Enable)
이 비트는 SLEEP 명령이 실행될 때 1로 세트되어 MCU가 슬립 모드로 들어가도록 한다.
- SM2...0(Sleep Mode Select Bits2, 1, 0) ->슬립 모드
이 비트를 이용하여 슬립 모드를 6가지우의 하나로 선택한다.
SM2 | SM1 | SM0 | Sleep Mode |
0 | 0 | 0 | Idle |
0 | 0 | 1 | ADC Noise Reduction |
0 | 1 | 0 | Power-down |
0 | 1 | 1 | Power-save |
1 | 0 | 0 | Reserved |
1 | 0 | 1 | Reserved |
1 | 1 | 0 | Standby |
1 | 1 | 1 | Extended Standby |
6가지 슬립 모드의 동작 요약
슬립 모드 | 차단되지 않는 클럭 | 오실레이터 | 슬립 모드의 해제 방법 | ||||||||||
clk (CPU) |
clk (FLASH) |
clk (I/O) |
clk (ADC) |
clk (ASY) |
메인 클럭 |
타이머 클럭 |
INT7~0 | TWI | Timer0 | SPM/ EEPROM |
ADC | 다른 I/O | |
Idle | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ||
ADC Noise Reduction |
∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ∨ | ||||
Power- down |
∨ | ∨ | |||||||||||
Power- save |
∨ | ∨ | ∨ | ∨ | ∨ | ||||||||
Standby | ∨ | ∨ | ∨ | ||||||||||
Extended Standby |
∨ | ∨ | ∨ | ∨ | ∨ | ∨ |
* Idle 모드
CPU의 동작을 멈추지만 SPI, USART, 아날로그 비교기, ADC, TWI, 타이머/카운터, 워치독, 인터럽트 시스템 등의 동작은 계속된다.
* ADC Noise Reduction
CPU의 동작을 멈추지만 ADC, TWI, 타이머/카운터, 워치독, 외부 인터럽트 등의 동작은 계속된다.
* Power-down
외부 크리스탈, 세라믹 레조네이터 발진이 정지되며 TWI, 워치독, 외부 인터럽트 등의 동작은 계속된다.
이 모드에서는 해제될 때는 클럭 발진회로가 안정 상태에 들어가는 충분한 시간이 필요한데 이는 사용자가 지정 할 수 있다.
* Power-save
Power-down 모드와 유사하지만 1가지가 다르다.
ASSR 레지스터에서 AS0 비트는 1로 설정하여 타이머/카운터0이 TOSC1, TOSC2 단자로 입력 되는 외부 클럭에 의하여 비동기로 동작할 때 이 모드를 사용한다는 것이다.
* Standby
슬립 모드에서도 클럽 발생 회로인 오실레이터가 동작하고 있다는 것을 제외하면 Power-down 모드와 유사하다.
이 모드는 외부 크리스탈, 레조네이터를 사용하는 경우에만 유효하다.
오실레이터가 동작하고 있으므로 Standby 모드가 해제되어 정상 동작이 개시 되는데 6개의 클럭 사이클만이 소요된다.
* Extended Standby
슬립 모드에서도 클럭 발생 회로인 오실레이터가 동작하고 있다는 것을 제외하면 Power-down 모드와 유사하다.
이 모드는 외부 크리스탈, 레조네이터를 사용하는 경우에만 유효하다.
오실레이터가 동작하고 있으므로 Standby 모드가 해제되어 정상 동작이 개시 되는데 6개의 클럭 사이클만이 소요된다.
[#M_- IVSEL(Interrupt Vector Select)|- IVSEL(Interrupt Vector Select)|- IVSEL(Interrupt Vector Select)
- IVCE(Interrupt Vector Change Enable)
인터럽트 벡터는 항상 위치가 고정되어 있는 것이 아니라 가변적으로 배치 할 수 있다.
즉, Fuse High Byte의 BOOTRSR 비트 와 MCRCR 레지스터의 IVSEL 비트에 따라 여러 가지의 조합이 가능하다.
◆ 외부 인터럽트 레지스터
EICRA(External Interrupt Control Register A)
이 레지스터는 INT3 ~ 0 핀으로 입력되는 신호에 의하여 인터럽트가 트리거되는 방법을 설정한다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ISC31 | ISC30 | ISC21 | ISC20 | ISC11 | ISC10 | ISC01 | ISC00 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
- ISCn1 : ISCn0
ISCn1 | ISCn0 | 인터럽트 트리거 방식 | 신호 |
0 | 0 | INTn의 LOW Level 인터럽트를 요구 발생 | |
0 | 1 | reserved | |
1 | 0 | INTn의 하강 에지(falling edge)가 인터럽트를를 비동기적으로 요구 발생 | |
1 | 1 | INTn의 상승 에지(rising edge)가 인터럽트를 비동기적으로 요구 발생 |
EICRB(External Interrupt Control Register B)
이 레지스터는 INT7 ~ 4 핀으로 입력되는 신호에 의하여 인터럽트가 트리거되는 방법을 설정한다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ISC71 | ISC70 | ISC61 | ISC60 | ISC51 | ISC50 | ISC41 | ISC40 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
- ISCn1 : ISCn0
ISCn1 | ISCn0 | 인터럽트 트리거 방식 | 신호 |
0 | 0 | INTn의 LOW Level 인터럽트를 요구 발생 | |
0 | 1 | INTn의 하강 에지 또는 상승 에지가 입터럽트를 요구 발생 | |
1 | 0 | INTn의 하강 에지(falling edge)가 인터럽트를를 비동기적으로 요구 발생 | |
1 | 1 | INTn의 상승 에지(rising edge)가 인터럽트를 비동기적으로 요구 발생 |
EIMSK(External Interrupt Mask Register) : 범용 인터럽트 마스크 레지스터
이 레지스터는 INT7 ~ 0을 개별적으로 허용하는데 사용된다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
INT7 | INT6 | INT5 | INT4 | INT3 | INT2 | INT1 | INT0 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
- INT7 ~ 0
1로 설정하면 허용, 0으로 설정하면 인터럽트 금지가 된다.
EIFR(External Interrupt Flag Register)
이 레지스터는 INT7 ~ 0 인터럽트 신호가 입력되어 해당 인터럽트가 트리거 되었음을 표시하는데 사용된다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
INTF7 | INTF6 | INTF5 | INTF4 | INTF3 | INTF2 | INTF1 | INTF0 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
- INTF7 ~ 0
이 비트들은 인터럽트 처리가 시작되고 MCU가 인터럽트 벡터를 인출하여 인터럽트 서비스 루틴으로 점프하게 되면 다시 0으로 클리어된다.
'소프트웨어 > AVR' 카테고리의 다른 글
내부 EEPROM 읽기/쓰기 (0) | 2011.09.28 |
---|---|
직렬통신[USART] (0) | 2011.09.27 |
타이머/카운터 (0) | 2011.09.23 |
LCD 제어 (0) | 2011.09.21 |
입.출력 포트(I/O) (0) | 2011.09.21 |