IT_etc/dk-128 (ATmega128)

타이머 카운터 _ 1초마다 LED를 깜빡 거리는 프로그램 구현

JJun ™ 2009. 6. 26. 12:47

==================================================================================================

 

타이머 카운터... ㅋ

 

==================================================================================================

 

[보드 세팅]

 

 

==================================================================================================

 

[소스코드]

 

#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++; // 오버 플로우 발생시 증가

 

// 다시 초기화 (6) : 6 ~ 255  ( 0 ~ 250을 하게 되면 오버플로우 시그널 발생 X )

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

             }

 

==================================================================================================


6장 타이머-카운터.pdf.pdf
0.86MB
시간타이머.txt
0.0MB
5장 타이머카운터 사용법.pptx.pptx
0.45MB
5장 외부인터럽트.pdf.pdf
0.34MB