Forum: Mikrocontroller und Digitale Elektronik Sehr schlechte MP3-Wiedergabequalität


von Luca B. (lucabert)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.