뻔뻔한 AVR 프로그래밍뻔뻔한 프로그래밍The 5th Lecture
유 명 환 ( [email protected])
INDEX인터럽트(Interrupt) 총 정리
AT 128 외부 인터럽트 제어 분석
1
2 ATmega128 외부 인터럽트 제어 분석
ATmega128 외부 인터럽트 관련 레지스터
2
3 ATmega128 외부 인터럽트 관련 레지스터
뻔뻔한 노하우 : AVR을 위한 C 소스 코드 작성 法
3
4 뻔뻔한 노하우 : AVR을 위한 C 소스 코드 작성 法
ATmega128 외부 인터럽트 실습 : 적외선 광 센서
4
5 g
인터럽트(I t t) 총 정리1 인터럽트(Interrupt) 총 정리1
소프트웨어(S/W) 인터럽트
소프트웨어 요청에 의해 발생되는 인터럽트
인터럽트
웨어 청에 의해 발생되는 인터럽
프로세서(CPU) 내부에서 발생
예) 타이머/카운터
하드웨어(H/W) 인터럽트
하드웨어(주변 디바이스) 요청에 의해 발생되는 인터럽트하드웨어(주변 디바이스) 요청에 의해 발생되는 인터럽트
프로세서(CPU) 외부에서 발생
예) 네트워크 카드
1 인터럽트(I t t) 총 정리1
Application
인터럽트(Interrupt) 총 정리
(System) LibraryUser Level System Call Hacking
System CallKernel Level
Software Interrupt
y
Virtual File System
Device File SystemGeneral File System Network File System
Buffer Cache TCP/IP Protocol Stack
Character Device DriverBlock Device Driver Network Device Driver
Device InterfaceDevice Interface
Block Device Character Device Network Device
1 인터럽트(I t t) 총 정리1 인터럽트(Interrupt) 총 정리
Software
int main()
Application
open()
(System) Library
sys_open()
Software Interrupt System Call
int main(){
………
open();
open(){
………
swi 0x900005;Interrupt Vector (5)
………
open();
………}
swi 0x900005;
………}
Interrupt Vector (2)
Interrupt Vector (3)
Interrupt Vector (4)
Interrupt Vector (1)
Interrupt Vector (2)
Interrupt Vector Tablefd = open();
sd = socket();
Interrupt Vector Table
User Level Kernel Level
1 인터럽트(I t t) 총 정리1 인터럽트(Interrupt) 총 정리
write() copy_from_user()
Device Driver Network Device (H/W)
copy_to_user()read()
인터럽트
wake_up()
ATmega128ATmega128 Sleep
1 인터럽트(I t t) 총 정리1 인터럽트(Interrupt) 총 정리
P lliP lli I t tI t t ?PollingPolling vs InterruptInterrupt ?
Interrupt on (H/W) BUSBUS ?
AT 128 외부 인터럽트 제어 분석2 ATmega128 외부 인터럽트 제어 분석2
ATmega128 Interrupt Vector Table AVR Assembly Code
2 AT 128 외부 인터럽트 제어 분석2 ATmega128 외부 인터럽트 제어 분석
AT 128 외부 인터럽트 관련 레지스터3 ATmega128 외부 인터럽트 관련 레지스터3
SREG: Status Register
Register 설명 실제 구현 예
SREG • AVR Core 내부에있는 Status Register는 ALU 연산수행후
갱신됨
sei();// <avr/interrupt.h>// #define sei()
– MCU의현상태및최근 ALU실행에대한결과를포함
• Bit7. I (Global Interrupt Enable): 프로세서 내 모든 인터럽트 활성화 비트 -> 허용!!!
설정 인터럽트허용
// #define sei() __asm__ __volatile__ ("sei" ::)
SREG |= 1<<SREG_I;•1로설정 인터럽트허용
3 AT 128 외부 인터럽트 관련 레지스터3 ATmega128 외부 인터럽트 관련 레지스터
EIMSK : External Interrupt Mask Register
Register 설명 실제 구현 예
Bit 7:0 •해당비트값을 “1”로설정(= Masking)하면
해당되는핀이외부인터럽트핀으로활성화됨
EIMSK = (1<<INT4);
해당되는핀이외부인터럽트핀으로활성화됨
3 AT 128 외부 인터럽트 관련 레지스터3 ATmega128 외부 인터럽트 관련 레지스터
EICRAEICRA : External Interrupt Control Register A
Register 설명 실제 구현 예
EICRA •트리거신호(Trigger Signal)를설정하기위한레지스터 EICRA = (0<<ISC21) | (0<<ISC20);
// INT2 핀에 Low 신호가 입력되는순간 인터럽트가 발생됨ISCn1 ISCn0 Trigger Signal
0 0 The low level of INTn
0 1 (reserved)
1 0 The falling edge of INTn
1 1 The rising edge of INTn
3 AT 128 외부 인터럽트 관련 레지스터3 ATmega128 외부 인터럽트 관련 레지스터
Signal
H Falling edge Rising edge
L
Low level
3 AT 128 외부 인터럽트 관련 레지스터3 ATmega128 외부 인터럽트 관련 레지스터
EICRBEICRB : External Interrupt Control Register B
Register 설명 실제 구현 예
EICRB •트리거신호(Trigger Signal)를설정하기위한레지스터 EICRB = (0<<ISC41) | (0<<ISC40);
// INT4 핀에 Low 신호가 입력되는순간 인터럽트가 발생됨ISCn1 ISCn0 Trigger Signal
0 0 The low level of INTn
0 1 (reserved)
1 0 The falling edge of INTn
1 1 The rising edge of INTn
3 AT 128 외부 인터럽트 관련 레지스터3 ATmega128 외부 인터럽트 관련 레지스터
Interrupt 발생
main program 실행 main program 실행
Interrupt 서비스루틴실행
Interrupt관련 Interrupt 스택에 해당 인터럽트 PC 값Interrupt 관련register bit 체크
Interrupt trigger 체크 main prog.
PC저장Interrupt vector로점프
서비스루틴 실행
로드메인복귀
SREG,EIMSK EICRA/BEIMSK EICRA/B
11
1
SREG
EIMSK
0 EICRB 0
뻔뻔한 노하우 : AVR을 위한 C 소스 코드 작성 法4 뻔뻔한 노하우 : AVR을 위한 C 소스 코드 작성 法4
int main()
{ ioport init(){
cli();
ioport_init();
ioport_init()
{
// 입출력 포트 초기화 & 설정
}
sei();
timer_init();
……… 초기화 & 설정 루틴 timer_init()
{
for(;;)
{
// 타이머/카운터 초기화 & 설정
}
}
서비스 루틴
}
}
AT 128 외부 인터럽트 실습 : 적외선 광 센서5 ATmega128 외부 인터럽트 실습 : 적외선 광 센서5