時計IC RTC8564を使う


 


RTC8564は I2C通信で時刻データを出し入れする
古いICなので、精度は 月差1分程度である

回路図

アドレスは0x02〜0x08 =秒〜年






プログラム

AVRマイコンのI2C通信設定を行う

//---------------------------------------------
// SCL=10M/(16+ 2*47*1)=200kHz
TWBR=47;
TWSR=0x00; //ビット速度値
TWCR=0b00000100; // TWI SCL/SDA で使用する
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
スレーブアドレスは 7ビットを左シフトして BIT0は READ /WRITEのコントロールになるため

#define RTC_ADDR_WRITE 0xA2
#define RTC_ADDR_READ 0XA3

メインプログラムは簡単である

1)時計ICの設定
2)時刻の連続読出し
3)終了処理
その後、LCDに表示させる
ーーーーーーーーーーーーーーーーーーーーーーーーーー
while(1){

     READ_TIME(); // RTC 時刻読取 --->dyear-dsec
     CRT_TIME();


     lcd_position(0,2);
     lcd_put_str("20");
     lcd_position(2,2);
     LCD_ASC(dyear);
     lcd_position(4,2);
     lcd_put_str("/");
     LCD_ASC(dmonth);
     lcd_put_str("/");
     LCD_ASC(dday);

     lcd_position(0,3);
     LCD_ASC(dhour);
     lcd_position(2,3);
     lcd_put_str(":");
     LCD_ASC(dmin);
     lcd_put_str(":");
     LCD_ASC(dsec);

     lcd_position(15,3);
     lcd_put_str(datweek[week]);

// 時刻設定 マクローーーーーーーーーーー
     if(KEY_MENU){SET_TIME();}


} //while(1)終了


C言語プログラム
-------------------------------------------------------------------------
このメインプログラムは 時計ICからデータを読出し変数に入れる
その変数をLCDに表示させる
今回は LCDのマクロプログラムは別項に記載されているので省略する

READ_TIME()は時間を読みだすプログラム
CRT_TIME()は 時計ICから読みだしたデータを 10進表示に変換している


//---- READ TIME -------------
void READ_TIME(void)
{
int i;

COM_RS();
for(i=2;i<9;i++){
         COM_RE();
         r_data[i]=ans;
         }
COM_STOP();

dsec=r_data[2] & 0x7F;
dmin=r_data[3] & 0x7F;
dhour=r_data[4] & 0x3F;
dday=r_data[5] & 0x3F;
dweek=r_data[6] & 0x07;
dmonth=r_data[7]& 0x1F;
dyear=r_data[8] & 0xFF;

}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
COM_RS()は 時計ICのアドレスを指定して、どのアドレスから読みだすか指定している
0x02から秒、時間、、、、年度を連続して読みだす
開始条件で 読出しモードにする

後は COM__RE()でデータを連続して読みだす


//-----------------------------
void COM_RS(void)
{

/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*SLA_W 書込アドレス送出 */
TWDR=0b10100010; //A2
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*DATA RTCアドレス送出 0x02 */
TWDR=0x02;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*SLA_R 読込アドレス送出 */
TWDR=0b10100011; //A3
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
}
//---------------------
void COM_RE(void)
{
/*DATA データ読込 */
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //データを取得

}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー