I2Cの受信の確認用として、I2C-RTCを接続したいと思います。
Z180に接続するまえに 動作確認のため、ラズベリーパイのI2Cに接続してみました。
I2C-RTCとして、秋月電子のリアルタイムクロックRTC-8564NBを使用してみました。

I2Cのコマンドを確認するとともに、ついでに、初期設定で、時刻も設定しちゃいましょう。
制御するソフトは、pythonをつかいます^^

リアルタイムクロックRTC-8564NBはモジュールになっていますが、電源OFF時の
電池は乗っていないので、外付けしています。
逆充電防止と過放電防止用に、2本のショットキーバリアダイオードを使用しています。
回路は、省略しますね。グーグル先生に聞いてみましょうwww

さて、z180では、I2Cでの呼び出しだけにしたいので、ラズベリーパイで時刻設定を
してみます。

RTC-8564NBのI2Cアドレスは、0x51のようです。
レジスターは、、全部で16個ありますが、今回は時刻設定だけでアラームとかタイマーとか設定はしないので、コントロールレジスタ2個と、年月、時刻設定用の7個の
レジスターだけを設定します。

コントロールレジスター(アドレス0,1)は、オール0でクリアしました。adress0x00,0x01=0x00

さて、アドレス02以降は実際の年月、時刻の設定となりますが、

ここに はまりどころがありました^^

データ形式がHEXではなく、BCD形式であること^^
週間の並びが月曜日1で始まり日曜日が7に^^
21世紀はアドレス07のbit7をセットすること^^

ということで、HEXtoBCDという関数を作成して、HEXからBCDに変換したり、細工をしています^^

次のpythonプログラムを実行すると、ラズベリーパイの現時刻をRTC-8564NBに書き込み、続いて、内容を呼び出してきます。
実行結果も載せていますが、アドレス02から08までの呼び出しを順番に表示しています。

#!/usr/bin/env python

import smbus
import time
import sys
import datetime

bus = smbus.SMBus(1)

DEVICE_ADDR = 0x51 #RTC8564 i2c address

def hextobcd(hex):
    bcd=divmod(hex,0x0a)
    bup=(bcd[0] << 4) & 0xf0
    blow=bcd[1]  & 0x0f
    return(bup | blow)

today   = datetime.date.today()
todaytime = datetime.datetime.today()

#write date & time
start_addr = 0x02

# RTC8564 Sunday is 0
if todaytime.isoweekday() == 7 :
  rtcweek=0
else:
  rtcweek=todaytime.isoweekday()

#setting 2001-2100 year and mon
rtcmon=0x80 | hextobcd(today.month)

#setting 20**year to **year
rtcyear=today.year - 2000

print ("*********")
print ("RTC-WRITE")
print ("*********")
print hex(hextobcd(todaytime.second))
print hex(hextobcd(todaytime.minute))
print hex(hextobcd(todaytime.hour))
print hex(hextobcd(today.day))
print hex(hextobcd(rtcweek))
print bin(rtcmon)
print hex(hextobcd(rtcyear))

bus.write_i2c_block_data(DEVICE_ADDR,0x00,[0x00,0x00])
bus.write_i2c_block_data(DEVICE_ADDR,start_addr,[hextobcd(todaytime.second),hextobcd(todaytime.minute),hextobcd(todaytime.hour),hextobcd(today.day),hextobcd(rtcweek),rtcmon,hextobcd(rtcyear)])

rtcread=bus.read_i2c_block_data(DEVICE_ADDR,start_addr,7)

print("")
print("********")
print("RTC-READ")
print("********")
print hex(rtcread[0] & 0x7f)
print hex(rtcread[1] & 0x7f)
print hex(rtcread[2] & 0x3f)
print hex(rtcread[3] & 0x3f)
print hex(rtcread[4] & 0x07)
print hex(rtcread[5] & 0x1f)
print hex(rtcread[6])

実行結果

[vim] $ sudo python rtc.py
*********
RTC-WRITE
*********
0x16
0x55
0x14
0x18
0x0
0b10001001
0x16

********
RTC-READ
********
0x16
0x55
0x14
0x18
0x0
0x9
0x16
[/vim]

おすすめの記事