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

[관련 포스트]

댓글

이 블로그의 인기 게시물

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

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

간단한 cfar 알고리즘에 대해

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

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