i2cをH8BASIC言語で制御

I2CをH8BASICで制御 電子工作 

H83048BASIC

H83052BASIC

この度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は、とても素晴らしいロジックだと思いました。

 

旧JE1ANB趣味のページ