I2CをH8BASICで制御 電子工作
H83048BASIC
この度BASIC言語の繁栄を願い、恐らく必要であろうi2cシリアルメモリーのリード・ライト通信プログラムを
AKI・H8/3048F専用 BASICコンパイラで作ってみました。
使用したEEPROMはi2cのATMEL24C64Bです。
入出力の切り替えは面倒なので、IN−PORTとOUT−PORTの2PORTを使用しました。
回路図は下記の様にP1を出力ポート、P2の入力プルアップMOS内臓を入力ポートにしました。
ソフトは、簡単にする為に、PICBASICのように、ピン制御できるようにしました。
頻繁に変化するビットの制御に対応させる為、P1ポート8ビット、P2ポート8ビットを全て、ピット単位での制御にしました。
また、出力ポートはダイオード2本で”L”の時のみ反映するとてもシンプルな回路にし、モニターとしてLEDを2個付けました。
SCLとSDAから”L”信号で引いてるダイオードは小信号用シリコンダイオードで1S1588相当品です。
H83048Fを外した写真でi2cのICが見える | H83048Fを取付けた写真 |
自作のROMライターで H83052FにPGMを書き込む |
H83052Fを外した写真で i2cのICが見える |
H83052FをRUN |
h83052は事前にRUNTIME.RTLのCLOCKを修正します。
h83048とh83052のROMライターをスイッチで切り替えて使いたいと思ったのですが、電圧が違うので
絶対操作ミスでh83052を壊すと思いh83052専用ROMライターとベースボードを自作しました。
ベースボードのP2ポートには8Pスイッチが接続されているので、i2c読み書きソフトを使う時は、
8PスイッチをOFF(P2-6:SW7とP2−7:SW8は絶対)にしてください。
下記のリストは、数値データをプログラムのDATA文に置き、そのDATAをi2cのATMEL24C64Bに書込み、その後、i2cから
データを読み出して、LCDに表示するサブルーチンの頭の部分です。
他の言語で開発される方にもBASIC言語なので理解し易く、お役に立てると思います。
' PGM=i2cBASIC
POKE &HFFFFC5,&H00 '入力PORT4 8BIT INPUT SET
POKE &HFFFFDA,&HFF 'C-MOS PULL UP
PORT4=&HFFFFC7 '入力ポート
' 外部出力とSCL
POKE &HFFFFC0,&HFF '出力PORT1 8BIT OUTPUT SET
PORT1=&HFFFFC2 '6bit exout 2bit RAM CONTROL
' 外部入力とSDA
POKE &HFFFFC1,&H00 '入力PORT2 8BIT INPUT SET
POKE &HFFFFD8,&HFF 'C-MOS PULL UP
PORT2=&HFFFFC3 '6bit exinput 2bit RAM CONTROL
'========================================================================
DIM IP2(10)
DIM IP4(10)
DIM OP1(10)
DIM OPT(10)
'========================================================================
console 1,0:print "I2CH8BASIC"
console 1,1:print "READ WRITE PGM"
Dim W(10) '書き込みモード
Dim R(10) '読み込みモード
Dim H(10) '上位アドレス
Dim L(10) '下位アドレス
Dim D(10) '書き込みデータ
Dim E(10) '読み込みデータ
DIM F(10) 'データ確認
'--------------------------------------------------------------------------
A=160 'READ CONTROL SET (10100000)2
FOR I=0 TO 7
B=A/2
IF A=B*2 THEN W(8-I)=0 ELSE W(8-I)=1
A=B
NEXT I
'--------------------------------------------------------------------------
A=161 'WRITE CONTROL SET (10100001)2
FOR I=0 TO 7
B=A/2
IF A=B*2 THEN R(8-I)=0 ELSE R(8-I)=1
A=B
NEXT I
'--------------------------------------------------------------------------
'初期設定
sst=65 'delay time h83048 sst=0
OP1(6)=1:OP1(7)=1
GOSUB !OPORT1
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'ATMEL AT24C64B 1データ(0〜65535)10進を2バイトを使って表現
'読み書き開始
:!LOOPX
GOSUB !IPORT4
IF IP4(4)=0 THEN SPEED=0:GOSUB !W_MEMORY 'S1黒スイッチ
IF IP4(5)=0 THEN SPEED=0:GOSUB !R_MEMORY 'S2赤スイッチ
IF IP4(6)=0 THEN SPEED=50000:GOSUB !W_MEMORY 'S3青スイッチ
IF IP4(7)=0 THEN SPEED=50000:GOSUB !R_MEMORY 'S4黄スイッチ
GOTO !LOOPX
:!W_MEMORY
'データ文から50件のデータを読んでi2cに書き込む。
ADR=0
RESTORE !DATA00
FOR CNT=1 TO 50
READ DAT
XDATA=DAT
GOSUB !EEP_WRITE
CONSOLE 1,0:PRINT " COUNTER=";CNT
CONSOLE 1,1:PRINT "WR=";DAT;" ";DATA1;"
";DATA2
FOR T=0 TO SPEED:NEXT
NEXT
RETURN
:!R_MEMORY
'i2cから50件のデータを読んで内容を表示する。
ADR=0
FOR CNT=1 TO 50
GOSUB !EEP_READ
CONSOLE 1,0:PRINT " ADDRESS=";ADR
CONSOLE 1,1:PRINT "READ DATA=";RDATA
FOR T=0 TO SPEED:NEXT
NEXT
RETURN
:!DATA00
DATA 0,1,2,3,4,5,6,7,8,9
DATA 10,20,30,40,50,60,70,80,90,100
DATA 200,300,400,500,600,700,800,900,1000,2000
DATA 3000,4000,5000,6000,7000,8000,9000,10000,20000,30000
DATA 40000,50000,60000,60001,60002,60003,60004,60005,61234,65535
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'
サブルーチン省略
追記
AT24C64Bの最大書込みアドレスを調べる為、0番地と1番地の2アドレスに16ビットのデータ、次に2番地と3番地の2アドレスに
16ビットのデータの様にデータを書き込み続けた結果、偶数アドレス(8190)10進、(1111111111110)2進で、次の偶数アドレスで
先頭アドレスに戻りました。
2進数で見ると、うなずける感じです。
故にAT24C64Bの場合、データ数は4、096件が最大で、ADR=0〜8190の範囲の偶数番地で、指定できると思います。
AT24C256Bの場合、データ数は16、384件が最大で、ADR=0〜32766の範囲の偶数番地で、指定できると思います。
AT24C1024Bの場合、データ数は65、536件が最大で、ADR=0〜131070の範囲の偶数番地で、指定できると思います。
最後に、今回プログラムを作成して、i2cは、とても素晴らしいロジックだと思いました。