続7 8ピンPICでUSB PIC16F57_USBIO
前回はエンハンスドベースラインのPIC16F570を用いてUSBIOの検討を行いましたが、同じことがベースラインのPIC16F57で行えないか検討しました。
PIC16F57は28pinでI/Oが20本あるので最大17のI/Oを制御することが可能です。
また国内での入手性も良好です。
注意
今回ご紹介するプログラムはプロトタイプであることと、かつ私の実力不足が原因で制御可能なI/O数は1です。
後述するように割り込みが使用できない制約から、入力ポートの変化を検出することが難しく、
16FUSBのサンプルプログラム上で入力ポートの変化を検出することができません。
(注意の注、USBIOの入力ポートが使用できないということではありません。プログラム次第)

<回路図>


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


PIC16F57はT0CKI端子が独立しているのでTOCKI端子とD+の信号線と直結します。
<PIC16F57の制約とプログラム作成の留意点>
?PIC16F57には割り込みが存在しない。またTM0のオーバーフローブラグも存在しない。
割り込みが使用できないので、ホストから出力されるSYNCコード"KJKJKJKK"をポーリングで検出する必要があります。
D+の立ち上がり(最初のK)の検出はTMR0のオーバーフローを使用して検出できますが、割り込みの時のように常に同じタイミングで検出できないため、信号の同期をとるための工夫が必要です。
具体的には信号の同期をとるために以下のルーチンを使用しました。
TMR0のエッジ検出時に許されるタイミングは図の◎●○の3パターンですが図の下段に記載のルーチンを通過する際に●のタイミングに収斂されます。

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
ダウンロード先
http://hp.vector.co.jp/authors/VA058115/
https://drive.google.com/file/d/1DbU5_cfQeg33Dh0moj9FPS5Vyg81j1ZN/view?usp=drivesdk
PIC16F57は28pinでI/Oが20本あるので最大17のI/Oを制御することが可能です。
また国内での入手性も良好です。
注意
今回ご紹介するプログラムはプロトタイプであることと、かつ私の実力不足が原因で制御可能なI/O数は1です。
後述するように割り込みが使用できない制約から、入力ポートの変化を検出することが難しく、
16FUSBのサンプルプログラム上で入力ポートの変化を検出することができません。
(注意の注、USBIOの入力ポートが使用できないということではありません。プログラム次第)

<回路図>


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


PIC16F57はT0CKI端子が独立しているのでTOCKI端子とD+の信号線と直結します。
<PIC16F57の制約とプログラム作成の留意点>
?PIC16F57には割り込みが存在しない。またTM0のオーバーフローブラグも存在しない。
割り込みが使用できないので、ホストから出力されるSYNCコード"KJKJKJKK"をポーリングで検出する必要があります。
D+の立ち上がり(最初のK)の検出はTMR0のオーバーフローを使用して検出できますが、割り込みの時のように常に同じタイミングで検出できないため、信号の同期をとるための工夫が必要です。
具体的には信号の同期をとるために以下のルーチンを使用しました。
TMR0のエッジ検出時に許されるタイミングは図の◎●○の3パターンですが図の下段に記載のルーチンを通過する際に●のタイミングに収斂されます。

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領域は、
?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のページ(別館)
https://drive.google.com/file/d/1DbU5_cfQeg33Dh0moj9FPS5Vyg81j1ZN/view?usp=drivesdk
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT