SDカードのリード(読み込み)トライアル 玉砕中! - MP3プレーヤー自作
>>前の記事: SDメモリカードスロットを電子工作用に変換
やっかいだ、
やっかいだ、
ほとほとやっかいだ。
SDカードから、
PICマイコンを使ってMP3データをリードするだけだけど、
玉砕中です。
せめてもの進捗状況の報告。
使用するPICマイコン
PIC18F452
ベースにするサンプルプログラム
http://www.picfun.com/PIC24F/AP/app24F08.html
“このMP3プレーヤのプログラムはMPLAB C30のC言語だけで記述しています。
またSDカードのファイル操作用のプログラムはすべてマイクロチップ社のフリーの
FATファイルシステムを使っています。
これでファイル操作に関するプログラムは何も作る必要がなくなります。
あとはVS1011e制御用のプログラムですが、こちらは独立のソースとしてライブラリ
のような構成にしました。
これでメイン関数の部分はほんのわずかのプログラム状態になりすっきりしました。
またC言語だけで記述していますので、PIC18などへの移植も簡単にできると思います。”
>PIC18などへの移植も簡単にできると思います
・・・
簡単じゃないよーー。
まぁ、僕のレベルが低いだけなんだろうけどさ・・・。
picfunのプログラムに、
Microchip Memory Disk Drive File System
FSconfig.h
FSDefs.h
FSIO.c
FSIO.h
GenericTypeDefs.h
SD-SPI.c
SD-SPI.h
の一式が入っていたので、
こいつを使えばSDカード関係のメモリー操作はらくらくだね!
と思っていたのですが、、
現実は、やっかいです。
Microchip Memory Disk Drive File Systemが使える環境は
PICマイコン、PIC18/PIC24/dsPIC30/dsPIC33。
コンパイラー、C18/C30です。
PIC18F452とC18を使えば、
そのまま使えるぞーと思いきや、
そのままでは使えません。
というか、picfunさんは、いったいどこから
Microchip Memory Disk Drive File System
を拾ってこられてのでしょうか?
それは、さておき、
まずは、SPIで使うピンを再配置してやらなければなりません。
デフォルトで設定されているのはPIC24関連です。
PIC24Fのマニュアルに記載されているピン配置とレジスタを参考に、
それに対応するようなPIC18F452のピン配置と、PIC18F452用のレジスタに変更させます。
SD-SPI.h #define SD_CS PORTBbits.RB4 #define SD_CS_TRIS TRISBbits.TRISB4 #define SD_CD PORTBbits.RB3 #define SD_CD_TRIS TRISBbits.TRISB3 #define SD_WE PORTBbits.RB2 #define SD_WE_TRIS TRISBbits.TRISB2 // Registers for the SPI module you want to use #define SPICON1 SSPCON1 #define SPISTAT SSPSTAT #define SPIBUF SSPBUF #define SPISTAT_RBF SSPSTATbits.BF #define SPICON1bits SSPCON1bits #define SPISTATbits SSPSTATbits // Tris pins for SCK/SDI/SDO lines #define SPICLOCK TRISCbits.TRISC3 #define SPIIN TRISCbits.TRISC4 #define SPIOUT TRISCbits.TRISC5
まだ実際にチップに書き込んで試していないので、
定かではありませんが、この部分のエラーだけはなくなります。
これでコンパイルできるようになるかなと思いきや、
これだけではコンパイルできません。
このままでは、
にっくきリンクエラーなるものが発生するので、
メモリの再配置が必要になります。
リンカースクリプトにある、
p18f452.lkrに記載されているメモリーの分配を
適切に再配分しなければなりません。
これがやっかいで、やっかいで、
というか、どこをどう配置し直せば良いのかわかりません。
ネットをうろついて、
“PIC18F452でMP3プレーヤーを作ってみた”
http://www.mars.dti.ne.jp/~m7030/pic_room/pic_mp3.html
にあるp18f452i.lkrにメモリの再配置をしたやつが置いてあったので、
それを使うことにします。
CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED CODEPAGE NAME=page START=0x2A END=0x7FFF CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED ACCESSBANK NAME=accessram START=0x0 END=0x7F DATABANK NAME=gpr0 START=0x80 END=0xFF DATABANK NAME=gpr1 START=0x100 END=0x1FF DATABANK NAME=gpr2 START=0x200 END=0x2FF DATABANK NAME=gpr3 START=0x300 END=0x3FF DATABANK NAME=gpr4 START=0x400 END=0x4FF DATABANK NAME=gpr5 START=0x500 END=0x5FF ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED SECTION NAME=CONFIG ROM=config STACK SIZE=0x100 RAM=gpr5
↑
もともとのメモリ配置
MP3のリード用にメモリを再配置
(http://www.mars.dti.ne.jp/~m7030/pic_room/pic_mp3.html から)
↓
CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED CODEPAGE NAME=page START=0x2A END=0x7DBF CODEPAGE NAME=debug START=0x7DC0 END=0x8FFF PROTECTED CODEPAGE NAME=idlocs START=0x200000 END=0x200017 PROTECTED CODEPAGE NAME=config START=0x300000 END=0x30001D PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED CODEPAGE NAME=eedata START=0xD00000 END=0xF000FF PROTECTED ACCESSBANK NAME=accessram START=0x0 END=0x7F DATABANK NAME=gpr0 START=0x80 END=0xFF DATABANK NAME=gpr1 START=0x100 END=0x9FF DATABANK NAME=gpr3 START=0xA00 END=0xDFF DATABANK NAME=gpr5 START=0xE00 END=0xEF3 DATABANK NAME=dbgspr START=0xEF4 END=0xEFF PROTECTED ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED SECTION NAME=CONFIG ROM=config SECTION NAME=WORK RAM=gpr1 SECTION NAME=BUFF RAM=gpr3 //buffer STACK SIZE=0x0F3 RAM=gpr5
メモリの配置も(コピペで)終わったし、
じゃ、完璧だね!
と本当に言いたい所だけど、
そうは問屋が卸さなかった。。
メモリの配置、
完璧じゃなかった。
FSIO.cで、ピーヒャラピーヒャラ、
メモリが足りないぞボケとエラーを出しやがるのです。
以前よりはマシになりましたが、
問題はですね、
どの場所のメモリが足りないのかわからないんです・・。
FSIO.cのファンクションを消していって、
犯人探しをした結果。。。
まず、
FSconfig.hにあるFS_MAX_FILES_OPENを3から1に変更。
(おまじない程度の意味しかなさそう・・)
SYSTEM_CLOCK (DWORD)20000000
↓
SYSTEM_CLOCK (DWORD)10000000
に一応変更。
問題を避けるため20MHzのセラロック使うかもしれない。
それで犯人探しの本筋は、
容疑者、全員死刑!
FSIO.cにあるかなりの機能を
FSconfig.hからコメントアウトして停止させた。
// Comment this line out if you don't intend to write data to the card //#define ALLOW_WRITES // Comment this line out if you don't intend to format your card // Writes must be enabled to use the format function //#define ALLOW_FORMATS // Uncomment this definition if you're using directories // Writes must be enabled to use directories //#define ALLOW_DIRS // Uncomment this to use the FindFirst, FindNext, and FindPrev #define ALLOW_FILESEARCH // Allows the use of FSfopenpgm, FSremovepgm, etc with PIC18 //#define ALLOW_PGMFUNCTIONS // Allows the use of the FSfprintf function // Writes must be enabled to use the FSprintf function //#define ALLOW_FSFPRINTF
ALLOW_FILESEARCH以外を停止させて、
ようやくリンクエラーを隠せました。。
うーん、
気持ち悪い・・。
ネットでまた調べ始める。。
ヒット
うぐぅーーー(カノン風味
http://www.eetasia.com/ARTICLES/2007OCT/PDF/EEOL_2007OCT02_STOR_CTRLD_AN.pdf?SOURCES=DOWNLOAD
Implementing File I/O Functions Using Microchip's Memory Disk Drive File System Library
・・・
ライブラリーセットアップが載ってるよ・・。
読む読む読む・・。
ぐわっぎゃ!
ちょいまて、
メモリ足りねぇくせえぜごぜえます! (パニック
PIC18F452
プログラムメモリ32KB
RAM 1536B
EEPROM 256B
ライブラリーのメモリー消費
最低限の機能
プログラムメモリ 19.7KB
データメモリ(RAM?) 1771B
ヤバイ・・・
データメモリをオーバーしている気がする。。
その他の機能 - 消費するプログラムメモリ
ファイルサーチ 3.6KB
書き込み 12KB
フォーマット(書き込みEnable) 4.9KB
ディレクトリ操作(書き込みEnable) 13.8KB
・・・
PIC18F452じゃ、
ヤバイかもしれません。
ちなみにpicfunさんで使っているPICマイコンは、
PIC24FJ64GA002
プログラムメモリ64KB
SRAM 8192B
450円
メモリの容量が
十全にあります。
くそー、
PIC24を書き込めるやつライタがあれば、
さっさと乗り移るのに。。
唯一、PIC18系で問題なく使え入手が簡単そうなのが、
PIC18F8720
プログラムメモリ128KB
RAM 3840B
お値段 3200円 (撃沈
http://akizukidenshi.com/catalog/items2.php?p=1&q=PIC18F8720-I%2FPT
もうこの辺まで来ると、
PICkit2を買って、
PIC24に鞍替えしたほうが・・。
と思う今日この頃。
efのオープニングがループだよー。
>>前の記事: SDメモリカードスロットを電子工作用に変換
コメント (⇒ログイン)
今のところコメントはありませんー
だれか書いてー

