PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第199回]
●PICUSBIO−08(5)動作テスト(4)
前回までPICUSBIO−08に実装しているPIC18F4550のI/Oポートの動作テストについて書いてきました。
PIC18F4550は40pinのICでI/Oポートの数もたくさんあります。
PORTB、C、D、Eは8ビットに満たないポートもあるためそれらをまとめてなんとか26pinのフラットケーブルコネクタに配置できました。
ND80Z3.5などの82C55入出力コネクタにできるだけ合わせる形の端子配列にしました。
でもまだPORTAが残っています。
RA0〜RA5の6ビットです。
これはもう別のコネクタに配置するしかありません。
26pinコネクタのほかに10pinのフラットケーブルコネクタに配置しました。
その様子がわかるようにPICUSBIO−08の回路図を再掲します。
この回路図は[第183回]及び[第197回]でお見せしました。
26pinコネクタにはND80Z3.5などの82C55の端子番号にできるだけ合わせてPIC18F4550のI/O端子を配置したため82C55の端子名PA0〜PC7も併記しました。
その流れでRA0〜RA5に対してはPD0〜PD5を併記しました。
82C55のPA0〜PA5と混同しないためそのように考えたのですが今から思うとかえってわかりにくくなってしまったようです。
下が10pinコネクタの端子図です。
左側が回路図の表記をそのまま端子図にしたものです。
こうして見るとPD0〜PD5には何の意味もありません。
余計なことをしてしまいました。
右側はND80Z3.5などの82C55用26pinコネクタのpin1〜pin10の端子名を併記した端子図です。
前回までと同様82C55の端子名を併記することでたとえばPIC18F4550のRA0がND80Z3.5などの26pinコネクタでは82C55のPA5の位置に配置されていることがわかります。
こんなふうに配置しないでいっそのことPA0にRA0を、PA1にRA1を配置したほうがあとからテストがしやすかったのにと後悔しています。
10pinコネクタには表記していませんが26pinコネクタではPA0、PA1はpin7、pin8に配置してあります。
10pinコネクタはND80Z3.5などとの互換性は考えなくてもよいのでRA0〜RA5はpin番号に合わせて配置したのですが、今までと同じように既存のLED表示ボードを使ってテストしようとするとかえってテストがやりにくいことにプログラムを書く段階ではじめて気が付きました。
ま、しかし、それは82C55のテストで使っているLED表示ボードをそのまま流用しようとしたためで、ユーザーが使うためには別段支障があるわけではありません。
その場合には端子名とpin番号が一致しているほうが使い易いと思います。
とにかくそういうことなのでテストプログラムは今までとは考え方を変えなくてはなりません。
今までのプログラムの考え方ですと最初にPA2(ビット2)に対応するLED(右から3番目)を消灯し、それから順に左側に向かって各ビットを消灯していくことになります。
この場合PA0とPA1はありませんからPA2から始まります。
それはよいのですがPA2にはRA4が配置されています。
PA3にはRA5が配置され、PA4にはRA1が配置されています。
今までのプログラムのように前の値を単純に2倍するというわけにはいきません。
どうしましょう?
その方法として次のように考えました。
テスト用のLEDのPA2〜PA7を順に消灯するにはどのようにすればよいかをまず考えてから次にそれをPIC18F4550のポート出力に置き換えるように考えました。
最初に82C55のAポートのビット2(PA2)だけを1にします。
10pinコネクタを26pinコネクタの一部と考えた上図右の端子図で考えるとPA2にはRA4が配置されていますから実際にはPIC18F4550のRA4だけを1にすることになります。
つまりそれは(PIC18F4550の)PORTAに10(00010000)を出力する作業です。
次に(82C55の)左側のビット3(PA3)だけを1にします。
PA3にはRA5が配置されていますから実際にはRA5を1にする、つまりそれはPORTAに20(00100000)を出力する作業です。
次に左側のビット4(PA4)だけを1にします。
PA4にはRA1が配置されていますから実際にはRA1を1にする、つまりPORTAに02(00000010)を出力する作業です。
次に左側のビット5(PA5)だけを1にします。
PA5にはRA0が配置されていますから実際にはRA0を1にする、つまりPORTAに01(00000001)を出力する作業です。
次に左側のビット6(PA6)だけを1にします。
PA6にはRA3が配置されていますから実際にはRA3を1にする、つまりPORTAに08(00001000)を出力する作業です。
最後に左端のビット7(PA7)だけを1にします。
PA7にはRA2が配置されていますから実際にはRA2を1にする、つまりPORTAに04(00000100)を出力する作業です。
以上を整理するとPORTAに次の値を順に出力すればよいことになります(値は16進数)。
10、20、02、01、08、04
これを十進数で表記すると
16、32、2、1、8、4
です。
どういうプログラムを書けばよいかが見えてきました。
下がそのプログラムです。
こういうときにはDATA文、READ文がぴったりです。
最初に30行のDATA文でデータの並びを記述します。
50行のREAD文を実行するとDATA文で記述した順に値が変数に読み込まれます。
BASICは実に便利です。
プログラムを実行しました。
RA0〜RA5は10pinコネクタに配置しました。
その10pinコネクタはND80Z3.5などの82C55入出力用の26pinコネクタのpin1〜pin10に電源の位置を合わせて重ねることができます。
コネクタ増設のために作ったコネクタボードを利用して10pinコネクタと26pinコネクタのpin1〜pin10を接続しました。
そのようにすることで上記のプログラムを実行するとLED表示ボードのAポート(一番上のライン)に値が出力されます。
最初に右から3番目のLEDが約0.5秒間消灯しそれからは約0.5秒ごとに消灯位置が左にシフトしていきます。
左端までいくとまた右から3番目に戻ってそれが繰り返されます。
PIC−USBIO using BASIC[第199回]
2023.3.25upload
前へ
次へ
ホームページトップへ戻る