• 검색 결과가 없습니다.

Atmega163L Interrupt

문서에서 하드웨어 설계 및 프로그래밍 (페이지 42-51)

RELAY

4. Atmega163L Interrupt

인터럽트란

1) ?

가 현재 처리학 는 일보다 급하게 처리해야 할 사건이 발생했을 때 현재 수행

CPU hdlT ,

중인 일을 잠시 중단하고 급한 일을 처리한 후에 본래의 일을 다시 수행하는 것을 말한 다.

인터럽트를 사용하면 프로그램을 순서대로만 처리하지 않기 때문에 발생 시기를 예측 할 수 없는 사건을 처리하는데 효과적이다.

인터럽트 처리과정 2)

인터럽트가 준비된 장치는 인터럽트 요구 플래그 비트를 세트하고 에게 인터럽트

(1) CPU

를 요구한다 인터럽트 발생.( )

는 인터럽트 확인 신호를 보내고 를 받은

(2) CPU (INTA : interrupt acknowledge) , INTA 입출력 장치는 인터럽트 요구(INTR : interrupt request) 신호를 삭제 한다.

는 레지스터 등을 스택에 저장한다

(3) CPU PC, PSW, (PUSH)

는 인터럽트 서비스 루틴 의 주소를 프로그램 카운터 에 적재한다

(4) CPU (ISR) (PC) .

인터럽트 서비스 루틴을 수행한다

(5) .

레지스터 등을 스택으로부터 복귀한다

(6) PSW, .(POP)

본래의 메인 프로그램으로 복귀한다

(7) .

다음 그림과 같이 표현될 수 있다.

의 인터럽트 벡터 3) Atmega163L

Vector No.

Program

Address Source Interrupt Definition

1 $000(1) RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset

2 $002 INT0 External Interrupt Request 0 3 $004 INT1 External Interrupt Request 1 4 $006 TIMER2 COMP Timer/Counter2 Compare Match 5 $008 TIMER2 OVF Timer/Counter2 Overflow 6 $00A TIMER1 CAPT Timer/Counter1 Capture Event 7 $00C TIMER1 COMPA Timer/Counter1 Compare Match A 8 $00E TIMER1 COMPB Timer/Counter1 Compare Match B 9 $010 TIMER1 OVF Timer/Counter1 Overflow

10 $012 TIMER0 OVF Timer/Counter0 Overflow 11 $014 SPI, STC Serial Transfer Complete 12 $016 UART, RXC UART, Rx Complete 13 $018 UART, UDRE UART Data Register Empty 14 $01A UART, TXC UART, Tx Complete 15 $01C ADC ADC Conversion Complete 16 $01E EE_RDY EEPROM Ready

17 $020 ANA_COMP Analog Comparator 18 $022 TWSI 2-wire Serial Interface

인터럽트 사용을 위해 알아야할 의 레지스터들

4) MCU ...

4-1 The Status Register – SREG

Bit7-I: Global interrupt Enable

외부 인터럽트 핀을 가동하기 위해서는 반드시 Global interrupt Enable bit가 set(1) 되어야 만 한다. 만약 Global interrupt Enable가 clear(0) 되어 있다면 어떤 인터럽트 도 동작할 수 없다. 각각의 인터럽트(INT0, INT1) 사용가능은 General Interrupt Mask

에서 설정할 수 있다 Register(GIMSK)

실제 코딩할 때 예

또는 로 써주면 된다

#asm("sei"); SREG I = 0x80; .

나머지 Bit 6~0 은 인터럽트 사용(enable)과 무관하기 때문에 넘어갑니다.

4-2 The General Interrupt Mask Register – GIMSK

외부 인터럽트 Bit 7 - INT1 : 1

가 되고 의 가 될 때 외부 인터

INT1 bit set(1) Status Register(SREG) bit7-I set(1)

럽트 핀은 활성화 된다.

에 있는

MCU General Control Register(MCUCR) Interrupt Sense Control

는 가 상승 에지 에서 동작할지 하강 에

0,1bits(ISC11 and ISC10) INT1 (risring edge) 지(falling edge)에서 동작할지를 결정한다.

핀은 핀으로 설정되어 있더라도 인터럽트는 요청될 수 있다 중복사용 가

INT1 output (

▷ 능)

외부인터럽트 Bit 6 - INT0 : 0

가 되고 의 가 될 때 외부 인터

INT0 bit set(1) Status Register(SREG) bit7-I set(1)

럽트 핀은 활성화 된다.

에 있는

MCU General Control Register(MCUCR) Interrupt Sense Control

는 가 상승 에지 에서 동작할지 하강 에

0,1bits(ISC01 and ISC00) INT0 (risring edge) 지(falling edge)에서 동작할지를 결정한다.

핀은 핀으로 설정되어 있더라도 인터럽트는 요청될 수 있다 중복사용 가

INT0 output (

▷ 능)

Bit 5 - Res: Reserved Bits

이 bit는 ATmega163L에서 제한되어있는 bit이고 읽기값이 정의되지 않았다.

Bit 4~0 - Res: Reserved Bits

이 bit들은 ATmega163L에서 제한되어있는 bit들이고 읽기값이 항상 0(zero)이다.

각각의 인터럽트 인에이블 사용예 만 가능

INT0 GIMSK = 0x40;

만 가능

INT1 GIMSK = 0x80;

모두가능

INT0, INT1 GIMSK = 0xC0;

4-3 The General Interrupt Flag Register – GIFR

․ Bit 7 - INF1: External Interrupt Flag1

핀의 에지 또는 논리적인 변화가 인터럽트 요청을 일으킬 때 대응하는 인터 INT1 (edge)

럽트 플래그(interrupt flag)인 INF1이 set(1) 된다.

의 와 대응하는 인터럽트 가능 인 의 이 로 설정되면

SREG I-bit bit GIMSK INT1 set(1) ,

는 로 점프한다

MCU interrupt vector .

인터럽트 루틴이 실행될때 flag는 자동으로 clear(0)된다 또는. INF1에 비트에 논리적

으로 “1”을 쓰면 클리어가 된다 또 INF1이 레벨 인터럽트로 설정되면, INF1 비트는 자동으로 클리어 된다.

Bit 6 - INF0: External Interrupt Flag0

핀의 에지 또는 논리적인 변화가 인터럽트 요청을 일으킬 때 대응하는 인터 INT0 (edge)

럽트 플래그(interrupt flag)인 INF0이 set(1) 된다.

의 와 대응하는 인터럽트 가능 인 의 이 로 설정되면

SREG I-bit bit GIMSK INT0 set(1) ,

는 로 점프한다

MCU interrupt vector .

인터럽트 루틴이 실행될때 flag는 자동으로 clear(0)된다 또는. INF1에 비트에 논리적

으로 “1”을 쓰면 클리어가 된다 또 INF1이 레벨 인터럽트로 설정되면, INF1 비트는 자동으로 클리어 된다.

과 은 채터링 방지를 위해서 사용한다

(INF0 INF1 .)

Bit 5~0 - Res: Reserved Bits

이 bit들은 ATmega163L에서 제한되어있는 bit들이고 읽기값이 항상 0(zero)이다.

4-4 MCU Control Register – MCUCR :

레지스터는 및 일반적인 의 기능을 설정하는 기능이

MCUCR interrupt sense control MCU 있다.

Bit 7 - Res: Reserved Bit

이 bit는 ATmega163L에서 제한되어있는 bit이고 읽기값이 항상 0(zero)이다.

Bit 6 - SE: Sleep Enable

지시가 실행되었을때 가 가 되려면 는 되어야만 한

SLEEP MCU Sleep mode SE bit set(1)

▷ 다.

Bit 5,4 - SM1/SM0 : Sleep Mode select Bits 1 and 0

이 bit들은 아래표와 같은 사용가능한 Sleep Mode를 선택한다.

Sleep Mode Select

Bit 3,2 - ISC11, ISC10 : Interrupt Sense Control 1 Bit 1 and Bit 0

외부인터럽트 1(INT1)은 SREG I Flag와 대응하는 GIMSK의 인터럽트 마스크를 설정(set) 함으로써 발생된다. INT1 핀의 레벨과 에지를 활성화하는 것은 아래표에 정의되어있다.

ISC11 ISC10 설명

0 0 INT1의 LOW LEVEL에서 인터럽트를 발생한다. 0 1 INT1의 논리적인 변화에서 인터럽트를 발생한다. 1 0 INT1의 하강 에지에서 인터럽트를 발생한다. 1 1 INT1의 상승 에지에서 인터럽트를 발생한다.

Interrupt 1 Sense Control

Bit 1,0 - ISC01, ISC00 : Interrupt Sense Control 0 Bit 1 and Bit 0

외부인터럽트 0(INT0)은 SREG I Flag와 대응하는 GIMSK의 인터럽트 마스크를 설정(set) 함으로써 발생된다. INT0 핀의 레벨과 에지를 활성화하는 것은 아래표에 정의되어있다.

ISC01 ISC00 설명

0 0 INT0의 LOW LEVEL에서 인터럽트를 발생한다. 0 1 INT0의 논리적인 변화에서 인터럽트를 발생한다. 1 0 INT0의 하강 에지에서 인터럽트를 발생한다. 1 1 INT0의 상승 에지에서 인터럽트를 발생한다.

Interrupt 0 Sense Control

과 의 인터럽트 타입 결정의 예 INT0 INT1

INT0, INT1 LOW LEVEL MCUCR = 0x00 INT0-LOW LEVEL & INT1- FALLING EDGE MCUCR = 0x08 INT0-LOW LEVEL & INT1- RISING EDGE MCUCR = 0x0C INT0-FALLING EDGE & INT1-RISING EDGE MCUCR = 0x0E

논리적 변화

INT0- & INT1- FALLING EDGE MCUCR = 0x09 INT0-FALLING EDGE & INT1-FALLING EDGE MCUCR = 0x0A

실습예제 5)

위에서 공부한 레지스터들의 특성을 이용해 인터럽트 프로그래밍을 실습한다.

예제1. 인터럽트 실험1

아래와 같은 회로를 작성하고 프로그램1) PORTB0~7 모두 점등된 상태에서 INT0을 누르 면 세 번 깜빡이고 다시 켜지는 프로그램을 작성한다 단 인터럽트 타입은 하강에지이.(

다.)

실습 회로도

< >

프로그램

< >

#include <mega163.h>

void delay(unsigned int m) {

unsigned int i, j;

for(i=0;i<m;i++)

for(j=0;j<1000;j++);

}

// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) {

unsigned int i;

for(i=0; i<3; i++) {

PORTB = 0x00;

delay(200);

PORTB = 0xff;

delay(200);

} }

void main(void) {

DDRB=0xff;

/RESET PD7

PD1 PD2 PD3 PD4 PD5 PD6

PD0

R1 10K R 10K

VCC VCC

C2 0.1u

C1 0.1u SW3 int0 SW

1 4

2 3 SW4

int1 SW

1 4

2 3 R330*8EA

PB2(AIN0) PB1(T1) PB0(T0)

PB3(AIN1)

PB7(SCK) PB6(MISO) PB5(MOSI) PB4(SS)

VCC

VCC

J1

L CON 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20

J2

H CON 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40

GIMSK=0x40; // External Interrupt(s) initialization MCUCR=0x02; // INT0: On INT1: Off

GIFR=0x40; // INT0 Mode: Falling Edge

#asm("sei") // Global enable interrupts while (1)

{

PORTB=0x00;

} }

예제 2. 인터럽트 실험2

의 가 모두 켜진 상태에서 을 누르면 왼쪽으로 가 하나씩 꺼지면서

PORTB0~7 LED INT0 LED

이동하고 INT1을 누르면 오른쪽으로 LED가 하나씩 꺼지면서 이동하는 프로그램을 작성하 라 단 인터럽트 타입은( INT0은 하강에지, INT1은 LOW LEVEL이다.)

프로그램

< >

#include <mega163.h>

unsigned int led =0x00;

void delay(unsigned int m) {

unsigned int i, j;

for(i=0;i<m;i++)

for(j=0;j<1000;j++);

}

// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) {

led = led << 1;

if(led == 0x00)led = 0x01;

PORTB = led;

}

// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) {

led = led >> 1;

if(led == 0x00)led = 0x80;

delay(100);

PORTB = led;

}

void main(void) {

PORTB=0x00;

DDRB=0xFF;

// External Interrupt(s) initialization GIMSK=0xC0; // INT0: On INT1: On

MCUCR=0x02; // INT0 Mode: Falling Edge, INT1 Mode: Low level GIFR=0xC0;

// Global enable interrupts

#asm("sei") while (1);

}

예제 3. 인터럽트 실험 3

에 연결된 가 하나씩 오른쪽으로 이동하는 상태에서 이 발생하면

PORTB LED ( ) INT0 LED 8

개를 3 번 깜빡이고 나서, 다시 정상적인 동작 (LED를 하나씩 오른쪽으로 이동) 하도록 하고 INT1이 발생하면 LED 8 개를 3 번 깜빡이고 나서 다시 정상적인 동작, (LED를 하나 씩 왼쪽으로 이동 하도록 하는 프로그램입니다) ( , INT0,INT1단 모두 하강에지 사용)

프로그램

< >

#include <mega163.h>

unsigned char dir=0;

void delay(long int i) {

while(i--);

}

// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) {

unsigned int i;

dir = 0;

for(i=0; i<3; i++) {

PORTB = 0x00;

delay(100000);

PORTB = 0xff;

delay(100000);

} }

// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) {

unsigned int i;

dir = 1;

for(i=0; i<3; i++)

{

PORTB = 0x00;

delay(100000);

PORTB = 0xff;

delay(100000);

} }

void main(void) {

unsigned char led = 0xfe;

DDRB = 0xff;

PORTB = led;

// External Interrupt(s) initialization GIMSK=0xC0; // INT0: On INT1: On

MCUCR=0x0A; // INT0 Mode: Falling Edge, INT1 Mode: Falling Edge GIFR=0xC0;

// Global enable interrupts 또는

#asm("sei") // SREG I = 0x80;

while(1) {

delay(100000);

switch (dir) {

case 0:

led = (led << 1) | 0x01;

if(led == 0xff) led = 0xfe;

PORTB = led;

break;

case 1:

led = (led >> 1) | 0x80;

if(led == 0xff) led = 0x7f;

PORTB = led;

break;

} } }

문서에서 하드웨어 설계 및 프로그래밍 (페이지 42-51)

관련 문서