Hallo, Leute
Heute habe ich die Funktionen für die Verwaltung der SD/MMC-Karte in
meinen Wecker eingebunden.
Die Funktionen habe ich von SVN heruntergeladen. Die sind die Funktionen
von dieser Artikel: http://www.mikrocontroller.net/articles/AVR_FAT32
Ich kann jetzt problemlos Dateien von der Karte lesen.
Nun wollte ich eine MP3-Datei aus der Karte abspielen.
Es klappt, selbstverständlich, aber die Qualität ist sehr schlecht.
Man hört immer in Hintergrund eine hohe Summen und sind einige
Nebengeräusche dazu zu hören.
Bei der Entwicklung, bisher, habe ich einen etwas schlechter
Lautsprecher an einer Ausgabe des Verstärkers angebunden (andere
Lautsprecher habe ich leider nicht, dann muss ich ein Kanal an die Luft
hängen lassen).
Am Anfang, dachte ich, daß das das Problem war, ich habe also einen
guten Lautsprecher von meiner Stereoanlage angeschloßen.
Die Qualität ist deutlich besser, aber das Problem ist immer zu hören.
Hat jemand eine Ahnung, was das Problem sein kann?
Vorher, mit der kleinen Datei als Array konnte ich das Problem nicht
hören, aber die Abspielzeit war weniger als eine Sekunde, jetzt sind wir
bei mehr als zwei Sekunden. Es kann also sein, daß das Problem immer da
war, aber vorher konnte ich es nicht hören.
Der Code ist echt trivial:
1 | enableMMC();
|
2 | ffopen(file_name);
|
3 | disableMMC();
|
4 | tdaTurnOn();
|
5 | tdaLoud();
|
6 |
|
7 | for(currentPointer = 0; currentPointer < file.length;)
|
8 | {
|
9 | enableMMC();
|
10 | for(l = 0; (l < 32) && (currentPointer < file.length); l++)
|
11 | {
|
12 | mp3[l] = ffread();
|
13 | currentPointer++;
|
14 | }
|
15 | disableMMC();
|
16 |
|
17 | vsSetChipSelect();
|
18 | vsSetBSync();
|
19 | for(i = 0; i < l;)
|
20 | if(bit_is_set(VS_PIN, VS_DREQ_PIN))
|
21 | {
|
22 | spiWriteByte(mp3[i++]);
|
23 | }
|
24 | vsClearBSync();
|
25 | }
|
26 | for(i = 0; i < (file.length % 32); i++)
|
27 | {
|
28 | vsSetBSync();
|
29 | spiWriteByte(0);
|
30 | vsClearBSync();
|
31 | }
|
32 | enableMMC();
|
33 | ffclose();
|
34 | disableMMC();
|
35 |
|
36 | vsWaitForComplete();
|
Die Funktionen enableMMC() und disableMMC() geben mir die Möglichkeit
mit der Karte zu sprechen, da der MOSI mit einer AND-Port an der Karte
verbunden ist. Die gleiche Lösung habe ich in anderen Projekten gesehen,
und sollte dienen um sicher zu sein, daß die Karte nicht unerwünscht (zB
bei der Programmierung) geschrieben wird.
Danke für eure Vorschlage!
Luca Bertoncello