I2Cを試す。(ATTiny2313編) | 団塊親父のブログ

団塊親父のブログ

自分の趣味・記録用のブログです。

 AVR工作の第2弾として、I2Cによるシリアル制御を試した。

 秋月のI2C接続小型液晶、AQM0802Aを実験台にする。 まずは、bingったところ、アセンブラ・C言語を使っている人が多い。

 だが、アセンブラは面倒くさいし、今からCを覚えるには老い先が短すぎるので、BASCOMで何とかしたい。(40年ほど前にハンドアセンブルでZ80を使ったことがある。悲しいがもうそんな気力は無い。)


 ■ BASCOM-AVR の使用方法■ 様を参考に色々試すがうまくいかない。まったく反応しないんですね、これが。 さらにbingると、測定用電子回路作成のキーポイント (細田)様のサイトの、BASCOMやAVRの「くせ」(マニュアルやネットに載っていない問題点や新規事項など) に、「ソフトウエアI2Cのバグ」を発見した。 本当に助かりました。


 さて、実験結果から主なところを覚書として記載することに。


1 Tiny系のAVRには、USIを使うシリアル通信PIN(PB7=SCL、PB5=SDA)があるが、BASCOMのソフトウェアI2Cには関係ない。 どのポートを指定しても

同じサイズのオブジェクトができた。


2 連続して文字データを送るときに、I2CSEND命令では最初の&H40のコントロールコードが送れない。 bit6のある文字(たとえば@)を先頭に付けると、後の文字が表示できる。 または、文字列を分解して、配列状態で送るしかない。


3 先に書いた■ BASCOM-AVR の使用方法■
様の LCD「AQM0802A」用ライブラリを、ありがたく使わせていただくのが手っ取り早いかも。


4 BASCOM標準ライブラリでの動作状況



5 写真に使った実験用プログラムソース

' **********************************
' DDS control test program for AD9850.
' Bascom-avr
' AvrIspmk2 with AVR-STUDIO4.
' 18-19/Jan./2014 Copyright j_audio.
'*********************************

$regfile = "attiny2313.dat" 'use ATTiny2313
$crystal = 8000000 ' Default clock source
Config Clockdiv = 1 ' Default division factor is 8.

'$hwstack ,'$swstack ,'$framesize = Default

'-----------------------
' I2C LCD7=SDA,8=SCL
'-----------------------
Config Sda = Portb.5 'PORTB.5 is the SDA line
Config Scl = Portb.7 'PORTB.7 is the SCL line'-----------------------

'-----------------------

Config I2cdelay = 10
'-------- Declares variables. ---------------
Dim Temp As Byte
Dim Lcd_dt As String * 8
Dim Lcd_dt2 As String * 9

Dim Slave As Byte

Dim Dat As Byte

I2cinit

Waitms 10
Slave = &H7C
Temp = &H00 '

Dat = &H38 '秋月のデータシートどおりの初期化コマンド
Gosub I2c_com
Dat = &H39
Gosub I2c_com
Dat = &H14
Gosub I2c_com
Dat = &H70
Gosub I2c_com
Dat = &H56
Gosub I2c_com
Dat = &H6C
Gosub I2c_com
Dat = &H38
Gosub I2c_com
Dat = &H0C
Gosub I2c_com
Dat = &H01
Gosub I2c_com
Waitms 5
Lcd_dt = hell@o Lcd_dt2 = "@" + Lcd_dt '先頭に @を付けると後の文字列が出る。

I2csend &H7C , Lcd_dt2 ,9

End

'----- 1バイト送る。------

I2c_com:
I2cstart       ' [スタート・コンディション] の状態にする。
I2cwbyte &H7C   ' スレーブ・アドレス(書き込み)を送信。
I2cwbyte Temp   ' select command control
I2cwbyte Dat     'write command data
I2cstop        ' [ストップ・コンディション] の状態にする。
Waitus 27
Return