본문 바로가기
코스웨어/10년 시스템제어

[시스템제어] 4월 15일 17번 유성민

by 알 수 없는 사용자 2010. 4. 15.
728x90
반응형

ATmega
<StopWatch 실습>


1분 내의 시간을 잴 수 있는 스톱와치 프로그램을 구현하시오.
(초/밀리초 = 00:00)

1번 스위치를 누르면 일시정지, 다시 누르면 재개.
2번 스위치를 누르면 리셋됨

밀리초 값은 FND, 초 값은 LED에 표시함.


#include
 <atmega.h>
#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