QLOOKアクセス解析

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

簡易波形発生器の作製のプログラムを追加

簡易波形発生器の作製のページにプログラムを追加しました。
スポンサーサイト

簡易波形発生器の作製

簡易波形発生器の作成のページを新規作成しました。

tag : AVR

ビット演算

ビット演算のページを新規作成しました。

自分の備忘録というか、なんというか。

今後も必要に応じて内容を追加するつもりです。

tag : AVR C言語

VS1011eとAVR mega88でmp3プレイヤー

VS1011e AVR mp3 等のキーワードで検索して来られる方が何人かいるようなので、自分が作ったときに注意したことなんかを少しまとめておく。
前回の記事はこちら
順番は適当。
そのうちサイトの方にもちゃんとしたページを作りたいんだけど、他の事で忙しくて手が回らないんだな。


■必要な知識

プログラム環境は出来ればC言語がいい。参考になる記事がネット上に多数公開されている。

次にFAT。SDカードを使用するにはこれを理解せずには進まないと思う。でもそんなに恐れる必要はない。私も最初はまったく分からなかったけど、丁寧に解説してくれてるサイトがあるので熟読すればすぐに理解できる。(下URL)
http://www.geocities.co.jp/SiliconValley-PaloAlto/2038/fat.html
http://www.cek.ne.jp/~kunio.h/index.htm

そしてSPI通信。マイコンへのプログラムの書き込みもSDカードとのデータのやり取りもVS1011eとのデータのやり取りもこの方式。ハードウェア方式のSPI通信の方が速度が速い。

VS1011eの知識。これはちあきさんがデータシートを翻訳してくれているから、感謝しながら一通り目を通せばいいとおもう。
http://www.chiaki.cc/Timpy/

こんなものかしら。


■mega88のクロック

VS1011eには12.8MHzか25.6MHzのクロックを供給するのが推奨されてる。
このクロックをそのままマイコンにも供給してみた。

言い換えると、mega88に12.8MHzのクリスタルを接続して、CLKO(PB0)ピンからクロック出力。
それをVS1011eのXTALIピンにぶち込んでやった。
これでクリスタルの節約にもなるし、mega88の内部発振よりも速い。
本当は25.6MHzをぶち込みたかったんだけど、一応mega88の定格が20MHzだから遠慮した。
クロックが25.6MHzで無い場合は初期化時にクロックダブラの設定をする必要がある。

12.8MHzでも320kbpsが再生出来ているので実際の使用には問題ない。


■ブレッドボードとEasyMP3でテスト

easymp3


もともとポータブルな機器にしたかったけど、その前にストロベリーリナックスさんのEasyMP3でテストした。これを使うとブレッドボードでも簡単にテストできる。
LQFP-48パッケージに移行する場合、プログラムの変更は必要ない。
ただし、EasyMP3にはバッファのチップが付いてて、これを介するとマイコンの入出力方向レジスタの設定が間違ってても正常に動くことがある。それに気づかずにLQFP-48パッケージに移行してえらい目にあった。

P8070299.jpg
結局LQFP-48パッケージでEasyMP3と同じ入出力ポートのキットを自作してテストするはめに。


■VS1011eの操作

VS1011eは1曲演奏するごとにリセットして初期化する。
手順はこんな感じ。

1.電源投入
2.ハードウェアリセット
3.ソフトウェアリセット
4.初期化
5.音楽演奏
6.演奏終了後、3.へ戻る。

下URLの電子工作室さんがていねいに説明してくれてる。
http://www.picfun.com/PIC24F/AP/app24F08.html


■系全体のおおまかな理解

基本的にマイコンはSDカードとVS1011eとの間に入ってデータのやり取りをサポートする感じ。
あとスイッチ入力とか電源電圧の監視、それに対するレスポンスをやるだけ。

VS1011eはマイコンから送られてくる音楽データをひたすらデコードしてDA変換して出力する。
音量調節とかのコマンドが送られてきたらそれに従うだけ。(レジスタが書き換えられるだけ)

SDカードも要求されたデータをただただ送出するだけ。

ひとつひとつを見てみるとそれぞれは本当に簡単なことしかしてないことが分かる。




基板
基板

回路図
回路図(参考にならない例として見ていただければ…(^^;
※ネット上の先輩方の回路を多数インスパイアさせてもらっています。


以下参考URL(前回と同じ、かつ上記URLともかぶってます)
感謝しながら閲覧しましょう。

SDカード関連
http://www.geocities.co.jp/SiliconValley-PaloAlto/2038/fat.html
http://www.cek.ne.jp/~kunio.h/index.htm
http://elm-chan.org/docs/mmc/mmc.html

VS1011Eのデータシート翻訳(ありがたい!)
http://www.chiaki.cc/Timpy/

AVRのソースがコメントも付いてて分かりやすい!
http://yuki-lab.jp/hw/index.html

mp3リンク集
http://blog.goo.ne.jp/ykimata/e/1ba60896c4d96553548266ef30ec2fed

トランジスタ測定

hFEとVcは問題なく表示できるが、Vbが0.1V程度と計測される。そんなばかな。
テスターで測ると0.5V出ている。
AVRのADCの入力インピーダンスはデータシートによると100Mohmらしいからこれが影響ではないはずなんだけど。

それと、浮動小数点数を使うとサイズが一気に膨れ上がるから全て整数型で計算しているんだけど、
LCDへの出力はやっぱり少数が欲しいわけで、少しサイズは食うけどそういう関数を作った。

具体的には、整数値を10^nで割った値を文字列に変換して引数で渡したアドレスに書き込む。というもの。今回はマイナスの数字は扱わないからマイナスの処理は省略した。
それと、0以下の数字は少数点前の0は省略。(0.5→.5)
参考までに貼っておくが、上手く動く保障はない。

#include <stdlib.h>            //ltoa()が含まれる
#include <string.h> //strcpy()が含まれる

#define STRFLOAT_MAXDIGIT 6 //有効最大桁数
//***************************
//整数値を10^nで割った値を文字列strに代入
//引数:整数値num 割る数の10のべき数 結果を書き込む文字列
//***************************
uint8_t strfloat(uint16_t num, uint8_t n, uint8_t *str){
uint8_t cha[STRFLOAT_MAXDIGIT];
uint16_t cal=0;
int8_t cnt=0,i=0;

ltoa(num, cha, 10); //numを文字列に変換
cal=num;

while(cal>0){ //桁数取得
cnt++;
cal/=10;
}

cnt-=n;

while(cnt<0){ //結果が1未満の場合、文字列を全体的に右にずらす
cnt++;
for(i=STRFLOAT_MAXDIGIT-1;i>0;i--){
cha[i]=cha[i-1];
}
cha[0]='0';
}

for(i=STRFLOAT_MAXDIGIT-1;cnt<=i;i--){
if(i>0){
cha[i]=cha[i-1];
}else{
cha[0]='0';
}
}

cha[cnt]='.'; //ドットの記入
strcpy(str,cha);

return 0;
}




こんにちわ
ウェブサイト
チョコレイトスピーカーの開発日記ブログですよ
最新記事
カテゴリ
検索フォーム
リンク
プロフィール

yosio

Author:yosio
しがない大学生
電子工作とかパソコンとかアニメとかが趣味
写真なんかも撮ったりするからうp出来ればいいな
サイトも見に来てくださいな

QRコード
QRコード
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。