楽天市場
[無料でホームページを作成] [通報・削除依頼]

続8 8ピンPICでUSB PIC16F505_USBIO

前回はベースラインのPIC16F57でUSBIOの検討を行いましたが、出力1チャンネルというお粗末な仕様でした。
最終的にPIC16F57で多チャンネルUSBIOを実現したいのですが(私にとって)課題も多いということは前回・前々回と、記述したとうりです。

そこで今回は課題解決の糸口として入力4チャンネル、出力4チャンネルの仕様に挑戦してみました。
使用したPICはPIC16F505とPIC16F506(共に14PIN)です。

img_20141021-000926.jpg


<回路図>

img_20141021-000953.jpg

<回路上の留意点>
PIC16F505/506は設計が旧いためかPIC16F57よりも更に電圧印加の条件がきびしいことがわかりました。
PICにはUSBの5V(若しくはそれ以上)を印加する必要があります。印加電圧が低いと24MHzで正常に作動しません。



<PIC16F505/506の制約とプログラム作成の留意点>

?割り込みが存在しないのはPIC16F57と一緒ですが、問題は"入力ポートの変化をどのタイミングで読みに行くか"です。
16FUSBのオリジナルのプログラムではポートのセットアップ後に無限ループを形成し、無限ループ内部で入力ポートの変化を検出しています。当然割り込みもこの無限ループ中で発生しますので、割り込みが使用できない条件では、入力ポートの変化を検出する際にホストからのSYNCコードを読み飛ばすかも知れません。

入力ポートの変化を検出するプロセスを無限ループ中に置かずに、別な場所に置けないか検討したところ良い場所を見つけました。
興味のある方はソースファイルでご確認ください。安定して作動するようなので懸案がひとつ解決しました。


?フラッシュ領域の制約
PIC16F505/506のフラッシュ領域はPIC16F57の半分の1kワードしかありません。
このサイズに収まるようストリングデスクリプタを割愛しました。サブルーチンの配置も変更しています。
また当初はビットごとに入出力の方向も選択できるようにしたかったのですが、フラッシュの余裕が無くあきらめました。

2014.11.08 追記 続10でビットごとに入出力の方向も選択できるようにしました。

?ポートの割り当て
PIC16F505/506ではPORTBとPORTCがそれぞれ6ビットずつ割り当てられています。
24MHzのクリスタルオシレーターを使用しますので、OSC1に割り当てられているRB5は使用できません。
USBの通信に必要な信号線はD+、D-、SE0の3本ですが、このうちD+はT0CKIと兼用の端子を使用しますのでRC5が使用できません。SE0の端子はD+、D-信号のモニタなので入力専用のRB3を使用します。

結果としてI/Oとして使用可能なポートを以下のように定めました。

出力ビット0 -->RC0
出力ビット1 -->RC1
出力ビット2 -->RC2
出力ビット3 -->RC3

入力ビット0 -->RB0
入力ビット1 -->RB1
入力ビット2 -->RB2
入力ビット3 -->RB4


<ホストプログラム>
16FUSBのホストプログラムを入力4チャンネル、出力4チャンネルの仕様に改造しました。バイナリとソースプログラムを同包しています。


ダウンロード先

Bequest333のページ(別館)

http://hp.vector.co.jp/authors/VA058115/

https://drive.google.com/file/d/1DfknE6ZDWnthq43M5Ar9nRMfrVrF7HeY/view?usp=drivesdk