2010_8_3_Timer_Interrupt2

Report
KT-M128 Peripheral
Device
Interrupt
Timer / Counter0
2010. 8. 3
조 승훈
Reference:
AVR ATmega128 정복, ohm사
마이콤 기초와 응용 강의노트 (ATmega128 시스템), 동국대 전기공학과 최한호
Index
• AVR Interrupt
• Timer / Counter0
• Source Code
2
AVR Interrupt
• Interrupt Overview
– CPU 외부의 하드웨어적인 요구에 의해서 정상적인 프로그램의 실
행 순서를 변경하여 보다 시급한 작업을 먼저 수행한 후에 다시 원래
의 프로그램으로 복귀하는 것
– 비동기적으로 발생하는 주변장치의 서비스 요청에 CPU가 가장 빠
르게 대응 할 수 있는 방법
– 비동기적으로 동작하는 CPU(고속)와 주변장치(저속) 사이에서 효율
적으로 일을 수행
3
AVR Interrupt
– 인터럽트의 3대 요소
• 발생원 : 누가 요청했는가?
• 우선 순위 : 2개 이상의 요청 시 어떤 것을 먼저 서비스 할까?
• 인터럽트 벡터 : 서비스 루틴의 시작 번지는 어디인가?
– ATmega128의 인터럽트 처리 과정
① 매 사이클의 인터럽트 요청이 있는지 확인하고 해당 인터럽트 플래그에 기록
② 어느 인터럽트 요청이 있는지 인터럽트 플래그를 조사하고 우선 순위와 허용 여부를 결정
③ 인터럽트 벡터 주소를 찾아가기 위한 CALL 명령을 수행, 다른 인터럽트 발생을 방지하기
위해 SREG의 I bit를 Clear, 복귀 주소(PC)를 Stack에 저장
④ 인터럽트 벡터에 따라 인터럽트 서비스 루틴으로 점프하여 실행
⑤ RETI를 만나면 Stack에 저장된 PC를 복구하여 원래 프로그램으로 복귀
– 응답 시간
• 인터럽트 벡터의 JMP명령 (3clk) + 1개 이상의 명령 (최소 1clk) = 최소 4clk
(SREG의 I bit Clear, PC를 Stack에 저장, 인터럽트 벡터를 통해 ISR로 점프)
• RETI는 4clk 소요
(PC를 Stack에서 POP, SP = SP + 2, SREG의 I bit 1로 Set)
4
AVR Interrupt
• 인터럽트의 종류
– 인터럽트 발생원인에 따른 분류
• 하드웨어 인터럽트
– 내부 인터럽트
– 외부 인터럽트
• 소프트웨어 인터럽트
– 인터럽트 발생 시 마이크로 프로세서의 반응 방식에 따른 분류
• 차단 가능 인터럽트
• 차단 불가능 인터럽트
– 인터럽트를 요구한 입출력 기기를 확인하는 방법에 따른 분류
• 벡터형 인터럽트 (Vectored Interrupt)
• 조사형 인터럽트 (Polled Interrupt)
5
AVR Interrupt
• 내부 인터럽트
– CPU에 정의되어 있지 않은 명령의 실행
– Zero로 나눗셈을 시도
– 보호된 메모리 영역에 접근 등의 원인에 의해 마이크로 프로세서 내
부적으로 발생하는 인터럽트
– ATmega128은 내부 인터럽트가 없음
6
AVR Interrupt
• 외부 인터럽트
–
–
–
–
–
–
타이머에서 지정 된 시간 경과
입력 장치의 서비스 요구
출력 장치의 작업 종료
A/D 변환의 완료
DMA 동작의 종료
마이크로 프로세서와 독립되어 있는 외부장치에 의해 발생하는 순
수한 의미에서의 인터럽트
7
AVR Interrupt
• 차단 가능 / 불가능 인터럽트
– 차단 가능 인터럽트
• 프로그래머에 의해 인터럽트 요청을 받아들이지 않고 무시 할 수 있는 것
• 시간제약이 중요한 프로그램에서는 인터럽트 요청을 허용하지 않을 수 있음
– 차단 불가능 인터럽트
• 프로그래머에 의해 어떤 방법으로도 인터럽트 요청이 차단 될 수 없는 것
• 전원 이상, 비상 정지 스위치 등 돌발사태에 대비하기 위한 것
• 인터럽트 차단 및 허용
– 인터럽트 마스크 레지스터, 인터럽트 허용 레지스터를 사용하여 개
별적으로 차단 및 허용 가능
– EIMSK : 개별적 인터럽트의 차단 / 허용
– SEI : Set Global Interrupt Flag, Global Interrupt Enable
Asm 명령
– CLI : Clear Global Interrupt Flag, Global Interrupt Disable
8
AVR Interrupt
• 벡터형 인터럽트
– 인터럽트가 발생 할 때마다 인터럽트를 요청한 장치가 인터럽트 서
비스 루틴의 시작 번지를 CPU에게 전송하거나, 또는 CPU가 각 인
터럽트의 종류에 따라 미리 지정된 메모리 번지에서 인터럽트 벡터
를 읽어서 이를 인터럽트 서비스 루틴의 시작번지로 사용하는 방식
– 인터럽트 시간이 빠름
– 주변 장치의 많고 적음에 영향이 없음
– ATmega128의 모든 인터럽트는 이 방식을 사용
9
AVR Interrupt
• 조사(Polling)형 인터럽트
– 인터럽트가 발생하면 이 인터럽트를 요청한 장치를 찾기 위해 CPU
가 각 주변장치를 소프트웨어적으로 차례로 조사(Polling)하는 방식
– 하드웨어 구조가 간단
– 주변 장치의 수에 따라 처리시간이 변함
– ATmega128은 사용하지 않음
10
AVR Interrupt
• 인터럽트의 우선순위 제어
– 인터럽트 우선순위 제어가 필요한 경우
• 우연히 2개 이상의 주변장치가 동시에 CPU에 인터럽트를 요청하는 경우
• 하나의 인터럽트가 서비스되고 있는 동안에 또 다른 인터럽트가 요청되는 경우
– 벡터형 인터럽트의 경우
• 인터럽트 우선 순위 제어기의 우선 순위 레지스터의 초기화로 우선순위 제어방
식 사용
– 조사형 인터럽트의 경우
• Polling의 순서에 의하여 소프트웨어적으로 우선 순위 선정
11
AVR Interrupt
• Interrupt Vector
부트 사이즈의 선택
Reset 및 Interrupt Vector의 위치 설정
BOOTRST in Fuse High Byte
12
AVR Interrupt
• 외부 인터럽트
– 외부 핀 INT0-7에 직접 입력되는 신호 (HIGH & LOW)값을 입력
값으로 받아 인터럽트가 걸려 정해진 ISR을 실행하는 것
– 외부 인터럽트의 특징
• 외부 인터럽트는 INT0-7 핀의 트리거 동작으로 인터럽트 발생
• LOW / Rising-Edge / Falling-Edge의 방식으로 트리거 신호 선택 가능
• INT0-7 핀의 입/출력 방향에 관계없이 인터럽트 발생
(Software적으로 데이터를 출력하여 인터럽트 요구 가능)
• INT 4-7 : I/O Clock이 있어야만 사용 가능
• INT 0-3 : 비동기적 검출 가능
(Sleep Mode에서 벗어 날 때 사용 가능)
13
AVR Interrupt
– 외부 인터럽트의 동작
①
②
③
④
⑤
⑥
⑦
⑧
⑨
인터럽트 활성화 (SREG.I / EIMSK 해당 비트 활성화)
외부 INT의 동작 Edge나 논리 신호에 인터럽트 요청
INTFn = 1 상태로 Flag가 Set 됨
실행 중이던 메인 프로그램의 PC를 Stack에 저장
해당 인터럽트 벡터로 점프
해당 인터럽트 루틴 처리
처리가 끝나면 RETI 명령을 받음
Stack으로부터 저장 된 PC값을 로드
동작 중이던 프로그램 위치로 복귀, 메인 프로그램을 계속해서 수행
14
AVR Interrupt
• Interrupt 관련 Register
– MCUCR (MUC Control Register)
– Bit 1 : Interrupt Vector Select
• Interrupt Vector 설정
– Bit 0 : Interrupt Vector Change Enable
• 0: Interrupt Vector 바꿈 차단
• 1: Interrupt Vector 바꿈 허용
15
AVR Interrupt
• EICRA (External Interrupt Control Register A)
– Bit 7 – 6 (External Interrupt 3 Sense Control)
• 외부 인터럽트 INT3의 트리거 방식 설정
– Bit 5 – 4 (External Interrupt 2 Sense Control)
• 외부 인터럽트 INT2의 트리거 방식 설정
– Bit 3 – 2 (External Interrupt 1 Sense Control)
• 외부 인터럽트 INT1의 트리거 방식 설정
– Bit 1 – 0 (External Interrupt 0 Sense Control)
• 외부 인터럽트 INT0의 트리거 방식 설정
ISOn 1
ISOn0
인터럽트 트리거 방식
0
0
Intn 핀의 Low Level 신호 입력이 인터럽트를 트리거
0
1
-
1
0
Intn 핀의 Falling Edge 입력이 인터럽트를 트리거
1
1
Intn 핀의 Rising Edge 입력이 인터럽트를 트리거
16
AVR Interrupt
• EICRB (External Interrupt Control Register B)
– Bit 7 – 6 (External Interrupt 7 Sense Control)
• 외부 인터럽트 INT7의 트리거 방식 설정
– Bit 5 – 4 (External Interrupt 6 Sense Control)
• 외부 인터럽트 INT6의 트리거 방식 설정
– Bit 3 – 2 (External Interrupt 5 Sense Control)
• 외부 인터럽트 INT5의 트리거 방식 설정
– Bit 1 – 0 (External Interrupt 4 Sense Control)
• 외부 인터럽트 INT4의 트리거 방식 설정
ISOn 1
ISOn0
인터럽트 트리거 방식
0
0
Intn 핀의 Low Level 신호 입력이 인터럽트를 트리거
0
1
Intn 핀의 Falling Edge 또는 Rising Edge 입력이 인터럽트를 트리거
1
0
Intn 핀의 Falling Edge 입력이 인터럽트를 트리거
1
1
Intn 핀의 Rising Edge 입력이 인터럽트를 트리거
17
AVR Interrupt
• EIMSK (External Interrupt Mask Register)
– Bit 7 – 0 : External Interrupt Mask Register
• 1: 각각의 인터럽트 허용
• 0: 각각의 인터럽트 금지
18
AVR Interrupt
• EIFR (External Interrupt Flag Register)
– Bit 7 – 0 : External Interrupt Flag Register
• 각각의 인터럽트 발생
19
AVR Timer /Counter
• Timer / Counter Overview
– 입력으로 들어오는 펄스를 셈하는 장치
– 입력으로 들어오는 펄스가 어디에 존재하느냐에 따라 Timer와
Counter로 나눔
– AVR ATmega128에는 범용 타이머 / 카운터가 4개 존재
•
•
•
•
Timer/Counter0
Timer/Counter1
Timer/Counter2
Timer/Counter3
(8bit)
(16bit)
(8bit)
(16bit)
20
AVR Timer /Counter
– Timer와 Counter의 차이점
• Timer
– 내부 Clock (빠름 / 분주 가능: 범위 내에서 Clock 선택 가능) – 동기모드
– 타이머는 MCU의 내부 Clock (Clk I/O -> 분주기 -> ClkT)을 이용
– 일정시간 간격의 펄스를 만들어 내거나, 일정시간 경과 후에 인터럽트 발생 가능
• Counter
– 외부 Clock (느림 / 분주 불가능: 외부 Clock 그대로 사용) – 비 동기모드
– Counter는 외부 핀 (TOSC1, TOSC2, T1, T2, T3)을 통해 들어오는 펄스를 계수
(Edge Detector)하여 Event Counter로서 동작
(Pulse = Event, Counter = Number of Event)
– Timer / Counter Register
•
•
•
•
Timer / Counter Control Register (TCCRn)
Timer / Counter Register (TCNTn)
Output Compare Register (OCRn)
Interrupt
– Timer / Counter Interrupt Flag Register (TIFR)
– Timer / Counter Interrupt Mask Register (TIMSK)
21
AVR Timer /Counter
• 8Bit Timer / Counter 0
– Timer / Counter0의 특징
•
•
•
•
•
•
•
싱글 채널 카운터
Clear Timer on Compare Match 기능 (Auto Reload 기능)
글리치가 없는 Phase Correct PWM 기능
주파수 발생 기능
10bit 프리스케일러 기능
Timer0 Overflow Interrupt와 Timer0 Compare Match Interrupt
I/O Clock과는 별도로 32.768kHz를 인가 가능한 핀 (TOSC1, TOSC2 핀)
22
AVR Timer /Counter
• BOTTOM : ox00일 경우 카운터가 Bottom에 도
달
• MAX
: 0xFF일 경우 카운터가 MAX에 도달
• TOP
: Max or OCR0 값에 도달
23
AVR Timer /Counter
• 프리스케일러 (PreScaler)
– 전치 분주기
– 총 8개의 스케일을 가지고 있음
– 분주비가 1:8일 경우, 시스템 Clock이 8번 들어 올 때, 프리스케일러
를 통과한 Clock은 1번의 Clock이 발생
Prescaler for Timer / Counter0
Prescaler for Timer / Counter0
(ASSR[3
])
(SFIOR[1
])
(TCCR0[2:
0])
CS02
CS01
CS00
기능 설명
0
0
0
정지
0
0
1
CLK
0
1
0
CLK / 8
0
1
1
CLK / 32
1
0
0
CLK / 64
1
0
1
CLK / 128
1
1
0
CLK / 256
1
1
1
CLK / 1024
24
AVR Timer /Counter
• Timer / Counter 관련 레지스터 (I/O Reg 영역에
Mapping)
– SFIOR (Special Function I/O Register)
– Bit 7 : TSM (Timer / Counter Synchronization Mode)
• 1: Timer / Counter0의 동기 모드, PSR0와 PSR321에 쓴 값은 유지 됨
• 0: PSR0와 PSR321에 쓴 값은 하드웨어에 의해 클리어 됨
– Bit 1 : PSR0 (Prescaler Reset Timer / Counter0)
• 1: Timer / Counter0의 Prescaler를 리셋
• 0: 영향 없음
25
AVR Timer /Counter
– ASSR (Asynchronous Status Register)
– Bit 3 : AS0 (Asynchronous Timer / Counter0)
• 0: Clock 소스 = ClkI/O (동기 모드)
• 1: Clock 소스 = TOSC1 (비동기 모드)
– Bit 2 : TCN0UB (Timer /Counter (TCNT0) Update Busy)
• 비동기 모드일 때 TCNT0에 새로운 값이 라이트되면 셋
– Bit 1 : OCR0UB (Output Compare Register (OCR0) Update
Busy)
• 비동기 모드일 때 OCR0에 새로운 값이 라이트되면 셋
– Bit 0 : TCR0UB (Control Register (TCCR0) Update Busy)
• 비동기 모드일 때 TCCR0에 새로운 값이 라이트되면 셋
26
AVR Timer /Counter
– TCCR0 (Timer /Count0 Control Register)
– Bit 7 : FOC0 (Force Output Compare)
• 1: 강제로 OC0 단자에 출력 비교가 매치된 신호 출력 (PWM 아닌 경우에 유효)
– Bit 6 : WGM00 (Waveform Generation Mode)
• Counter의 카운팅 방향, MAX(TOP) 카운터 값의 소스 및 Mode 선택
– Bit 5 – 4 : Com01 - Com00 (Compare Match Output Mode)
• OC0 핀 기능 설정
– Bit 3 : WGM01 (Waveform Generation Mode)
• Counter의 카운팅 방향, MAX(TOP) 카운터 값의 소스 및 Mode 선택
– Bit 2 – 0 : CS02 – CS00 (Clock Select)
• Clock의 분주 비율 설정
27
AVR Timer /Counter
Waveform Generation Mode
Mode WGM01 WGM00 Mode of Operation
TOP
Update of OCR0
TOV0 Flag Set
0
0
0
Normal
oxFF
Immediate
MAX
1
0
1
PWM,
Phase Correct
oxFF
TOP
BOTTOM
2
1
0
CTC
OCR0
Immediate
MAX
3
1
1
Fast PWM
oxFF
TOP
MAX
Compare Output Mode, non PWM Mode
Mode
PWM모드가 아닌 경우
(Normal / CTC)
Mode COM01 COM00
FAST
PWM
COM01 COM00
0
0
범용 입출력포트
(OC0 출력 차단)
0
1
비교매치 >> OC0 Toggle 출력
1
0
비교매치 >> OC0 = 0 출력
1
1
비교매치 >> OC0 = 1 출력
설명
0
0
범용 입출력포트
(OC0 출력 차단)
0
1
Reserved
설명
1
0
비교매치 >> OC0 = 0 출력
오버플로우 >> OC0 = 1 출력
1
1
비교매치 >> OC0 = 1 출력
오버플로우 >> OC0 = 0 출력
Mode
Phase Correct
PWM
COM01 COM00
설명
0
0
범용 입출력포트
(OC0 출력 차단)
0
1
Reserved
1
0
상향카운터 비교매치>> OC0 = 0 출력
하향카운터 비교매치>> OC0 = 1 출력
1
1
상향카운터 비교매치>> OC0 = 1 출력
하향카운터 비교매치>> OC0 = 0 출력
28
AVR Timer /Counter
– TCNT0 (Timer / Counter0 Register)
– Timer / Counter0의 8bit 카운터 값을 저장하고 있는 레지스터
29
AVR Timer /Counter
• OCR0 (Timer / Counter0 Output Control Register)
– TCNT0 값과 비교하여 OC0 핀에 출력신호를 발생하기 위한 8bit값
을 저장하는 레지스터
30
AVR Timer /Counter
– TIMSK (Timer / Counter Interrupt Mask Register)
– Timer / Countern에서 발생하는 Interrupt의 개별적으로 enable
– Bit 1: OCIE0 (Timer / Counter0 Output Compare Match
Interrupt Enable)
• OCIE0 bit가 1로 설정되고 SREG의 I비트가 1로 설정되어 있으면 Timer /
Counter0의 출력 비교 Interrupt가 enable
• 이 때, Timer / Counter0 출력비교 Interrupt가 발생하면 TIFR의 OCF0 bit가 1
이 되면 이 Interrupt가 처리 됨
– Bit 0: TOIE0 (Timer /Counter0 Overflow Interrupt Enable)
• TOIE0 bit와 I bit가 1로 설정되어 있으면 Overflow Interrupt가 enable 됨
• 이 때, TIFR의 TOV0 비트가 1이 되면 ISR이 실행 됨
31
AVR Timer /Counter
– TIFR (Timer / Counter Interrupt Flag Register)
– Timer / Counter에서 발생하는 Interrupt Flag를 저장
– Bit 1: OCF0 (Timer / Counter0 Output Compare Flag)
• TCNT0과 OCR0의 값을 비교, 같으면 이 bit가 1로 설정되고, 출력비교
Interrupt가 발생, 이 Interrupt가 처리되면 자동으로 0으로 Clear 됨
– Bit 0: TOV0 (Timer / Counter0 Overflow Flag)
•
•
•
•
Timer / Counter0에서 Overflow가 발생하면 자동으로 1로 설정 됨
이 bit가 1이 되면 Overflow Interrupt 발생
Interrupt가 처리되면 자동으로 0으로 Clear 됨
Phase PWM Mode에서는 Timer / Counter0이 0x00에서 카운트 방향을 바꿀
때 1로 설정 됨
32
AVR Timer /Counter
• Timer
– 각 타이머에서 사용하는 Clock에 대한 설정 필요
• 프리스케일러(PreScaler) 값으로 조절 가능
• 프리스케일러 값은 각 타이머의 컨트롤 레지스터(TCCRn)에서 설정
– 각 타이머 레지스터 (TCNTn)에 얼마마다 한번 씩 인터럽트를 걸게
할 것인지와 관련된 값을 써주면 됨
– 타이머 인터럽트 관련 레지스터들을 설정 필요
• 타이머 인터럽트에서는 TIMSK 레지스터만 설정
33
AVR Timer /Counter
• Timer / Counter0의 Output Compare 장치
– 8bit 비교기 : 연속해서 TCN0 값과 OCR0 값을 비교
– TCNT0 값과 OCR0 값이 같을 때마다 match 신호 발생
– match 신호는 Timer Clock의 다음 Cycle에서 OCF0
(Output Compare Flag) 를 셋
– OCIE0 bit와 SREG 레지스터의 I bit가 1로 Set되어 있으면 OCF0는
Output Compare Interrupt 발생 시킴
– OCF0 Flag는 Interrupt가 실행되고 나서 자동으로 Clear 됨
(OCF0 bit에 1을 써서 Software적으로 Clear해도 됨)
34
AVR Timer /Counter
• Timer / Count0 관련 레지스터
– TCCR0 (Timer / Counter Control Register)
– Bit 7 : FOC0 (Force Output Compare)
• 1: 강제로 OC0 단자에 출력 비교가 매치된 신호 출력 (PWM이 아닌 경우 유효)
– Bit 6 : WGM00 (Waveform Generation Mode)
35
AVR Timer /Counter
• Timer / Counter0의 동작 모드
– WGM[1:0] (Waveform Generation Mode, TCCR0 Reg)와
COM[1:0] (Compare Output Mode, TCCR0 Reg)에서 설정
– WGM : 카운터의 순서에 영향을 비침
– COM : PWM 모드에서 (Non)inverting mode를 결정
Non-PWM 모드에서 compare match 시점에서 출력이 1로
Set되는지, 0으로 Clear 되는지, Toggle인지를 결정
– 4가지 동작 모드 지원
•
•
•
•
Normal Mode
CTC (Clear Timer on Compare Match) Mode
Fast PWM Mode
Phase Correct PWM Mode
36
AVR Timer /Counter
• Normal Mode (WGM[1:0] = 0으로 설정)
– 동작 모드 중 가장 간단한 모드
– 항상 상향 카운터
T : 시간 간격
N : 프리스케일러 분주비
T0 : TCNT0 초기값
f : 분주되기 전 Clock
– 카운트 도중 Clear되지 않음
– TOP이 oxFF가 되면 다시 BOTTOM(0x00)에서 시작 (Overflow)
– TOV0 (Timer /Counter Overflow Flag)는 TCNT0 값이 0이 되는
시점에서 1로 Set 됨
– 비교매치(Compare Match) 인터럽트 발생
• 파형을 예상하지 못하기 때문에 비 추천
37
AVR Timer /Counter
• CTC Mode (Compare Timer on Compare Match Mode)
– WGM[1:0] = 2로 설정
– 주파수 분주 기능으로 주로 사용 (PortB4 = OC0)
• DDR 레지스터 값을 출력으로, COM[1:0]을 1로 설정
–
–
–
–
항상 상향 카운터
T : 시간 간격
N : 프리스케일러 분주비
0x00 ~ OCR0 계수 동작 반복
T : TCNT0 초기값
f : 분주되기 전 Clock
OCR0값과 TCNT0 값이 같으면 카운트 도중 Clear
MAX이거나 OCR0 값일 때, Overflow Interrupt 발생
0
• COMP 인터럽트와 동일하게 작동되기 때문에 비 추천
Mode
PWM모드가 아닌 경우
(Normal / CTC)
COM01
COM00
설명
0
0
범용 입출력포트
(OC0 출력 차단)
0
1
비교매치 -> OC0 Toggle 출력
1
0
비교매치 -> OC0 = 0 출력
1
1
비교매치 -> OC0 = 1 출력
38
AVR Timer /Counter
• 타이머 0, 2의 CTC모드 동작
39
AVR Timer /Counter
• FAST PWM (WGM[1:0] = 3)
–
–
–
–
높은 주파수 PWM 파형발생이 필요할 때 사용
상향 카운터 (Single-Slope Operation)
0x00 ~ 0xFF 계수 동작 반복
TCNT0과 OCR0의 Compare Match되면 OC0에 LOW 출력, OC0
은 0으로 Clear 됨 (COM0[1:0] = 2)
– oxFF -> 0x00 Overflow되면 OC0에 HIGH 출력, OC0은 1로 Set
됨 (COM[1:0] = 2)
Mode
FAST
PWM
COM01
COM00
설명
0
0
범용 입출력포트
(OC0 출력 차단)
0
1
Reserved
1
0
비교매치 -> OC0 = 0 출력
오버플로우 -> OC0 = 1 출력
1
1
비교매치 -> OC0 = 1 출력
오버플로우 -> OC0 = 0 출력
40
AVR Timer /Counter
• Phase Correct PWM
–
–
–
–
–
–
높은 분해능의 PWM출력 파형을 발생하는데 사용
상향카운터 0x00 -> 0xFF
하향카운터 0xFF -> ox00
0x00 ~ oxFF ~ ox00 계수 동작 반복
상향카운터 비교매치>> OC0 = 0 출력 (COM0 1 : 0 = 2)
하향카운터 비교매치>> OC0 = 1 출력 (COM0 1 : 0 = 2)
Mode
Phase Correct
PWM
COM01
COM00
설명
0
0
범용 입출력포트
(OC0 출력 차단)
0
1
Reserved
1
0
상향카운터 비교매치 -> OC0 = 0 출력
하향카운터 비교매치 -> OC0 = 1 출력
1
1
상향카운터 비교매치 -> OC0 = 1 출력
하향카운터 비교매치 -> OC0 = 0 출력
41
AVR Timer /Counter
1. Match 된 다음 Cycle에 Set
2. OCIE0 bit와 SREG의 I 비트
가 1이면 Output Compare
Interrupt 발생
3. Interrupt가 실행되고 나면
OCF는 자동으로 Clear
동작 모드 비트
Compare Output Mode
42
AVR Timer /Counter
• 모드의 동작에 따라 ClkTn에서
카운터가 클리어, 증가, 감소
• AS0를 이용하여 외부 또는 내부 Clock 소스 설정
• CS[2:0]를 설정하여 사용 주파수로 분주 가능
• TCCR0 레지스터의 TGM01~00으로 모드 설정
• TCNT0과 OCR0는 8bit로 구성
CS00~ CS02
AS0
• BOTTOM : ox00일 경우 카운터가 Bottom에 도
달
• MAX
: 0xFF일 경우 카운터가 MAX에 도달
• TOP
: Max or OCR0 값에 도달
43
Timer / Counter
• Timer / Counter 0과 2
– 공통점
•
•
•
•
8bit 구조
Overflow
PWM과 유사한 기능
제어방식
– 차이점
• Timer / Counter0은 32.768KHz의 크리스탈을 접속하는
TOSC1 및 TOSC2 단자를 가짐
• RTC 기능을 갖도록 할 수 있음
• 다른 Timer / Counter와는 다르게 내부 클럭을 사용하든
외부 클럭을 사용하든 모두 프리스케일러의 분주 기능 사용가능
44
AVR Timer /Counter
• Timer / Counter Summary
Timer / Counter
0
1
2
3
기본 구조
8bit
16bit
8bit
16bit
타이머 입력
clkI/O(=clkCPU)
clkI/O(=clkCPU)
clkI/O(=clkCPU)
clkI/O(=clkCPU)
타이머 프리스케일러
1, 8, 32, 64, 128, 256, 1024
1, 8, 64, 256, 1024
1, 8, 64, 256, 1024
1, 8, 64, 256, 1024
카운터 입력
Timer / Counter
Oscillator
T1
T2
T3
TOSC1
관련 레지스터
TCCR0
TCNT0
OCR0
ASSR
SFIOR, TIMSK, TIFR
동작 모드
-
TCCR1A, TCCR1B, TCCR1C
TCCR2
TCNT1H/L
TCNT2
OCR1AH/L, OCR1BH/L, OCR1CH/L
OCR2
ICR1H/L
SFIOR, TIMSK, TIFR,
SFIOR, TIMSK, TIFR
ETIMSK, ETIFR
Normal CTC
Normal
Fast PWM
Phase Correct PWM
Phase and
Frequency
Correct PWM
TCCR3A, TCCR3B, TCCR3C
TCNT3H/L
OCR3AH/L, OCR3BH/L, OCR3CH/L
ICR3H/L
SFIOR, TIMSK, TIFR,
ETIMSK, ETIFR
-
Phase and Frequency Correct
PWM
입력 신호
TOSC1, TOSC2
T1, ICP1
T2
T3, ICP3
출력 신호
OC0
OC1A, OC1B, OC1C
OC2
OC3A, OC3B, OC3C
인터럽트
Output Compare
Match
Output Compare
Match A/B/C
Input Capture
Output Compare
Match
Output Compare Match A/B/C
기타
RTC 기능
타이머 및 카운터 모두
프리스케일러 사용
Overflow
Capture 기능
Input Capture
Capture 기능
45
Source Code
#define F_CPU 16000000
//Clock Frequency : to use
util/delay.h
#define EX_SS_DATA (*(volatile unsigned char *)0x8002) //7seg
data
#define EX_SS_SEL (*(volatile unsigned char *)0x8003) //7seg
digit
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1KHz
// actual value: 1.000KHz (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
Timer / Counter0 Control Register
ASSR = 0x00; //set async mode
TCNT0 = 0x06; //set count
OCR0 = 0x00; //250
TCCR0 = 0x04; //start timer prescale 64
}
const char segment_data[10] = {63,
6,91,79,102,109,125,39,127,103}; //0 to 9
unsigned char display_num[4]={0,0,0,0};
unsigned char digit_num=0;
// Seven segment 4자리 숫자 출력 버퍼 (digit)
void port_init(void)
ISR(TIMER0_OVF_vect)
{
{
PORTA = 0x00;
TCNT0 = 0x00; //reload counter value 0x06
DDRA = 0xff; //1출력 0입력 for 7segment
digit_num++;
PORTB = 0x00;
digit_num = digit_num%4;
DDRB = 0x00;
EX_SS_DATA = segment_data[display_num[digit_num]];
PORTC = 0x00;
EX_SS_SEL = ~(0x01 << digit_num);
DDRC = 0x0f;
//Low 8bit output
}
PORTD = 0x00;
DDRD = 0x00;
1 / 16000000 = 0.0000000625sec
1ms를 만들기 위해 Count 해야 되는 TCNT0 개수
PORTE = 0x00;
prescalar
8 = 0.001 / 0.0000005 = 2000 개
DDRE = 0x00;
8 = 0.0000000625 * 8 = 0.0000005 = 0.5 us
64 = 0.001 / 0.000004 = 250 개
PORTF = 0x00;
64 = 0.0000000625 * 64 = 0.000004 = 4 us
256 = 0.001 / 0.000016 = 62.5 개
DDRF = 0x00;
256 = 0.0000000625 * 256 = 0.000016 = 16 us
1024 = 0.001 / 0.000064 = 15.625 개
PORTG = 0x00;
1024 = 0.0000000625 * 1024 = 0.000064 = 64 us
DDRG = 0x00;
46
Source Code
//call this routine to initialize
void init_devices(void)
{
//stop errant interrupts until
asm("cli");
XDIV = 0x00;
XMCRA = 0x00;
port_init();
timer0_init();
all peripherals
set up
//disable all interrupts
//xtal divider
//external memory
MCUCR = 0x80;
//ext mem access enable
EICRA = 0x00;
//ext ints control reg A
EICRB = 0x00;
//ext ints control reg B
EIMSK = 0x00;
//ext Int mask reg
TIMSK = 0x01;
//timer interrupt sources (MASK) T/C0 Ovf
flag
ETIMSK = 0x00;
//extended timer interrupt sources
asm("sei");
//re-enable interrupts
//all peripherals are now initialized
}
int main(void)
{
int i=0;
init_devices();
while(1){
i++;
display_num[0] =
display_num[1] =
display_num[2] =
display_num[3] =
_delay_ms(1000);
}
(i%10000)/1000;
(i%1000)/100;
(i%100)/10;
(i%10);
}
47
Source Code
• Map File
– 링크와 관련된 여러 가지 정보들을 텍스트로 표현한 파일
– 디버깅 시 결정적은 정보를 제공
– In Avr Studio
• Project -> Configuration Options -> Generate Map File Check
48
Source Code
– Map File의 구성
•
•
•
•
Archive member included because of file (symbol)
Discarded input sections
Memory Configuration
Linker script and memory map
– Archive member included because of file (symbol)
• 이 프로젝트에서 사용된 라이브러리 (아카이브) 파일들에 대한 정보
– ex) ../../../src/gcc/libdriver.a(gpio.o)
gcc/timer.o (GPIOPinRead)
– GPIOPinRead : 프로젝트에서 사용 된 함수명
– libdriver.a : GPIOPinRead가 정의되어 있는 라이브러리
– gpio.o .
: libdriver.a의 구성 파일 중에 실제 GPIOPinRead가 있는 gpio.c 파일의
목적코드
49
Source Code
– Discarded input sections
• 첫 번째 항목에서 언급된 라이브러리 중 사용되지 않은(링크되지 않은), 함수의
리스트
• 링커가 라이브러리를 링크 할 때 라이브러리 내의 모든 함수를 모두 링크하지 않
음
– Memory Configuration
•
•
•
•
프로젝트 바이너리의 전체 Memory Map을 볼 수 있음
ld파일 (link scriptor file)에서 지정한 내용을 간단히 요약
섹션 이름은 ld 파일에서 정하기 나름
EX) Memory Configuration
–
–
–
–
–
–
–
–
Name
text
data
eeprom
fuse
lock
signature
*default*
Origin
0x00000000
0x00800060
0x00810000
0x00820000
0x00830000
0x00840000
0x00000000
Length
Attributes
0x00020000
xr
0x0000ffa0
rw !x
0x00010000
rw !x
0x00000400
rw !x
0x00000400
rw !x
0x00000400
rw !x
0xffffffff
50
Source Code
– Linker script and memory map
• 디버깅 시 아주 유용한 정보를 제공
Interrupt Vector 1-34 (__vector_16 제외)
51
Source Code
• Section
• text(혹은 code) : 프로그램 코드. instruction들이 저장된 영역,
Read only이기 때문에 주로 ROM에 저장 됨
• rodata(혹은 RO) : const 변수들을 위한 영역, 프로그램 코드가 아닌 변수이지만
const, 즉 read only이기 때문에 code와 같이 ROM 영역에
저장하는 것이 일반적
• data(혹은 RW) : 전역변수, static 변수 중 초기값이 지정된 변수들을 위한 영역.
초기값(data)이 있다는 의미와 read-write 가능하다는 의미로
이런 이름이 주로 사용 됨
• bss(혹은 ZI) : 전역변수, static 변수 중 초기값이 없는 변수들을 위한 영역.
data 색션과 같지만 초기값이 없는 변수들, 즉 Zero Initialization
영역
52
•
53
Port A
(Octal D-type Latch with 3-state outputs)
from Port G2
from Port G0
Port C
(3 X 8 Decoder)
/E1 = /E2 = 0, E3 = 1 일 때만 A0A1A2 값을 가짐
(8bit Equal to Comparator)
(3 X 8 Decoder)
/E1 = /E2 = 0, E3 = 1 일 때만 A0A1A2 값을 가짐
54
55

similar documents