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();
}

[관련 포스트]

댓글

이 블로그의 인기 게시물

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

아두이노(arduino) 심박센서 (heart rate sensor) 심박수 측정 example code

간단한 cfar 알고리즘에 대해

base64 인코딩 디코딩 예제 c 소스