SlideShare a Scribd company logo
1 of 29
X[Deca] AVR study
Konkuk University. Department of Electronic Engineering
200811486
김정목
Page  2
Contents
Contents
1 Timer/Counter
2 PWM
Page  3
Timer/Counter
Timer
- 컴퓨터 동작 중에서 경과시간을 나타내거나 외부(예를 들어 clock)에서 펄스 신호를 카운트하여
특정한 간격으로 삽입하여 신호를 발생시키는 장치.
Counter
- 유한개의 상태를 갖고 각각의 상태가 계수적으로 표현되는 기구이며 적당한 신호를 받으면 그 수가 1
또는 주어진 상수 만큼 증가하는 것.
Timer/Counter in Atmega128
- Two 8-bit Timer/Counters with separate prescaler and compare mode
1) 8-bit timer/counter0
2) 8-bit timer/counter2
- Two expanded 16-bit Timer/Counters with separate prescaler, compare mode and capture mode.
1) 16-bit timer/counter1
2) 16-bit timer/counter3
Page  4
PWM(Pulse Width Modulation)
PWM(Pulse Width Modulation)
- Pulse 변조 방식중 하나로, 변조 신호의 크기에 따라 Pulse 폭(width)을 변조하는 방식
Page  5
Timer/Counter
8-bit Timer/Counter0 (with PWM and Asynchronous operation)
Page  6
Timer/Counter
1. Definition
Page  7
Timer/Counter
2. Modes of operation
- Timer/counter 와 Output compare pin의 동작에 관한 것
- Waveform generation mode(WGM01:0)와 Compare output mode(COM01:0) bits로 정의/설정
- WGM01:0은 counting sequence에 영향을 줌
- COM01:0은
PWM mode 일 경우 생성된 PWM output이 inverted 인지 아닌지 제어
Non-PWM mode 일 경우 compare match에서 output이 set / cleared / toggled 인지 정의
- Normal / CTC / fast PWM / Phase correct PWM mode가 있음
1) Normal mode
- 항상 up counting하며, counter를 clear하지 않음
- Counter가 maximum인 8-bit value(TOP=0xFF)넘어가면 단순히 overrun하며,
bottom(0x00)부터 다시 시작한다.
- TCNT0가 0이 되면 Timer/Counter overflow flag(TOV0)가 set이 된다.
Page  8
Timer/Counter
2) CTC(Clear Time on Compare match) Mode (1/2)
- OCR0(Output Compare Register)는 counter의 resolution을 설정하기 위해 사용
- TCNT0(counter value)와 OCR0의 값이 같을 때 counter가 clear됨
즉, OCR0가 counter의 TOP value를 정의함
- Counter 값이 TOP value에 도달 할 때 마다 interrupt가 발생함
(Output Compare Match Interrupt)
Page  9
Timer/Counter
2) CTC(Clear Time on Compare match) Mode (2/2)
- CTC mode에서 waveform output을 생성하기 위해서는, OC0 output이 COM01:0을 toggle
mode로 setting 함으로써 각각의 compare match 때 logical level을 toggle 할 수 있음
- OC0 value가 pin에 보이기 위해서는 pin direction을 output으로 설정해야함
- Waveform frequency equation :
- N은 prescale factor를 나타내며 (1, 8, 32, 64, 128, 256, 1024) 중 하나의 값을 가짐
Page  10
Timer/Counter
3) Fast PWM(Pulse Width Modulation) Mode (1/2)
- High Frequency PWM waveform operation / Single-slope operation
- Counter는 BOTTOM에서 MAX까지 count하고 BOTTOM에서 다시 시작함
- Non-inverting Compare output mode에서는
TCNT0와 OCR0의 compare match에서 OC0가 clear 되고 BOTTOM에서 다시 set 됨
- Inverting Compare output mode에서는
compare match에서 OC0가 set되고 BOTTOM에서 다시 clear 됨
Page  11
Timer/Counter
3) Fast PWM(Pulse Width Modulation) Mode (2/2)
- PWM frequency for the output
- N은 prescale factor이며 (1, 8, 32, 64, 128, 256, 1024) 중 하나의 값을 가짐
Page  12
Timer/Counter
4) Phase Correct PWM(Pulse Width Modulation) Mode (1/2)
- High resolution PWM waveform generation / dual-slope operation
- Counter는 BOTTOM에서 MAX로 MAX에서 BOTTOM으로 count 함
- Non-inverting Compare output mode에서는
Up counting 중에는 TCNT0와 OCR0의 compare match에서 OC0가 clear 되고
Down counting 중에는 compare match에서 OC0가 set 됨
- Inverting Compare output mode에서는
Up counting 중에는 TCNT0와 OCR0의 compare match에서 OC0가 set 되고
Down counting 중에는 compare match에서 OC0가 clear 됨
Page  13
Timer/Counter
4) Phase Correct PWM(Pulse Width Modulation) Mode (2/2)
- Timer/Counter Overflow flag(OVF0)는 counter가 BOTTOM에 갈 때 마다 set 됨
- PWM frequency for the output
- N은 prescale factor이며 (1, 8, 32, 64, 128, 256, 1024) 중 하나의 값을 가짐
Page  14
Timer/Counter
1.TCCR0 – Timer/Counter Control Register (1/5)
1) FOC0 : Force Output Compare
- Non-PWM mode에 대해서만 유효함. FOC0=1 일 경우 OC0에 자동으로 Compare match와
같은 출력이 발생함 이 때 출력은 COM01:0에 의해 설정되어 있음. 그러나 interrupt가
발생하지는 않으며 TCNT0 역시 초기화 되거나 하지는 않음. 일반적으로 0으로 설정.
Page  15
Timer/Counter
1.TCCR0 – Timer/Counter Control Register (2/5)
2) WGM01:0 : Waveform Generation Mode
- Sequence of counter
- TOP (Maximum of counter value)
- Type of waveform generation ( Normal / CTC / fast PWM / phase correct PWM )
Page  16
Timer/Counter
1.TCCR0 – Timer/Counter Control Register (3/5)
3) COM01:0 : Compare Output Mode (1/2)
- OC0(Output Compare pin)의 동작을 설정함
- OC0에 해당하는 DDR(Data Direction Register)가 출력으로 설정되어 있어야 함
- Type of waveform generation ( Normal / CTC / fast PWM / phase correct PWM )
(1) Non-PWM Mode
Page  17
Timer/Counter
1.TCCR0 – Timer/Counter Control Register (4/5)
3) COM01:0 : Compare Output Mode (2/2)
(2) fast PWM Mode
(3) phase correct PWM Mode
Page  18
Timer/Counter
1.TCCR0 – Timer/Counter Control Register (5/5)
4) CS02:0 : Clock Select Mode
- Timer/Counter에서 사용하게될 Clock Source를 선택함
- Prescale 설정
Page  19
Timer/Counter
2. TCNT0 – Timer/Counter Register
- Read/Write가 가능한 8-bit Timer/Counter
- Counting 진행 중에 TCNT0의 값을 변화시키면 compare match를 놓칠 수 있음
3. OCR0 – Output Compare Register
- OCR0 값은 지속적으로 TCNT0값과 비교됨
- Output compare interrupt에 사용되거나 OC0 pin에 waveform output을 생성하데 사용
Page  20
Timer/Counter
4. TIMSK - Timer/Counter Interrupt Mask Register
1) OCIE0 : Timer/Counter0 Output Compare Match Interrupt Enable
- OCIE0=1이면, timer/counter output compare match interrupt가 사용가능
2) TOIE0 : Timer/Counter0 Overflow Interrupt Enable
- TOIE0=1이면, timer/counter overflow interrupt가 사용가능
5. OCR0 – Output Compare Register
1) OCF0 : Output Compare Flag0
2) TOV0 : Timer/Counter0 Overflow Flag0
Page  21
Timer/Counter
참고) Accessing 16-bit Register
- 16-bit timer/counter의 경우 8-bit timer/counter와 거의 동일하게 사용되며
대신 16-bit TCNT와 OCR을 사용하므로 16-bit register 접근에 대해 알 필요가 있음
- 모든 16-bit timer에 있는 16bit register는 동일한 Temporary Register를 사용
- 16-bit 중 Low byte(L) 에 접근하는 것은 16-bit read/write operation을 trigger함
1) Write
- CPU에 의해서 16-bit의 Low byte(L) register가 쓰여지면,
temporary register에 쓰여진 High byte(H) 값과 Low byte(L)가 16-bit register에
같은 clock cycle내에 copy 됨
2) Read
- CPU에 의해서 16-bit register의 Low byte(L) 값이 읽혀지면,
Low byte(L)값이 읽혀지는 clock cycle내에 16-bit register의 High byte(H) 값이
Temporary Register에 쓰여짐
결론)
- 16-bit write를 하기 위해선 High byte -> Low byte 순으로 하며,
- 16-bit read를 하기 위해선 Low byte -> High byte 순으로 함.
Page  22
Timer/Counter_Normal mode
// 실습1-1)
#include<avr/io.h>
#include<avr/interrupt.h>
volatile int cnt=0;
int main(void) {
DDRA = 0xFF;
TCCR0 = 0x07;
//TCNT0 = 0;
//OCR0 = 0;
TIMSK = 0x01;
sei();
while(1) {
}
return 0;
}
ISR(TIMER0_OVF_vect) {
cnt++;
if(cnt==61) {
cnt=0;
if(PORTA==0x00)
PORTA=0x01;
else
PORTA=PORTA<<1;
}
}
// Normal mode / OC0 disconneted
// clk_IO = 16Mhz / division factor = 1024
// timer/counter0 overflow interrupt
// 약 1초 주기로 LED가 순처적으로 이동하며 점등
// 실습1_1_1)
// clk_IO = 16Mhz / division factor = 256
// 약 0.5초 주기로 전체 LED 점멸
Page  23
Timer/Counter_CTC mode(1/3)
// 실습1-2)
#include<avr/io.h>
#include<avr/interrupt.h>
volatile int cnt=0;
int main(void) {
DDRA = 0xFF;
TCCR0 = 0x0F;
//TCNT0 = 0;
OCR0 = 0x10;
TIMSK = 0x02;
sei();
while(1) {
}
return 0;
}
ISR(TIMER0_COMP_vect) {
cnt++;
if(cnt==500) {
PORTA = ~PORTA;
cnt=0;
}
}
// CTC mode / OC0 disconneted
// clk_IO = 16Mhz / division factor = 1024
// OCR0 = 0x10 // 16
// timer/counter0 compare match interrupt
// 약 0.5초 주기로 LED가 점멸함
Page  24
Timer/Counter_CTC mode(2/3)
// 실습1-3)
#include<avr/io.h>
#include<avr/interrupt.h>
int main(void) {
DDRB = 0x10;
TCCR0 = 0x1F;
//TCNT0 = 0;
OCR0 = 0x10;
// 0x4E(78) for 5ms
// 0x10(16) for 1ms
//TIMSK = 0x02;
while(1) {
}
return 0;
}
// CTC mode / Toggle OC0 on compare match
// clk_IO = 16Mhz / division factor = 1024
//---------------------------------------//
// OCR0 = 0x10 // 16
// f_ocn = f_clk_io / (2*N*(1+OCR0))
// = 16*10^6 / (2*1024*(1+16))
// = 488.28 (Hz) (~= 500 Hz)
// period = 1 / f_ocn
// = 1 / 488.28
// = 0.00204 (s) (~= 0.002 s)
// 주의) toggle이므로 주기는 counting의 2배가 된것임
// OC0(Port B[4])에
// 주기 약 2ms / on time 약 1ms의 신호 출력
//---------------------------------------//
// OCR0 = 0x4E // 78
// f_ocn = 100.16 (Hz) (~= 100 Hz)
// period = 0.00998 (s) (~= 0.010 s)
// OC0(Port B[4])에
// 주기 약 10ms / on time 약 5ms의 신호 출력
//---------------------------------------//
Page  25
Timer/Counter_CTC mode(3/3)
Page  26
Timer/Counter_fast PWM mode(1/2)
// 실습1-4)
#include<avr/io.h>
#include<avr/interrupt.h>
int main(void) {
DDRB = 0x10;
TCCR0 = 0x6F;
// fat PWM / non-inverting
//TCNT0 = 0;
OCR0 = 0x40;
// 0x40(64)/0x80(128)/0xC0(192)
while(1) {
}
return 0;
}
// fast PWM mode / Non-inverting
// clk_IO = 16Mhz / division factor = 1024
// OCR0 = 0x40 // 64
//---------------------------------------//
// period_pwm은 PWM 전체 주기
// time_on은 PWM 중 on time 시간
// f_pwm = f_clk_io / (N*256)
// = 16*10^6 / (1024*256)
// = 61.03 (Hz) (~= 61 Hz)
// period_pwm = 1 / f_ocn
// = 1 / 61.03
// = 0.0163 (s) (~= 0.016 s)
// OCR0(TOP)=0x40 이므로
// tiem_on = (1 / f_pwm) * (64/256)
// = (1 / 61.03) * (64/256)
// ~= 0.004 (s)
Page  27
Timer/Counter_fast PWM mode(2/2)
Page  28
Timer/Counter_Phase correct PWM mode(1/2)
// 실습1-5)
#include<avr/io.h>
#include<avr/interrupt.h>
int main(void) {
DDRB = 0x10;
TCCR0 = 0x67;
// phase correct PWM
// non-inverting
//TCNT0 = 0;
OCR0 = 0x80;
while(1) {
}
return 0;
}
// phase correct PWM mode / Non-inverting
// clk_IO = 16Mhz / division factor = 1024
// OCR0 = 0x80 // 128
//---------------------------------------//
// period_pwm은 PWM 전체 주기
// time_on은 PWM 중 on time 시간
// f_pwm = f_clk_io / (N*510)
// = 16*10^6 / (1024*510)
// = 30.367 (Hz) (~= 30 Hz)
// period_pwm = 1 / f_pwm
// = 1 / 30.367
// = 0.0329 (s) (~= 0.033 s)
// OCR0(TOP)=0x80 이므로
// tiem_on = 2 * (1 / f_pwm) * (128/510)
// = 2 * (1 / 30.367) * (128/510)
// ~= 2 * 0.008 = 0.016(s)
// dual-slope 이므로 2를 곱함
Page  29
Timer/Counter_Phase correct PWM mode(2/2)

More Related Content

Viewers also liked

01. avr studio 6.2 사용법
01. avr studio 6.2 사용법01. avr studio 6.2 사용법
01. avr studio 6.2 사용법성호 정
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 6
2013 mcu( 마이크로컨트롤러 ) 수업자료 62013 mcu( 마이크로컨트롤러 ) 수업자료 6
2013 mcu( 마이크로컨트롤러 ) 수업자료 6진우 김
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 5
2013 mcu( 마이크로컨트롤러 ) 수업자료 52013 mcu( 마이크로컨트롤러 ) 수업자료 5
2013 mcu( 마이크로컨트롤러 ) 수업자료 5진우 김
 
00. 환경구축
00. 환경구축00. 환경구축
00. 환경구축성호 정
 
2013 MCU( 마이크로컨트롤러 ) 수업자료 1
2013 MCU( 마이크로컨트롤러 ) 수업자료 12013 MCU( 마이크로컨트롤러 ) 수업자료 1
2013 MCU( 마이크로컨트롤러 ) 수업자료 1진우 김
 
AVR 기초와 응용 강의노트(최한호)
AVR 기초와 응용 강의노트(최한호)AVR 기초와 응용 강의노트(최한호)
AVR 기초와 응용 강의노트(최한호)활 김
 
02. led switch
02. led switch02. led switch
02. led switch성호 정
 
노동진 Mega splatting
노동진 Mega splatting노동진 Mega splatting
노동진 Mega splattingdrandom
 
Relay and AVR Atmel Atmega 16
Relay and AVR Atmel Atmega 16Relay and AVR Atmel Atmega 16
Relay and AVR Atmel Atmega 16Robo India
 
X[deca] 9월 개강총회
X[deca] 9월 개강총회X[deca] 9월 개강총회
X[deca] 9월 개강총회성호 정
 

Viewers also liked (13)

01. avr studio 6.2 사용법
01. avr studio 6.2 사용법01. avr studio 6.2 사용법
01. avr studio 6.2 사용법
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 6
2013 mcu( 마이크로컨트롤러 ) 수업자료 62013 mcu( 마이크로컨트롤러 ) 수업자료 6
2013 mcu( 마이크로컨트롤러 ) 수업자료 6
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 5
2013 mcu( 마이크로컨트롤러 ) 수업자료 52013 mcu( 마이크로컨트롤러 ) 수업자료 5
2013 mcu( 마이크로컨트롤러 ) 수업자료 5
 
USB-AVRISP
USB-AVRISPUSB-AVRISP
USB-AVRISP
 
03. usart
03. usart03. usart
03. usart
 
00. 환경구축
00. 환경구축00. 환경구축
00. 환경구축
 
2013 MCU( 마이크로컨트롤러 ) 수업자료 1
2013 MCU( 마이크로컨트롤러 ) 수업자료 12013 MCU( 마이크로컨트롤러 ) 수업자료 1
2013 MCU( 마이크로컨트롤러 ) 수업자료 1
 
AVR 기초와 응용 강의노트(최한호)
AVR 기초와 응용 강의노트(최한호)AVR 기초와 응용 강의노트(최한호)
AVR 기초와 응용 강의노트(최한호)
 
02. led switch
02. led switch02. led switch
02. led switch
 
노동진 Mega splatting
노동진 Mega splatting노동진 Mega splatting
노동진 Mega splatting
 
Relay and AVR Atmel Atmega 16
Relay and AVR Atmel Atmega 16Relay and AVR Atmel Atmega 16
Relay and AVR Atmel Atmega 16
 
X[deca] 9월 개강총회
X[deca] 9월 개강총회X[deca] 9월 개강총회
X[deca] 9월 개강총회
 
강의자료4
강의자료4강의자료4
강의자료4
 

Similar to 05. timer.counter.pwm

Interrupt @atmega
Interrupt @atmegaInterrupt @atmega
Interrupt @atmegamanintroll
 
ADC(nanheekim)
ADC(nanheekim)ADC(nanheekim)
ADC(nanheekim)Nanhee Kim
 
TestBCD2016-1(Answer)
TestBCD2016-1(Answer)TestBCD2016-1(Answer)
TestBCD2016-1(Answer)Yong Heui Cho
 
Measuring distance with ultrasonic sensor
Measuring distance with ultrasonic sensorMeasuring distance with ultrasonic sensor
Measuring distance with ultrasonic sensorChangsupSong1
 
망고100 보드로 놀아보자 8
망고100 보드로 놀아보자 8망고100 보드로 놀아보자 8
망고100 보드로 놀아보자 8종인 전
 
TestBCD2018-1(answer)
TestBCD2018-1(answer)TestBCD2018-1(answer)
TestBCD2018-1(answer)Yong Heui Cho
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 4
2013 mcu( 마이크로컨트롤러 ) 수업자료 42013 mcu( 마이크로컨트롤러 ) 수업자료 4
2013 mcu( 마이크로컨트롤러 ) 수업자료 4진우 김
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델Seungmo Koo
 

Similar to 05. timer.counter.pwm (11)

Interrupt @atmega
Interrupt @atmegaInterrupt @atmega
Interrupt @atmega
 
ADC(nanheekim)
ADC(nanheekim)ADC(nanheekim)
ADC(nanheekim)
 
TestBCD2016-1(Answer)
TestBCD2016-1(Answer)TestBCD2016-1(Answer)
TestBCD2016-1(Answer)
 
Avr lecture8
Avr lecture8Avr lecture8
Avr lecture8
 
Measuring distance with ultrasonic sensor
Measuring distance with ultrasonic sensorMeasuring distance with ultrasonic sensor
Measuring distance with ultrasonic sensor
 
망고100 보드로 놀아보자 8
망고100 보드로 놀아보자 8망고100 보드로 놀아보자 8
망고100 보드로 놀아보자 8
 
TestBCD2018-1(answer)
TestBCD2018-1(answer)TestBCD2018-1(answer)
TestBCD2018-1(answer)
 
2013 mcu( 마이크로컨트롤러 ) 수업자료 4
2013 mcu( 마이크로컨트롤러 ) 수업자료 42013 mcu( 마이크로컨트롤러 ) 수업자료 4
2013 mcu( 마이크로컨트롤러 ) 수업자료 4
 
Avr lecture3
Avr lecture3Avr lecture3
Avr lecture3
 
Avr lecture6
Avr lecture6Avr lecture6
Avr lecture6
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 

05. timer.counter.pwm

  • 1. X[Deca] AVR study Konkuk University. Department of Electronic Engineering 200811486 김정목
  • 2. Page  2 Contents Contents 1 Timer/Counter 2 PWM
  • 3. Page  3 Timer/Counter Timer - 컴퓨터 동작 중에서 경과시간을 나타내거나 외부(예를 들어 clock)에서 펄스 신호를 카운트하여 특정한 간격으로 삽입하여 신호를 발생시키는 장치. Counter - 유한개의 상태를 갖고 각각의 상태가 계수적으로 표현되는 기구이며 적당한 신호를 받으면 그 수가 1 또는 주어진 상수 만큼 증가하는 것. Timer/Counter in Atmega128 - Two 8-bit Timer/Counters with separate prescaler and compare mode 1) 8-bit timer/counter0 2) 8-bit timer/counter2 - Two expanded 16-bit Timer/Counters with separate prescaler, compare mode and capture mode. 1) 16-bit timer/counter1 2) 16-bit timer/counter3
  • 4. Page  4 PWM(Pulse Width Modulation) PWM(Pulse Width Modulation) - Pulse 변조 방식중 하나로, 변조 신호의 크기에 따라 Pulse 폭(width)을 변조하는 방식
  • 5. Page  5 Timer/Counter 8-bit Timer/Counter0 (with PWM and Asynchronous operation)
  • 7. Page  7 Timer/Counter 2. Modes of operation - Timer/counter 와 Output compare pin의 동작에 관한 것 - Waveform generation mode(WGM01:0)와 Compare output mode(COM01:0) bits로 정의/설정 - WGM01:0은 counting sequence에 영향을 줌 - COM01:0은 PWM mode 일 경우 생성된 PWM output이 inverted 인지 아닌지 제어 Non-PWM mode 일 경우 compare match에서 output이 set / cleared / toggled 인지 정의 - Normal / CTC / fast PWM / Phase correct PWM mode가 있음 1) Normal mode - 항상 up counting하며, counter를 clear하지 않음 - Counter가 maximum인 8-bit value(TOP=0xFF)넘어가면 단순히 overrun하며, bottom(0x00)부터 다시 시작한다. - TCNT0가 0이 되면 Timer/Counter overflow flag(TOV0)가 set이 된다.
  • 8. Page  8 Timer/Counter 2) CTC(Clear Time on Compare match) Mode (1/2) - OCR0(Output Compare Register)는 counter의 resolution을 설정하기 위해 사용 - TCNT0(counter value)와 OCR0의 값이 같을 때 counter가 clear됨 즉, OCR0가 counter의 TOP value를 정의함 - Counter 값이 TOP value에 도달 할 때 마다 interrupt가 발생함 (Output Compare Match Interrupt)
  • 9. Page  9 Timer/Counter 2) CTC(Clear Time on Compare match) Mode (2/2) - CTC mode에서 waveform output을 생성하기 위해서는, OC0 output이 COM01:0을 toggle mode로 setting 함으로써 각각의 compare match 때 logical level을 toggle 할 수 있음 - OC0 value가 pin에 보이기 위해서는 pin direction을 output으로 설정해야함 - Waveform frequency equation : - N은 prescale factor를 나타내며 (1, 8, 32, 64, 128, 256, 1024) 중 하나의 값을 가짐
  • 10. Page  10 Timer/Counter 3) Fast PWM(Pulse Width Modulation) Mode (1/2) - High Frequency PWM waveform operation / Single-slope operation - Counter는 BOTTOM에서 MAX까지 count하고 BOTTOM에서 다시 시작함 - Non-inverting Compare output mode에서는 TCNT0와 OCR0의 compare match에서 OC0가 clear 되고 BOTTOM에서 다시 set 됨 - Inverting Compare output mode에서는 compare match에서 OC0가 set되고 BOTTOM에서 다시 clear 됨
  • 11. Page  11 Timer/Counter 3) Fast PWM(Pulse Width Modulation) Mode (2/2) - PWM frequency for the output - N은 prescale factor이며 (1, 8, 32, 64, 128, 256, 1024) 중 하나의 값을 가짐
  • 12. Page  12 Timer/Counter 4) Phase Correct PWM(Pulse Width Modulation) Mode (1/2) - High resolution PWM waveform generation / dual-slope operation - Counter는 BOTTOM에서 MAX로 MAX에서 BOTTOM으로 count 함 - Non-inverting Compare output mode에서는 Up counting 중에는 TCNT0와 OCR0의 compare match에서 OC0가 clear 되고 Down counting 중에는 compare match에서 OC0가 set 됨 - Inverting Compare output mode에서는 Up counting 중에는 TCNT0와 OCR0의 compare match에서 OC0가 set 되고 Down counting 중에는 compare match에서 OC0가 clear 됨
  • 13. Page  13 Timer/Counter 4) Phase Correct PWM(Pulse Width Modulation) Mode (2/2) - Timer/Counter Overflow flag(OVF0)는 counter가 BOTTOM에 갈 때 마다 set 됨 - PWM frequency for the output - N은 prescale factor이며 (1, 8, 32, 64, 128, 256, 1024) 중 하나의 값을 가짐
  • 14. Page  14 Timer/Counter 1.TCCR0 – Timer/Counter Control Register (1/5) 1) FOC0 : Force Output Compare - Non-PWM mode에 대해서만 유효함. FOC0=1 일 경우 OC0에 자동으로 Compare match와 같은 출력이 발생함 이 때 출력은 COM01:0에 의해 설정되어 있음. 그러나 interrupt가 발생하지는 않으며 TCNT0 역시 초기화 되거나 하지는 않음. 일반적으로 0으로 설정.
  • 15. Page  15 Timer/Counter 1.TCCR0 – Timer/Counter Control Register (2/5) 2) WGM01:0 : Waveform Generation Mode - Sequence of counter - TOP (Maximum of counter value) - Type of waveform generation ( Normal / CTC / fast PWM / phase correct PWM )
  • 16. Page  16 Timer/Counter 1.TCCR0 – Timer/Counter Control Register (3/5) 3) COM01:0 : Compare Output Mode (1/2) - OC0(Output Compare pin)의 동작을 설정함 - OC0에 해당하는 DDR(Data Direction Register)가 출력으로 설정되어 있어야 함 - Type of waveform generation ( Normal / CTC / fast PWM / phase correct PWM ) (1) Non-PWM Mode
  • 17. Page  17 Timer/Counter 1.TCCR0 – Timer/Counter Control Register (4/5) 3) COM01:0 : Compare Output Mode (2/2) (2) fast PWM Mode (3) phase correct PWM Mode
  • 18. Page  18 Timer/Counter 1.TCCR0 – Timer/Counter Control Register (5/5) 4) CS02:0 : Clock Select Mode - Timer/Counter에서 사용하게될 Clock Source를 선택함 - Prescale 설정
  • 19. Page  19 Timer/Counter 2. TCNT0 – Timer/Counter Register - Read/Write가 가능한 8-bit Timer/Counter - Counting 진행 중에 TCNT0의 값을 변화시키면 compare match를 놓칠 수 있음 3. OCR0 – Output Compare Register - OCR0 값은 지속적으로 TCNT0값과 비교됨 - Output compare interrupt에 사용되거나 OC0 pin에 waveform output을 생성하데 사용
  • 20. Page  20 Timer/Counter 4. TIMSK - Timer/Counter Interrupt Mask Register 1) OCIE0 : Timer/Counter0 Output Compare Match Interrupt Enable - OCIE0=1이면, timer/counter output compare match interrupt가 사용가능 2) TOIE0 : Timer/Counter0 Overflow Interrupt Enable - TOIE0=1이면, timer/counter overflow interrupt가 사용가능 5. OCR0 – Output Compare Register 1) OCF0 : Output Compare Flag0 2) TOV0 : Timer/Counter0 Overflow Flag0
  • 21. Page  21 Timer/Counter 참고) Accessing 16-bit Register - 16-bit timer/counter의 경우 8-bit timer/counter와 거의 동일하게 사용되며 대신 16-bit TCNT와 OCR을 사용하므로 16-bit register 접근에 대해 알 필요가 있음 - 모든 16-bit timer에 있는 16bit register는 동일한 Temporary Register를 사용 - 16-bit 중 Low byte(L) 에 접근하는 것은 16-bit read/write operation을 trigger함 1) Write - CPU에 의해서 16-bit의 Low byte(L) register가 쓰여지면, temporary register에 쓰여진 High byte(H) 값과 Low byte(L)가 16-bit register에 같은 clock cycle내에 copy 됨 2) Read - CPU에 의해서 16-bit register의 Low byte(L) 값이 읽혀지면, Low byte(L)값이 읽혀지는 clock cycle내에 16-bit register의 High byte(H) 값이 Temporary Register에 쓰여짐 결론) - 16-bit write를 하기 위해선 High byte -> Low byte 순으로 하며, - 16-bit read를 하기 위해선 Low byte -> High byte 순으로 함.
  • 22. Page  22 Timer/Counter_Normal mode // 실습1-1) #include<avr/io.h> #include<avr/interrupt.h> volatile int cnt=0; int main(void) { DDRA = 0xFF; TCCR0 = 0x07; //TCNT0 = 0; //OCR0 = 0; TIMSK = 0x01; sei(); while(1) { } return 0; } ISR(TIMER0_OVF_vect) { cnt++; if(cnt==61) { cnt=0; if(PORTA==0x00) PORTA=0x01; else PORTA=PORTA<<1; } } // Normal mode / OC0 disconneted // clk_IO = 16Mhz / division factor = 1024 // timer/counter0 overflow interrupt // 약 1초 주기로 LED가 순처적으로 이동하며 점등 // 실습1_1_1) // clk_IO = 16Mhz / division factor = 256 // 약 0.5초 주기로 전체 LED 점멸
  • 23. Page  23 Timer/Counter_CTC mode(1/3) // 실습1-2) #include<avr/io.h> #include<avr/interrupt.h> volatile int cnt=0; int main(void) { DDRA = 0xFF; TCCR0 = 0x0F; //TCNT0 = 0; OCR0 = 0x10; TIMSK = 0x02; sei(); while(1) { } return 0; } ISR(TIMER0_COMP_vect) { cnt++; if(cnt==500) { PORTA = ~PORTA; cnt=0; } } // CTC mode / OC0 disconneted // clk_IO = 16Mhz / division factor = 1024 // OCR0 = 0x10 // 16 // timer/counter0 compare match interrupt // 약 0.5초 주기로 LED가 점멸함
  • 24. Page  24 Timer/Counter_CTC mode(2/3) // 실습1-3) #include<avr/io.h> #include<avr/interrupt.h> int main(void) { DDRB = 0x10; TCCR0 = 0x1F; //TCNT0 = 0; OCR0 = 0x10; // 0x4E(78) for 5ms // 0x10(16) for 1ms //TIMSK = 0x02; while(1) { } return 0; } // CTC mode / Toggle OC0 on compare match // clk_IO = 16Mhz / division factor = 1024 //---------------------------------------// // OCR0 = 0x10 // 16 // f_ocn = f_clk_io / (2*N*(1+OCR0)) // = 16*10^6 / (2*1024*(1+16)) // = 488.28 (Hz) (~= 500 Hz) // period = 1 / f_ocn // = 1 / 488.28 // = 0.00204 (s) (~= 0.002 s) // 주의) toggle이므로 주기는 counting의 2배가 된것임 // OC0(Port B[4])에 // 주기 약 2ms / on time 약 1ms의 신호 출력 //---------------------------------------// // OCR0 = 0x4E // 78 // f_ocn = 100.16 (Hz) (~= 100 Hz) // period = 0.00998 (s) (~= 0.010 s) // OC0(Port B[4])에 // 주기 약 10ms / on time 약 5ms의 신호 출력 //---------------------------------------//
  • 26. Page  26 Timer/Counter_fast PWM mode(1/2) // 실습1-4) #include<avr/io.h> #include<avr/interrupt.h> int main(void) { DDRB = 0x10; TCCR0 = 0x6F; // fat PWM / non-inverting //TCNT0 = 0; OCR0 = 0x40; // 0x40(64)/0x80(128)/0xC0(192) while(1) { } return 0; } // fast PWM mode / Non-inverting // clk_IO = 16Mhz / division factor = 1024 // OCR0 = 0x40 // 64 //---------------------------------------// // period_pwm은 PWM 전체 주기 // time_on은 PWM 중 on time 시간 // f_pwm = f_clk_io / (N*256) // = 16*10^6 / (1024*256) // = 61.03 (Hz) (~= 61 Hz) // period_pwm = 1 / f_ocn // = 1 / 61.03 // = 0.0163 (s) (~= 0.016 s) // OCR0(TOP)=0x40 이므로 // tiem_on = (1 / f_pwm) * (64/256) // = (1 / 61.03) * (64/256) // ~= 0.004 (s)
  • 28. Page  28 Timer/Counter_Phase correct PWM mode(1/2) // 실습1-5) #include<avr/io.h> #include<avr/interrupt.h> int main(void) { DDRB = 0x10; TCCR0 = 0x67; // phase correct PWM // non-inverting //TCNT0 = 0; OCR0 = 0x80; while(1) { } return 0; } // phase correct PWM mode / Non-inverting // clk_IO = 16Mhz / division factor = 1024 // OCR0 = 0x80 // 128 //---------------------------------------// // period_pwm은 PWM 전체 주기 // time_on은 PWM 중 on time 시간 // f_pwm = f_clk_io / (N*510) // = 16*10^6 / (1024*510) // = 30.367 (Hz) (~= 30 Hz) // period_pwm = 1 / f_pwm // = 1 / 30.367 // = 0.0329 (s) (~= 0.033 s) // OCR0(TOP)=0x80 이므로 // tiem_on = 2 * (1 / f_pwm) * (128/510) // = 2 * (1 / 30.367) * (128/510) // ~= 2 * 0.008 = 0.016(s) // dual-slope 이므로 2를 곱함
  • 29. Page  29 Timer/Counter_Phase correct PWM mode(2/2)

Editor's Notes

  1. 1