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


PICBASICコンパイラ

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

[第55回]



●ASM,ENDASM

アセンブラ in BASICの使い方です。
PICBASICコンパイラではBASICプログラムは行番号をつけて記述します。
アセンブラも同じです。
BASICと同じように行番号をつけてPICのアセンブラ命令を書きます。
ただそのようにするだけだとBASICの命令とPICのアセンブラ命令が混在することになってしまいますから、そこを交通整理するためにアセンブラの命令行の前にASM命令を置き、アセンブラを終了するところにENDASM命令を置きます。
下のようなイメージになります。

10 BASIC文
   :    この間は普通にBASICの命令文を書きます
100 ASM
   :    この間はPICのアセンブラ命令文を書きます
200 ENDASM
   :    これ以後は普通にBASICの命令文を書きます

実際のプログラム例で示します。
   10 'asmtest
   20 TRISC=0
   30 asm
   40 *loop
   50 incf PORTC
   60 goto loop
   70 endasm

できるだけ簡単なプログラムにしようとしたため簡単にしすぎました。
これは余りいい例ではありませんね。
のちほどまた別のサンプルプログラムをお見せするつもりです。
10行〜30行がBASICのプログラム行です。
’asm’そのものはBASICの命令です。
これ以後はPICアセンブラの記述になりますという宣言文です。
70行のendasmもBASICの命令です。
これ以後はBASICの命令文ですという宣言文です。
このプログラムはここで終っています。
この例の場合PICのアセンブラプログラムが「無限ループ」になっているのでそれより後ろに何を書いても無駄になってしまうからです。
普通はこの後ろにまたBASICのプログラムを書くことになります。
さらにそれからあとにまたasm〜endasmを書くこともできます。
40行〜60行がPICアセンブラの命令行です。
PICアセンブラのルールではラベルと命令は記述する桁位置によって区別されます。
PICアセンブラではラベルは1桁目から記述します。
アセンブラの命令は2桁目以後に記述します。
しかしPICBASICコンパイラでは桁位置による区別はしないので命令文とラベルを区別するためにラベルの場合には先頭に*をつけて示します。
60行のGOTO文はBASICと同じ命令文ですが’asm’と’endasm’の間にありますからこの場合にはPICアセンブラの命令です。
GOTO文についてはたまたまBASICとPICアセンブラで同じ命令文になっていますがそこはコンパイラとアセンブラで区別して認識されます。
BASICのGOTO文で’asm’〜’endasm’の間の行に行くことはできません。
同様にPICアセンブラのgoto文でBASICの命令行に行くこともできません。
’asm’と’endasm’で囲った中はいわば「塀の中」でその内と外の行き来はできません。
’asm’がPICアセンブラの入口で’endasm’が出口です。

下は上のBASIC+アセンブラプログラムをPICBASICコンパイラにかけた結果作成されたPICアセンブラソースプログラムファイル(asmファイル)です。
;    10 'asmtest
;    20 TRISC=0
    movlw D'0'
    movwf TRISC
;    30 asm
;    40 *loop
loop
;    50 incf PORTC
    incf PORTC
;    60 goto loop
    goto loop
;    70 endasm

20行のBASIC文TRISC=0はその下に表示されている2行のPICアセンブラ命令に翻訳されていますが30行のasmと70行のendasmの間の文はそのままPICアセンブラの命令になっています。
このPICアセンブラソースブログラムファイルはPICアセンブラによって読み込まれ、下のPICアセンブラリストファイル(LISTファイル)とPICマシン語コードファイル(BINファイル)が作成されました。
2040      ;    10 'asmtest
2040      ;    20 TRISC=0
2040 000e     movlw D'0'
2042 946e     movwf TRISC
2044      ;    30 asm
2044      ;    40 *loop
2044      loop
2044      ;    50 incf PORTC
2044 822a     incf PORTC
2046      ;    60 goto loop
2046 22ef     goto loop
2048 10f0 
204a      ;    70 endasm

PICのアセンブラ命令がマシン語コードに翻訳されています。

実際には上のファイルの作成はBASICソースプログラムをLOADするとPICBASICコンパイラによって自動的に行なわれます。
下はその画面です。

/loadでBASICソースプログラム asmtst3.txt をロードするとPICBASICコンパイラが起動して、この画面からはわかりませんが*convert*のところでasmファイル(asmtst3.asm)が作成されています。
そのあと*** p18asm ***のところでPICアセンブラが起動してasmtst3.asmを読み込んでマシン語コードファイル(binファイル、画面ではobjct fileと表現されている)とアセンブラリストファイル(list file)が作成されました。
そのあと念のためにLISTコマンドでBASICプログラムの表示を行ないました。

/runコマンドを入力すると上で生成されたPICマシン語コードがPICターゲートボードのPIC(今回はPIC18F4550)に書き込まれたあとただちに実行されます。

PICのマシン語プログラムが無限ループになっているためprogram startedと表示されたあとWindowsのコマンドプロンプト画面はそこで停止した状態になります。
もちろんこのときPICターゲットボードの側は書き込まれたマシン語プログラムを実行中です。
そのマシン語プログラムはPIC18F4550のPORTCの出力を+1ずつカウントアップしFFになったら00に戻ってカウントを繰り返すものです。
下はPORTCのビット0とビット1の出力をオシロスコープで観測した写真です。

上側(CH1)がビット1(RC1)で下側(CH2)がビット0(RC0)の出力波形です。
高速パルスが出力されているのでかなり強いリンギングが出ています。

水平時間軸を拡大しました。

PIC18F4550BASICコンパイラボードは12MHz水晶発振を内部PLL回路で48MHzにしてそれをシステムクロックにしています。
PICの命令クロックはその1/4の12MHzです。
PIC18F4550に書き込んだマシン語プログラムは下の2つの命令の繰り返しです。

loop
   incf PORTC
   goto loop

incf PORTCは1命令クロックでgoto loopは2命令クロックです。
1回の繰り返しは3命令クロックですからその実行時間は
1/12*3=0.25μs
になります。
上のオシロスコープの画像で見るとちょうど計算通りのバルス波形であることがわかります。

ところで。
PIC18F4550はたった2命令の短いマシン語の無限ループプログラムを実行していますから普通はリセットをかけるしかこのプログラムを止めることはできません。
しかし、PICBASICコンパイラシステムならばできてしまいます。

program startedの表示で止まっていた画面ですが[Ctrl][C]と[Ctrl][B]だけは入力できます。
[Ctrl][B]を入力すると、PIC18F4550ボードがブレークしてコマンドプロンプトに制御が戻りました。
デバッグのためのメッセージが表示されていてわかりにくくなっています。
break [2046]
はアドレス2046でブレークしたことを示しています。
そしてそれは
ソースプログラムでは60行の実行直前であるという表示が出ています。
このようにマシン語プログラムの実行中でもブレークできるのでそこでプログラムのデバッグなどを行なうことができます。

ああ、そうでした。
この続きがあったのでした。
上の画面で終了してしまいましたのでもう一度起動して続きを実行してみます。

システムを起動したときにUSB接続しているPICターゲットボードのPICにプログラムが書き込み済みの場合には
/pmrd 80,0
を実行すると書き込み済みのプログラム名が表示されます。
この機能は[第53回]で紹介しました。
プログラムは書き込み済みですから/runコマンドで直ちに実行させられます。
そのあと[Ctrl][B]の入力でブレークさせたところまでがさきほど説明したところです。
ここでそのあと
/cont
を入力することでブレークしたところからプログラムを再開させることができます。

もちろんそのあと[Ctrl][B]で再びブレークさせることもできます。

マシン語プログラムを実行しているという感じはありませんでしょう。
もうまるでインタプリタを実行しているような感じです。
PICBASICコンパイラはなかなかの優れものなのです。

PICBASICコンパイラ[第55回]
2023.7.21upload

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