atmega128에서 타이머/카운터 사용을 위한 초기치 셋팅하는법

//atmega128에서 타이머/카운터 사용을 위한 초기치 셋팅하는법

atmega128에서 타이머/카운터 사용을 위한 초기치 셋팅하는법

// 타이머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

[TIM0_OVF] void timer0_ovf_isr(void){ // 코드비젼용

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


2018-03-15T10:38:14+09:00 2010/04/26|Categories: 땜질|Tags: , , |0 Comments