목차
<타이머/카운터를 이용한 디지털시계 설계>
▶이론 및 배경
▶타겟 보드(ATmega128 보드)설명 및 회로도 첨부
▶프로그램 소스파일 분석
▶전체 프로그램의 flow chart
▶이론 및 배경
▶타겟 보드(ATmega128 보드)설명 및 회로도 첨부
▶프로그램 소스파일 분석
▶전체 프로그램의 flow chart
본문내용
트1
TIMSK = 0x10; // OC1A interrupt 사용가능
ETIMSK = 0x00;
TIFR = 0x3C; // 모든 interrupt flags 클리어
ETIFR = 0x01;
sei();
}
void LCD_2digit(unsigned char number) //10진수의 두자리 수로 출력
{
LCD_data(number/10 + '0'); // 10^1
LCD_data(number%10 + '0'); // 10^0
}
void Display_time(void) //각각의 hour, minute, second, sec 출력
{
LCD_command(0xC2);
LCD_2digit(hour);
LCD_command(0xC5);
LCD_2digit(minute);
LCD_command(0xC8);
LCD_2digit(second/100);
LCD_command(0xCB);
LCD_2digit(second%100);
}
ISR(TIMER1_COMPA_vect) // 타이머/카운터 1을 이용한 인터럽트실행
{
second++; // second 1/100 ms
if(second == 6000) // 6000 * 1/100 = 60s
{ second = 0; // 60s 일 경우 second = 0 , minute 증가
minute++;
if(minute == 60) // minute = 60 이면 시간 증가 및 minute =0 로 만듬
{ minute = 0;
hour++;
if(hour == 100) // hour100 이면 hour=0
hour = 0;
}
}
Display_time(); // 시간 출력
}
ISR(TIMER3_COMPA_vect) //" : : " 의 0.5초마다 출력하기위한 인터럽트
{
if(s==1)
{
s=0;
}
else
{
s=1;
}
}
void stopwatch(void) // 스탑워치 함수
{
MCU_initialize(); //초기화
Delay_ms(50);
LCD_initialize();
Beep();
LCD_string(0x80," AVR STOP WATCH "); //스탑워치모드시 LCD 위쪽행의 출력
Set_timer1(); // 타이머/카운터1의 인터럽트를 실행하기 위한 레지스터값을 저장한 함수
cli(); // 타이머 출력 멈춤(∵타이머카운터 인터럽트 1과 3 실행시에 두 인터럽트가 겹쳐 서 타이머의 초기 스타트 버튼 클릭이전에 시작되어서 cli()이라는 함수를 통해서 시작을 못하게함)
Clear_time(); // 디스플레이 초기화
run_flag = 0;
PORTB=0x30; //LED 1,2 on
while(1)
{ switch(Key_input()) // 키입력에따른 스위치 함수
{ case 0x0E : if(run_flag == 0) break //runflag의 값이 0이면 무시
cli(); // 스탑워치 멈춤
PORTB = 0x30; // LED 1,2 on
run_flag = 0;
break
case 0x0B : if(run_flag == 1) break // 스탑워치 스타트 버튼
PORTB = 0x30;
TCNT1H = 0x00;
TCNT1L = 0x00;
run_flag = 1;
sei(); //global interrupt
break
case 0x07 : if(run_flag == 1) break // reset 버튼
Clear_time();
break
cli();
PORTB = 0x30;
case 0x0D : cli(); //메인루틴으로 돌아감
PORTB = 0x30;
run_flag = 0;
main();
break
default: break
}
}
}
int main(void)
{
MCU_initialize();
Delay_ms(50);
LCD_initialize(); // 초기화
Beep();
int k;
LCD_string(0x80," NO-1 DIGICLOCK "); //초기 LCD 디스플레이
LCD_string(0xC0," M : : ");
LCD_command(0x0F);
cursor = 0xC2; //커서의 초기위치 지정 C2 아래쪽LCD창의 세번째위치
Delay_ms(200);
if(RTC_FLAG != 'G') // RTC_data 사용을 위한 과정
{ RTC_FLAG = 'G'
RTC_HOUR = 0x12;
RTC_MINUTE = 0x00;
RTC_SECOND = 0x00;
RTC_A = 0x2F; // oscillator ON, SQW=2Hz
RTC_B = 0x00; // interrupt 불가능, SQW 불가능
}
s=0;
TCCR3A = 0x00; // CTC mode(4), OC1A로 출력하지말것
TCCR3B = 0x0C; // 16MHz/256/(1+31249) = 2Hz → 0.5초
TCCR3C = 0x00;
OCR3A = 31249;
TCNT3 = 0x0000; // 타이머카운터3 초기화
TIMSK = 0x00;
ETIMSK = 0x10;
TIFR = 0x00;
ETIFR = 0x3E;
sei();
while(1)
{
DSP_RTC1(); //RTC를 이용한 시계함수 실행
switch(Key_input()) //Key입력에 대한 각각의 기능 실행
{ case 0x0E : alarm(); // alarm모드
break
case 0x0D : stopwatch(); //Stopwatch모드
break
case 0x0B : Increment2(); // 시간 증가
break
case 0x07 : Increment1(); // 분 증가
break
default : break
}
hour=RTC_HOUR;
minute=RTC_MINUTE;
hour_alm=RTC_HOUR_ALM;
min_alm=RTC_MIN_ALM;
if(hour == hour_alm && minute == min_alm)
{
for(k=0;k<=hour_alm;k++) //alarm에 입력된 시간에 대하여 알람울림
{
Beep();
PORTB=0xF0;
}
}
}
}
▶전체 프로그램의 flow chart
▶디지털시계 작동 결과물
~별도 첨부
TIMSK = 0x10; // OC1A interrupt 사용가능
ETIMSK = 0x00;
TIFR = 0x3C; // 모든 interrupt flags 클리어
ETIFR = 0x01;
sei();
}
void LCD_2digit(unsigned char number) //10진수의 두자리 수로 출력
{
LCD_data(number/10 + '0'); // 10^1
LCD_data(number%10 + '0'); // 10^0
}
void Display_time(void) //각각의 hour, minute, second, sec 출력
{
LCD_command(0xC2);
LCD_2digit(hour);
LCD_command(0xC5);
LCD_2digit(minute);
LCD_command(0xC8);
LCD_2digit(second/100);
LCD_command(0xCB);
LCD_2digit(second%100);
}
ISR(TIMER1_COMPA_vect) // 타이머/카운터 1을 이용한 인터럽트실행
{
second++; // second 1/100 ms
if(second == 6000) // 6000 * 1/100 = 60s
{ second = 0; // 60s 일 경우 second = 0 , minute 증가
minute++;
if(minute == 60) // minute = 60 이면 시간 증가 및 minute =0 로 만듬
{ minute = 0;
hour++;
if(hour == 100) // hour100 이면 hour=0
hour = 0;
}
}
Display_time(); // 시간 출력
}
ISR(TIMER3_COMPA_vect) //" : : " 의 0.5초마다 출력하기위한 인터럽트
{
if(s==1)
{
s=0;
}
else
{
s=1;
}
}
void stopwatch(void) // 스탑워치 함수
{
MCU_initialize(); //초기화
Delay_ms(50);
LCD_initialize();
Beep();
LCD_string(0x80," AVR STOP WATCH "); //스탑워치모드시 LCD 위쪽행의 출력
Set_timer1(); // 타이머/카운터1의 인터럽트를 실행하기 위한 레지스터값을 저장한 함수
cli(); // 타이머 출력 멈춤(∵타이머카운터 인터럽트 1과 3 실행시에 두 인터럽트가 겹쳐 서 타이머의 초기 스타트 버튼 클릭이전에 시작되어서 cli()이라는 함수를 통해서 시작을 못하게함)
Clear_time(); // 디스플레이 초기화
run_flag = 0;
PORTB=0x30; //LED 1,2 on
while(1)
{ switch(Key_input()) // 키입력에따른 스위치 함수
{ case 0x0E : if(run_flag == 0) break //runflag의 값이 0이면 무시
cli(); // 스탑워치 멈춤
PORTB = 0x30; // LED 1,2 on
run_flag = 0;
break
case 0x0B : if(run_flag == 1) break // 스탑워치 스타트 버튼
PORTB = 0x30;
TCNT1H = 0x00;
TCNT1L = 0x00;
run_flag = 1;
sei(); //global interrupt
break
case 0x07 : if(run_flag == 1) break // reset 버튼
Clear_time();
break
cli();
PORTB = 0x30;
case 0x0D : cli(); //메인루틴으로 돌아감
PORTB = 0x30;
run_flag = 0;
main();
break
default: break
}
}
}
int main(void)
{
MCU_initialize();
Delay_ms(50);
LCD_initialize(); // 초기화
Beep();
int k;
LCD_string(0x80," NO-1 DIGICLOCK "); //초기 LCD 디스플레이
LCD_string(0xC0," M : : ");
LCD_command(0x0F);
cursor = 0xC2; //커서의 초기위치 지정 C2 아래쪽LCD창의 세번째위치
Delay_ms(200);
if(RTC_FLAG != 'G') // RTC_data 사용을 위한 과정
{ RTC_FLAG = 'G'
RTC_HOUR = 0x12;
RTC_MINUTE = 0x00;
RTC_SECOND = 0x00;
RTC_A = 0x2F; // oscillator ON, SQW=2Hz
RTC_B = 0x00; // interrupt 불가능, SQW 불가능
}
s=0;
TCCR3A = 0x00; // CTC mode(4), OC1A로 출력하지말것
TCCR3B = 0x0C; // 16MHz/256/(1+31249) = 2Hz → 0.5초
TCCR3C = 0x00;
OCR3A = 31249;
TCNT3 = 0x0000; // 타이머카운터3 초기화
TIMSK = 0x00;
ETIMSK = 0x10;
TIFR = 0x00;
ETIFR = 0x3E;
sei();
while(1)
{
DSP_RTC1(); //RTC를 이용한 시계함수 실행
switch(Key_input()) //Key입력에 대한 각각의 기능 실행
{ case 0x0E : alarm(); // alarm모드
break
case 0x0D : stopwatch(); //Stopwatch모드
break
case 0x0B : Increment2(); // 시간 증가
break
case 0x07 : Increment1(); // 분 증가
break
default : break
}
hour=RTC_HOUR;
minute=RTC_MINUTE;
hour_alm=RTC_HOUR_ALM;
min_alm=RTC_MIN_ALM;
if(hour == hour_alm && minute == min_alm)
{
for(k=0;k<=hour_alm;k++) //alarm에 입력된 시간에 대하여 알람울림
{
Beep();
PORTB=0xF0;
}
}
}
}
▶전체 프로그램의 flow chart
▶디지털시계 작동 결과물
~별도 첨부
추천자료
- 직류전원공급기사용법 실험 세미나자료
- 예비,결과보고서 - 4-Phase clock 발생기
- 디지털시대의 새로운 강자 휴맥스
- 전자회로실험 보고서 (사전 결과)
- 커패시터, RL 회로의 과도 응답
- 예비 실험5 EXPERIMENT dc 5 Series dc Circuits
- [실험] 단진자를 이용한 중력가속도 측정
- 구조실험 - 단순보의 휨 모멘트 실험
- 디지털 논리회로 설계 및 실습 - (결과) 논리 프로브 구성 - 실험 목표, 이론요약, 논리 임계...
- [통신공학 실험] XR2206을 이용한 FSK(Frequency Shift Keying)변조
- 물리학 실험 - 전류와 자기장, Lenz의 법칙
- 마이크로프로세서 응용 및 실험 - ADC & UART
- 영양생화학실험A+)단백질의 정성반응 레포트
- AVR 온도센서를 이용하여 온도측정하기 (디지털온도계 제작,전자온도계 만들기,OPamp,단극성,...