Interrupt @atmega
-
Upload
manintroll -
Category
Education
-
view
1.243 -
download
7
description
Transcript of Interrupt @atmega
Edited and Added by 15기 김승호
First made by 12기 한재웅
Second made by 13 김범수
*
*
1. 마이크로 프로세서 I/O포트에 대한 프로그램
방법
2. 왜 인터럽트를 써야 할까?
3. 외부 인터럽트
4. 타이머 카운트 인터럽트
5. CTC 모드 및 PWM 모드
6. 소스 코딩 및 퀴즈
7. 재미있는 과제 1,2
*
1.폴링 방식
2.인터럽트 방식
어떠한 작업을 수행할 시에 외부에서 들어오는
이벤트로 인해 어떠한 작업을 시행될 때 이용되
는 방식 딱 두종류!
*
*Polling : 명사(n) 1.투표 2.여론조사
*CPU가 특정 이벤트를 처리하기 위해 그 이벤트
가 발생할 때까지 모든 연산을 모니터링 하는데
쓴다.
*장점 : 단일 이벤트 시에 유용
*단점 : 다중 이벤트가 발생되면?
*
*Interrupt : 동사(v) 1. 방해하다 2.중단하다
*특정 요구에 의해서 정상적인 프로그램의 실행
순서를 변경하여 요구한 작업을 먼저 수행한 후
에 다시 원래의 프로그램으로 복귀하는 방법.
*장점 : 다중처리를 효율적으로 할 수 있다.
*단점 : 쓸 때 약간의 머리를 써야한다.
*
*우리가 쓰는 컴퓨터들은 한가지 일만 하지 않는
다. 즉, 다중 처리를 하고 있는 것이다.
*다중처리를 위해서는 많은 CPU 자원을 낭비하
는 Polling 방식보다는 Interrupt방식이 CPU를
효율적으로 사용할 수 있다!
*하지만 언제나 좋지는 않다.
*
*C언어에서 함수랑 좀 비슷하지 않나..?
*함수와 인터럽트와 다른 점 ?
함수는 call할 때, 인터럽트는 인터럽트 걸릴 때
동작.
인터럽트 걸릴 때는 어떻게 조절하지?
*
*Atmega128에는 외부 인터럽트 Port : 8개(INT)
외부에서 어떤 변화가 검출
이 될 때 요청이 되는 인터
럽트
사용레지스터 : EIMSK(External Interrupt Mask Register)
*
ISC71 ISC70 ISC61 ISC60 ISC51 ISC50 ISC51 ISC50
ISCn1 ISCn0 인터럽트 Call 시점
0 0 INTn Low Level
0 1 INTn Any Change
1 0 INTn Falling Edge
1 1 INTn Rising Edge
*
레지스터 설명
EICRA 외부 인터럽트 제어 레지스터(for INT0~INT3)
EICRB 외부 인터럽트 제어 레지스터(for INT4~INT4)
EIMSK 외부 인터럽트 마스크 레지스터
-8개의 외부 인터럽트를 인에이블시키는 비트
로 구성한다.
EIFR 외부 인터럽트 플래그 레지스터
-외부 인터럽의 발생여부를 나타냄
SREG 상태 레지스터
-BIT 7-I : 인터럽트를 쓰기 위해서 반드시 1로
셋되어야한다.
*
*Register : 사전적 의미 – 등록하다. 신고하다. 기록
하다. 나타내다. 기억하다. 인식되다.
* 여기서의 의미 : 산술적, 논리적 연산이나 정보 해
석, 전송 등을 할 수 있는 일정 길이의 정보를 저장하
는 CPU내의 기억 장치. 저장 용량에는 제한되어 있으
나 주기억 장치에 비해서 접근 시간이 빠르고, 체계적
인 특징이 있다. 컴퓨터에는 산술 및 논리 연산의 결
과를 임시로 기억하는 누산기, 기억 주소나 장치의 주
소를 기억하는 주소 레지스터를 비롯하여 컴퓨터의
동작을 관리하는 각종 레지스터가 사용된다.
*
• 타이머 : 일정한 시간 간격을 세는 것.
• 머신 사이클 : 명령어 하나를 수행하는데 걸리는
시간으로 타이머 모드에서 일정한 시간 간격이
머신 사이클의 시간 간격을 의미한다.
• IF Atmega128에 16Mhz 크리스탈이 있다
면, 1 머신 사이클의 간격은 62.5ns, 타이머는
62.5ns마다 작동한다.
*
* 타이머 : 머신 사이클을 세는 것.
* 카운터 : 타이머에 Overflow가 일어날 때마다숫자를 세는 것
* 타이머 인터럽트 : 카운터를 이용하여 인터럽트를 작동시키는 스위치로 사용한 인터럽트
*타이머 인터럽트에는 크게 타이머 모드와 카운터 모드가 있다. 시간을 세는 기능을 타이머 모드, 숫자를 세는 기능을 카운터 모드.
* CLOCK(falling Edge 일 때)
• 타이머가 1증가하는 시점
• 카운터가 1 증가하는 시점(overflow 될때, 이 기준이 바뀔 수도 있다.)
*
*타이머 모드
*일정한 간격의 시간을 세는 것
*Ex)100M 달리기할 때의 스톱워치
*카운트 모드
*일정한 간격과 관계 없이 숫자만을 세는 것
*Ex)계수기, 놀이공원 입장객들 체크할 때
*
*TCNT(Timer/Counter Register)
*총 4개의 타이머/카운터가 있다.
*Timer/Counter0,2(8bit)
*Timer/Counter1,3(16bit)
Timer는 머신 사이클 마다 카운트된 값을 레지스터
에 보관한다.
Counter(0,2) : TCNT0/2 레지스터에 저장
Counter(1,3) : TCNT1/3H와 TCNT1/3L 레지스
터에 저장(16비트이기 때문에)
*
*OCR(Timer/Counter Output Compare Register)
*오버플로(Overflow)가 일어나는 시점을 변경할 경우그 시점을 명시해주는 레지스터
*Timer/Counter0,2(8bit)
*Timer/Counter1,3(16bit)
Timer는 머신 사이클 마다 카운트된 값을 OCR값과 비교한다.
Counter(0,2) : OCR0/2 레지스터에 저장
Counter(1,3) : OCR1/3A,B,C H와 OCR1/3A,B,C L 레지스터에 저장(16비트이기 때문에)
*
*TCCR0 (Timer/Counter0 Control Register)
*
*CS : 분주비 설정
*
*TIMSK(Timer/Counter Interrupt Mask Register)
*인터럽트 Enable
*
*모든 타이머/카운터에 대한 Enable/Disable Commmad
*
*타이머/카운터 레지스터인 TCNT1H:TCNT1L (타이머1 기준)가 overflow될 때, 요청되는 인터
럽트
*
*방금 그림에서 65535번 카운트를 했다면 모든 레지스터에 ‘1’로 채워지고, 이 때 1을 더하면 최상위비트 자리에서 올림수가 발생, 이때가 overflow이다.
*
*CTC(Clear Time on Compare Match) Mode
*OCR값과 TCNT값이 맞으면 인터럽트가 호출되고
TCNT값이 리셋된다. OC0 출력파형은 인터럽트
마다 Toggle된다.
*
*높은 주파수의 PWM 파형을 발생하는 유용하다.
*비반전 비교 출력모드에서 TCNT0 값은 계속하여 OCR0과비교되어 일치하면 OC0 핀을 통해 0이 출력되고, TCNT0 값이 0이 되면 1을 출력된다.
*
#include <mega8.h>
Unsigned char led= 0xFE;
Void main(void)
{
DDRC=0xFF;
PORTC= led;
TIMSK = 0x01; // 문제 1 : 이 레지스터가 하는 일은?
TCCR0= 0x07; // 문제 2 : 이 레지스터가 하는 일은?
TCNT0= 0x00; // 문제3 : 이 레지스터가 하는 일은?
SREG = 0x80; // 문제 4 : 이 레지스터가 하는 일은?
//문제 5 : 이 레지스터들로 인해 생기는 인터럽트
while(1);
}
Intrrupt [TIM0_OVF] void timer_int0(void)
{
led<<=1;
led |= 0x01;
if(led == 0xFF) led = 0xFE;
PORTC = led;
}
답
문제1 : Timer Count Interrupt Mask 레지스터, 인터럽트를 키고 끄는 역할을 한다.0x01 - 타이머 0 오버플로우 모드 ON문제2 : Timer Count Control Register타이머 모드를 제어한다.0x07 : normal 모드, 1024분주
문제3 : Timer Count Register 0x00: 첫 카운터 값은 00H문제4 : SREG 전역 인터럽트 인에이블
문제5: (1/16)us*1024분주*(256-0) = 0.0163초
마다 인터럽트 발생하여, LED 왼쪽으로 순차 점멸
*
*Timer1 오버플로우 인터럽트를 이용하여 1초에
LED가 1초에 한 번 꺼졌다 켜졌다 하게 하기.
1. 16MHz 동작속도를 가지고 있다.
2. 분주비를 이용
3. TCNT1H와 TCNT1L의 초기값은 0(65536번
카운트해야 Overflow 발생)
4. TCCR1B 레지스터 하위 3비트의 값과 계산식
을 적을 것(분주비)
*
*인터럽트(CTC모드)를 사용하여 3개의 LED 패턴
만들기(눈에서 인식할 수 있을만큼)
1. 조건 1 : 스위치 1, 2, 3을 누를 때마다 패턴이
바뀌어야함.
2. 조건 2 : 인터럽트에서 Delay를 사용하면 안
됨.