Upload
lethuy
View
223
Download
0
Embed Size (px)
Citation preview
55주차주차AVRAVR의의 인터럽트인터럽트 제어제어 레지스터레지스터 및및 관련관련 실습실습
Next-Generation Networks Lab.
3. 레지스터 설정
외부 인터럽트 레지스터
레지스터 설명레지스터 설명
MCUCRMCU Control Register
SREGStatus Register
EICRAExternal Interrupt Control Register A외부 인터럽트 3~0의 인터럽트 센스 컨트롤 설정
EICRBExternal Interrupt Control Register B외부 인터럽트 7~4의 인터럽트 센스 컨트롤 설정
External Interrupt Mask RegisterEIMSK
External Interrupt Mask Register 개별 인터럽트 허용 유무를 설정
EIFRExternal Interrupt Flag Register
20
EIFRp g g
개별 인터럽트의 상태를 나타냄
MCUCR
IVSEL: Interrupt Vector Select IVCE: Interrupt Vector Change Enable
SREGIVCE: Interrupt Vector Change Enable
21
전체 인터럽트의 설정/해제 방법
asm(“SEI”);
SREG 0 80
asm(“CLI”);
SREG 0 00SREG = 0x80;
sei(); // set interrupt
SREG = 0x00;
cli(); // clear interrupt
22
EICRA
EICRB
23
ISC Interrupt Sense Control
24
EIFR
EIMSK
INT4 INT3 INT2 INT1 INT0
25
ATmega128의 외부 인터럽트 핀
26
외부외부 인터럽트인터럽트 관련관련 내부내부 회로회로
인터럽트감지회로
ISC01 ISC00 INT0 I-bit
EICRA EIMSK SREG
감지회로
Pi 2ISR
Pin 25 (INT0_vector)
INT1
Pin 26ISR
(INT1 t )인터럽트 감지회로
INT1
27
(INT1_vector)
예제예제
예제 7.3
포트 A의 7-segment에 초시계를 구현한다 포트 A의 7 segment에 초시계를 구현한다.
PE6에 연결된 Tact SW를 누르면 상승에지에서 초시계가 ’38’ 으로 초기화된다.
Port A
CPU B d7-segment
CPU Boardg
(Decoder)
Tact Switch
Port E6
28
Tact Switch
예제예제 77--3 Tact SW 3 Tact SW INT6, INT6, 상승에지상승에지 감지감지
typedef unsigned char INT8;typedef unsigned int INT16;
//MCUCR |= 0x00;EICRB |= 0x30; // INT6 risingEIMSK |= 0x40; // INT6 enable
#define F_CPU 1000000UL
#include <avr/io.h>
EIMSK | 0x40; // INT6 enableEIFR |= 0x00; // Flag clearSREG |= 0x80; //sei();
/#include <util/delay.h>#include <avr/interrupt.h>
while(1){
for(i=0; i<6; i++)INT8 i, j ;
ISR(INT6_vect) // INT6 interrupt function
{for(j=0; j<10; j++){
{ i=3; j=8; }
int main (void){
PORTA = (i << 4) | j;_delay_ms(1000);
}}{
DDRA = 0xFF; // 7-segmentDDRE = 0x00; // PE6 --> Tact SW// DDRE | (0<<DDRE6);
}}return 0;}// DDRE |= (0<<DDRE6); }
29
예제예제
예제 7.4 포트 A의 7-segment에 초시계를 구현한다.
Tact 스위치 SW4를 CPU 보드의 PD1에 연결한다. 그리고, Tact SW를 누르면
상승에지에서 초시계가 ’38’ 으로 초기화된다.
Port A
CPU B d7-segment
CPU Boardg
(Decoder)
Tact Switch
Port D1
30
Tact Switch
예제예제 77--4 Tact SW 4 Tact SW INT1, INT1, 상승에지상승에지 감지감지
typedef unsigned char INT8;typedef unsigned int INT16;
//MCUCR |= 0x00;EICRA |= 0x0C; // INT1 risingEIMSK |= 0x02; // INT1 enable
#define F_CPU 1000000UL
#include <avr/io.h>
EIMSK | 0x02; // INT1 enableEIFR |= 0x00; // Flag clearSREG |= 0x80; //sei();
/#include <util/delay.h>#include <avr/interrupt.h>
while(1){
for(i=0; i<6; i++)INT8 i, j ;
ISR(INT1_vect) // INT1 interrupt function
{for(j=0; j<10; j++){
{ i=3; j=8; }
int main (void){
PORTA = (i << 4) | j;_delay_ms(1000);
}}{
DDRA = 0xFF; // 7-segmentDDRD = 0x00; // PD1 --> Tact SW// DDRD | (0<<DDRD1);
}}return 0;}// DDRD |= (0<<DDRD1); }
31
예제예제
예제 7.5 포트 A의 7-segment에 초시계를 구현한다.
Tact 스위치 SW3을 CPU 보드의 PE4에 연결한다. 그리고, SW3을 누르면 하강
에지에서 초시계가 ’00’ 으로 초기화된다.
동시에 Tact 스위치 SW4를 CPU 보드의 PD1에 연결한다 그리고 SW4를 누르 동시에 Tact 스위치 SW4를 CPU 보드의 PD1에 연결한다. 그리고, SW4를 누르
면 상승에지에서 초시계가 ’38’로 초기화된다.
P t A
7 t
Port A
CPU Board7-segment(Decoder)
Port E4Port D1
32
Tact SwitchPort D1
예제예제 77--5 5 Tact SW Tact SW INT4, INT1INT4, INT1
typedef unsigned char INT8;typedef unsigned int INT16;
DDRD = 0x00; // Tact SWDDRE = 0x00; // Tact SWEICRA |= 0x0C; // INT1 rising
#define F_CPU 1000000UL
#include <avr/io.h>
EICRA | 0x0C; // INT1 rising EICRB |= 0x02; // INT4 falling EIMSK |= 0x12; // INT1, INT4 enableEIFR |= 0x00; // Flag clear/
#include <util/delay.h>#include <avr/interrupt.h>
| ; // gSREG |= 0x80; //sei(); while(1){
INT8 i, j ;
ISR(INT4_vect) // INT4 interrupt function
for(i=0; i<6; i++){
for(j=0; j<10; j++){ i=0; j=0; }
ISR(INT1_vect) // INT1 interrupt function{ i 3 j 8 }
{PORTA = (i << 4) | j;_delay_ms(1000);
}{ i=3; j=8; }
int main (void){
}}
}return 0;{
DDRA = 0xFF; // 7-segmentreturn 0;}
33
예제예제
예제 7-6 포트 A의 7-segment에 초시계를 구현한다.
PD1에 IR-LED를 연결하고, PD0에 IR센서를 연결한다. IR-LED를 쏘고 있는 정
상적인 경우에는 IR센서에 신호가 계속 감지된다. 그러다가, IR센서에 신호가
감지되지 않으면 초시계를 ’00’ 으로 초기화한다감지되지 않으면 초시계를 ’00’ 으로 초기화한다.
Port A
CPU B d7-segment
CPU Boardg
(Decoder)
IR 센서
Port D0
34
IR 센서
적외선적외선 센서센서 회로도회로도
35
예제예제 77--6 IR6 IR--Sensor Sensor INT0INT0
typedef unsigned char INT8;typedef unsigned int INT16;
//MCUCR |= 0x00;EICRA |= 0x02; // INT0 fallingEIMSK |= 0x01; // INT0 enable
#define F_CPU 1000000UL
#include <avr/io.h>
EIMSK | 0x01; // INT0 enableEIFR |= 0x00; // Flag clearSREG |= 0x80; //sei();
/#include <util/delay.h>#include <avr/interrupt.h>
while(1){
for(i=0; i<6; i++)INT8 i, j ;
ISR(INT7_vect) // INT7 interrupt function
{for(j=0; j<10; j++){
{ i=0; j=0; }
int main (void){
PORTA = (i << 4) | j;_delay_ms(1000);
}}{
DDRA |= 0xFF; // 7-segmentDDRD |= 0x20; // 0000 0010
// PD1 >IR LED PD0 >IR Sensor
}}return 0;}// PD1-->IR-LED, PD0-->IR-Sensor }
36