ATmega328PB timer example code gettickcount
본 글은 ATmega328PB에서 인터럽트를 사용하여 시간 tick을 가져오는
gettickcount를 구현한 예제 소스를 싣고 있다.
원리는 간단하다. 10 ms마다 인터럽트를 발생시키고 그때마다 count를 증가시키다.
그리고 필요할 떄 gettickcount() 함수를 호출하여 시간 tick을
받아온다. 즉, 부팅 이후 흘러간 시간 tick을 가져오는 함수이다.
소스코드는 아래와 같다. main()함수 시작시 timer_init()을 하고, 그 후
필요할때 gettickcount()를 호출하면 된다.
#define F_CPU 8000000UL //
//#define F_CPU 16000000UL //
#include <math.h>
#include <stdlib.h>
#include <inttypes.h>
#include <stdbool.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define SYS_TICK_UNIT_MS 10
static volatile unsigned long system_tick_count = 0;
ISR(TIMER1_COMPA_vect)
{
/*10 ms*/
system_tick_count++;
}
unsigned long gettickcount()
{
return
(system_tick_count*SYS_TICK_UNIT_MS);
}
void timer_init()
{
/* set up the system 100Hz
timer
(OCR1A+1) = delay /
(F_CPU/prescaler)
100Hz / (8Mhz / 8) = 100Hz/1000000Hz
= 0.0001Hz
(OCR1A+1) = 10ms / 0.001ms = 10000
*/
if(F_CPU == 16000000UL )
OCR1A = (20000);
else if(F_CPU == 8000000UL)
OCR1A = (10000);
/* Configure timer 1 for CTC mode
(Mode 4) */
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1
<< CS11); /* set prescaler to 8 and starts the timer */
TCCR1C = 0;
/* Enable interrupt on compare match
*/
TIMSK1 |= (1 << OCIE1A);
/* Enable global interrupts */
sei();
}
[관련 포스트]
댓글
댓글 쓰기