타이머 카운터 _ 1초마다 LED를 깜빡 거리는 프로그램 구현
==================================================================================================
타이머 카운터... ㅋ
==================================================================================================
[보드 세팅]
==================================================================================================
[소스코드]
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define CPU_CLOCK 16000000 // CPU Clock = 16000000Hz = 1600MHz
#define TICKS_PER_SEC 1000 // Tick per sec = 1000 (1초에 100번 체크)
#define PRESCALER 64 // 8bit 이기 때문에 255 이하의 값이 나오도록
#define on_OFF_INPUT DDRF // LED 입력
#define on_OFF_OUTPUT PORTF // LED 출력
volatile unsigned int g_elapsed_time; // 시간 변수
void initLED(void); // LED 초기화
void setTCCR0(void); // TCCR0 설정
void initTCNT0(void); // TCNT0 초기화
void setTIMSK(void); // TIMSK 설정
void toggleLED(char *state); // LED를 키고 끄는(반전) 토글 함수
void sleep(unsigned int elapsed_time); // 지연 함수
SIGNAL(SIG_OVERFLOW0) // time0의 오버 플로우 인터럽트에 대한 인터럽트 서비스 루틴
{
g_elapsed_time++; // 오버 플로우 발생시 증가
TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / PRESCALER);
}
int main(void)
{
char state = 0; // LED on/Off 용도로 사용되는 변수
initLED();
setTCCR0();
initTCNT0();
setTIMSK();
sei();
while(1)
{
toggleLED(&state);
sleep(1000);
}
return 1;
}
void initLED(void) // LED 초기화
{
ON_OFF_INPUT = 0xFF;
ON_OFF_OUTPUT = 0xFF;
}
void setTCCR0(void) // TCCR0 설정
{
TCCR0 = (1 << CS02) | (0 << CS01) | (0 << CS00);
}
void initTCNT0(void) // TCNT0 초기화
{
TCNT0 = 256 - (CPU_CLOCK / TICKS_PER_SEC / PRESCALER);
}
void setTIMSK(void) // TIMSK 설정
{
TIMSK = (0 << OCIE0) | (1 << TOIE0);
}
void toggleLED(char *state) // LED를 키고 끄는(반전) 토글 함수
{
*state = ~(*state);
ON_OFF_OUTPUT = *state;
}
void sleep(unsigned int elapsed_time) // 지연 함수
{
g_elapsed_time = 0;
while(elapsed_time > g_elapsed_time);
}
==================================================================================================