PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第8回]
●サンプルプログラム(4)I/Oポートへの出力(2)
前回からの続きです。
前回はPICではI/Oポートも「レジスタ」なので普通の変数として扱うことができる、ということを書きました。
実際PIC用のBASICとしてはOUT文はI/Oポートを「I/O」として扱うためだけに付加したいわば特殊な命令ですから、PICではI/Oポートもそのほかのレジスタと同じなのだということが理解できれば、I/Oポートへの出力だからOUT文を使わなければならない、などとこだわる必要はなくなります。
それだけI/Oポートがらみのプログラム(実際PICではそれが一番多いと思います)を書くときの自由度が上がることになります。
そのことを理解していただいたうえで前回の続きを見ていただくことにします。
前回は2つめのサンプルプログラムBSOUTT2.TXTをロードしたところで終りました。
今回はその続きです。
最初のサンプルプログラムBSOUTT1.TXTではPORTCをZ80などと同じI/Oと考えてOUT文を使いました。
BSOUTT2.TXTではPORTCをレジスタと考えて代入文(LET文)を使っています(PICではこちらの方が普通の扱い方です)。
BSOUTT1.TXTとBSOUTT2.TXTでは全く同じ結果になります、と前回書きました。
全く同じということは、コンパイルした結果同じマシン語コードが生成されるという意味です。
今回も/RUNで実行したあと、[Ctrl][B]を入力してブレークしたあとで/PMRDコマンドでPICに書き込まれたマシン語コードを読み出してみました。
上のコマンドプロンプト画面の上部に表示されているのは前回BSOUTT1.TXTをコンパイルしてPICに書き込まれたマシン語コードを/PMRDコマンドで読み出して表示したものです。
今回の表示内容と全く同じであることが確認できます。
さらに。
「I/Oポートがレジスタと同じように扱える」ということになりますと、こんなプログラムが書けることになります。
3つめのサンプルプログラムBSOUTT3.TXTをロードしました。
いままでの2つのプログラムはPORTCに’00000000’と’00000001’を交互に出力するものでした。
たとえば上位のビットへの出力は無視してビット0だけに注目したときに今までの2つと同じ出力になるようなプログラムを書くとすればBSOUTT3.TXTのようなプログラムも書けるはずです。
実際にプログラムを実行してみました。
今回はとりあえずRC0(PORTCのビット0)のみをCPLDロジアナで観測しました。
BSOUTT1の出力波形([第6回]参照)に比べると少しパルス幅が大きくなっていますがH期間L期間のデューティ比はほぼ同じになっています。
Hが430nsでLが400nsです。
CPLDロジアナでサンプリングクロックが100MHzの場合最低でも10nsのズレが発生します。
それを考慮するとH=420ns、L=410nsになりますからそれでも少しだけH期間の方が長いように見えます。
本当のところはどうなのでしょうか。
計算上はどちらも417nsになるはずです。
1回の周期は計算上は833nsです。
ロジアナの波形を周期で見ると830nsですからぴったり合っています。
そのことからすると上記のH期間とL期間の差はCPLDロジアナのサンプリング周波数100MHzではそれ以上細かくは測定できない限界によるものだと考えられます。
今回も説明の途中ですが、長くなりますので続きは次回に書くことにします。
PICBASICコンパイラ[第8回]
2023.4.12upload
前へ
次へ
ホームページトップへ戻る