kt-m128 peripheral device

55
KT-M128 Peripheral Device Interrupt Timer / Counter0 2010. 8. 3 조 조조 Reference: AVR ATmega128 정정 , ohm 정 정정정 정정정 정정 정정정정 (ATmega128 정정정 ), 정정정 정정정정정 정정정

Upload: marek

Post on 12-Jan-2016

100 views

Category:

Documents


5 download

DESCRIPTION

KT-M128 Peripheral Device. Interrupt Timer / Counter0 2010. 8. 3 조 승훈. Reference: AVR ATmega128 정복 , ohm 사 마이콤 기초와 응용 강의노트 (ATmega128 시스템 ), 동국대 전기공학과 최한호. Index. AVR Interrupt Timer / Counter0 Source Code. AVR Interrupt. Interrupt Overview - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: KT-M128 Peripheral Device

KT-M128 Peripheral Device

InterruptTimer / Counter0

2010. 8. 3 조 승훈Reference:

AVR ATmega128 정복 , ohm 사마이콤 기초와 응용 강의노트 (ATmega128 시스템 ), 동국대 전기공학과 최한호

Page 2: KT-M128 Peripheral Device

Index• AVR Interrupt

• Timer / Counter0

• Source Code

2

Page 3: KT-M128 Peripheral Device

AVR Interrupt• Interrupt Overview

– CPU 외부의 하드웨어적인 요구에 의해서 정상적인 프로그램의 실행 순서를 변경하여 보다 시급한 작업을 먼저 수행한 후에 다시 원래의 프로그램으로 복귀하는 것

– 비동기적으로 발생하는 주변장치의 서비스 요청에 CPU 가 가장 빠르게 대응 할 수 있는 방법

– 비동기적으로 동작하는 CPU( 고속 ) 와 주변장치 ( 저속 ) 사이에서 효율적으로 일을 수행

3

Page 4: KT-M128 Peripheral Device

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

Page 5: KT-M128 Peripheral Device

AVR Interrupt• 인터럽트의 종류

– 인터럽트 발생원인에 따른 분류• 하드웨어 인터럽트

– 내부 인터럽트– 외부 인터럽트

• 소프트웨어 인터럽트

– 인터럽트 발생 시 마이크로 프로세서의 반응 방식에 따른 분류• 차단 가능 인터럽트• 차단 불가능 인터럽트

– 인터럽트를 요구한 입출력 기기를 확인하는 방법에 따른 분류• 벡터형 인터럽트 (Vectored Interrupt)• 조사형 인터럽트 (Polled Interrupt)

5

Page 6: KT-M128 Peripheral Device

AVR Interrupt• 내부 인터럽트

– CPU 에 정의되어 있지 않은 명령의 실행– Zero 로 나눗셈을 시도– 보호된 메모리 영역에 접근 등의 원인에 의해 마이크로 프로세서

내부적으로 발생하는 인터럽트– ATmega128 은 내부 인터럽트가 없음

6

Page 7: KT-M128 Peripheral Device

AVR Interrupt• 외부 인터럽트

– 타이머에서 지정 된 시간 경과– 입력 장치의 서비스 요구– 출력 장치의 작업 종료– A/D 변환의 완료– DMA 동작의 종료– 마이크로 프로세서와 독립되어 있는 외부장치에 의해 발생하는

순수한 의미에서의 인터럽트

7

Page 8: KT-M128 Peripheral Device

AVR Interrupt• 차단 가능 / 불가능 인터럽트

– 차단 가능 인터럽트• 프로그래머에 의해 인터럽트 요청을 받아들이지 않고 무시 할 수 있는 것• 시간제약이 중요한 프로그램에서는 인터럽트 요청을 허용하지 않을 수 있음

– 차단 불가능 인터럽트• 프로그래머에 의해 어떤 방법으로도 인터럽트 요청이 차단 될 수 없는 것• 전원 이상 , 비상 정지 스위치 등 돌발사태에 대비하기 위한 것

• 인터럽트 차단 및 허용– 인터럽트 마스크 레지스터 , 인터럽트 허용 레지스터를 사용하여

개별적으로 차단 및 허용 가능– EIMSK : 개별적 인터럽트의 차단 / 허용– SEI : Set Global Interrupt Flag, Global Interrupt Enable– CLI : Clear Global Interrupt Flag, Global Interrupt Disable

8

Asm 명령

Page 9: KT-M128 Peripheral Device

AVR Interrupt• 벡터형 인터럽트

– 인터럽트가 발생 할 때마다 인터럽트를 요청한 장치가 인터럽트 서비스 루틴의 시작 번지를 CPU 에게 전송하거나 , 또는 CPU 가 각 인터럽트의 종류에 따라 미리 지정된 메모리 번지에서 인터럽트 벡터를 읽어서 이를 인터럽트 서비스 루틴의 시작번지로 사용하는 방식

– 인터럽트 시간이 빠름– 주변 장치의 많고 적음에 영향이 없음– ATmega128 의 모든 인터럽트는 이 방식을 사용

9

Page 10: KT-M128 Peripheral Device

AVR Interrupt• 조사 (Polling) 형 인터럽트

– 인터럽트가 발생하면 이 인터럽트를 요청한 장치를 찾기 위해 CPU가 각 주변장치를 소프트웨어적으로 차례로 조사 (Polling) 하는 방식

– 하드웨어 구조가 간단– 주변 장치의 수에 따라 처리시간이 변함– ATmega128 은 사용하지 않음

10

Page 11: KT-M128 Peripheral Device

AVR Interrupt• 인터럽트의 우선순위 제어

– 인터럽트 우선순위 제어가 필요한 경우• 우연히 2 개 이상의 주변장치가 동시에 CPU 에 인터럽트를 요청하는 경우• 하나의 인터럽트가 서비스되고 있는 동안에 또 다른 인터럽트가 요청되는 경우

– 벡터형 인터럽트의 경우• 인터럽트 우선 순위 제어기의 우선 순위 레지스터의 초기화로 우선순위 제어방식

사용

– 조사형 인터럽트의 경우• Polling 의 순서에 의하여 소프트웨어적으로 우선 순위 선정

11

Page 12: KT-M128 Peripheral Device

AVR Interrupt• Interrupt Vector

12

Reset 및 Interrupt Vector 의 위치 설정

BOOTRST in Fuse High Byte

부트 사이즈의 선택

Page 13: KT-M128 Peripheral Device

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

Page 14: KT-M128 Peripheral Device

AVR Interrupt– 외부 인터럽트의 동작

① 인터럽트 활성화 (SREG.I / EIMSK 해당 비트 활성화 )② 외부 INT 의 동작 Edge 나 논리 신호에 인터럽트 요청③ INTFn = 1 상태로 Flag 가 Set 됨④ 실행 중이던 메인 프로그램의 PC 를 Stack 에 저장⑤ 해당 인터럽트 벡터로 점프⑥ 해당 인터럽트 루틴 처리⑦ 처리가 끝나면 RETI 명령을 받음⑧ Stack 으로부터 저장 된 PC 값을 로드⑨ 동작 중이던 프로그램 위치로 복귀 , 메인 프로그램을 계속해서 수행

14

Page 15: KT-M128 Peripheral Device

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

Page 16: KT-M128 Peripheral Device

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 의 트리거 방식 설정

16

ISOn 1 ISOn0 인터럽트 트리거 방식

0 0 Intn 핀의 Low Level 신호 입력이 인터럽트를 트리거

0 1 -

1 0 Intn 핀의 Falling Edge 입력이 인터럽트를 트리거

1 1 Intn 핀의 Rising Edge 입력이 인터럽트를 트리거

Page 17: KT-M128 Peripheral Device

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 의 트리거 방식 설정

17

ISOn 1 ISOn0 인터럽트 트리거 방식

0 0 Intn 핀의 Low Level 신호 입력이 인터럽트를 트리거

0 1Intn 핀의 Falling Edge 또는 Rising Edge 입력이 인터럽트를

트리거

1 0 Intn 핀의 Falling Edge 입력이 인터럽트를 트리거

1 1 Intn 핀의 Rising Edge 입력이 인터럽트를 트리거

Page 18: KT-M128 Peripheral Device

AVR Interrupt• EIMSK (External Interrupt Mask Register)

– Bit 7 – 0 : External Interrupt Mask Register• 1: 각각의 인터럽트 허용• 0: 각각의 인터럽트 금지

18

Page 19: KT-M128 Peripheral Device

AVR Interrupt• EIFR (External Interrupt Flag Register)

– Bit 7 – 0 : External Interrupt Flag Register• 각각의 인터럽트 발생

19

Page 20: KT-M128 Peripheral Device

AVR Timer /Counter• Timer / Counter Overview

– 입력으로 들어오는 펄스를 셈하는 장치

– 입력으로 들어오는 펄스가 어디에 존재하느냐에 따라 Timer 와 Counter 로 나눔

– AVR ATmega128 에는 범용 타이머 / 카운터가 4 개 존재• Timer/Counter0 (8bit)• Timer/Counter1 (16bit)• Timer/Counter2 (8bit)• Timer/Counter3 (16bit)

20

Page 21: KT-M128 Peripheral Device

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

Page 22: KT-M128 Peripheral Device

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

Page 23: KT-M128 Peripheral Device

AVR Timer /Counter

23

• BOTTOM : ox00 일 경우 카운터가 Bottom 에 도달• MAX : 0xFF 일 경우 카운터가 MAX 에 도달• TOP : Max or OCR0 값에 도달

Page 24: KT-M128 Peripheral Device

AVR Timer /Counter• 프리스케일러 (PreScaler)

– 전치 분주기– 총 8 개의 스케일을 가지고 있음– 분주비가 1:8 일 경우 , 시스템 Clock 이 8 번 들어 올 때 ,

프리스케일러를 통과한 Clock 은 1 번의 Clock 이 발생

24

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

Prescaler for Timer / Counter0

Prescaler for Timer / Counter0

(SFIOR[1])

(ASSR[3])

(TCCR0[2:0])

Page 25: KT-M128 Peripheral Device

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

Page 26: KT-M128 Peripheral Device

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

Page 27: KT-M128 Peripheral Device

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

Page 28: KT-M128 Peripheral Device

AVR Timer /Counter

28

Mode

WGM01

WGM00

Mode of Operation

TOPUpdate of

OCR0TOV0 Flag

Set

0 0 0 Normal oxFF Immediate MAX

1 0 1PWM,

Phase CorrectoxFF TOP BOTTOM

2 1 0 CTC OCR0 Immediate MAX

3 1 1 Fast PWM oxFF TOP MAX

ModeCOM0

1COM0

0설명

PWM 모드가 아닌 경우(Normal / CTC)

0 0범용 입출력포트 (OC0 출력 차단 )

0 1비교매치 >> OC0 Toggle 출력

1 0 비교매치 >> OC0 = 0 출력

1 1 비교매치 >> OC0 = 1 출력

Mode

COM01

COM00

설명

FASTPWM

0 0범용 입출력포트 (OC0 출력 차단 )

0 1 Reserved

1 0

비교매치 >> OC0 = 0 출력오버플로우 >> OC0 = 1 출력

1 1

비교매치 >> OC0 = 1 출력오버플로우 >> OC0 = 0 출력

ModeCOM0

1COM0

0설명

Phase CorrectPWM

0 0범용 입출력포트 (OC0 출력 차단 )

0 1 Reserved

1 0

상향카운터 비교매치 >> OC0 = 0 출력하향카운터 비교매치 >> OC0 = 1 출력

1 1

상향카운터 비교매치 >> OC0 = 1 출력하향카운터 비교매치 >> OC0 = 0 출력

Waveform Generation Mode

Compare Output Mode, non PWM Mode

Page 29: KT-M128 Peripheral Device

AVR Timer /Counter– TCNT0 (Timer / Counter0 Register)

– Timer / Counter0 의 8bit 카운터 값을 저장하고 있는 레지스터

29

Page 30: KT-M128 Peripheral Device

AVR Timer /Counter

30

• OCR0 (Timer / Counter0 Output Control Register)

– TCNT0 값과 비교하여 OC0 핀에 출력신호를 발생하기 위한 8bit값을 저장하는 레지스터

Page 31: KT-M128 Peripheral Device

AVR Timer /Counter

31

– 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 이 실행 됨

Page 32: KT-M128 Peripheral Device

AVR Timer /Counter

32

– 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 로 설정 됨

Page 33: KT-M128 Peripheral Device

AVR Timer /Counter• Timer

– 각 타이머에서 사용하는 Clock 에 대한 설정 필요• 프리스케일러 (PreScaler) 값으로 조절 가능• 프리스케일러 값은 각 타이머의 컨트롤 레지스터 (TCCRn) 에서 설정

– 각 타이머 레지스터 (TCNTn) 에 얼마마다 한번 씩 인터럽트를 걸게 할 것인지와 관련된 값을 써주면 됨

– 타이머 인터럽트 관련 레지스터들을 설정 필요• 타이머 인터럽트에서는 TIMSK 레지스터만 설정

33

Page 34: KT-M128 Peripheral Device

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

Page 35: KT-M128 Peripheral Device

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

Page 36: KT-M128 Peripheral Device

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

Page 37: KT-M128 Peripheral Device

AVR Timer /Counter• Normal Mode (WGM[1:0] = 0 으로 설정 )– 동작 모드 중 가장 간단한 모드

– 항상 상향 카운터

– 카운트 도중 Clear 되지 않음

– TOP 이 oxFF 가 되면 다시 BOTTOM(0x00) 에서 시작 (Overflow)

– TOV0 (Timer /Counter Overflow Flag) 는 TCNT0 값이 0 이 되는 시점에서 1 로 Set 됨

– 비교매치 (Compare Match) 인터럽트 발생• 파형을 예상하지 못하기 때문에 비 추천

37

T : 시간 간격 N : 프리스케일러 분주비 T0 : TCNT0 초기값f : 분주되기 전 Clock

Page 38: KT-M128 Peripheral Device

AVR Timer /Counter• CTC Mode (Compare Timer on Compare Match

Mode)– WGM[1:0] = 2 로 설정– 주파수 분주 기능으로 주로 사용 (PortB4 = OC0)

• DDR 레지스터 값을 출력으로 , COM[1:0] 을 1 로 설정

– 항상 상향 카운터– 0x00 ~ OCR0 계수 동작 반복– OCR0 값과 TCNT0 값이 같으면 카운트 도중 Clear– MAX 이거나 OCR0 값일 때 , Overflow Interrupt 발생

• COMP 인터럽트와 동일하게 작동되기 때문에 비 추천

38

ModeCOM0

1COM0

0설명

PWM 모드가 아닌 경우(Normal / CTC)

0 0범용 입출력포트 (OC0 출력 차단 )

0 1비교매치 -> OC0 Toggle 출력

1 0 비교매치 -> OC0 = 0 출력

1 1 비교매치 -> OC0 = 1 출력

T : 시간 간격 N : 프리스케일러 분주비 T0 : TCNT0 초기값f : 분주되기 전 Clock

Page 39: KT-M128 Peripheral Device

AVR Timer /Counter• 타이머 0, 2 의 CTC 모드 동작

39

Page 40: KT-M128 Peripheral Device

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)

40

ModeCOM0

1COM0

0설명

FASTPWM

0 0범용 입출력포트 (OC0 출력 차단 )

0 1 Reserved

1 0비교매치 -> OC0 = 0 출력오버플로우 -> OC0 = 1 출력

1 1비교매치 -> OC0 = 1 출력오버플로우 -> OC0 = 0 출력

Page 41: KT-M128 Peripheral Device

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)

41

Mode COM01 COM00 설명

Phase CorrectPWM

0 0범용 입출력포트 (OC0 출력 차단 )

0 1 Reserved

1 0상향카운터 비교매치 -> OC0 = 0 출력하향카운터 비교매치 -> OC0 = 1 출력

1 1상향카운터 비교매치 -> OC0 = 1 출력하향카운터 비교매치 -> OC0 = 0 출력

Page 42: KT-M128 Peripheral Device

AVR Timer /Counter

42

1. Match 된 다음 Cycle 에 Set2. OCIE0 bit 와 SREG 의 I

비트가 1 이면 Output Compare Interrupt 발생

3. Interrupt 가 실행되고 나면 OCF 는 자동으로 Clear

동작 모드 비트 Compare Output Mode

Page 43: KT-M128 Peripheral Device

AVR Timer /Counter

43

AS0CS00~ CS02• 모드의 동작에 따라 ClkTn 에서 카운터가 클리어 , 증가 , 감소• AS0 를 이용하여 외부 또는 내부 Clock 소스 설정• CS[2:0] 를 설정하여 사용 주파수로 분주 가능• TCCR0 레지스터의 TGM01~00 으로 모드 설정• TCNT0 과 OCR0 는 8bit 로 구성

• BOTTOM : ox00 일 경우 카운터가 Bottom 에 도달• MAX : 0xFF 일 경우 카운터가 MAX 에 도달• TOP : Max or OCR0 값에 도달

Page 44: KT-M128 Peripheral Device

Timer / Counter • Timer / Counter 0 과 2

– 공통점• 8bit 구조• Overflow• PWM 과 유사한 기능• 제어방식

– 차이점• Timer / Counter0 은 32.768KHz 의 크리스탈을 접속하는 TOSC1 및 TOSC2 단자를 가짐• RTC 기능을 갖도록 할 수 있음• 다른 Timer / Counter 와는 다르게 내부 클럭을 사용하든 외부 클럭을 사용하든 모두 프리스케일러의 분주 기능 사용가능

44

Page 45: KT-M128 Peripheral Device

AVR Timer /Counter• Timer / Counter Summary

45

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 T3TOSC1

관련 레지스터

TCCR0TCNT0OCR0ASSR

SFIOR, TIMSK, TIFR

TCCR1A, TCCR1B, TCCR1CTCNT1H/L

OCR1AH/L, OCR1BH/L, OCR1CH/L ICR1H/L

SFIOR, TIMSK, TIFR, ETIMSK, ETIFR

TCCR2TCNT2 OCR2

SFIOR, TIMSK, TIFR

TCCR3A, TCCR3B, TCCR3CTCNT3H/L

OCR3AH/L, OCR3BH/L, OCR3CH/L ICR3H/L

SFIOR, TIMSK, TIFR, ETIMSK, ETIFR

동작 모드

Normal CTCNormal

Fast PWMPhase Correct PWM

-Phase and Frequency

Correct PWM-

Phase and Frequency Correct PWM

입력 신호 TOSC1, TOSC2 T1, ICP1 T2 T3, ICP3

출력 신호 OC0 OC1A, OC1B, OC1C OC2 OC3A, OC3B, OC3C

인터럽트

OverflowOutput Compare

MatchOutput Compare

Match A/B/COutput Compare

MatchOutput Compare Match A/B/C

Input Capture Input Capture

기타RTC 기능

타이머 및 카운터 모두 프리스케일러 사용

Capture 기능 Capture 기능

Page 46: KT-M128 Peripheral Device

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>

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}; // Seven segment 4자리 숫자 출력 버퍼 (digit)

void port_init(void){ PORTA = 0x00; DDRA = 0xff; //1 출력 0 입력 for 7segment PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x0f; //Low 8bit output PORTD = 0x00; DDRD = 0x00; PORTE = 0x00; DDRE = 0x00; PORTF = 0x00; DDRF = 0x00; PORTG = 0x00; DDRG = 0x00;}

//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}

unsigned char digit_num=0;

ISR(TIMER0_OVF_vect){ TCNT0 = 0x00; //reload counter value 0x06 digit_num++; digit_num = digit_num%4; EX_SS_DATA = segment_data[display_num[digit_num]]; EX_SS_SEL = ~(0x01 << digit_num);}

46

1 / 16000000 = 0.0000000625secprescalar8 = 0.0000000625 * 8 = 0.0000005 = 0.5 us64 = 0.0000000625 * 64 = 0.000004 = 4 us256 = 0.0000000625 * 256 = 0.000016 = 16 us1024 = 0.0000000625 * 1024 = 0.000064 = 64 us

1ms 를 만들기 위해 Count 해야 되는 TCNT0 개수8   = 0.001 / 0.0000005 = 2000 개64  = 0.001 / 0.000004 = 250 개256 = 0.001 / 0.000016 = 62.5 개1024 = 0.001 / 0.000064 = 15.625 개

Page 47: KT-M128 Peripheral Device

Source Code//call this routine to initialize all peripheralsvoid init_devices(void){ //stop errant interrupts until set up asm("cli"); //disable all interrupts XDIV = 0x00; //xtal divider XMCRA = 0x00; //external memory port_init(); timer0_init();

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] = (i%10000)/1000; display_num[1] = (i%1000)/100; display_num[2] = (i%100)/10; display_num[3] = (i%10); _delay_ms(1000);

}}

47

Page 48: KT-M128 Peripheral Device

Source Code• Map File

– 링크와 관련된 여러 가지 정보들을 텍스트로 표현한 파일– 디버깅 시 결정적은 정보를 제공– In Avr Studio

• Project -> Configuration Options -> Generate Map File Check

48

Page 49: KT-M128 Peripheral Device

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

Page 50: KT-M128 Peripheral Device

Source Code– Discarded input sections

• 첫 번째 항목에서 언급된 라이브러리 중 사용되지 않은 ( 링크되지 않은 ), 함수의 리스트

• 링커가 라이브러리를 링크 할 때 라이브러리 내의 모든 함수를 모두 링크하지 않음

– Memory Configuration • 프로젝트 바이너리의 전체 Memory Map 을 볼 수 있음• ld파일 (link scriptor file) 에서 지정한 내용을 간단히 요약• 섹션 이름은 ld 파일에서 정하기 나름• EX) Memory Configuration

– Name Origin Length Attributes– text 0x00000000 0x00020000 xr– data 0x00800060 0x0000ffa0 rw !x– eeprom 0x00810000 0x00010000 rw !x– fuse 0x00820000 0x00000400 rw !x– lock 0x00830000 0x00000400 rw !x– signature 0x00840000 0x00000400 rw !x– *default* 0x00000000 0xffffffff

50

Page 51: KT-M128 Peripheral Device

Source Code– Linker script and memory map

• 디버깅 시 아주 유용한 정보를 제공

51

Interrupt Vector 1-34 (__vector_16 제외 )

Page 52: KT-M128 Peripheral Device

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

Page 53: KT-M128 Peripheral Device

53

Page 54: KT-M128 Peripheral Device

54

Port A

Port C

from Port G2

from Port G0

(Octal D-type Latch with 3-state outputs)

(8bit Equal to Comparator)(3 X 8 Decoder) /E1 = /E2 = 0, E3 = 1 일 때만 A0A1A2 값을 가짐

(3 X 8 Decoder) /E1 = /E2 = 0, E3 = 1 일 때만 A0A1A2 값을 가짐

Page 55: KT-M128 Peripheral Device

55