2017년 128강좌 > [BK-AVR128] DS1302(RTC) read & write

TODAY420 TOTAL2,160,431
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 2017년 128강좌 | [BK-AVR128] DS1302(RTC) read & write

페이지 정보

작성자 키트 작성일2017-09-12 15:08 조회2,465회 댓글0건

본문

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <mega128.h>
#include <delay.h>
//
#define U08 unsigned char
#define U16 unsigned int
 
#define FU08 flash unsigned char
//
#define  LCD_PORT    PORTA
#define  LCD_C_WR    PORTB=(PORTB&0x1F)|0x80
#define  LCD_D_WR    PORTB=(PORTB&0x1F)|0xA0
//
#define  LCD_EN_1    PORTB|=0x80
#define  LCD_EN_0    PORTB&=~0x80
//
//#define  LCD_RW_1    PORTB|=0x40
//#define  LCD_RW_0    PORTB&=~0x40
//
//#define  LCD_RS_1    PORTB|=0x20
//#define  LCD_RS_0    PORTB&=~0x20
//
#define    SEC    0x80
#define    MIN    0x82
#define    HOUR   0x84
#define    DATE   0x86
#define    MONTH  0x88
#define    YEAR   0x8c
//
#define    RTC_SCL       PORTE.2      // PE2
#define    RTC_SDA_WR    PORTE.3      // PE3
#define    RTC_SDA_RD    PINE.3       // PE3
#define    RTC_SDA_DDR   DDRE.3       // PE3
#define    RTC_RST       PORTE.4      // PE4
//
U08 rtc_Init[8]={0x10,1,1,0,0,0,0,0}; // 시간초기값 년월일시분초
U08 time[8];                          // 년월일시분초
U08 fnd[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; //애노드
U08 led_buf=0,fnd_buf[8]={0,},digit=5;
//
void LCD_DATA(U08 d){ LCD_PORT=d; LCD_D_WR; delay_us(1); LCD_EN_0; delay_us(50); }
void LCD_CMD (U08 c){ LCD_PORT=c; LCD_C_WR; delay_us(1); LCD_EN_0; delay_ms( 3); }
void LCD_POS(U08 c,U08 r){ LCD_CMD(0x80|(c+r*0x40)); }
void LCD_CLR(void){ LCD_CMD(1); }
void LCD_STR (U08  *s){ while(*s)LCD_DATA(*s++); }
void LCD_STRf(FU08 *s){ while(*s)LCD_DATA(*s++); }
//
void LCD_INIT(void){
    delay_ms(50);
    LCD_CMD(0x38); LCD_CMD(0x38); LCD_CMD(0x38);
    LCD_CMD(0x0E); LCD_CMD(0x06); LCD_CLR();
}
//
void write_ds1302(U08 addr, U08 data){
    U08 i;
    RTC_SCL=0; RTC_RST=1; delay_us(2);
    for(i=0;i<8;i++){
        if((addr>>i)&1)RTC_SDA_WR=1; else RTC_SDA_WR=0;
        delay_us(2); RTC_SCL=1; delay_us(1); RTC_SCL=0; delay_us(1);
    }
    for(i=0;i<8;i++){
        if((data>>i)&0x01)RTC_SDA_WR=1; else RTC_SDA_WR=0;
        delay_us(2); RTC_SCL=1; delay_us(1); RTC_SCL=0; delay_us(1);
    }
    RTC_RST=0;
}
//
U08 read_ds1302(U08 addr){
    U08 i, data=0;
    RTC_RST=1; delay_us(2);
    //write
    for(i=0;i<8;i++){
        if((addr>>i)&1)RTC_SDA_WR=1; else RTC_SDA_WR=0;
        delay_us(2); RTC_SCL=1; delay_us(1); RTC_SCL=0; delay_us(1);
    }
    // read
    RTC_SDA_DDR=0; RTC_SDA_WR=1;
    for(i=0;i<8;i++){
        data>>= 1;
        if(RTC_SDA_RD)data|=0x80;
        delay_us(1); RTC_SCL=1; delay_us(2); RTC_SCL=0; delay_us(1);
    }
    RTC_SDA_DDR=1; RTC_SCL=0; delay_us(1); RTC_RST=0;
    return data;
}
//
void save_time(void){
    write_ds1302(YEAR,time[0]); write_ds1302(MONTH,time[1]);
    write_ds1302(DATE,time[2]); write_ds1302(HOUR, time[3]);
    write_ds1302(MIN, time[4]); write_ds1302(SEC,  time[5]);
}
//
void init_time(void){
    U08 i;
    for(i=0;i<8;i++)time[i]=rtc_Init[i];
    save_time();
}
//
void get_time(void){
    time[0]=read_ds1302(YEAR+1);   if(time[0]>0x99)init_time();
    time[1]=read_ds1302(MONTH+1);  if(time[1]>0x12)init_time();
    time[2]=read_ds1302(DATE+1);   if(time[2]>0x31)init_time();
    time[3]=read_ds1302(HOUR+1);   if(time[3]>0x23)init_time();
    time[4]=read_ds1302(MIN+1);    if(time[4]>0x59)init_time();
    time[5]=read_ds1302(SEC+1);    if(time[5]>0x59)init_time();
}
//
interrupt [TIM2_COMP] void timer2_comp_isr(void){ //100us
  static U08 cnt2=0,fnd_cnt=0;
  switch(cnt2){
    case 0: PORTA=~led_buf; PORTF|=8; PORTF&=~8; break// led out
    case 1: // fnd out
      PORTA=0; PORTF|=4; PORTF&=~4;          // common off
      PORTC=fnd[fnd_buf[fnd_cnt]];           // segment data
      if(fnd_cnt==digit)PORTC&=~0x80;        // digit out 
      PORTF|=2;PORTF&=~2;                    // 573 segment out
      PORTA=1<<fnd_cnt; PORTF|=4; PORTF&=~4; // common out
      if(++fnd_cnt>7)fnd_cnt=0;  
      break;
    case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: break;
  }
  if(++cnt2>9)cnt2=0; 
}
//
void main(void){
  DDRA=0xFF;  // FND_COMMON & LED & lcd data
  DDRC=0xFF;  // FND_SEGMENT
  DDRB=0xE0;  // LCD control
  DDRF=0x0E;  // 573_sel
  led_buf=0;  // led off
  RTC_RST=0;  RTC_SDA_WR=0; RTC_SCL=0;
  DDRE=0x1C;  // rtc PE2~PE4 out
  write_ds1302(0x8E,0); write_ds1302(0x90,0xA4);
  TCCR2=0x0B; OCR2= 24; TIMSK=0x80; //16000000/64/(1+ 24),100us
  LCD_INIT();
  SREG=0x80;
  while(1){
    get_time();
    fnd_buf[0]=2;            fnd_buf[1]=0;            //20
    fnd_buf[2]=time[0]>>4;   fnd_buf[3]=time[0]&0x0F; //yy
    fnd_buf[4]=time[1]>>4;   fnd_buf[5]=time[1]&0x0F; //mm
    fnd_buf[6]=time[2]>>4;   fnd_buf[7]=time[2]&0x0F; //dd
    digit=8; //off
    led_buf=1; LCD_POS(0,0); LCD_STRf("1"); delay_ms(500);
    //
    fnd_buf[0]=16;           fnd_buf[1]=16;           //off
    fnd_buf[2]=time[3]>>4;   fnd_buf[3]=time[3]&0x0F; //h
    fnd_buf[4]=time[4]>>4;   fnd_buf[5]=time[4]&0x0F; //m
    fnd_buf[6]=time[5]>>4;   fnd_buf[7]=time[5]&0x0F; //s
    digit=5; //on
    led_buf=0; LCD_POS(0,0); LCD_STRf("0"); delay_ms(500);
  }
}

전에 만들어둔 예제를 추가했습니다.

키입력이 없어서 시간 조정 등의 기능은 구현하지 않았습니다.

FND의 세그먼트에 전류제한 저항이 없어서 숫자1 과 숫자8의 밝기 차이가 심합니다. ---  경고 1



동작시켜본 분은 답글로 인증샷 또는 동영상 남겨주세요^^

댓글 0

조회수 2,465

등록된 댓글이 없습니다.

2017년 128강좌HOME > 2017년 128강좌 목록

2017년 128강좌 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 9622
공지 사이트 이용 안내댓글[24] master 17-10-29 29594
31 [BK-AVR128] WS2812B 키트 17-09-12 1777
30 [BK-AVR128] LCD 시간표시 키트 17-09-12 2254
29 [BK-AVR128] KEY 매트릭스 추가 키트 17-09-12 1785
현재글 [BK-AVR128] DS1302(RTC) read & write 키트 17-09-12 2466
27 [BK-AVR128] LED & FND 타이머2 인터럽트로 구동 키트 17-09-12 2101
26 [OpenM128] NRF24L01 RF Board (B) 키트 17-09-12 1869
25 [OpenM128] FAT45DBXX DataFlash Board 키트 17-09-12 1471
24 [OpenM128] FT245 USB FIFO Board (mini) 키트 17-09-12 1627
23 [OpenM128] PCF8563 RTC Board 키트 17-09-12 1488
22 [OpenM128] PL2303 USB UART Board (mini) 키트 17-09-12 1718
21 [OpenM128] AD Keypad 키트 17-09-12 1689
20 [OpenM128] 2.2inch 320x240 Touch LCD (A) 키트 17-09-12 2112
19 [OpenM128] Hardware design 이미지 키트 17-09-12 1810
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기