728x90
반응형
ATmega
<StopWatch 실습>
1분 내의 시간을 잴 수 있는 스톱와치 프로그램을 구현하시오.
(초/밀리초 = 00:00)
1번 스위치를 누르면 일시정지, 다시 누르면 재개.
2번 스위치를 누르면 리셋됨
밀리초 값은 FND, 초 값은 LED에 표시함.
#include
#include <avr/signal.h>
#include <avr/interrupt.h>
#define CPU_CLOCK 16000000 //CPU clock = 16,000,000
#define TICKS_PER_SEC 1000 //Ticks per sec = 1,000
#define PRESCALER 128 //Prescaler = 64
//클럭의 배수 (크기, 오버클럭)
volatile unsigned int g_elapsed_time; // 시간 변수
void initLED(void); //LED 초기화
void initOCR0(void); //OCR0 초기화
void setTCCR0(void); //TCCR0 설정
void initTCNT0(void); //TCNT0 초기화
void setTIMSK(void); //TIMSK 설정
void toggleLED(char * state,char *iNum); //LED반전
void sleep(unsigned int elapsed_time);//1초 대기
SIGNAL(SIG_OUTPUT_COMPARE0); //timer0의 오버플로어
int main(void)
{
char state = 0;
char iNum = 0;
initLED();
setTCCR0();
initTCNT0();
setTIMSK();
initOCR0();
sei();
while(1)
{
toggleLED(&state,&iNum);//증가시키는 함수
if(PINC==0xFE)// 만약 첫번째 스위치를 눌렀을경우
{
if(state==0)
{
state=1;//정지
}
else
{
state=0;//시작
}
}
if(PINC==0xFD)//만약 두번째 스위치를 눌렀을경우
{
PORTE=0x00;//FND 초기화
PORTF=0x00;//LED 초기화
}
sleep(10);
}
return 1;
}
void initLED(void) //LED 초기화
{
DDRF = 0xff;// LED 출력
DDRE = 0xff;// FND 출력
PORTF = 0xff;
PORTE = 0x00;
}
void setTCCR0(void) //TCCR0 설정
{
TCCR0 |= (1<<CSO2);
TCCR0 &= (~(1<<CSO1));
TCCR0 &= (~(1<<CSO0));
TCCR0 |= (1<<3);
}
void initOCR0(void)
{
OCR0 = 250;
}
void initTCNT0(void) //TCNT0 초기화
{
TCNT0 = 0;
}
void setTIMSK(void) //TIMSK 설정
{
TIMSK |= (1<<1);
}
void toggleLED(char * state,char *iNum) //LED반전
{
int i,j;
i = PORTE/16;// FND 10자리수 출력하기위한 변수
j = PORTE%16;// FND 1자리수 출력하기위한 변수
if(PORTF == 59)// 60초가 될경우 멈츄기
{
*state=1;
}
if(*state == 0)//만약 0 일경우 M/S(미리세커) 증가
{
if (i==9&&j==9)// 0.99초 지났을경우
{
PORTF = PORTF-1;//1초증가(LED ++)
i=0;//초기화
j=0;//초기화
}
else if(j==9)//16진수 10진수 만들기
{
i++;
j=0;
}
else
{
j++;
}
PORTE = i*16+j;
}
}
void sleep(unsigned int elapsed_time)//1초 대기
{
g_elapsed_time=0;
while(g_elapsed_time<elapsed_time);
return;
}
SIGNAL(SIG_OUTPUT_COMPARE0) //timer0의 비교매치
{
g_elapsed_time++;
}
728x90
'코스웨어 > 10년 시스템제어' 카테고리의 다른 글
[시스템제어]4월 21일 일일업무 이창민(20번) (1) | 2010.04.26 |
---|---|
[시스템제어]4월22일 보고서 임창모 (1) | 2010.04.22 |
[시스템제어]4월20일 보고서 19번 이상은 (1) | 2010.04.20 |
[시스템제어] 4월 19일 보고서 이민규 (1) | 2010.04.20 |
[시스템제어]4월13일 (15번 신관식) 업무 보고서 (1) | 2010.04.15 |
시스템제어 - 4월14일 안태민(16번) (1) | 2010.04.14 |
시스템제어 4월12일 14번 선동환 보고서 (1) | 2010.04.12 |
13번 배정훈 보고서(4월 9일) (1) | 2010.04.11 |