工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

タグ:USB

要旨

  PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は前回うまく動作させることができなかったUSBマイクロフォンのサンプルプログラム(USB Device - Audio - Microphone)について動作させる方法がわかったのでその結果を記した。


背景と目的

  前回の記事で『PICで動かすUSB』で取り上げられているUSBマイクのサンプルプログラム(USB Device - Audio - Microphone)を動かしてみたが、うまく動作させることができなかった。しかし、その後いくつかの検証を得て動かすことができた。そこで、その検証により得た知見をまとめる。


活動の詳細
1.動作しなかった原因

 動作しなかった原因はリンカスクリプトをプロジェクトに追加していなかったことである。リンカスクリプトは、プログラムのメモリ配置を決めるための記述であり目的の処理内容を特定位置に配置するために重要である。図1.1は今回のサンプルで追加しない場合と追加した場合の比較結果でありメモリ配置が異なっていることがわかる。ちなみに、これはビルド時に生成される.mapファイルの中身を比較したものである。
ただし、今回の場合プログラムの配置に違いは無く、データの配置の違いのみであった。ではなぜデータの配置の違いで正しく動作しなくなるのかというと、PIC18F14K50では、データRAMの一部領域はUSB機能が使用するデータRAM領域と共用のため、その領域に目的データを配置し、目的データ以外は避けるようにリンカスクリプトで指示する必要があるからである。当デバイスのデータシート4ページを見ると、図1.2に共用している旨の記載があり、図1.3ではDPRAMという記述で共用領域が示されている。さらに、リンカスクリプトrm18f14k50.lkrには、

DATABANK NAME=usb2 START=0x200 END=0x2FF PROTECTED

という記述があり、共用領域である0x200~0x2FFまでをusb2という名前で定義してある。これにより、USB機能で使用するデータ以外は配置されないようになっているのである。この状態でビルドすれば、USB機能は正しく動作することになる。図1.1を見返してみると、リンカスクリプトを追加した場合ではオーディオデータのPCとの入出力用バッファReceivedDataBufferおよびToSendDataBufferが0x200~0x2FFに配置されていることがわかる。おそらく追加しないときにはUSB関連のモジュールがこれらのバッファにアクセスできずデータを送受信できなかったのではないかと思われる。


map比較
図1.1 .mapファイルの比較(左がリンカスクリプトを追加しない場合、右が追加した場合。データの配置が異なっている。)

USBと共用
図1.2 USB機能で使用するRAM領域に関する記述(PIC18F14K50のデータシート4ページより抜粋)

DPRAM
図1.3 USB機能で使用するRAM領域に関する記述(PIC18F14K50のデータシート35ページより抜粋)

2.新たに遭遇した問題

 実は、今回1の問題解決を探っている間にビルドがうまくいかない問題に直面したのだが、その原因はコンパイラの使用期限切れで最適化機能が働かずプログラムサイズが大きくなり配置しきれなくなったことであった。そこで、ブートローダを使用する前提で書かれているリンカスクリプトの記述を一部変更しプログラムを配置しきれるようにした。具体的には、『PICで動かすUSB』の103ページ相当の記述である。これによりうまくビルドできた。ちなみに、当書籍はブートローダを使わないならば無駄なのでプログラムを詰めて配置するという理由で変更していて、最適化が働かなくなった場合については触れていない。つまり、書籍どおりの変更をはじめから適用すればビルドはできるが最適化が働かなくなっていることに気づけなかっただろう。


3.コンパイラ使用期限が切れるとブートローダに対応しづらくなる

 ところで、最適化が働かなくなるとどの程度プログラムサイズが大きくなるのかという点が知りたかったので調べようとしたが、残念ながら最適化が働いている状態での実験がすでにできなくなってしまったため調べられなかった。しかし、働かなくなった後のプログラムサイズは.mapファイルのprogram memory usageという部分のパーセンテージで知ることができる。今回のUSBマイクのサンプルでは4kbyte中の77%なので3kbyte強である。
これは実は、ブートローダを使用できないということでもある。なぜなら、ブートローダを使用するには少なくとも1kbyteの空きが必要だからである。つまり、最適化が働かないせいでプログラムサイズが大きくメモリの空き領域が1kbyte以下になってしまう場合には、ブートローダを使用するプログラムは作れないということである。残念かつ当然であるが、無料で使っている以上仕方ないことである。


まとめと今後の課題

  USBによる仮想マイクのサンプルプログラムを正しく動作させることができた。そして、その原因についても検証し明らかにすることができた。しかし、まだまだ動かしていないサンプルプログラムがあるので今後はそちらにもチャレンジしたい。

要旨

 PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は第5回として実験用基板にUSBマイクロフォンのサンプルプログラムを書き込み動作テストを行ったが、うまく動かすことができなかった。


背景と目的

 本ブログのPICマイコン関連実験でよく参考書として使用している『PICで動かすUSB』の中には、USBマイクのサンプルがある。これは、仮想マイクを構築し、USBでPCと接続してマイクデバイスとして動作させることができるものであり、今後のUSBデバイス製作において有用と考えられるため、ぜひテクニックとして習得しておきたい。そこで、今回はサンプルを用いてUSBによる仮想マイクを構築し通信させてみる。


活動の詳細
1.サンプルプログラムの概要

 サンプルプログラムは、Application Librariesに用意されており、USB Device - Audio - Microphoneというフォルダの中のUSB Device - Audio - Microphone Demo - C18 - Low Pin Count USB Development Kitを用いる。このサンプルであれば手持ちのPIC18F14K50が載ったテキスト付属の評価ボードがそのまま使用できる。このサンプルの動作は、PCへ接続するとPICとシリアルで接続されたデバイスをPCが仮想マイクと認識し、評価ボードのボタンを押すと仮想音声データ(マイコンのROMに記憶させておいたデータ)をマイクの音声としてPCに送り、PCで音声が再生される。


仮想マイク
図1 仮想マイクの動作イメージ

2.動作確認

 通常通り、プログラムを書き込み動作させたところ、PCはデバイスを認識しデバイスドライバをインストールし始めた。ここまでは順調である。そして使用準備が整った旨のメッセージが出たので、早速ボタンを押してみたが、まったく反応がない。改めて、参考書を確認してみると、コントロールパネルのサウンドから規定の録音デバイスに指定し、このデバイスを聴くにチェックを入れる必要があることがわかった。また、Windows付属のサウンドレコーダーの録音を開始してから再度ボタンを押してみたがやはり反応がない。その後も、プログラム書き込みをやりなおしたり、デバイスの接続をやり直してみたりいろいろ試してみたが、だめだった。


3.情報収集

 2.のとおり、現状ではサンプルプログラムを動かすことができていないので、Webでこのサンプルに関する情報が無いか調べてみた。すると、一部で正しく動作しないという情報を得た。その情報が掲載されていたWebサイトによれば、PIC18F2550を用いたサンプルを動かし無事に動作した旨が記載されていたが、どうやらPIC18F14K50では動作させることができなかった模様である。また、ほかにもYouTubeでPIC18F2550による動作例が見つかったが、PIC18F14K50はなかった。したがって、現状ではPIC18F14K50で正しく動作させている例が見つかっていない。さらに、参考書発行元であるラトルズのWebサイト等に情報が無いか調べてみたが、こちらでも何も見つけることができなかった。


4.結果まとめ

 結局、PIC18F14K50を用いたサンプルがどうすれば動くかについてはわからなかったが、参考書の著者は動かすことができているのだから、おそらく参考書に書かれていないような注意点や条件を見落としているせいだろう。しかし、それを見つけるにはそれなりに時間もかかるだろうし、ここまでもそれなりに時間を費やしたので(数時間)、あまり深追いせず本件はここまでとする。
もし、この記事を読んだ方で正常動作させられた等の情報があれば、下記コメント欄にでも情報をいただけるとありがたいのだが・・・。


まとめと今後の課題

 USBによる仮想マイクのサンプルプログラムを書き込み動作確認をしたが、正しく動作させることができなかった。今後は、正常にどうさせるための情報がないかWeb等で適宜情報収集したい。

このページのトップヘ