目次
前
次
デバッグLCD接続
ファームウエア開発のとき、MCRマシンがセンサー値で
どういう判断をしているのかを、LCDに表示した方が
テスト、デバッグに有利と考え、IICバスのLCDを入手。
IICバスインタフェースというので、接続を4ピンに
とする変換基板も同時入手して対応します。
動作確認のために、ATmega328に実装したAmForthを利用。
ATmega328のポートDの2^7、2^6の2ビットを次のように割当。
2^7 PD7 SDA
2^6 PD6 SCK
ポートDの上位2ビットを出力として使うので、DDRに対して
出力設定をパラメータ指定。
DDRD c@ $C0 OR DDRD c!
8ビットのデータ転送が主体なので、データシートで
必要なワードをどう定義するのかを調べます。
SとPのコンディションがあるので、これらをワードで
定義してしまいます。
: INIT.START
PORTD c@ $C0 or PORTD c! \ SDA = 1 , SCK = 1
PORTD c@ $80 xor PORTD c! \ SDA = 0 , SCK = 1
PORTD c@ $40 xor PORTD c! \ SDA = 0 , SCK = 0
;
: EXIT.PERFORM
PORTD c@ $80 xor PORTD c! \ SDA = 0
PORTD c@ $40 or PORTD c! \ SCK = 1
PORTD c@ $80 or PORTD c! \ SDA = 1 , SCK = 1
;
つぎは8ビットを転送して、LCDからACKを取得する
ワードを定義します。
: SND.IIC
PORTD c@ $C0 XOR PORTD c! \ clear 2^7 , 2^6
8 0 do i
lshift dup
$80 and
0 <> if PORTD c@ $80 or PORTD c! then
PORTD c@ $40 OR PORTD c!
PORTD c@ $40 XOR PORTD c!
PORTD c@ $80 XOR PORTD c!
loop
\ get ACK
$80 DDRD c@ XOR DDRD c!
PIND c@ $80 AND
$80 DDRD c@ OR DDRD c!
;
8ビット転送までワードを定義したなら
処理を考えていきます。
IICバスアドレス、コントロールバイト、パラメータの
ワンセットで送信する仕様を採用していきます。
この仕様なら、IICバスアドレスは$3E固定で
2バイトをワードSND.IICに、2回にわけての
与え方で処理できます。
コーリングシーケンスは、次のようにすれば充分。
$30 $41 SND.IICX
コントロールバイト、パラメータの順で与えられる
ので、ワードswapを使って、入れ替えてからワード
SND.IICを使うだけで済みます。
ワードSND.IICXの定義は、以下。
: SND.IIX
INIT.START
$3E SND.IIC
SWAP SND.IIC SND.IIC
EXIT.PERFORM
;
複数バイトを送信するときには、コントロールバイトの
MSBを1にするか0にするかを判断して処理しないと駄目
ですが、1パラメータを送信するので、その判定を回避
できます。
初期化が必要なので、そのシーケンスを確認。
ms単位の時間待ちは、ワードMSを利用すればよいので
シーケンスを実現するワードを定義。
: INIT.LCD
50 MS
$38 $39 SND.IICX
$14 $73 SND.IICX
$56 $6C SND.IICX
200 MS
$38 $01 SND.IICX
$0C $0C SND.IICX
;
(under construction)
目次
前
次