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

PPTX
Interrupt @atmega
PDF
1 5 horton series 2000 manual
PDF
Avr lecture5
PDF
아두이노 2015-2 한동대학교 공학설계입문
PPT
Arduino Basic Programming
PDF
Arduino 소개, RC카 만들기
PDF
06. ADC
PPTX
04. external interrupt
Interrupt @atmega
1 5 horton series 2000 manual
Avr lecture5
아두이노 2015-2 한동대학교 공학설계입문
Arduino Basic Programming
Arduino 소개, RC카 만들기
06. ADC
04. external interrupt

Viewers also liked (10)

PDF
01. avr studio 6.2 사용법
PDF
USB-AVRISP
PPTX
03. usart
PDF
00. 환경구축
PDF
AVR 기초와 응용 강의노트(최한호)
PPTX
02. led switch
PDF
노동진 Mega splatting
PPTX
Relay and AVR Atmel Atmega 16
PPTX
X[deca] 9월 개강총회
PPT
강의자료4
01. avr studio 6.2 사용법
USB-AVRISP
03. usart
00. 환경구축
AVR 기초와 응용 강의노트(최한호)
02. led switch
노동진 Mega splatting
Relay and AVR Atmel Atmega 16
X[deca] 9월 개강총회
강의자료4
Ad

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

PPTX
Interrupt @atmega
PDF
ADC(nanheekim)
DOCX
TestBCD2016-1(Answer)
PDF
Avr lecture8
PPTX
Measuring distance with ultrasonic sensor
PPTX
망고100 보드로 놀아보자 8
DOCX
TestBCD2018-1(answer)
PDF
Avr lecture3
PDF
Avr lecture6
PDF
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Interrupt @atmega
ADC(nanheekim)
TestBCD2016-1(Answer)
Avr lecture8
Measuring distance with ultrasonic sensor
망고100 보드로 놀아보자 8
TestBCD2018-1(answer)
Avr lecture3
Avr lecture6
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Ad

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