秋月などで買えるRL78G1C(R5F10JBCAFP, 32pin)ですが、「Renesas USB MCU, USB Peripheral Human Interface Devices Class Driver (PHID) using Basic Mini Firmware」で公開されているソースコード、そのまま動かないようです。なお、USBキーボードとして動作させるモードを使おうとしてます。
今、作業始めて見つけた条件の違いは、
(1) 48pinが、前提で、32pinにはないポートをスイッチに割り当てている。再配置が必要かも。←sw1,sw2,sw3で使ってるポートは、32pinにもありました。(2) 外付け水晶を使った発信が前提で、内蔵発信器になっていないこと。ロースピードで良いので、内蔵発信器で動くようにしたい。(3) 今後の作業で見つけていきます。
上記の3つの中で、(2)の変更をするための情報が知りたく、お願い致します。
RL78G10と同様の回路で、制御プログラムは書き込めているようです。
ユーザズマニュアルでは、下記の記載がヒントかな。
② 高速オンチップ・オシレータオプションバイト(000C2H)により,fHOCO = 48 MHz (TYP.) /24 MHz (TYP.)から周波数を選択し,発振させることができます。CKSELRビット(MCKCレジスタのビット0)を"0"に設定すると,周波数fHOCOをRDIV0, 1ビット(MCKCレジスタのビット1, 2)の設定によって,2/4/8分周(2分周がデフォルト)したクロックがメイン・システム・クロック・ソース(fIH)として選択されます。リセット解除後,CPUは必ずこの高速オンチップ・オシレータ・クロックで動作を開始します。USBクロックとして高速オンチップ・オシレータ・クロックをソースクロックとして選択(USBファンクション・コントローラ機能のロウ・スピード転送時のみ使用可能)する場合は,fHOCOの周波数選択を48 MHzとした上で,メイン・システム・クロック(fMAIN)に必ずfHOCOを分周したメイン・システム・クロック・ソース(fIH)を選択して使用してください。STOP命令の実行またはHIOSTOPビット(CSCレジスタのビット0)の設定により,発振を停止することができます。オプション・バイトで設定した周波数は,高速オンチップ・オシレータ周波数選択レジスタ(HOCODIV)で変更できます。周波数は,図5-9 高速オンチップ・オシレータ周波数選択レジスタ(HOCODIV)のフォーマットを参照してください。
③ PLL(Phase Locked Loop)による高速システム・クロックの逓倍機能USBホスト/ファンクション・コントローラ用のクロック供給を主目的としたクロック機能で,PLL発振周波数(fPLL)が48MHzとなるようにDSCCTLレジスタを設定して使用します。また、CKSELRビットを"1"に設定すると,周波数fPLLをRDIV0, 1ビットの設定によって,2/4/8分周したクロックがメイン・システム・クロック・ソース(fIH)として選択されます。USBクロックとしてPLLクロックをソースクロックとして選択する場合はメイン・システム・クロック(fMAIN)として必ずfPLLを分周したメイン・システム・クロック・ソース(fIH)を選択して使用してください。DSCONビット(DSCCTLレジスタのビット0)の設定により,PLLを動作,停止させることができます。なお,PLLの設定の詳細およびUSBクロックとの接続関係に関しては図5-12,表5-3を参照してください。
これの具体的なプログラムがどうなうのか? でも、②と③で、混乱
試しに、「// MCKC |= 0x01; /* Select PLL clock (fPLL) */」とコメントアウトすると、下写真のエラーメッセージがでるようになったが、どう設定するのだろうか?
上写真は、ロースピードでつけろと書いてあったコンデンサを外した時のエラー。
前提として、USBデバイスとして、使うときは、水晶発振器が必須ということではないですよね。
-------
デバイスマネージャのダイアログを見ていると、一瞬、HIDキーボードデバイスとして、認識されているようだ。
データシートに載っていました。
D+/D-につながるUDP0,UDM0,UDP1,UDM1は6.5Vまで大丈夫ですので、VBUS側(5V)に逃すようにつなげば良いです。
皆様、情報、有難うございます。部品が入手できたら、試したいと思います。
TPD2E001DRLRを入手したものの、意外に小さく、手付の半田付けでは、無理そうなので、別の部品を探します。この大きさなら、これを内蔵するUSBコネクタがあってもよさそう(;^ω^) DZDパッケージの方が大きそうなのですが、在庫が無いようです。
試しに、外付け水晶振動子無しの場合で、手元にあったリード線付のスイチングダイオード(1S2076Aを4本)を付けたら、うんともすんとも、認識されなくなりました(;^ω^)。但し、1N4148の方が、TPD2E001に近い仕様な模様。
安いUSBアナライザ(USBストリームスコープ US-F100Aとか中古)でもあった方が、いいかな。外付け水晶振動子なしは、鬼門だったかな。
とりあえず、外付け水晶振動子の使用を前提にすると、ダイオード4本も付けられるようにして、PCBはこんな感じに修正しとけば、良いかな。
とりあえず、このPCBを発注して、第二ラウンドします。
昨日、水晶振動子付版の電子基板が届いたので、試したところ、ふりだしに戻った感じで、E20を繋いでないと、PCから認識されない状態になりました。抵抗器は、0Ω, 22Ω, 47Ω, 100Ωと変えても、症状変わらず。
お騒がせしてます。新しい電子基板の動作不安定の落ちが、見えてきました。現象論ですが、resetピンをプルアップしてなかったのが原因のようです。resetピンをプルアップして、更に、動作確認予定です。RL78/G10を使ったときには、resetピンは、オープンで使えていたので、同じようにしてました。
外付け水晶振動子ありに変更しましたが、ちゃんと動くようになったみたいです。皆様、有難うございました。
RL78/G1C ユーザーズマニュアル ハードウェア編のページ20には、resetピンは、使わない時には、VDDへ接続しろと書いてあるのね。内部でプルアップでないってことですかね。D+とD-の保護ダイオードは、1N4148で動いてます。
PCBファイルも修正。シルク1ヶ所の印刷面修正と、プルアップ抵抗器の追加。
修正版PCBファイルも公開。但し、サイリウム部分は未チェック。ゲームコントローラ部のRL78G1Cと、サイリウム部のGR-KURUMIそれぞれは、シリアルで接続されているだけなので、独立して使えるようになってます。
サンプルを改造して、プッシュスイッチを接続するポートで変更しようと、下記修正をしたのですが、ポートからちゃんと値が取れてない状況。ポート初期化は初心者なので、何が不足しているのか、データシート見ながら確認中。兼用機能を無効化しそこねてるのかどうか。サンプルソースの下記の関数usb_cpu_set_pin_functionが、ポート初期化をしている模様。
void usb_cpu_set_pin_function(void) { ADPC = 0x01; // all digital port PIOR = 0x00; // /* Pin | Function | I/O | Connection */ /*****************************************/ /* P00 | P00 | I | SW02 */ /* P01 | P01 | I | SW01 */ IICCTL00.7 = 0; //stop SDA IICCTL01.7 = 0; //stop SDA TOE0 = 0; TO0 = 0; CKS0.7 = 0; SOE0 = 0x01; SO0 = 0x02; PMC = 0xfc; // p00 and p01 to digital I/O PM0 = 0xff; // p01 and p01 t0 input PU0 = 0x03; /* P20 | P20 | I | SW04 */ /* P21 | P21 | I | SW07 */ /* P22 | P22 | I | SW0a */ PM2 = 0xff; /* P30 | P30 | I | SW0c */ /* P31 | P31 | I | SW06 */ PM3 = 0xff; PU3 = 0x03; /* P60 | P60 | I | SW0b */ /* P61 | P61 | I | SW08 */ /* P62 | P62 | I | SW03 */ PM6 = 0xff; /* P70 | P70 | I | SW09 */ PM7 = 0xff; PU7 = 0x01; /* P120 | P120 | I | SW05 */ PMC12 = 0xfe; PM12 = 0xff; PU12 = 0x01; } /* eof usb_cpu_set_pin_function() */E20で見ると、P2,P3,P6,P7,P12からは値が取れていてけど、P0から、常時、0値で、値が取れてない模様。P0の何かを無効化できてないのかな。そもそも、P0を使わない方が良いのかしら。
お騒がせしました。下記のレジスタ誤りでした。
誤「PMC = 0xfc; // p00 and p01 to digital I/O 」正「PMC0 = 0xfc; // p00 and p01 to digital I/O 」
void usb_cpu_set_pin_function(void) { ADPC = 0x01; // all digital port PIOR = 0x00; // /* Pin | Function | I/O | Connection */ /*****************************************/ /* P00 | P00 | I | SW02 */ /* P01 | P01 | I | SW01 */ IICCTL00.7 = 0; //stop SDA IICCTL01.7 = 0; //stop SDA TOE0 = 0; TO0 = 0; CKS0.7 = 0; SOE0 = 0x01; SO0 = 0x02; PMC0 = 0xfc; // p00 and p01 to digital I/O PM0 = 0xff; // p01 and p01 t0 input PU0 = 0x03; /* P20 | P20 | I | SW04 */ /* P21 | P21 | I | SW07 */ /* P22 | P22 | I | SW0a */ PM2 = 0xff; /* P30 | P30 | I | SW0c */ /* P31 | P31 | I | SW06 */ PM3 = 0xff; PU3 = 0x03; /* P60 | P60 | I | SW0b */ /* P61 | P61 | I | SW08 */ /* P62 | P62 | I | SW03 */ PM6 = 0xff; /* P70 | P70 | I | SW09 */ PM7 = 0xff; PU7 = 0x01; /* P120| P120 | I | SW05 */ PMC12 = 0xfe; PM12 = 0xff; PU12 = 0x01; } /* eof usb_cpu_set_pin_function() */
この訂正で、サンプルのキーボード機能の動作を確認できました(下画像)。
この英数キーをファンクションキーに変えれば、今回のゲームコントローラとしては、目的達成。あとは、シリアルポート0を使えるようにすること。
チョコです。
無事動作おめでとうございます。
RL78では、アナログ入力兼用ポートは初期状態では
アナログ入力になっています。これをデジタル入出力に
変更すれば、PMレジスタの初期値は1(入力ポート)なので、
そのまま使えるはずです。(タイマやシリアル関係の出力は
無関係です。そもそも、これらのレジスタはPER0レジスタの
対応するビットが1になっていないと設定はできません。)