AVR2560

2013.06.07_인터럽트에 대한 이론_

성엽이 2013. 6. 7. 13:45

인터럽트의 종류(Page 138) 

인터럽트의 동작(Page 139)

: ISR(interrupt service routine, interrupt handler) 

어느 기기나 장치에 기계적으로나 운영체제에 의해서 호출이 되는 것

여기서 기계적으로 호출이 되는것을 일반적인 Interrupt 라고 하며,

운영체제에서 호출이 되는 것을 'Call Back', Call Back 함수를 호출했다. 라고한다. 



▶ EXT_INT.c

#include "EXT_INT.h"

#include "Lcd.h"


void INT_Init(void) // Low 레벨에서 걸리도록. Negative-Edge

{

EICRB = (0<<ISC40) | (0<<ISC41);

EIMSK = (1<<INT4);

sei();    // 글로벌 인터럽트를 켜줘야 외부인터럽트 동작을 하므로 sei()  함수를 호출해주었다.

return;

}


void __vector_5(void)

{

LCD_string("Hello, World!!");

return;

}

▶ EXT_INT.h



#ifndef _EXT_INT_H

#define _EXT_INT_H



/**** 외부인터럽트 제어 레지스터 EICRA ***/

#define EICRA ((*(volatile unsigned char *)0x69))

#define ISC31 7

#define ISC30 6

#define ISC21 5

#define ISC20 4

#define ISC11 3

#define ISC10 2

#define ISC01 1

#define ISC00 0


/**** 외부인터럽트 제어 레지스터 EICRB ***/

#define EICRB ((*(volatile unsigned char *)0x6A))

#define ISC71 7

#define ISC70 6

#define ISC61 5

#define ISC60 4

#define ISC51 3

#define ISC50 2

#define ISC41 1

#define ISC40 0


/**** 외부인터럽트 마스크 레지스터 EIMSK **/

#define EIMSK ((*(volatile unsigned char *)0x3D))

#define INT7 7

#define INT6 6

#define INT5 5

#define INT4 4 // 6번핀을 사용할 것이다.

#define INT3 3

#define INT2 2

#define INT1 1

#define INT0 0


void INT_Init(void);

void __vector_5(void) __attribute__ ((signal, used, externally_visible));


#define sei(void)   __asm__ __volatile__ ("sei" ::) // InLine asm , 소스코드 안에 직접 집어넣는 어셈블러

// C소스안에 어셈블리어를 쓸수없는데, 어셈블리어를 넣을때 InLine 으로 넣을수 있다.

// C가 아니기 때문에 전처리, 컴파일에서 걸리지 않는다. gcc 문법임.

// 방법 (1) SREG = ((SREG) | (1<<Global_Interrupt_Enable)); 직접 넣는 명령어.

// (2) 어셈블리 명령어 sei(); 어셈블리 명령어.

#define sleep(void) __asm__ __volatile__ ( "sleep" "\n\t" :: )

// 전력소모를 줄이기위한 어셈블리 대기상태 명령.


#endif // _EXT_INT_H