![]()

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)終了
![]()
-------------------------------------------------------------------------
このメインプログラムは 時計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; //データを取得
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
![]()