忍者ブログ
 30年ぶりに復活した隊長の電子工作指令本部
全体を通してSRAM不足なので、MassStorageやファイルシステムに対し、 個々にメモリを
割り当てる事は出来ません。
なので、排他的に利用する機能同士で、SRAMバンク(セクション)を共有する事にしました。

これは、#pragma udata overlay といった具合に overlay キーワードで指定可能です。
排他的機能同士で、malloc() と free() を使用して、メモリを譲り合うような動作ですね。

本作例では、DATABANK NAME=share START=0x500 END=0x7FF PROTECTED
という、共有バンクを設けており、MSDと、FAT間等でこの領域を共有します。
従って、MSDとFATは、同時には動作できない仕様としています。

MCHPMSD

・付属のリンカスクリプトは使用しません。本作用に再配置したリンカスクリプトを使用します。

・usbcfg.h を編集し、USE_SELF_POWER_SENSE_IO と USE_USB_BUS_SENSE_IO
 が無効になるようにします。

・sdcard.h を編集し、SDC_CS と SDC_CS_DIR の設定を、RB3へ変更します。

・sdcard.h 等を編集し、MEDIA_CD と MEDIA_WD が無効になるようにします。

・sdcard.h 等を編集し、STATUSLED が無効になるようにします。

・msd.c 等に記述されている、mInitAllLEDs(), mLED_1_On() 等のLEDマクロを
 コメントアウトします。

・usbdrv.c の USBSuspend() 関数の中身を全てコメントアウトし、次の一行を記述します。

 UIRbits.IDLEIF = 0;

・usbmmap.c にて定義されているmsd_buffer[512] の配置指定を、下記の様に変更します。

 #pragma udata overlay share=0x500
 volatile far char msd_buffer[512];

・usbdsc.cやmsd.cで定義されているデバイス表示等を勝手に変更しました。(いいのでしょうか)

・USBDriverService() は、USB割り込みによって処理するようにしました。

FatFs

・Flashの容量制限により、READONLY他、可能な限り不要な機能を外しています。

・SRAMの容量制限により、TINY指定しています。なるべく連続してファイルを読まないと、
 頻繁にアロケーションテーブルの再読み込みが発生するため、注意が必要です。

・上記制約的動作は、FatFsの制約ではなく、PIC18F4550 の各容量が小さい為です。

・diskio.cの仕事は、MCHPMSDに含まれるsdcardモジュールのSectorRead() APIを
 呼び出し、セクタの生データを読み込む事です。

・FatFsは、ディレクトリ内の後方列挙は出来ますが(f_readdir())、前方列挙が出来ません。
 後方列挙のみを使用して前選曲を行うための実装が、結構大きくなってしまいました。

RDA5800C (ソース:fmr.c

・I2CよりもSPIの方が簡単そうなので、SPIモードで動作させています。

・SPIモードでは、下記の様に25ビット単位で通信します。
 レジスタ番号上位4ビット + R/Wビット + レジスタ番号下位4ビット + 16ビット送信or受信

・ノーウェイトでリードライト出来ました。

・データシートには載っていませんが、レジスタ02H の B11 と B7 は 1 でないと動作しませ。
 逆に、データシートに載っていない他のビットは 0 でないと動作しないようです。

・ノイズに弱いです。LCD表示を行うとノイズが聞こえたり、最悪誤動作する現象が出ました。
 幸い、ラジオ視聴中に表示を更新する事は殆どないので、なんとかなっています。

・GPIO 1~3 は、Hi-Z状態に設定しても、僅かにLEDが光る(電位を持っている)ようです。

ZY-FGD1442701V1 (ソース:lcd.c

・サンプルプログラムの初期設定値では、若干コントラストが悪いようです。
 GMCTRP1 / GMCTRN1 の設定値を調整すると良くなります。

・ノーウェイトでリードライト出来ました。

・LCDからのReadについては、関数は用意してあり正常に動作しますが、不要でした。

・誤ってかなりの期間、絶対定格である3.3Vを超えて5Vで駆動していましたが壊れませんでした。

VS1011e (ソース:mp3.c

・ノーウェイトでリードライト出来ました。

・XRESETをHIにした直後から、謎の"サー"ノイズが観測されました。このノイズは、少しでも曲を
 再生すると出なくなります。その後、LOにしてHIにすると、また発生します。
 曲の再生直前までミュートする事で解決しました。

・再生の途中で、再生時間の表示更新を行うと、フォントファイルの読込みに移ってしまうため、
 音が途切れる場合がありました。1桁ずつ更新する事でこの問題を回避しました。

その他

・割り込み処理は下記3つありますが、全体としては基本ポーリング方式です。

 1) TMR0(オフタイマー用)
 2) TMR1(起動LED表示)
 3) USB

・本作では、PICのクリスタルは20MHzを使用し、内部で48MHz駆動?しています。
 常識かも知れませんが、この場合、各タイマーの入力クロックも48MHzとなるので、良く見る
 20MHz前提の計算式では、正しい間隔を刻めません。
 タイマーを16ビットモードでフリーランさせた場合、1398.1ms間隔で割り込みが発生します。

・ダイオードマトリクスSW入力では、3ビットのうちどれかがLOである事を検出したら、直ぐに
 読み込まずに、5ms程まってから読み込みます。各ビットの値が確定するまでバラツキが
 あるためです。

・電源OFF(RA5をLO)にした後は、SLEEPして実際に電源が落ちるまでそのままにします。
 SLEEPしないと、電圧が降下していく過程で、各ポートの出力値が不定となり、一瞬バタツキ
 が見られます。

・前途しましたが、当初ミュート回路は無くポートをON/OFFさせるソフトウェアビープを乗せて
 いました。出来るだけ正弦波に近づけるための回路を設けていたのですが、さほど良い音が
 出ず、また、タクトスイッチを押す音がかき消すため、結局いらんかったなぁ等と思っていた
 矢先にポップノイズの問題が出てきたため、ミュート回路に変更しました。
 ソースには、その名残が残っています。
 ソフトウェアビープは、素直に圧電サウンダを使うほうがよさそうですね。

・本作では、EEPROMにラストチャンネルやボリューム等の情報を記録します。
 EEPROMへアクセスする為に、C18のライブラリにある EEP API を使用しています。

  void Busy_eep ( void );
  unsigned char Read_b_eep( unsigned int badd );
  void Write_b_eep( unsigned int badd, unsigned char bdata );

 C18ライブラリは、なんとなく使いたくなかったのですが、唯一、これらだけ使用しています。
 ただ、これらの関数のソースは公開されており、簡単なものなので、自分のトコにコピーして
 持ってきても良いかもしれません。

 

拍手[0回]

PR
隊長

ブログ内検索

Copyright © [ The 電子工作 ] All rights reserved.
Special Template : 忍者ブログ de テンプレート and ブログアクセスアップ
Special Thanks : 忍者ブログ
Commercial message : [PR]