AVR과 CLCD를 이용한 디지털시계

[code]
#define SYSTEM_CLK   (16000000L)
#define ComputeBaud(baud)  (unsigned int)(((SYSTEM_CLK / 16) / (baud)) – 1)
#define UBRRxH(baud)   (unsigned char)((ComputeBaud(baud)>>8)&0xFF)
#define UBRRxL(baud)   (unsigned char)((ComputeBaud(baud))&0xFF)

#define UART0_BAUD   9600  // PC   <-> AVR

#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include “clcd.h”

unsigned int time_count = 0;
unsigned char string_time[16];
unsigned char sec, min, hour = 0;

void uart0_init(void)
{
 unsigned char dummy;

 UBRR0H = UBRRxH(UART0_BAUD);
 UBRR0L = UBRRxL(UART0_BAUD);
 UCSR0A = 0x00;  // 1x
 UCSR0B = 0x98;  // RxInt=EN
 UCSR0C = 0x06;  // data 8bit
 dummy  = UDR0;  // UDR0 clear
}

void init_Timer(void)
{
 TCNT0 = 0x06;  // Counter0 Start: 6
 TCCR0 = 0x04;  // 64/16 = 4us
 TIMSK = 0x01;  // TCNT0 EN
}

void init(void)
{
 // CLCD Display Setting
 init_LCD();    // LCD Initialize

// usart initialize
 uart0_init();
// Timer Setting
 init_Timer();
}
// Timer0 Interrupt
SIGNAL(SIG_OVERFLOW0)
{
 TCNT0 = 6; // 256-6 = 250 count = 1ms
 if(++time_count == 1000) // at 1s
 {
  sec++;
  if(sec==60)
  {
   sec = 0;
   min++;
   if(min==60)
   {
    min = 0;
    hour++;
    if(hour==24)
    {
     hour = 0;
    }
   }
  }
  time_count = 0;
 }
}
// UART0 Rx ISR – AVR <- PC
SIGNAL(SIG_UART0_RECV)
{
 unsigned char RxChar;
 RxChar = UDR0;
 
 switch(RxChar)
 {
  case ‘h’: // Keyboard ‘h’ hour+1
  {
   hour++;
   if(hour==24)
    hour = 0;
   break;
  }
  case ‘m’: // Keyboard ‘m’ min+1
  {
   min++;break;
   if(min==60)
    min = 0;
   break;
  }
 }
}
//—————————— Main Function ——————————–
int main(void)
{
 cli();  //Interrupt Disable
 init(); //Initialize
 sei();  //Interrupt Enable

 char string1[16] = “Digital Clock”;
 char string2[16] = “Set by UART0 h,m”;
 string_out(0x80, string1); // 출력문자열
 string_out(0xC0, string2);

 while(1)
 {
  sprintf(string2,” TIME: %u%u:%u%u:%u%u “,hour/10,hour%10,min/10,min%10,sec/10,sec%10);
  string_out(0xC0,string2);
 }
}
[/code]
5113474733.h

사용자 삽입 이미지ATmega128을 이용하여 구동시켜 보았습니다.
CLCD의 연결은 PORT A를 이용해서 4bit mode로 동작합니다.
CLCD의 동작이 제대로 되지 않을 경우 clcd.h의 시간 지연값들을
더 늘려보시기 바랍니다.
(자세한 내용은 “AVR을 이용한 CLCD 출력” 참조)

Timer는 64분주비를 이용하여 4us마다 증가합니다.
따라서 1ms 초를 세기 위해 TCNT0는 Timer Interrupt가 걸릴때
6부터 시작하게 하였습니다. (256-6) * 4us = 1ms
Interrupt 마다 time_count값을 증가키셔 1000이 되면 초 값을 증가시킵니다.
마찬가지 과정을 거쳐 시, 분, 초를 증가시킵니다.

You may also like...

댓글 남기기