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

続7 8ピンPICでUSB PIC16F57_USBIO

前回はエンハンスドベースラインのPIC16F570を用いてUSBIOの検討を行いましたが、同じことがベースラインのPIC16F57で行えないか検討しました。


PIC16F57は28pinでI/Oが20本あるので最大17のI/Oを制御することが可能です。
また国内での入手性も良好です。

注意
今回ご紹介するプログラムはプロトタイプであることと、かつ私の実力不足が原因で制御可能なI/O数は1です。
後述するように割り込みが使用できない制約から、入力ポートの変化を検出することが難しく、
16FUSBのサンプルプログラム上で入力ポートの変化を検出することができません。
(注意の注、USBIOの入力ポートが使用できないということではありません。プログラム次第)

img_20141008-171052.jpg



<回路図>
img_20141008-171129.jpg
img_20141008-222542.jpg

<回路上の留意点>
PIC16F57とPIC16F570の電気特性が異なるため、前ページで記載した(ツェナーダイオードを用いない)回路が使用できません。
これにハマリました。PIC16F57に印加する電圧を高めてUSBの信号線にツェナーダイオードをかませる必要があります。
img_20141008-171231.jpg
img_20141008-171254.jpg

PIC16F57はT0CKI端子が独立しているのでTOCKI端子とD+の信号線と直結します。



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

?PIC16F57には割り込みが存在しない。またTM0のオーバーフローブラグも存在しない。
割り込みが使用できないので、ホストから出力されるSYNCコード"KJKJKJKK"をポーリングで検出する必要があります。
D+の立ち上がり(最初のK)の検出はTMR0のオーバーフローを使用して検出できますが、割り込みの時のように常に同じタイミングで検出できないため、信号の同期をとるための工夫が必要です。

具体的には信号の同期をとるために以下のルーチンを使用しました。
TMR0のエッジ検出時に許されるタイミングは図の◎●○の3パターンですが図の下段に記載のルーチンを通過する際に●のタイミングに収斂されます。

img_20141008-171350.jpg

TMR0のオーバーフロー検出に関してはTMR0の7ビット目が立っているかどうかを検出することで前回同様の処理が行えます。




?スタック深さが2段
エンハンスドベースラインのスタックは4段ありましたがベースラインのスタックは2段しかありません。
この点を鑑み、サブルーチンの数を前回よりも減らしています。
残したサブルーチン
MandarNAK
MandarDATA
MandarACK
DesencriptarNRZI
ProcessOut
EscribirUSBPID
LevantarTabla
CalcularCRC16
InsertarCRC16
InsertarBitStuffing
Label_A




?FSRレジスタがバンクレジスタを兼用する仕様
いや、これには正直難儀しました。16F570のプログラムを16F57的に記述し、動作を確認した後、16F57のプログラムに反映させることで何とか動くものを作ることができました。
16F57ではFSRレジスタに値を書き込む際にバンクも変化しますので、FSRレジスタやINDFレジスタの読み書き命令の前後で目的のバンクを参照するようにFSRレジスタの6ビット目と5ビット目を再設定する必要があります。
また0x08~0x0FのRAM領域は、参照する書き込むと強制的にバンク0に戻されるので注意が必要です。



?RAMの割り当てに関して
?の項目とも関わるのですが、D+,D-に割り当てたポートの読み書きはバンク固定でないと処理が追いつきません。
バンク切り替えを行う時間的余裕がありません。
バンク切り替えを最小限に収めるため、思考錯誤の末、RAMの配置を以下のように変更しました。前回の16F570のものとは大きく異なっています。

;RAM-Bank0
Veces              EQU        0x0E
count               EQU        0x0F

RespPID           EQU        0x10
Resp_0            EQU        0x11
Resp_1            EQU        0x12
Resp_2            EQU        0x13
Resp_3            EQU        0x14
Resp_4            EQU        0x15
Resp_5            EQU        0x16
Resp_6            EQU        0x17
Resp_7            EQU        0x18
Resp_8            EQU        0x19
Resp_9            EQU        0x1A
Resp_A            EQU        0x1B
Resp_B            EQU        0x1C
ByteAMandar     EQU        0x1D
Banderas_0      EQU        0x1E
Banderas_1      EQU        0x1F

;RAM-Bank1
Var_0              EQU        0x30
Var_1              EQU        0x31
Var_2              EQU        0x32
Var_3              EQU        0x33
Var_4              EQU        0x34
Var_5              EQU        0x35
Var_6              EQU        0x36
Var_7              EQU        0x37
Var_8              EQU        0x38
Var_9              EQU        0x39
BytesRecibidos  EQU        0x3A
Posicion            EQU        0x3B

;RAM-Bank2
RecNRZI_0        EQU        0x50
RecNRZI_1        EQU        0x51
RecNRZI_2        EQU        0x52
RecNRZI_3        EQU        0x53
RecNRZI_4        EQU        0x54
RecNRZI_5        EQU        0x55
RecNRZI_6        EQU        0x56
RecNRZI_7        EQU        0x57
RecNRZI_8        EQU        0x58
RecNRZI_9        EQU        0x59
RecNRZI_A        EQU        0x5A
RecNRZI_B        EQU        0x5B
RecNRZI_C        EQU        0x5C
UltAddressRec    EQU        0x5D
DeviceAddress    EQU        0x5E
temp                 EQU        0x5F

;RAM-Bank3
PID                   EQU        0x70
Recibido_1        EQU        0x71
Recibido_2        EQU        0x72
Recibido_3        EQU        0x73
Recibido_4        EQU        0x74
Recibido_5        EQU        0x75
Recibido_6        EQU        0x76
Recibido_7        EQU        0x77
Recibido_8        EQU        0x78
Recibido_9        EQU        0x79
Recibido_A        EQU        0x7A
Recibido_B        EQU        0x7B
Recibido_C        EQU        0x7C
NuevoAddress    EQU        0x7D
Banderas_2       EQU        0x7E

#define    Ocupado        Banderas_0, 3
#define    Setup            Banderas_0, 5
;;Reservation                 Banderas_0, 6
#define AsignAddress     Banderas_1, 0
#define INPend             Banderas_1, 3
#define InterruptIN        Banderas_1, 4
#define Stall                  Banderas_1, 5
#define ZLPPend            Banderas_1, 6
#define    Data1             Banderas_2, 1
;;Reservation                 Banderas_2, 2






ダウンロード先

Bequest333のページ(別館)

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

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