30年ぶりに復活した隊長の電子工作指令本部
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
全体を通して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ライブラリは、なんとなく使いたくなかったのですが、唯一、これらだけ使用しています。
ただ、これらの関数のソースは公開されており、簡単なものなので、自分のトコにコピーして
持ってきても良いかもしれません。
割り当てる事は出来ません。
なので、排他的に利用する機能同士で、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ライブラリは、なんとなく使いたくなかったのですが、唯一、これらだけ使用しています。
ただ、これらの関数のソースは公開されており、簡単なものなので、自分のトコにコピーして
持ってきても良いかもしれません。
隊長
カテゴリー
PR