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

続6 8ピンPICでUSB PIC16F570_USBIO


Microchipからエンハンスドベースラインの石が出ています。
PIC16F570は28pinでI/Oが24本あるのでこれを用いてUSBIOが実現できればたくさんのポート(最大20)
を制御することが可能です。ということで試してみました。

注意
今回ご紹介するプログラムはプロトタイプであることと、かつ私の実力不足が原因で制御可能なIO数は3です。
入出力の方向制御と多ポート化に対応するためには?ホストプログラムの新規作成?レポートデスクリプタの
変更、?TRISの制御プロセスの追加、?多チャンネルの読み書きプロセスの追加が必要になりますが、
これには本家"Inalambrico USB 12F675"のソースコードが大いに参考になります。
img_20141009-131038.jpg


<回路図>
img_20140920-161600.jpg
img_20140920-161629.jpg



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

?PIC16F570には割り込みが存在するが、16FUSBで使用するINT割り込みが存在しない。
INT割り込みの代わりになりそうなのはコンパレータによる割り込みとPORTBのPIN変化割り込みですが、
前者はIN+、IN-の端子を強制的にアナログポートにしてしまい。ポート利用率の点で不採用としました。
後者のPORTBのPIN変化割り込みについても、将来的にPORTBを8ビット連続で使用するつもりなので不採用としました。
これらに代わる方法としてTMR0のオーバーフロー割り込みを使用します。
考え方としては?T0CKIを選択。?TMR0に0xFFをセット。?D+信号の立ち上がりを待つ。?TMR0カウントアップ。?オーバーフロー割り込み発生。
16FUSBでは、別の場所でビット転送時の完了をTMR0で検出していますので、割り込み検出とビット転送時にT0CKI使用の有効・無効を切り替えます。

?スタック深さが4段
PIC16F6XXのスタックは8段ありましたが、エンハンスドベースラインのスタックは4段しかありません。
このうち1つは割り込みで使用するため、サブルーチンを無くしてネストを低減させる必要があります。
結果、以下のサブルーチンを廃止しました。
Espero
Label_3
Label_6
Label_9
さらにビット転送時の完了検出も割り込みを使用していますので、転送完了の検出に割り込みを使用しないようにプログラムを変更しました。

?TRIS、OPTION
エンハンスドベースラインの石ではTRIS、OPTIONの記述がライトオンリーなので、ポートの方向やT0CKI、プリスケーラーの選択をbitごとに変更できません。従ってD+、D-の方向を切り替えるたびにに入出力用のポートも再設定する必要があります。

?細分化されたRAM
エンハンスドベースラインの石では先のページで記載した必要RAM容量は満たすのですが、バンク毎に細分化されるため
割り込み受信に関係するRAMレジスタをページ0に配置する必要があります。
具体的にはBANK0には以下のようにレジスタを配置しました。

Banderas_0        EQU        0x0C
Banderas_1        EQU        0x0D
DeviceAddress     EQU        0x0E
UltAddressRec     EQU        0x0F

RecNRZI_0        EQU        0x10
RecNRZI_1        EQU        0x11
RecNRZI_2        EQU        0x12
RecNRZI_3        EQU        0x13
RecNRZI_4        EQU        0x14
RecNRZI_5        EQU        0x15
RecNRZI_6        EQU        0x16
RecNRZI_7        EQU        0x17
RecNRZI_8        EQU        0x18
RecNRZI_9        EQU        0x19
RecNRZI_A        EQU        0x1A
RecNRZI_B        EQU        0x1B
RecNRZI_C        EQU        0x1C
NuevoAddress    EQU        0x1D
ByteAMandar      EQU        0x1E
Veces                EQU        0x1F

0x0C~0x0Fのレジスタはどのバンクからもアクセスできるので前後でのバンク切り替えは不要です。
頻繁にバンク切り替えを行う必要が生じるため、プログラムは冗長になります。

?コンテキスト自動保存
これはPIC16F570の制約ではありませんが、割り込みが発生するとWレジスタ、STATUSレジスタ、BSRレジスタ、FSRレジスタが自動保存されますので、割り込みルーチンの先頭でこれらを保存する必要がありません。

?EscribirUSBPIDルーチン
PIC16F570_USBIOを試作し接続しても認識されないバグに悩まされましたが、このルーチンが原因であると判明しました。(ビットの転送間隔が一部不正となる。)正しいサイクルで転送できるように書き換えました。


ダウンロード先

Bequest333のページ(別館)

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

https://drive.google.com/file/d/1DXpkGEW7-qTIPyiHHk38-QyWaOPuafry/view?usp=drivesdk