● 実験テーマ57
「dsPIC33F_WAVプレーヤの、製作実験記」
(後閑哲也 著「PICではじめるアナログ回路」の製作記事による。思ったより苦戦しました。その顛末記です。)
■ 2014.8.25
・今迄、MP3デコーダIC:VS1011eまたは、VS1053bを使っての、WAV/MP3/MIDI等の音楽プレーヤの
自作はしてきたが、それらを使わないで、PIC単体で音楽プレーヤを作ったことはなかった。
まあ、MP3を、PIC単体でやらせるのは、負荷が重く難易度も高いと思うのだが、WAV再生だけなら
なんとかなりそうである。
このHPには公開してないが、PICのPWM機能を使っての、SDカードプレーヤもどきの実験は、何年も
前にしたことがある。
ただ、CDクオリティの、WAVファイルを再生することは、とても出来ず、低レートのWAVファイルしか
再生できなかったことを記憶している。
今回、後閑氏のHPと、最近発行された著書「PICではじめるアナログ回路」に、
特定のdsPIC33ファミリ(dsPIC33FJ64GP802)に内蔵されている、「Audio
DAC」を使って
SDカードに記録した、WAVファイルを高音質で再生する記事が載っていたので、この記事を参考に
作ってみることにしました。
この、Audio DACは、16bit分解能、44.1ksps、ステレオ(ビットレート:1411Kbps)という
CDクオリティのデータを、256倍のオーバーサンプリングのΔΣD/Aで実行する。
なので、CDドライブで再生した時より、高音質の再生が期待できそうである。
・後閑氏の本には、CD-ROMが付属されてないが、「技術評価社」のサポートページにて、
「PIC_Analog.zip」を、ダウンロードすれば、各章の、プロジェクト一式、回路図、パターン図
を見ることができる。
そこで、早速、ダウンロードして、ZIPファイルを展開し、第10章の、「WAVPlayer」フォルダの中の
メインソースを、ノートパッドで見てみたが、何故か、改行が変だし、漢字コメントが文字化けしている。
・改行が変なのは、現役(正社員時代)の頃から、使っていた、ノートパッド以外の、エディタ:「EmEditor」
で、このファイルを開くと、まず次のような、情報ダイアログが現れる。
・どうも、このソースファイルには、CR+LFではない改行コードが含まれているようです。
このまま、OKボタンを押してみました。
すると、改行は正常表示になりました。
ただ、漢字コメントは、化けたままです。
■ 2014.8.26
・いろいろ調査した結果、文字化けが解決した。
結局、エンコード方法を、Wordの表現で、日本語(JIS)にして開かないと駄目なことが判った。
日本語(JIS 0208-1990 および JIS 0212-1990)では駄目だった。
以下に、調査した時のメモをアップした。
■ 2014.8.27〜 2014.8/31
・ダウンロードしたZIPファイルの中には、HEXファイルも含まれていたが、自分でもソースを
いじりたいので、プロジェクトを組まないといけないが、その前に、水魚堂で自分用の
回路図作成と、パーツを確定して部品手配を済ませた。
ハード的にオリジナルと違うところは、以下の通りです。
@ 簡単なパワーアンプ(NJM2073D使用)と、SP出力ジャック+入力音量VRを追加。
このICは、IC固有のヒスノイズが多いが、超小型のSPでのモニターとしての用途に
限定して使うので特に問題ない。
A 小型の、I2C液晶は、そのままでは、メイン基板に取り付けにくいし、背が低く
その下に、PIC等の部品を置けなくなるので、サブ基板に取り付け、メイン基板とは
スタックで、コネクタ接続することにした。
B SW類には、背の高いものを選び、表面パネルから操作し易くしました。
■ 2014.9.1
・通常どおり、プロジェクトウイザードで、ソースファイル(*.C)と、ヘッダファイル(*.H)及び、
リンカスクリプトファイル(dsPIC33FJ64GP802.gld)と、
ライブラリファイル(dsPIC33FJ64GP802-coff.a)を登録して、ビルドしたが、エラーが発生。
FSIO.cのビルドはOKで、次のlcd_i2c_lib.cのビルドでエラーが発生し、BUILD
FAILEDになってしまう。
後で、技術評論社に、これに関連した事で質問した時に返ってきた回答で解ったことなのですが、
このPICの場合は、(或いは、MPLAB IDEのバージョンの違いでか?)
CファイルとHファイルの登録だけすれば、後は何も登録する必要はないようで、
リンカやライブラリは自動で選択されるようです。
無論そのようにしてプロジェクトを組んでもエラーは発生しました。
また、これも後で技術評論社の回答で、解ったことですが、
後閑氏の開発環境は、最新バージョンの、「MPLAB X IDE」を使っているようです。
後閑氏のプロジェクトには、「WAVPlayer.X」というフォルダがあります。
WAVPlayer.Xフォルダは完成済みのプロジェクトで、
MPLAB X IDEから[File]→[Open Project]でこのフォルダを指定すれば
完成済のプロジェクトが開くようです。
尚、私のこの、技術評論社への質問(9月2日付)が切っ掛けとなり、現在は、
技術評論社のサポートページに、
「Firmwareフォルダ内のPICマイコン用ファームウェアの使い方」と題して、このような説明が
追加されてます。(技術評論社経由で、後閑氏からの回答があったようです。)
一方、私の開発環境は、MPLAB IDE V8.60です。
たぶんインストールしたのは、WIN7にしてからなので、3年位前になると思います。
この、開発環境の違いで出ているエラーもあるはずである。
ソースを見ると一見、見慣れない記述のヘッダーファイル:
xc.hが定義されていた。
これは何なのと思いながらも、たぶんデバイス(MPU)のヘッダファイルで、通常は、
デバイス名.hなはずと思い、 #include "p33FJ64GP802.h"に置換えてみた。
これでビルドしたら、
FSIO.c, lcd_i2c_lib.c, SD_SPI.cまでOKになったが、
メインソース:WAVPlayer.cで、NGとなった。
エラーメッセージは以下の通り。
「case label not witin a awitch statement」(sw文のcaseラベルが、switch文の中にない)
ソースを見ても、そのようなところは、見当たらなかった。
■ 2014.9.2
・昨日の、caseラベルのエラーだが、case1:で起こっていることは判ったのだが、どうも原因が
わからない。
何気なく、case1中のステートメントで、改行してスペースを一行空けないと見にくいところが
あったので、そのように修正してから、ビルドしたらこのエラーを含め全て無くなった。
コンパイラ C30のバグか?
原因は解らないが、ソースも見易くなるので、このまま先に進めることにした。
詳細は以下を参照してください。
■ 2014.9.3〜 2014.9.5
・そうこうしている内に、部品が全て届いた。
今回は、やや特殊と思える部品として、44.1kHz(22.7uS)のDAC割込み用の、
ベースになる水晶:11.9628MHz(HC49USタイプ)があったが、これは若松通商にあった。
・部品実装の前に、予め、構想を練っていた通り、前後アクリル板の加工を行った。
・次にユニバーサル基板の加工と、部品実装を開始した。
9月5日には、主要部品の実装と、アクリル板との仮組み確認まで終了した。
■ 2014.9.6〜 2014.9.8
・その他の部品配置を決めながら、ワイヤリングを行った。
■ 2014.9.9
・全ての実装が完了した。
今回の基板サイズは、101 x 106mm となりました。
・まずは簡単に、電源ラインのショートチェックと、主要部品への供給電源電圧を確認した。
実測で、3.30Vジャストであった。
PIC認識も、HEX書込みも問題なく出来た。
どこかのHPで、このdsPIC33Fの書込み時、Vddの問題がある旨の記事を見たことがあるので
心配だったが、それはなかった。(PICkit2使用)
・ところが、うまく動かない?
自分でビルドしたHEXがいけないのかと思い、後閑氏が用意してくれているHEXをそのまま書込ん
でも同じである。
症状は、通常の連続再生とSKIP SW機能は良さそうなのだが、
MODE SWを押しても、
テストトーンが鳴らず、その後ハングアップのようになり、もう一度MODE
SWを押しても、再生
に戻らないようだ。
ただ、DAC出力ジャックにヘッドフォンを接続して再生音を聞いてみると、ノイズは極小で、
ここは、上手く行っているようである。
■ 2014.9.10
・昨日の問題点等を整理してみた。
@ 開発環境(MPLAB)の違いから、Configの書式が異なることが判明。
・MPLAB IDE→ _***(XXX_YYY & ・・・・)
・MPLAB X IDE→ #program・・・
また、全ての、Configパラメータを設定しないと、HEX書込み時、Warningが発生することが
判った。
今迄は、これを無視しても問題なかったので、ほっといたが、今回は全て設定記述してみた。
A 使用するエディタの違いで、TABキーを使用した場合の、スペースの数の設定が異なるようで
後閑氏のソースは、私が何時も、ノートパッドで作成しているソースと比較して、スペースの数が
少なかったので、違和感があり、ここだけは編集し直すことにした。
B イニシャルでの、SDカード実装チェックの時の、カード検知が、おかしいような気がする。
カード未検知の時は、カードを挿入して検知するまで、待ちループに入るはずが、入ってこない
ような動作になる。
これは、待ちループ(whileループ)に、LEDポートのトグル動作(点滅)を追加して確認したの
だが、待ちの時は直ぐ点滅するはずが点滅しない。
何かおかしい?
これについては、CD信号と、WP信号を確認してみたが、レベル、動作とも異常なかった。
C MODE SWの動作がおかしい。(昨日のコメント参照のこと)
このSWは、PICの内部プルアップを使っているが、チェックしたところ動作に問題なく
プルアップ設定に問題はないようである。
・Bのカード検知不具合については、検知方法を、現状の、ファイルシステム初期化関数:FSInit();
を実行後の戻り値を判断して検知する方法から、戻り値を使わないで、単純にカード検知信号:CD/
のポートを読込んでチェックし、検知されたら、FSInit();を実行して、ファイルシステムの初期化を
行う方法に変更したら、うまく行った。
この方法は、RTOS版の、PIC32MX MP3プレーヤの時と同じやり方であるが、PIC32MXの時は
ポート直接リードという形の記述ではなく、専用のカード検知リード関数をコールする形になっていた
と思うが・・・まあ、基本は同じである。
■ 2014.9.11
・動作チェックを効率的に行うため、3曲のみ収録したSDカード(手持ちの64Mカード)を用意した。
・このカードで、あらためて現状のソフトで動作確認してみた。
<動作確認>
以下の、2つはOK
@ SD挿入後、電源を入れ、3曲の繰返し再生はOK(途中SKIP
SWは、押さない)
A SDカードを挿入しないで、電源を入れた場合は、昨日ソフトを修正しているので、
カードを挿入するまでは、赤LEDが点滅を繰返し、挿入されると、1回だけ緑LEDが点滅して
再生が始まる。これは正常。このLED動作は、自分なりに追加したものです。
(ソフト修正前の症状を細かく観測すると、SDカード挿入後、数10秒何の反応なしの後、
ファイルサーチして再生を始めるという動作をする。)
以下の3つは常時起こるNG
C 途中で、SKIP SWを押した時は、まず、最初の、1曲目→ 2曲目→ 3曲目まではOKだが、
3曲目の途中で、SKIP SWを押すと、一度は、戻って、1曲目のファイル名を表示するが、
再生前に、2曲目に移って再生が始まってしまう。
D
MODE SWを押しても、テストトーンが鳴らず、その後ハングアップのようになり、
もう一度MODE
SWを押しても、再生に戻らない。
E ファイル名表示がおかしい場合がある。
これは、文字数と関係あって、全てのファイル名が、最大の8文字(8.3形式に限定使用)
になっている場合は問題ないが、8文字より少ない文字数のファイルが存在すると
前のファイルの後の何文字かが残ってしまうという症状である。
・Cから追ってみることにした。
■ 2014.9.12
・原因究明のために、継続再生ケース部の、フローを書いて眺めていたら、割とすぐに原因が判った。
再生途中に、SKIP SWが押されたら、まず、EndFlagをセットするのだが、このフラグのリセットをする
タイミングが悪かった。
リセットするタイミングは、通常繰返し再生の場合に、次のファイルが、有った場合と、
次のファイルが無かった場合で、最初の曲のサーチに戻る場合の、2つのケースだが、オリジナル
ソースでは、次のファイルが無かった場合で、最初の曲のサーチに戻る場合の、リセットが抜けていた。
これを修正したら正常になった。
・Eも直ぐに判った。
単に、ファイル名を表示する前に、8.3形式の総文字数:12文字(名前8文字+ドット:'.'+'WAV")
のクリアが抜けていただけである。これも修正でOKになる。
・ここで時々しか出ない症状を確認した。
SKIP SW機能だが、時々、SKIPした時、再生しないで、断続音(ブツ音)しか聞こえず、その後
ハングアップしているようで、SW操作不能になる。
これは一時保留にして先に進めることにした。
・今、モード1:テストトーンは上手く行ってないが、イニシャライズのモードを、2から1に変更して
強制的に、テストトーンを確認してみた。
その結果、テストトーンの周波数は、実測で、約2Vp-p、の1.377kHz(サイン波)であることが
確認できた。
■ 2014.9.13
・再生中に、MODE SWを押した時の、不具合(常時起こるNGのD)調査を行った。
最初、考えたのは、オリジナルプログラムは、DAC割込みは、最初の1曲目の4kバイトの、
SD→ バッファへのデータ転送の時のみ、DAC割込みを禁止しているが、それ以降、
1曲の再生が終了するまでは、DAC割込みは許可されたままである。
つまり、最初の4kバイトの転送を除いて、SD→ バッファ転送中も、DAC割込みが、22.7uSの周期
で掛りっぱなしになっている。
まあ、出来るだけ途切れ無しに、DAC内の、FIFOバッファに転送しなければならないので、必要な
操作と思われるが、試しに、SD→ バッファ転送中と、DAC割込み処理中は、CN(SW)割込みを
禁止してみた。
これで、テストモードへ移行するようになったが、もう一度、MODE
SWを押した時に、
再生モードへ移らない。
最初の1曲目の、ファイル名は表示するが、再生しないで、ダンマリになる。
これは、再生中に、MODE SWを押した場合、無条件で、CASE1:(モード1)にチェンジしているが、
曲の強制終了処理(バッファクリア+ファイルクローズ)が抜けているのが原因だった。
これを修正したら、大方、動きはよさそうになってきたが・・・・
■ 2014.9.14
・未だ、駄目である。
時々、SKIP SWによる、曲送りの時、再生しないで断続音(ブツ音)になることがある。
今の所、原因不明である。
■ 2014.9.15
・今迄やってきた結果から、転送中にCN割込み禁止処理を入れると、MODE
SWの、バッファ転送中の
CN割込みによる影響での、データ化け(ブツ音の元)、暴走等の現象は防げるが、4kバイト単位での
転送の連続性が損なわれるので、時々、曲送り、または連続再生の途中で、SD読込エラー(データ化け)
または、FIFOへの転送が間に合わない等の事象が発生し、ブツ音になる現象が起きていると推測できる。
※ MODE SWを、CN割込みで読込んでいるが、これも、SKIP
SWと同様にメインループで行えば
多重割込みによる、相互干渉の影響がなくなる。
というか考える必要がなくなる。
思い切って、そのようにソースを修正してみることにした。
その結果、モード移行動作は良好になった。
■ 2014.9.16
・大方よくはなってきたが、SKIP SWによる、曲送りの時、再生しないで断続音(ブツ音)になる現象は
未だ時々起きている。
ちょっと解らなくなってきたが、以前これと同じ現象を経験していて、その時は、SDカードを中古の安価
なものから、新品の、ちょっと高めのSDカードにしたら良くなったことがあったので、
それで後日やってみることにした。(注文しないといけないが・・)
■ 2014.9.17
・曲送りの時(SKIP SWでの曲送りと、通常の自動リピート再生の時、両方)
次のファイルの、オープンからファイル名表示まではOKだが、その再生が行われず、「ブツ、ブツ・・・」
と断続的な音がして、その後ハングアップして、SWが効かなくなる。
但し、この現象は、いつも起こるわけではないが、起こる時は割と直ぐに起きることもある。
この問題をなんとかしたい。
いい機会なので、ここで、DAC割込み周期と割込み処理時間、SD→バッファ転送時間を実測してみようと考えた。
気分転換にもなるし、何かヒントがつかめるかも?
・測定結果から、おかしいと思えるところは見当たらず、特にヒントになるものはつかめなかった。
・ここで、もう一つ新たに、時々起る現象を確認した。
曲送り時に発生する現象より、発生頻度は低い感じがするが、
曲の再生中にも、何というか、音が瞬間的に変(まあ、途切れる感じ)になり、直ぐに正しい再生
に戻るという現象だ。
■ 2014.9.19〜 2014.9.21
・相変わらず、時々出る不具合を追って、いろいろ試してはいるものの、症状はよくならない。
<試した事: いずれの試行も駄目だったが、Cが一番効果があった。>
@ 次のファイルオープン後のバッファ転送を直ぐに始めないで、数10mSのウエイトを入れる。
A DAC割込み関数の、オプション記述:コンテキスト保存の高速化を狙って、shadow
を追加し
no_auto_psv, shadowとする。
B オリジナルソースには、最初の曲ファイルオープン時は、正常オープンか否かのチェックを
して、正常オープンだったら、最初のSD読出し→バッファ転送をやっているのだが、
2曲目以降のファイルオープン時は、その正常オープンか否かのチェックを行っていなかった
ので追加してみた。
C 注文しておいた、新しいSDカード: GREEN
HOUSE社 "GH-SDC2GG"
(2Gの標準SDカードで、クラス6、カード仕様の、Ver.2.0準拠品)で、再生してみる。
■ 2014.9.22
・なかなか原因がつかめず、どうしようかと困惑気味。
ここで、microchip社の、当該PICの、DACマニュアルを見始めた。
後閑氏の、DACに関する記述と、マニュアルの、DAC記述(プログラム例)を比較してみた。
大きな違いは、後閑氏のは、
LCHの、DAC割込み関数の記述しかなく、まず、メインで、LCH
DAC割込みを許可して起動し
直ぐに、DAC内の、LCH側のFIFOバッファに音楽データを転送。
その後、DAC内の、ステータスレジスタの、RFLLビットをチェックし、空であれば、RCH側のFIFO
に音楽データを転送している。
(後閑氏の本には、割込みは、ステレオであれば、基本的に、ほぼ同時にバッファが空くことになる
ので、いずれか片方のバッファ空き割込みで、両CHにデータを送っても問題ないと書いてあるが・・)
一方、マニュアルの例では、
RCH、LCHで、DAC割込み関数が、2つ有り、それぞれで、FIFOへの音楽データ転送を行っている。
例では、転送部の、記述は省略されているが、たぶんステータスチェックは必要ないと思われる。
思い切って、このように記述を修正してみることにした。
結果、未だ、長時間再生でチェックはしてないが、少なくとも、SKIP
SWの曲送り(長押しも含める)
では、何回やっても、ブツ音で止まる症状は出なくなった。
殆ど同時に、L/R CHともに処理が行われているようだ。
改めて、DAC割込み処理時間を、LEDポートを利用して測ると、ソフト修正前の、1.5uSから、1.0oS
と減少していた。
以下に、測定の模様と、測定結果の写真をアップした。
■ 2014.9.23
・昨日のソフト修正で、9/22 21:00〜 9/23 7:30まで、10時間半の連続繰返し再生でも、
問題ないことを確認した。
(この時、使用したSDカードは、例の新品の、GREEN
HOUSE社のものである。)
ただ、中華製(シリコン・パワー社)の安物の、2Gの、SDカードでは、SKIP
SWによる
曲送りによる不具合は出ないものの、再生中に音が途切れるようになって、直ぐ正常な再生
に戻るという現象は、未だ起こる。
これは、信頼おけるSDカードで起きないので、良しとした。
■ 2014.9.24
・これまで、かなり苦戦したが、なんとか、まともに動くようになって一安心。
それでも、ちょっと操作上直した方がよいと思われる箇所があったのでソフトを修正してみた。
それは、現状、曲間の時間を、1秒に設定してあるのだが、これだとSKIP
SWを早く押した時の
反応が悪いので、半分の、0.5秒に修正した。(まあ、好みの問題ですが・・・)
無論、これによる再生への影響はない。
■ 2014.9.26
・最後に、これは、再生上は関係ないが、1つソフト上で気になっていることがある。
それは、I2Cの、SCLのボーレート(転送速度)の設定である。
後閑氏の本には、SCLは、100kHzに設定してあると書いてあるが、実測すると約倍の200kHzに
なっていた。(9月19日に確認)
まあ、200kHzでも、I2Cの仕様が、最大400kHzまでは許容しているので問題はないが、実測した
波形を見ると、5.1kΩのプルアップでも、かなり波形が鈍っていて、レベルも低く目なっていて、
ちょっとこれは修正した方が良いかなと思い修正することにした。
修正関連のメモ書きを、以下にアップしたので参照してください。
<最終回路図>
・こちらから、どうぞ→ 「PIC_WAVPlayer
回路図」
<最終ソース>
・こちらから、どうぞ→ WAVPlayer.c