학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

디지털 시계 만들기

학습목표

타이머/카운터1 사용하여 디지털 시계를 만들어 본다.

응용분야 시계, 타이머

학습주제

2가지의 시계를 만들어 본다.

1.       시계에 맟는 클럭을 설정하고 시간을 LCD 나타낸다.

2.       위에서 만든 시계를 AVR 4개의 출력포트에 7세그먼트를 연결하여 시간을 표시하고 시간과 분을 수정할 있는 스위치를 만든다.

예습내용

타이머/카운터1 사용하여 1초마다 동작하는 인터럽트를 만들어 초를 증가 시키고 60 되면 분을 증가하고, 분이 60 되면 시를 증가시킨다.

아래 그림은 4개의 7세그먼트를 이용하여 ,분을 표시하는 시계의 회로도 이다. SW0,SW1 ,분의 시간을 수정하는 스위치이다.

 

오른쪽 그림은 회로도 대로 만들어 시간을 표시한 사진이다.

실습방법

   

LCD 시간표시

아래 3번째 그림과 같이 Clopck Value, Mode, Interrupt on 설정한다. 이때 16MHz/256/(1+62499)=1Hz 인터럽트

동작한다.

 

 

보기1 AVR 프로그램  [AVR프로그램 내려받기]

시간을 LCD 나타내는 프로그램

아래와 같이 프로그램을 만든다.

 

 

#include <mega128.h>  

#include <stdio.h>

 

unsigned char second=0,minute=0,hour=0;

char time[10]="";

 

// Alphanumeric LCD Module functions

#asm

   .equ __lcd_port=0x1B

#endasm

#include <lcd.h>

 

// Timer 1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

// Place your code here 

              second++;

              if(second==60){

                             second=0;

                             minute++;

                             if(minute==60){

                                           minute=0;

                                           hour++;

                                           if(hour==13){

                                                         hour=1;

                                           }

                             }

              }

              sprintf(time,"%2d %2d %2d",hour,minute,second);

              lcd_gotoxy(0,0);

              lcd_puts(time);

}

 

// Declare your global variables here

 

void main(void)

{

// 생략

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 62.500 kHz

// Mode: CTC top=OCR1A

// OC1A output: Discon.

// OC1B output: Discon.

// OC1C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

TCCR1A=0x00;

TCCR1B=0x0C;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=62499>>8;

OCR1AL=62499 & 0xff;

OCR1BH=0x00;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

 

// 생략

 

// LCD module initialization

lcd_init(16);

 

// Global enable interrupts

#asm("sei")

 

while (1)

      {

      // Place your code here

 

      };

}

 

 

7세그먼트로 시간표시

AVR A,B,C,D 4개의 채널에 7세그먼트를 연결해 시간을 표시한다.

PortA,B,C,D 모두 Out 설정한다.

INT6,7 Falling Edge 설정한다.

 

 

 

보기2 AVR 프로그램  [AVR프로그램 내려받기]

시간을 7세그먼트로 나타내는 프로그램

second,minute,hour 세개의 변수는 CPU 전원이 나가도 현재 시간이 보전 되도록 rom 저장을 하였다.

 

 

#include <mega128.h> 

#include <delay.h> 

#include <stdio.h>

 

eeprom unsigned char second,minute,hour;     

char time[10]="";

char i,seg[10]={0xA0,0xF9,0xC4,0xD0,0x99,0x92,0x82,0xF8,0x80,0x90};

 

void displayTime()

{

              sprintf(time,"%2d%2d",hour,minute);

              if(hour>=10)

                             PORTA=seg[time[0]-0x30]; 

              else 

                             PORTA=0xff;

              PORTB=seg[time[1]-0x30]; 

              if(minute>=10)

                             PORTC=seg[time[2]-0x30]; 

              else 

                             PORTC=0xff;

              PORTD=seg[time[3]-0x30];  

}

 

// External Interrupt 6 service routine

interrupt [EXT_INT6] void ext_int6_isr(void)

{

              minute++;

              if(minute>=60)

                             minute=0;

              displayTime();

}

 

// External Interrupt 7 service routine

interrupt [EXT_INT7] void ext_int7_isr(void)

{

              hour++;

              if(hour>=13)

                             hour=0;

              displayTime();

}

 

// Timer 1 output compare A interrupt service routine

interrupt [TIM1_COMPA] void timer1_compa_isr(void)

{

// Place your code here

              second++;

              if(second==60){

                             second=0;

                             minute++;

                             if(minute==60){

                                           minute=0;

                                           hour++;

                                           if(hour==13){

                                                         hour=1;

                                           }

                             }

              }

              displayTime();

}

 

// Declare your global variables here

 

void main(void)

{

// 프로그램 생략

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 62.500 kHz

// Mode: CTC top=OCR1A

// OC1A output: Discon.

// OC1B output: Discon.

// OC1C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

TCCR1A=0x00;

TCCR1B=0x0C;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=62499>>8;

OCR1AL=62499 & 0xff;

OCR1BH=0x00;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

// 프로그램 생략

// Global enable interrupts

#asm("sei")

 

PORTA=0xff;

PORTB=0xff;

PORTC=0xff;

PORTD=0xff;  

 

if(hour>12)

              hour=0;

if(minute>60)

              minute=0;

if(second>60)

              second=0;

             

while (1)

      {

      // Place your code here

 

      };

}

 

처음