
// 타이머0 오버플로우 인터럽트 1msec
// X-TAL클럭 / TCCR0분주비 / TCNT0타이머값 = 주파수, 역수를 취하면 시간 //16000000Hz/128/125=1000Hz, (256-125)=131
TCCR0=5; TCNT0=131; TIMSK=1;
// 타이머0 오버플로우 인터럽트 5msec //16000000Hz/1024/78=200.32Hz, (256-78)=178
TCCR0=7; TCNT0=178; TIMSK=1;
// 타이머0 오버플로우 인터럽트 10msec //16000000Hz/1024/156=100.16Hz, (256-156)=100
TCCR0=7; TCNT0=100; TIMSK=1;
1msec는 분주비 128을 사용해서 정확한 1msec를 만들었지만
8비트 타이머로는 더 긴 시간을 만들 수 없으므로
오차가 있더라도 1024를 사용 했습니다.
8비트 타이머0로 만들 수 있는 시간 범위는 여기까지이며
더 긴 50msec 와 100msec는
타이머 인터럽트 함수 내에서 사용자 변수로 처리 하면 됩니다.
int count=0;
ISR(TIMER0_OVF_vect){ // 타이머0 오버플로우 인터럽트 1msec
// interrupt count++; if(count==50){ count=0; } // 50msec } ISR(TIMER0_OVF_vect){ // 타이머0 오버플로우 인터럽트 1msec // interrupt [TIM0_OVF] void timer0_ovf_isr(void){ // 코드비젼용 count++; if(count==100){ count=0; } // 100msec } 5msec와 10msec도 사용자 변수인 count로 만들 수 있습니다. // 타이머1 오버플로우 인터럽트 1msec // X-TAL클럭 / TCCR1B분주비 / TCNT1타이머값 = 주파수, 역수를 취하면 시간 // 클럭 / 분주비 / 타이머값 = 타이머 인터럽트 주파수, 역수를 취하면 시간 //16000000Hz/64/250=1000Hz,(65536-250)=65286 TCCR1B=3; TCNT1=65286; TIMSK=4; // 타이머1 오버플로우 인터럽트 5msec //16000000Hz/64/1250=200Hz,(65536-1250)=64286 TCCR1B=3; TCNT1=64286; TIMSK=4; // 타이머1 오버플로우 인터럽트 10msec //16000000Hz/64/2500=100Hz,(65536-2500)=63036 TCCR1B=3; TCNT1=63036; TIMSK=4; // 타이머1 오버플로우 인터럽트 50msec //16000000Hz/64/12500=20Hz,(65536-12500)=53036 TCCR1B=3; TCNT1=53036; TIMSK=4; // 타이머1 오버플로우 인터럽트 100msec //16000000Hz/64/25000=10Hz,(65536-25000)=40536 TCCR1B=3; TCNT1=40536; TIMSK=4; //----------------------------------------------------
// mega128 timer1 interrupt test
// xtal: 16MHZ
//----------------------------------------------------
#include <mega128.h>
//----------------------------------------------------
char tmrCnt, tmr100ms, tmr500ms;
//----------------------------------------------------
void init_timer()
{
TCNT1=0xfec7; //20ms(65536-313)
//TCNT1=0xfe79; //25ms(65536-391)
//TCNT1=0xfd8f; //40ms(65536-625)
//TCNT1=0xfcf2; //50ms(65536-782)
//TCNT1=0xfc58; //60ms(65536-936)
//-----16bit max timer
// 1/16(MHZ)=0.0625
// 0.0625*1024(prescaler:5)=64
// 64*65536(16bit)=4,194,304
// 4.194304 sec
//------------
// ex1) TCCR1B=5(1024), xtal:16MHz, per2ms?
// 1/16=0.0625
// 0.0625*1024=64
// 2,000/64=31
// 65,536-31=65,505-->hex:ffe1
// TCNT1=0xffe1;
//------------
// ex2) TCCR1B=5(1024), xtal:16MHz, per5ms?
// 1/16=0.0625
// 0.0625*1024=64
// 5,000/64=78
// 65,536-78=65,457-->hex:ffb1
// TCNT1=0xffb1;
//------------
// ex3) TCCR1B=5(1024), xtal:16MHz, per50ms?
// 1/16=0.0625
// 0.0625*1024=64
// 50,000/64=781
// 65,536-781=64,755-->hex:fcf3
// TCNT1=0xfcf3;
//------------
// ex4) TCCR1B=5(1024), xtal:16MHz, per500ms?
// 1/16=0.0625
// 0.0625*1024=64
// 500,000/64=7,812
// 65,536-7,812=57,724-->hex:e17c
// TCNT1=0xe17c;
//------------
// ex5) TCCR1B=5(1024), xtal:16MHz, per1sec?
// 1/16=0.0625
// 0.0625*1024=64
// 1,000,000/64=15,625
// 65,536-15,625=49,911-->hex:c2f7
// TCNT1=0xc2f7;
//------------
// ex6) TCCR1B=3(64), xtal:8MHz, per10ms?
// 1/8=0.125
// 0.125*64=8
// 10,000/8=1,250
// 65,536-1,250=64,286-->hex:fb1e
// TCNT1=0xfb1e;
//------------
}
//----------------------------------------------------
interrupt [TIM1_OVF] void timer1_ovf_isr()
{
init_timer();
//----------------per25ms
PORTD.0=~PORTD.0; //test pulse
//----------------
//time_100ms:
if(++tmrCnt < 4) return; //no 100ms?
//----------------per100ms
//----------------
//time_500ms:
tmrCnt=0;
if(++tmr100ms < 5) return; //no 500ms?
//----------------per500ms
//----------------
//time_sec:
tmr100ms=0;
if(++tmr500ms & 1) return; //no 1sec?
//----------------per1sec
//----------------
}
//----------------------------------------------------
void main()
{
DDRD.0=1; //out
TCCR1B=5; init_timer(); //prescaler:1024(5)
TIMSK|=0x04; //enable timer1 interrupt
#asm("sei") //enable global interrupt
while(1); //endless loop
}
// -------------------- end of file -------------------