BASIC4MCU | AVR | 타이머 | 타이머 오버플로우 인터럽트로 오차없는 시계만들기
페이지 정보
작성자 키트 작성일2017-08-29 09:22 조회5,614회 댓글0건본문
//타이머 오버플로우 인터럽트로 오차없는 시계만들기
통신용 클럭중에 하나인 11.058200MHz 사용
오차를 일으키지 않는 방법은 타이머 인터럽트 내에서 TCNT0 값을 갱신 하지 않는 것이다.
( 프리런닝 식으로 동작 )
TCCRB의 분주비는
TCCRB x-tal 분주비 TCNT0 인터럽트주기
1일 때 11059200Hz / 1 / 256 = 43200Hz
2일 때 11059200Hz / 8 / 256 = 5400Hz
3일 때 11059200Hz / 64 / 256 = 675Hz
4일 때 11059200Hz / 256 / 256 = 168.75Hz
5일 때 11059200Hz / 1024 / 256 = 42.1875Hz
수가 작으면서 소숫점이 없는 분주비 1/64이 적당
//코드비젼 atmega2560, 11.0582MHz
#include <mega2560.h>
U_I msec=0;
U_C clock_sec=0, clock_min=0, clock_hour=0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
msec++;
if(msec>=675){ msec=0; sec++; };
if(sec>59){ sec=0; min++; };
if(min>59){ min=0; hour++; };
if(hour>23) hour=0;
}
void main(void){
TCCRA=0;
TCNT0=0;
TIMSK1=0x01; // Overflow Interrupt Enable,
TCCRB=3; // 1=1, 2=8, 3=64, 4=256, 5=1024
#asm("sei")
while(1){}
}
14.7456MHz일 때 TCCRB의 분주비는
1일 때 14745600Hz / 1 / 256 = 57600Hz
2일 때 14745600Hz / 8 / 256 = 7200Hz
3일 때 14745600Hz / 64 / 256 = 900Hz
4일 때 14745600Hz / 256 / 256 = 225Hz
5일 때 14745600Hz / 1024 / 256 = 56.25Hz
수가 작으면서 소숫점이 없는 분주비 1/256 적당
U_C msec=0; // char type
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
msec++;
if(msec>=225){ msec=0; sec++; };
}
16MHz일 때 TCCRB의 분주비는
1일 때 16000000Hz / 1 / 256 = 62500Hz
2일 때 16000000Hz / 8 / 256 = 7812.5Hz
3일 때 16000000Hz / 64 / 256 = 976.5625Hz
4일 때 16000000Hz / 256 / 256 = 244.140625Hz
5일 때 16000000Hz / 1024 / 256 = 61.03515625Hz
1/64 적당
이경우 계산이 조금 지저분 해지겠군요
U_L msec=0; // long type
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
msec+=10000;
if(msec>=9765625){ msec-=9765625; sec++; };
}오버 플러우 인터럽트로 시계 만들기에는
통신용 클럭중에 하나인 14.7456MHz이 제일 좋군요
댓글 0
조회수 5,614등록된 댓글이 없습니다.