KSR CDI 第2幕 解決しました!

    どうもこんばんは。


    ハマっていたCDIのプログラムですが、とりあえず解決しました!!

    Microchipのサンプルプログラムのソースコードを変更してうまくUSBで通信できるようになりました。
    自分の理解の範囲内なので100%正しいか自信がないところもありますが、備忘録ということで状況を整理しておきます。


    今回、超長いです。
    あと画像なしのテキストオンリー。

    どのファイルのどの部分のコードを直せばよいのか?結果だけ知りたい人はLet’s Scroll!!


    いつもほぼ役に立たないしょうもない内容ばかりですが、今回ばかりは同じ現象でハマっている人にとってそこそこ有益な情報と思われます。
    ただ、需要がどの程度あるものか?たぶん日本国内でいいところ2~3人くらいだと思いますが...
    バイクブログとは思えないなようであることは自覚をしておりますのでおつきあい下さいとは言いません。
    興味の無い方はスルーでお願いします。


    1.問題の現象
    USBケーブルでPCとPICマイコンを接続してもPC側がUSBデバイスとして認識しない

    2.確認した内容
    2.1 USB通信の手順
    1) PIC24FはUSB2.0に準拠しており、今回、フルスピード(12Mbps)のHIDデバイスとしてプログラムを作成
    2) フルスピードの場合、ケーブル接続時PIC側が自動的にD+ラインをHi(=3.3V)に設定、D-ラインはLow(=0V)のまま
    3) この後、PC側が一定時間D+/D-ラインをLowとし、これによりPIC側が内部リセット
    4) PC側からコントロール転送という転送方式で通信を開始
    5) GetDevicerequestのコマンドが発行されて、PIC側が自分のプログラム内のDescriptorという情報を返信
    6) Descriptorの情報のやり取りの後でアドレス指定、”Configured State"の状態となり、最終的に通信が確立

    2.2 不具合の状況
    まず、USBケーブルを接続してもD+ラインがHiになりません。
    仕方がないのでD+ライン~Vcc(3.3V)間に1.5KΩのプルアップ抵抗を接続すると、PCからリセットがかかっているのが確認できました。(リセットはオシロスコープの波形で確認)

    U1OTGCONというレジスタにD+ラインの内臓プルアップ抵抗を有効にするビットがあるのですが、こいつを設定してもプルアップされたりされなかったりで動作が安定しません。

    2.3 ソースコードの調査
    IOポートにデバック用のLEDをつないでソースコードを追いかけていくと…

    ”usb_device.c”というソースファイルの783行目あたりの↓の処理に入らないことが判明。
    PCとの通信を開始しているにも関わらず、”USBTransactionCompleteIF”が真(=1)になりません。


      if(USBTransactionCompleteIE)
      {
        for(i = 0; i < 4u; i++) //Drain or deplete the USAT FIFO entries. If the USB FIFO ever gets full, USB bandwidth
        { //utilization can be compromised, and the device won't be able to receive SETUP packets.
          if(USBTransactionCompleteIF)
          {
          //Save and extract USTAT register info. Will use this info later.
            USTATcopy.Val = U1STAT;
            endpoint_number = USBHALGetLastEndpoint(USTATcopy);

              ・・・

          }//end if(USBTransactionCompleteIF)
          else
          {
            break; //USTAT FIFO must be empty.
          }
        }//end for()
      }//end if(USBTransactionCompleteIE)



    正常動作時、この一連の処理は↓の感じで流れます。

    PCからコマンド受信

    USBモジュールがU1STATレジスタを更新、同時にU1IRレジスタのBit3のTRNIFを1にセット

    TRNIF=1→USBTransactionCompleteIF=1なので、U1STATの情報を読み出す

    U1STATの情報によってエンドポイントとか入出力の方向が決まるのですが、そのU1STATの情報がセットされないorセット完了を知らせるTRNIFが1にならないことが問題のようです。


    3.そして解決へ
    さて、通信が確立されない状況とプログラムの挙動は把握できました。
    ここまではすぐにたどり着けたのですが、では原因は何か?というところが皆目見当がつきません。

    かなりハードウエアに近いレベルの話のような気がして配線を整理してUSBの信号ラインを最短でPICにつないだり、電源やGND周りの接続を見直したりとかいろいろトライしたのですが、一向に改善しません。
    ネット上にも特に参考になるような情報は見当たらないし...


    気になることはGPSデータロガーのプログラムではUSBデバイスとして認識しているということ。
    よって、Configuration Bitの設定を何度も見直したり、電源、GND周りの電圧や配線を見直したりしていました。
    時間だけがどんどん過ぎていきます。


    最後にGPSデータロガーのプログラムとの違いを一つづつ潰していったところ、ようやく原因にたどり着きました。
    原因となっていたコードはこれ↓。main.cというソースファイルの中にこんな処理があります。


    void SYSTEM_Initialize( SYSTEM_STATE state )

    {
        switch(state)
        {

                case SYSTEM_STATE_USB_START:
                    {
                     unsigned int pll_startup_counter = 600;
                        CLKDIVbits.PLLEN = 1;
                        while(pll_startup_counter--);
            }
                     ・・・

         
    PLLENを設定してwhile文で600回カウントする分待ち時間をとれ、というプログラムです。
    またその説明として↓のコメントが書いてあります。

       //On the PIC24FJ64GB004 Family of USB microcontrollers, the PLL will not power up and be enabled
                //by default, even if a PLL enabled oscillator configuration is selected (such as HS+PLL).
                //This allows the device to power up at a lower initial operating frequency, which can be
                //advantageous when powered from a source which is not gauranteed to be adequate for 32MHz
                //operation.  On these devices, user firmware needs to manually set the CLKDIV<PLLEN> bit to
                //power up the PLL.


    最初はふーん、って感じでスルーをしていたんですが、GPSデータロガーのプログラムではこんな処理は入れていないことに気が付きました。

    そこで、{}の中を全部コメントアウトしてGPSデータロガーのプログラムと同じように CLKDIV = 0x0020; でPLLENを設定するとビンゴ!
    USBの通信ができるようになりました。
    もうほんとにサクッと動いて拍子抜けするほどでした。
    ま、ソフといトウエアなんてそんなものなんでしょうけど。



    結局、Microchipのプログラムのままだと、CLKDIVのレジスタのうち、PLLENだけを設定していたことが原因だったようです。
    というか、ソフトウエアのプロフェッショナルからみたらそんなの当たり前だろって事かもしれませんが...

    修正方法は

    CLKDIVbits.PLLEN = 1; → CLKDIV=0x0020; に変更する
    CLKDIVbits.PLLEN = 1;を実行する前のどこかでCLKDIV=0x0000;のようにCLKDIVのPLLEN以外のbitを設定しておく

    のどちらかでよいみたいですね。
    while文のウエイトはあってもなくても正常に通信できるみたいですが、とりあえず残してあります。


    毎度のことですが、今回も長かった...
    これも毎度のことですが、結論はしょうもない話ということでした。


    ああ、また需要の無い記事を書いてしまいました...
    オチも何もないですが、とりあえず目出度し目出度しということで。


    いつもの高速移動とこのブログのプライバシーポリシー


    別宅に戻ってくつろいでいます。
    夕方、いつも通り湾岸線に入ったらベイブリッジの手前から工事の車線規制が始まったところに遭遇。
    ちょうど渋滞が始まったところでした。
    つばさ橋を渡りきるまで1車線になっていたので、結構混んだんじゃないかな?

    それ以外はいつも通りで、ほぼ予想時刻に別宅着。

    そしてヘルメットはこんな感じ。
    今年もこんな季節になりました。

    IMG_20180520_210045.jpg


    話は変わってGoogleアドセンスってやつを始めてみるつもりで、今Googleに申請しています。
    一応、アドセンス始めるときはこのブログで宣言しようかなと思っています。
    訪問してくれる人からするといつの間にかお金絡みのブログになっているっていうのも気分悪いかもしれないし。
    収入と言えるほどの金額になるとも思えませんが、やるなら正々堂々とね(笑)
    記事を書く励みにもなるんじゃないかと思っています。


    アドセンスについてですが、以前に比べていろいろ条件が付いたり、審査自体も厳しくなっていてハードルが上がっているみたいですね。

    例えば、サイト上のどこかに管理者への連絡手段がないとダメとか、サイトは独自ドメインじゃないとダメとか。
    さらにはプライバシーポリシーの表示というのもあるようです。

    最初の問題はブログにメールフォームを追加してクリアしているはず。
    独自ドメインはとりあえずFC2ブログの有料プランに申し込むことで対応。
    ブックマークされている方は変更をお願いします。そのままでも大丈夫みたいですけど。
    プライバシーポリシーというのは個人情報の取り扱いについての方針。
    アドセンスの審査の時点できちんと記載されている必要があるということのようです。

    それからGoogle Analyticsも始めましたので合わせて記載しておきます。
    最後に免責事項も追加しておきます。


    とりあえずこんな感じということで。



    ---------------------------------------------------------------------------
    【当サイトのプライバシーポリシー】


    ■当サイトに掲載されている広告について

    当サイトでは、第三者配信の広告サービス(Googleアドセンス)を利用しています。
    このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報 『Cookie』(氏名、住所、メール アドレス、電話番号は含まれません) を使用することがあります。
    またGoogleアドセンスに関して、このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、こちらをクリックしてください。


    ■当サイトが使用しているアクセス解析ツールについて

    当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。
    このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。
    このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
    この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。
    この規約に関して、詳しくはこちら、またはこちらをクリックしてください。


    ■免責事項

    当サイトで掲載している画像の著作権・肖像権等は各権利所有者に帰属します。権利を侵害する目的ではありません。
    記事の内容や掲載画像等に問題がありましたら、各権利所有者様本人が直接メールでご連絡下さい。
    確認後、対応させて頂きます。
    当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。
    当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めていますが、誤情報が入り込んだり、情報が古くなっていることもございます。
    当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

    ---------------------------------------------------------------------------




    KSR用CDI 第2幕 そして途方に暮れる

    バイクネタじゃなくてすみません。
    案の定、KSRのCDIプログラムでハマってきます。


    前回書いた通り、USBで接続できるようにして、点火時期の設定をPC経由でできるようにすることが目標です。
    PC側のプログラムをどうするかというのが大きな問題なんですが、まずはPIC側から考えてます。

    今回やりたいこと&やることは以下。
    1.PICマイコンとPCをUSBでつなぎたい
    2.PICマイコンは使い慣れたPIC24FJ64GB002
    3.PIC24FにHIDデバイスとして作成したプログラムを書き込んで、HIDデバイスとして通信する
    4.PIC側のプログラムはMicrochipのUSBフレームワークを使う
     4.1 フレームワークの「Low Pin count USB Development Kit」というデモボード用のプログラムを参考にして改造
     4.2 「Low Pin...」はPIC18F14K50が実装されているようなので、プログラムはPIC24FJ64GB002用に変更する
     4.3 ブレッドボード上に組んだ回路(PICマイコン)にプログラムを書き込んでサクッと完成

    具体的な作業は4のところになります。
    早速、必要なファイルをピックアップしてプロジェクトに登録、エラーがなくなるまでデバックして、ブレッドボード上に組んだデバイスに書き込みました。
    ここまではあっさりたどり着いたんですが、やっぱりそんなに簡単なわけないですわ。。。
    文章にすると3行なんですけどねぇ。。。


    USBケーブルでPCと接続してもUSBデバイスとして認識しません。
    ん~ 困った。
    すでに1カ月ほど停滞してます。



    Microchipのサイトからダウンロードしたフレームワークのファイルは↓のディレクトリに格納しています。
     C:\microchip\mla\v2017_03_06\apps\usb\device\hid_custom\firmware

    ここからプロジェクトに登録したファイルは↓の感じ。
     ・USB関連の主要なファイルは…\firmwareの下のdemo_srcのディレクトリからコピー
     ・PIC24FJ64GB004ファミリ用のフォルダ(…firmware\exp16_pic24fj64gb004_pim.x)内のファイルをコピー
     ・io_mapping.hをPIC24FJ64GB002に合わせて修正。
       
    CDIプロジェクトファイル

    コンパイルは通っているので、ファイルが足らないなんてことはないんですけどね。。。

    USBの通信はおよそ以下の手順で開始されるらしいです。詳しく知りたい人はググって下さい。

    ケーブル接続時に、PC(=ホスト)側がD+、D-ラインを一定時間Lowレベルとすることでリセットをかける。
    リセット後、ホストからGetdevicerequestなるコマンドが送信され、このコマンドを受信したことをデバイス側であるPICが返信。
    その後、PICのプログラム中に記述してある各種Discriptorの情報についてPC側と通信。
    これによりPC側がUSBデバイスの種類 (HIDとかMSDとか)を認識し、所望の条件での通信が可能な状態(=Configured State)になる。

    なんですが、最初のGetdevicerequestに対し、PIC側が応答していない模様。
    D+,D-ラインの波形を見ているとハードウエアのリセットはかかっている。

    こんな面倒なことを気にしなくてよいようにフレームワークとしてプログラムが提供されているはずなんですけどねぇ
    Microchipのプログラムがおかしいとも思えないので、何かが間違っているんでしょうね。
    仕事でやってるならすぐにメーカーさんにサポートをお願いするところですが、まあ、なんといってもプログラムも開発環境も全部タダな訳だし、個人がサポートしてくれと言っても相手にしてくれないだろうしね。

    とにかくこの手の話は自力で何とかするしかないんですよね。。。
    (*´Д`)。。。困った。。。


    とりあえずこんな感じということで。



    竜神峡~男体山周辺をツーリング

    どうもこんばんは。

    今週末は自宅にはもどらず、別宅で過ごしています。
    天気も良かったので、かるく走ってきました。

    朝、とりあえず竜神大吊橋目指して出発。
    1時間くらいなんですが、ここもまたこれまで一度も行ったことがありませんでした。
    GoogleのCMで一気に知名度が上がりましたよね。


    バンジージャンプが有料なのは知っていましが、吊り橋自体も310円の通行料金が必要でした。
    ちなみにバンジーは初回16000円。もちろんパスです。
    バンジーは10人くらいがスタンバっていました。
    何人か飛ぶのを見ましたが、お金もらっても遠慮しておきたい感じですね。

    IMG_20180512_084941.jpg

    IMG_20180512_090532.jpg

    IMG_20180512_091338.jpg



    竜神大吊橋のあとは「Cafe 遊森歩」(ユーモア)というカフェに行ってみました。
    30分もかからずに到着です。

    今使っている2017年版のツーリングマップルでは「遊森歩」という漢字のみの記載になっています。
    読み方がさっぱりわからなかったんですが、ちょっと前にネットで検索して知ってから気になってたんです。
    到着するとオーナーさんが外にいて、招き入れてくれました。
    立派なログハウスで、オーナーさんがサラリーマン時代から10年かけてセルフビルドしたとのこと。

    IMG_20180512_101253.jpg

    IMG_20180512_101305.jpg

    お店の中は結構ひろくて、ゆったりと座れそうな感じでした。
    今回はテラス席をチョイス。
    チーズケーキとコーヒーを頂きました。
    食レポしようと思いましたが、「おいしかった」以外の言葉が思い浮かびませんので、これで勘弁してください。
    とにかく雰囲気もいいし、リピートしたくなるお店であることは間違いないです。

    IMG_20180512_101751.jpg

    IMG_20180512_102400.jpg

    テラス席からの眺めです。
    写真は逆光で白飛びしちゃってますが、正面が男体山ということでした。
    良い眺めで気持ちいい場所ですし、紅葉もよさそうです。
    IMG_20180512_101806.jpg


    コーヒーのあとでオーナーさんのHB-3を見せてもらいました。
    自分も名前くらいしか知りませんでしたが、日本に輸入されたのは15台ほどらしく貴重なバイクのようですね。

    ひとしきりおしゃべりしてから、男体山に向かって出撃!
    この後は地図も見ずに山奥の舗装林道をひたすら走り続けてそこそこ満足。
    180㎞程走って、別宅着は14:00過ぎでした。

    休みでこちらにいるときはちょくちょく走っていますが、まだまだ知らない道だらけです。
    当分楽しめそうです。


    とりあえずこんな感じということで。


    T30 EVOのインプレというか感想文的なもの

    連休も終わり、今日からまたサラリーマンに復帰です。


    新しいタイヤにしてからなかなか距離を走れていませんでしたが、この前の福島ツーリングでようやく峠道含めてたくさん走ることができました。
    交換から1300kmほど走ったので、これまでの印象を書き残しておきます。
    交換直後に新型のT31が発売になっていますので、今更って感じなんですけどね。


    濡れた路面はほとんど走っていないのでドライ路面限定の話です。
    あとは絶対評価ではなく、前に使っていたピレリのDIABLO ROSSO CORSAとの相対比較の形になります。


    この先T30 EVOを否定しているような内容にも取れるかもですが、まあ、所詮個人の日記レベルなので気にしないでくださいね。
    T30EVOがダメというわけではないです。
    あくまで自分のV11との組合せで素人が感じたまま&気が付いたことだけを書いていますので、その点はご了承くださいませ。


    1.結論
    もう、DIABLO ROSSO CORSAの勝ち(現時点では)。
    誰が何と言っても勝ちです(現時点では)。


    2.感じたこととか理由とか
    そもそもカテゴリの違うタイヤなので、比較すること自体ナンセンスと言われるかもしれませんが、それは承知の上で。
    現時点では、と但し書きを付けたのは寿命はわからないからです。
    たぶんT30 EVOが勝っているのは新品時のミゾの深さくらいじゃないかと思います。マジで。
    勝ち負けというのは言い過ぎですね。好みかそうではないかと方が適切かな。

    DIABLO ROSSO CORSAはさすがに名作と言われたタイヤだけのことはありますね。
    あとは濡れた路面と寒い時期の印象を含んでいないのでT30にはいささか厳しい比較なんですけどね。


    ・街乗り
    T30の方がタイヤが固い感じがあります。路面の細かい凹凸でコツコツとショックがくる感じ。
    倒し込みでステアリングが切れてくる感じはT30の方が穏やかでのんびり走れる感じですね。
    車体の傾きに比例して素直に舵角が付くのがDIABLO ROSSO CORSAですね。

    ・峠道 ブレーキ~倒しこみ
    ブレーキでは両者の差はあまり感じませんでした。
    Fタイヤのグリップ限界までブレーキかけてタイヤをつぶして云々などという世界とは無縁なので(笑)
    舵角の付き方は街乗りの時と同じ印象ですね。T30はよくも悪くも直立付近でおっとりしているかな。

    ・峠道 コーナリング中のグリップ感
    これははっきりとDIABLO ROSSO CORSAが上だと思います。
    もちろん、タイヤ以前に運転手が限界までグリップを使うような走り方はできませんので、普通に峠道を走るレベルでの話ですが、DIABLO ROSSO CORSAは絶大な安心感があります。
    T30のグリップ感がないわけではないんですけどね。
    フロントタイヤの方が差が大きい気がします。

    ・峠道 立ち上がり加速
    常識的な開け方をする分にはどちらのタイヤもV11のパワーで滑り出すなんてことはない気がします。
    カチッとしているのはT30、グリグリとタイヤをこすりつけながら加速している感があるのはDIABLO ROSSO CORSA。
    これは優劣とかは感じてません。

    ・高速道路の直進安定性
    これはDIABLO ROSSO CORSAの勝ち。
    明らかに差があります。
    ハンドルが左右に切れることでバランスを取りながら直進しているわけですが、その左右に切れる量=フロントタイヤが蛇行する幅がT30の方が大きく感じます。
    T30の走行軌跡が筆ペンで書くくらいの線幅とするとDIABLO ROSSO CORSAは0.5㎜とか0.7㎜とかの水性ボールペンくらいの線幅のイメージですね。
    ちょっといけないスピードを出したとき、T30の方がすわりが悪いというか、ぶっちゃけ安心してスピード出せなさそうな感じがします。
    (もちろん実用上は問題ないですよ)


    3.まとめ
    T30 EVOはそもそもツーリングタイヤとして直立付近の応答?挙動?を穏やかにしてゆったりとした味付けにしているのかもしれません。
    これが今のV11の設定とか運転手の体重とか乗り方との組合せでは曖昧な印象につながっている気がします。
    特に今は自宅~別宅間の高速移動が中心なので余計に気になるんですね

    寿命とか低温時の性能とかトータルバランスで勝負するタイヤなので、今回の条件では比較すること自体がかわいそうな面もありますけどね。
    これは前述のとおりで、もう少し色々な条件で走って、もし気になることがあればまた書いてみたいと思います。

    今回の感想としては、やっぱりタイヤから始まってサスペンションもステアリングもスッと動いてスッと収束する方がスッキリした乗り味になる気がします。
    結局、年間5000㎞弱の走行距離で1.5年か2年に一回のタイヤ交換であればタイヤ自体のコストはあまり気にせず、ハイグリップタイヤでもいいのかもね。
    実際、DIABLO ROSSO CORSAでも雨の峠道とか豪雨の高速道路とか特に不安なく走れていた訳だし。
    バイカーズステーションでは公道ならスポーツツーリングタイヤがいいと主張してますが、ウエットも低温時も結局無理をしなければ滑ることもない気がするのですが、どうなんでしょうかね?


    リア
    IMG_20180507_141019.jpg

    フロント
    IMG_20180507_141050.jpg