AVR > 코드비젼용 DS1302

TODAY9,701 TOTAL4,430,231
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

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


BASIC4MCU | AVR | 타이머 | 코드비젼용 DS1302

페이지 정보

작성자 키트 작성일2017-08-29 09:28 조회5,686회 댓글0건

본문

//
// 코드비젼
// (DS1302)
//
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
//
#define    SEC    0x80
#define    MIN    0x82
#define    HOUR   0x84
#define    DATE   0x86
#define    MONTH  0x88
#define    YEAR   0x8c
 
// Port D
#define    RTC_SCL       PORTD.      //rtc D.0
#define    RTC_SDA_WR    PORTD.      //rtc D.1
#define    RTC_SDA_RD    PIND.       //rtc D.1
#define    RTC_SDA_DDR   DDRD.       //rtc D.1
#define    RTC_RST       PORTD.      //rtc D.2
 
char rtc_Init[8]={0x10,1,1,0,0,0,0,0}; // 시간초기값 년월일시분초
char time[8]; //년월일시분초
//
void write_ds1302(char addr, char data){
    char i;
    RTC_SCL=0; RTC_RST=1; delay_us(2);
    for(i=0; i<8; i++){
        if((addr>>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);
    }
    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;
}
//
char read_ds1302(char addr){
    char i, data=0;
    RTC_RST=1; delay_us(2);
    //write
    for(i=0; i<8; i++){
        if((addr>>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);
    }
    // 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){
    char 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();
}
//
void TX1_CH(char c){ while(!(UCSR1A&0x20)); UDR1=c; } // 송신 1바이트
void TX1_STR(char *s){ while(*s)TX1_CH(*s++); }       // 송신 문자열
//
void main(void){
  char buf[20];
  RTC_RST=0;RTC_SDA_WR=0; RTC_SCL=0;
  DDRD=0x07// rtc D.0~D.2 out
  write_ds1302(0x8E,0); write_ds1302(0x90,0xA4);
  UCSR0B=8; UBRR0L=103// 9600
  while(1){
      get_time();
      sprintf(buf,"%02x/%02x/%02x",time[0],time[1],time[2]); TX1_STR(buf);
      sprintf(buf,"%02x:%02x:%02x",time[3],time[4],time[5]); TX1_STR(buf);
    }
}
 
 
 
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
 
#define F_CPU 16000000UL // 16 MHz
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
//
#define    SEC    0x80
#define    MIN    0x82
#define    HOUR   0x84
#define    DATE   0x86
#define    MONTH  0x88
#define    YEAR   0x8c
 
// Port D
#define    RTC_SCL_1     PORTD|=     //rtc D.0
#define    RTC_SCL_0     PORTD&=~    //rtc D.0
#define    RTC_SDA_WR_1  PORTD|=     //rtc D.1
#define    RTC_SDA_WR_0  PORTD&=~    //rtc D.1
#define    RTC_SDA_RD    (PIND&2)      //rtc D.1
#define    RTC_SDA_DDR_1 DDRD|=      //rtc D.1
#define    RTC_SDA_DDR_0 DDRD&=~      //rtc D.1
#define    RTC_RST_1     PORTD|=     //rtc D.2
#define    RTC_RST_0     PORTD&=~    //rtc D.2
//
char rtc_Init[8]={0x10,1,1,0,0,0,0,0}; // 시간초기값 년월일시분초
char time[8]; //년월일시분초
//
void wr_ds1302(char addr,char data){
    char 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)&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);
    }
    RTC_RST_0;
}
//
char read_ds1302(char addr){
    char 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){
    wr_ds1302(YEAR,time[0]); wr_ds1302(MONTH,time[1]);
    wr_ds1302(DATE,time[2]); wr_ds1302(HOUR,time[3]);
    wr_ds1302(MIN,time[4]);  wr_ds1302(SEC,time[5]);
}
//
void init_time(void){
    unsigned char 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();
}
//
void TX1_CH(char c){ while(!(UCSR1A&0x20)); UDR1=c; } // 송신 1바이트
void TX1_STR(char *s){ while(*s)TX1_CH(*s++); }       // 송신 문자열
//
int main(void){
  char buf[20];
  RTC_RST_0; RTC_SDA_WR_0; RTC_SCL_0;
  DDRD=0x07// rtc D.0~D.2 out
  wr_ds1302(0x8E,0); wr_ds1302(0x90,0xA4);
  UCSR0B=8; UBRR0L=103// 9600
  while(1){
      get_time();
      sprintf(buf,"%02x/%02x/%02x    ",time[0],time[1],time[2]); TX1_STR(buf);
      sprintf(buf,"%02x:%02x:%02x\r\n",time[3],time[4],time[5]); TX1_STR(buf);
    }
}
 
 
 
//-----------------------------------------------------------------------------
 
//-----------------------------------------------------------------------------

댓글 0

조회수 5,686

등록된 댓글이 없습니다.

AVRHOME > AVR > 전체 목록

게시물 검색

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
모바일버전으로보기