BASIC4MCU | 질문게시판 | 답변 : ATmega128 타이머/카운터로 현재 시간을 UART로 표시하기
페이지 정보
작성자 master 작성일2019-05-30 16:46 조회23,442회 댓글5건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=9058
작성일
작성일
작성일
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-05-30 오후 5:32:38// by Ok-Hyun Park//#include <avr/io.h>#include <avr/interrupt.h>#include <stdio.h>#include <stdlib.h>//volatile unsigned char day1[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //각 월의 일수volatile unsigned char s=0,m=0,h=0,dd=31,mm=5,flag=0;volatile unsigned char r_cnt=0,buf[50];volatile int ms=0,yy=2019;////void TX1_char(char c){ while(!(UCSR1A&0x20)); UDR1=c; }void TX1_STR(char *s){ while(*s)TX1_char(*s++); }//ISR(TIMER0_COMP_vect){ // 1msif(++ms>999){ ms=0;if(++s>59){ s=0;if(++m>59){ m=0;if(++h>23){ h=0;if(++dd>day1[m]){ dd=1;if(++mm>12){ mm=1; if(++yy>9999)yy=0; }}}}}flag=1;}}//ISR(USART1_RX_vect){char r; int i;r=UDR1;if(r=='\n'){buf[r_cnt++]=0; // nulli=atoi((char *)&buf[1]);if(r=='s'){ s=i; } // secif(r=='m'){ m=i; } // minuteif(r=='h'){ h=i; } // hourif(r=='D'){ dd=i; } // dateif(r=='M'){ mm=i; } // monif(r=='Y'){ yy=i; } // yearr_cnt=0;}else if(r=='\r'){} // 무시else{if(r_cnt<48){ buf[r_cnt++]=r; }}}//int main(void){char str[50];TCCR0=0x0D; OCR0=124; TIMSK=2; // 16000000/128/(1+124),1msUCSR1B=0x98; UBRR1L=103; // 9600SREG=0x80;while(1){if(flag){ flag=0;sprintf(str,"%04d-%02d-%02d%02d:%02d:%02d\n\r",yy,mm,dd,h,m,s); TX1_STR(str);}}}
댓글 5
조회수 23,442바다조아님의 댓글
바다조아 작성일답변 감사합니다! 테스트 후 답변드리겠습니다!
바다조아님의 댓글
바다조아 작성일
<stdlib.h>가 변수에 들어갈 수 있는건가요? ATmel studio에서 작동을 하지 않길래요...
디버그창보니까 atoi 관련해서는 passing argument 1 of 'atoi' discards 'volatile' qualifier from pointer target type라고 뜹니다.
master님의 댓글
master
오타가 있었군요
다시 해보세요
바다조아님의 댓글
바다조아
네 작동은 됩니다! 그런데 시간이 1초마다 출력이 되네요 ㅜㅜ 한번 입력하면 한번 출력하는걸 원했거든요 ㅜㅜ
그리고 5월 31일 00시 00분 00초부터 시작을하네요..ㅜ
master님의 댓글
master
사소한 수정은 직접 공부해서 완성시켜보세요