본문 바로가기
코스웨어/16년 스마트컨트롤러

20160318_업무일지_정우민_펌웨어(시계2)

by 알 수 없는 사용자 2016. 3. 22.
728x90
반응형

리눅스(텔넷)

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


타이머/카운터(시계2)

 

 

 

#include "main.h"
#include "lcd.h"
#include "tc0.h"


int main(void)
{
 char caTime[] = "00:00:00";
 // volatile unsigned int uiSec = 0;     atmega에서는 int형은 2바이트 0~65535.
 unsigned int uiTime;
 
 lcd_Init ();
 tc0_Init ();
 sei();

 uiTime = uiSec = 0;      // 순서는  오른쪽부터 .
 
 while(1)
 {
  caTime[0] = '0' + (uiSec / 3600) / 10;
  caTime[1] = '0' + (uiSec / 3600) % 10;
  caTime[3] = '0' + ((uiSec % 3600) / 60) / 10;
  caTime[4] = '0' + ((uiSec % 3600) / 60) % 10;
  caTime[6] = '0' + (((uiSec % 3600) % 60) % 60) / 10;
  caTime[7] = '0' + (((uiSec % 3600) % 60) % 60) % 10;   //0의 아스키코드값에 3을 더해도 3이 된다.
  
  lcd_Inst(LCD_HOME);     //커서를 앞으로
  lcd_Str(caTime); 
  // tc0_MSDelay(900);     // 1초 지연
  // ++uiSec;

  while(uiTime == uiSec);

  uiTime = uiSec;
 }

 
 return 0;
}

 

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

 

#include "tc0.h"

static volatile unsigned int uiMsec;   // static 이파일 내부에서만 변수를 공유하게 함.
volatile unsigned int uiSec;

void tc0_Init(void)
{
 TCCR0A  = (0 << COM0A1) | (0 << COM0A0) | (0 << COM0B1) |(0 << COM0B0) |(0 << WGM01) |(0 << WGM00);
 TCCR0B  = (0 << FOC0A) | (0 << FOC0B) | (0 << WGM02) |(0 << CS02) |(1 << CS01) |(1 << CS00);
 //TCNT0  = 0x00;  우리가 사용하는 것이 아니다. 컴퓨터가 카운트한다
 OCR0A  = 250;  //분주비표 참고
 //OCR0B = 0x00;  우리는 OCR0A와 비교하므로 B는 사용 하지않는다
 TIMSK0  = (0 << OCIE0B) | (1 << OCIE0A) | (0 << TOIE0);
 //TIFR0  = 0x00;  //우리가 사용하지 않는다.

 
}
void __vector_21(void)
{
 ++uiMsec; // 타이머 / 카운터로 인한 내부인터럽트 발생시 0.001초 증가
 if(1000 <= uiMsec)
 {
  uiMsec = 0;
  ++uiSec;
 }
}

void tc0_MSDelay(unsigned int uiDtime)
{
 if(uiDtime > 1000)
 {
  uiDtime = 1000; // 최대값을 1000으로 제한
 }

 uiMsec = 0;
 
 while(uiMsec < uiDtime);
 
 
}

728x90