BASIC言語でワンチップマイコンのプログラムが書けるPICAXEを購入しお盆休み中の自由研究。
簡単なロジック制御なら使えそうです。
液晶表示器が扱えると用途も広がりそうなので挑戦してみました。
こちらの記事も参考にさせて頂き2日間かかってアナログ電圧を表示させる事に成功!!
http://airvariable.asablo.jp/blog/2013/05/25/6825184
ワンチップマイコンだけあって変数や計算の制約も多いですネ;;;
何度も何度もエラー出ました;;;
でも意外と簡単に液晶が扱える事も判りました。
これからやってみる人にとって、実際に動くサンプルプログラムが何よりの助けになる事を知っているので公開します。
3番ピン(C.4)の電圧を測定して表示するプログラムです。
液晶表示器 秋月電子通商 AE-AQM1602A(KIT) のプルアップ抵抗を有効にするためSCL,SDA の2カ所のはんだブリッジをしておく必要があります。
液晶表示器の電源は3.1V to 3.5V
PICAXE 08M2は5V、シリアルケーブルも5Vレベルのようですが外部電源で3.5V加えて動作しました。
電圧仕様外だと思うので壊れても知りません。
みなさんの助けになれば幸いです。
'**************************************
' I2C LCD test Display test
' AE-AQM1602A(KIT)
' *3.1V to 3.5V!! Not use AA battry*3=4.5V
' (I2C LCD 16 x 2 lines)
' for PICAXE 08M2
'**************************************
' Information of Connection
' pin1 VCC
' pin2 serial in
' pin3 analog in
' pin4 n.c
' ----
' pin8 GND
' pin7 serial out
' pin6 SCL(10kohm pull up by lcdkit)
' pin5 SDA(10kohm pull up by lcdkit)
'**************************************
#PICAXE 08M2
#NO_DATA
'I2C initialize
hi2csetup i2cmaster,$7C, i2cfast, i2cbyte 'AKIDUKI LCD
hi2cout ($00,$01) 'Clear display
pause 50
hi2cout ($00,$38) '拡張コマンドOFF
pause 50 'Wait
hi2cout ($00,$0C) 'ディスプレイON カーソルOFF
pause 50 'Wait
hi2cout ($00,$06) 'エントリーモードセット
pause 300 'Wait
hi2cout ($00,$39) 'コントラスト設定を行うため拡張命令ON
pause 50 'Wait
symbol Contrast = 30 '0 - 32 - 63 $00 - $3f 液晶のコントラスト設定値
'定数同士の計算は予め計算されるため、プログラムサイズに影響無し。
symbol ContrastL1 = Contrast // 16
symbol ContrastL2 = ContrastL1 or $70
hi2cout 0,(ContrastL2) '液晶コントラスト下位指定
pause 50
symbol ContrastH1 = Contrast / 16
symbol ContrastH2 = ContrastH1 or $54
hi2cout 0,(ContrastH2) '液晶コントラスト上位指定
pause 50
hi2cout ($00,$6C) 'フォロワー制御設定
pause 50
hi2cout ($00,$38) '拡張命令OFF
pause 50
hi2cout ($00,$01) 'Clear display
pause 50
hi2cout ($00,$80) 'Set DDR Address
pause 50 'Wait
'Displaying Hello world
hi2cout ($40,"Volt meter")
main:
READADC10 C.4,w0
'スケーリング $3ff(1023)が3500となるようにスケーリング
let w0 = w0 * 16 '4bit shift(max $3ff0)
'スケーリング後の値をhigh word で取得するので 3500($dac) が $dac00000 を $3ff0 で割ってスケーリング定数を得る。
'1word(16bit) * 1word(16bit)=2word(32bit)
'** 演算子は計算結果のhigh wordが帰ってくる。
' $dac0000 = $3ff0 * x
' x = $dac0000/$3ff0 = $36bd
let w0 = w0 ** $36BD 'high word return
'これで$3ffの時に$dac(3500)となる。正確には3499
bintoascii w0,b6,b5,b4,b3,b2 ' convert to ascii
hi2cout ($00,$c5) 'Set DDR Address
debug ' debug values for testing
'最上位桁のゼロサプレス処理
if b6 = "0" then
b6 = " "
' if b5 = "0" then
' b5 = " "
' endif
endif
hi2cout ($40,b6,b5,".",b4,b3,b2,"V")
pause 200 'wait 0.2sec
goto main
end