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


PICBASICコンパイラ

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

[第56回]



●PICBASICコンパイラサンプルプログラム

前回は「PICアセンブラ in BASIC」の説明をするために簡単なサンプルプログラムを作成して動作テストを行いました。
プログラムを実行してI/Oポートの出力波形をオシロスコープで観測し写真を撮りました。
実はその折についでだからということでアセンブラではない通常のBASICコンパイラプログラムも作成して同じように実行してI/Oポートの出力波形も写真に撮りました。
せっかくプログラムを書いて写真まで撮りましたので今回はそれをお見せすることにいたします。

こちらがそのときに書いたPICBASICコンパイラのソースプログラム(テキストプログラム)です。
   10 TRISC=0
   20 *bsloop
   30 PORTC=a
   40 a=a+1
   50 goto *bsloop

前回のPICアセンブラのサンプルプログラムと同じ動作をするプログラムです。
変数aの値を+1ずつ増加させてその値をPORTCから出力します。
PICBASICコンパイラは今のところ数値は8ビットですからaの値の範囲は0〜255($FF)です。
255に+1を加えると結果は0になります。
そこからまた+1ずつ加算されていきます。

下は上のBASICソースプログラムがPICBASICコンパイラによって読み込まれてその結果作成されたPICアセンブラプログラムリストです。
2040      ;    10 TRISC=0
2040 000e     movlw D'0'
2042 946e     movwf TRISC
2044      ;    20 *bsloop
2044      bsloop
2044      ;    30 PORTC=a
2044 3050     movf a,w
2046 826e     movwf PORTC
2048      ;    40 a=a+1
2048 3050     movf a,w
204a 22ec     call 44
204c 00f0 
204e 010e     movlw D'1'
2050 24ec     call 48
2052 00f0 
2054 1c24     addwf R1c,w
2056 306e     movwf a
2058      ;    50 goto *bsloop
2058 22ef     goto bsloop
205a 10f0 

このサンプルプログラムの計算式は簡単なものですがもっと複雑な式にも対応するためにあらかじめターゲットボードのPICに書き込み済みのサブルーチンをCALLしています。

PICBASICコンパイラによって生成されたPICマシン語プログラムを実行してPORTCから出力された波形です。

上側(CH1)がPORTCのビット1(RC1)の出力波形で下側(CH2)がPORTCのビット0(RC0)の出力波形です。

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

この波形からプログラムのGOTOループの1回の実行時間が3μsであることがわかります。
前回のアセンブラプログラムから生成されたマシン語プログラムでは1回のループの実行時間は250nsでした。
アセンブラでプログラムを書くのは大変ですがより高速で実行されるプログラムになります。

上のBASICプログラムはI/Oポートに値を出力するときに普通に使われる書き方ですがPICの場合にはI/Oポートそのものが一般的な変数と同じレジスタとして扱われます。
ですから向きを「出力」に指定したI/Oポートの出力値を読むことができます。
下はPORTCそのものをレジスタ(変数)として扱ったプログラム例です。
   10 TRISC=0
   20 *bsloop
   30 PORTC=PORTC+1
   40 goto *bsloop

さきほどのプログラムをこのように書いても同じように実行されます。

下はPICBASICコンパイラによって生成されたPICアセンブラプログラムリストです。
2040      ;    10 TRISC=0
2040 000e     movlw D'0'
2042 946e     movwf TRISC
2044      ;    20 *bsloop
2044      bsloop
2044      ;    30 PORTC=PORTC+1
2044 8250     movf PORTC,w
2046 22ec     call 44
2048 00f0 
204a 010e     movlw D'1'
204c 24ec     call 48
204e 00f0 
2050 1c24     addwf R1c,w
2052 826e     movwf PORTC
2054      ;    40 goto *bsloop
2054 22ef     goto bsloop
2056 10f0 

マシン語プログラムの長さがほんの少しだけ短くなりました。

プログラムの実行結果です。

先ほどのプログラムの実行速度とほとんど変わりません。
やはりサブルーチン部分の実行に大半の時間がかかっているようです。

PICBASICコンパイラ[第56回]
2023.7.24upload

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