2023.6.22
前へ
次へ
ホームページトップへ戻る


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第39回]



●PRINT文/LCD表示

今回はPRINT文について少し詳しく説明をします。
PICBASICコンパイラのPRINT文には2つの役目があります。
1つはプログラムのデバッグに役立つようにプログラムの途中にPRINT文を挿入したりレジスタの値などを表示させるための機能です。
実際その機能がないことにはデバッグは極めて困難になります。
デバッグのためのPRINT文は必須と言えるでしょう。
そのためには要はデバッグ画面(コマンドプロンプト画面)に簡単なメッセージや計算の途中の結果などの数値が表示できさえすればよいので、通常のPRINT文に期待されるような表示の際のレイアウトに関する機能などはなくてもよろしいでしょう。
さて、もう1つの機能なのですがこちらも非常に有用な機能です。
それが[第37回]に書きましたようにPICBASICコンパイラの最終的な目的であるところのPICボードの単独実行時のデータやメッセージをLCDに表示するための機能としてのPRINT文です。
どちらも重要な役目ですがPRINT文の機能としてはどちらかといえば後者によりウェイトがかかっています。
PICBASICコンパイラのPRINT文にはそのような2つの役目があることを理解してください。
[第37回]から書いておりますPRINT文は勿論後者についての説明です。

前置きは以上なのですが今回の説明に入る前に前回の補足説明をしておきます。
前回のプログラムはFOR〜NEXT文の中でPRINT文を使ってA〜Zの文字を表示するものでした。
PRINT文で使っているCHR$()は()の中の値をASCIIコードとみなしてそのコードに対応する文字を返します。
LCDに文字を表示するサンプルとしてそういうプログラムを例示しましたので、ひょっとするとPICBASICコンパイラでLCDに表示するにはそういう使い方をしなければならないのか、と思われたかもしれません。
前回のプログラムは連続する文字コードを利用することでアルファベットの文字列を簡単に表示する方法のひとつの例として使ったので、LCDに文字を表示するにはCHR$()を使わなければならないということではありません。
今回はもう少し一般的なLCDへの表示プログラム例をお見せしながらPICBASICコンパイラのPRINT文について説明します。

[第37回]のPIC18F4550ボード(PICBS02)は間にPIC18F14K50ボード(PICBS01)をはさむ形で間接的にWindowsマシンにUSB経由で接続されています。
その接続イメージは[第2回]で略図で説明しています。
下に再掲します。

図のUSBIFボードがPICBS01でPICターゲットボードがPICBS02です。
ちょっと見には市販のUSB−232C変換ケーブルを使えばよいじゃないかと思われそうですがそうしたくないわけがあってこのような構成になっています。
市販のUSB−232C変換ケーブルは大抵は中にFTDI社のUSB−232C変換ICが入っていてそれを使うためにはドライバのインストールが必要です。
そのドライバは大抵は自動でインストールしてくれるようですが、以前はなかなかインストールできなくて苦労したことをよく経験しました。
ユーザーによっては他にインストールしているアプリケーションなどが邪魔をしてどうしてもインストールできなかったり正常に動作しないことなどもありました。
それでドライバのインストールを必要としない(実際は必要なのですが標準的なHIDインターフェースなので大抵はWindowsがスタンダードのドライバを捜して組み込んでくれます)このようなシステムにしています。
当初は基本的にはUSB−232Cインターフェースの機能として考えていたのですが、ここしばらくあれこれ作業を進めるなかでなんだかすごい機能を組み込んでしまいそうなところにきてしまっています(またしても泥沼にはまりそうな…)。

ちょいと余談になりました。
話をもとに戻します。
いつものようにBASICプログラムをLOADしました。

プログラムはBSPRINTT5.TXTです。
ロードするとすぐにPICBASICコンパイラによってPICアセンブラソースプログラムに翻訳され、最終的にPICマシン語コードが生成されます。

LISTコマンドでプログラムをリスト表示しました。

前回は文字を表示するのにCHR$()を使いましたが文字列を表示するのに普通は表示したい文字列を” ”ではさんで使います。
” ”の中には半角の英大文字、小文字、数字と記号が使えますが全角文字やカナは使えません。
PRINT文に変数名を記述するとその値が16進数2桁で表示されます。
このプログラムでは変数としてa、b、cを使っています。
現在の仕様では変数の値は8ビットですから00〜FF(0〜255)の範囲に限られます。
現行ではマイナスの数は扱いません。
このあたりのところは将来は機能拡張するかもしれません。
PICのSFR(特殊関数レジスタ)を扱う関係で変数名としては英小文字と数字、それと−、__(アンダーバー)を使います。
このプログラムでは1桁の英小文字a、b、cを使いましたが1桁でなくても構いません。
14文字までの文字列を使うことができます(PICBASICの命令語と同じ文字列は使えません)。
表示の区切りマークとしては ,(カンマ)を使います。
;(セミコロン)は前後を空けないで間をつめて表示します。
PRINT文の最後を;(セミコロン)で終ると改行されません。
PRINT文の最後に;(セミコロン)をつけないで終ると改行されます。

/RUNコマンドを実行すると翻訳生成されたPICのマシン語コードがPICに送られてそこで実行されます。
PICターゲットボードにLCD表示器を接続していてもそれがUSBIFボードを介してWindowsパソコンとUSB接続されている状態ではPRINT文を実行するとLCD表示器ではなくて上の画面のようにコマンドプロンプトの画面に表示されます。
program startedの次からbreak program endの前までがPRINT文での表示です。
上の説明を見ながらプログラムリストとプログラムの実行結果の表示を照合してみてください。

PICBASICコンパイラによって作成されたマシン語プログラムリストファイルです。
2000      ;    10 print "LCDTEST"
2000 4c0e     movlw 4c
2002 16ec     call 2c
2004 00f0 
2006 430e     movlw 43
2008 16ec     call 2c
200a 00f0 
200c 440e     movlw 44
200e 16ec     call 2c
2010 00f0 
2012 540e     movlw 54
2014 16ec     call 2c
2016 00f0 
2018 450e     movlw 45
201a 16ec     call 2c
201c 00f0 
201e 530e     movlw 53
2020 16ec     call 2c
2022 00f0 
2024 540e     movlw 54
2026 16ec     call 2c
2028 00f0 
202a 26ec     call 4c
202c 00f0 
202e      ;    20 a=5:b=8
202e 050e     movlw D'5'
2030 306e     movwf a
2032 080e     movlw D'8'
2034 316e     movwf b
2036      ;    30 c=a+b
2036 3050     movf a,w
2038 22ec     call 44
203a 00f0 
203c 3150     movf b,w
203e 24ec     call 48
2040 00f0 
2042 1c24     addwf R1c,w
2044 326e     movwf c
2046      ;    40 print "a=";a,"b=";b,
2046 610e     movlw 61
2048 16ec     call 2c
204a 00f0 
204c 3d0e     movlw 3d
204e 16ec     call 2c
2050 00f0 
2052 3050     movf a,w
2054 14ec     call 28
2056 00f0 
2058 28ec     call 50
205a 00f0 
205c 620e     movlw 62
205e 16ec     call 2c
2060 00f0 
2062 3d0e     movlw 3d
2064 16ec     call 2c
2066 00f0 
2068 3150     movf b,w
206a 14ec     call 28
206c 00f0 
206e 28ec     call 50
2070 00f0 
2072 26ec     call 4c
2074 00f0 
2076      ;    50 print "c=";c,
2076 630e     movlw 63
2078 16ec     call 2c
207a 00f0 
207c 3d0e     movlw 3d
207e 16ec     call 2c
2080 00f0 
2082 3250     movf c,w
2084 14ec     call 28
2086 00f0 
2088 28ec     call 50
208a 00f0 
208c 26ec     call 4c
208e 00f0 
2090      ;    60 print "a=";%a,"b=";%b,;
2090 610e     movlw 61
2092 16ec     call 2c
2094 00f0 
2096 3d0e     movlw 3d
2098 16ec     call 2c
209a 00f0 
209c 3050     movf a,w
209e 1aec     call 34
20a0 00f0 
20a2 28ec     call 50
20a4 00f0 
20a6 620e     movlw 62
20a8 16ec     call 2c
20aa 00f0 
20ac 3d0e     movlw 3d
20ae 16ec     call 2c
20b0 00f0 
20b2 3150     movf b,w
20b4 1aec     call 34
20b6 00f0 
20b8 28ec     call 50
20ba 00f0 
20bc      ;    70 print "c=";%c,
20bc 630e     movlw 63
20be 16ec     call 2c
20c0 00f0 
20c2 3d0e     movlw 3d
20c4 16ec     call 2c
20c6 00f0 
20c8 3250     movf c,w
20ca 1aec     call 34
20cc 00f0 
20ce 28ec     call 50
20d0 00f0 
20d2 26ec     call 4c
20d4 00f0 

まだ説明の途中なのですが本日は時間がありません。
続きは次回にいたします。

PICBASICコンパイラ[第39回]
2023.6.22upload

前へ
次へ
ホームページトップへ戻る