Forum: Mikrocontroller und Digitale Elektronik MP3/MMC lesegeschwindigkeit


von knirps (Gast)


Lesenswert?

Hallo

Ich bin gerade dabei einen MP3 Player mit nem ATMega16 und dem VS1001 zu 
realisieren. Als Speichermedium benutze ich eine MMC Karte. Der 
Speicherkartenzugriff sowie die Ansteuerung des Decoders funktioniert 
einwandfrei. Um den Decoder zu testen habe ich über RS232 MP3 Daten an 
den Dekoder geschickt.

Jetzt habe ich versucht die MP3 Daten von der MMC dem Decoder zu 
schicken, mein Problem ist, dass ich nun die Daten nicht fliessend 
abspielen kann. Ich lese von der MMC immer 512Bytes und schicke diese 
anschliessend an den Decoder. Immer danach habe ich für kurze Zeit 
keinen Ton mehr, da ich wiederum Daten von der Karte einlese.

Hatte dieses Problem vielleicht auch schon jemand, oder weiss jemand wie 
ich die Lese bez. Schreibgeschwindigkeit erhöhen kann, damit der Buffer 
des Decoders nie ganz leer ist.

Den Decoder habe ich am SPI Bus des ATMega16 angeschlossen. Weil ich 
irgendwie Probleme hatte mit dem ChipSelect, lese ich die Daten der MMC 
per SoftwareSPI.

Besten Dank im voraus

von zero_gravity (Gast)


Lesenswert?

hey knirps :)

wie wärs mal mit nem programmausschnitt??
in was programmierst du denn???
hab mir auch nen mp3-player gebaut (mit nokia6610-display, vs1011, 
sd-karte, fat16 und sogar einer ordnerebene rumprahl ;) ), kann dir 
bei bedarf ja mal nen bisschen code schicken - allerdings in asm ^^

ich würd an deiner stelle erstma nachschaun, was der controller 
eigentlich alles so treibt, wenn er grad nicht einen block zum decoder 
rüberschickt... eigentlich haste da massig zeit - selbst bei hohen 
bitraten...

glg
zero_gravity

von knirps (Gast)


Lesenswert?

Hallo zero_gravity

Ich programmiere in C, asm hab ich nicht soviel Erfahrung..

Ich glaube ich hab meinen Fehler jetzt gefunden, als ich nachschauen 
wollte wie gross der Buffer vom Decoder ist. Ich habe nähmlich immer 
512Bytes an den Decoder gesendet, ohne zu überprüfen, ob DREQ gesetzt 
ist...
1
while (PINB&DREQ)                  // Solange DREQ
2
{
3
  MMC_Read (address, buffer);        // 512Bytes von MMC Karte lesen
4
  for (lauf=0;lauf<512;lauf++)
5
    DEC_SendData (buffer[lauf]);     // 512Bytes an Decoder senden
6
  address++;                         // Nächste Speicheradresse
7
}

Ich schreibe den Code mal so um, dass nur immer 32Bytes an den Decoder 
gesendet werden.. FAT16 implementierung habe ich noch nicht, kommt aber 
noch.
Hattest du nie Probleme mit der SD-Karte? Bei mir funktionieren 
irgendwie nur die MMC's..

Gruss knirps ;-)

von nop(); (Gast)


Lesenswert?

Da die MMC bis 50MBit/s lesen koennen, sollte es eigentlich bei 
passender Pufferung keine Probleme mit Aussetzern geben.

von knirps (Gast)


Lesenswert?

Das ist klar, aber ich kann mit dem ATMega16 und 8MHz Quarz niemals die 
50MBit/s auslesen.

von Nik B. (nikbamert)


Lesenswert?

Hi knirps!

Du sendest ja solange DREQ high ist immer 512 bytes, ohne DREQ wieder zu
überprüfen. Ist DREQ high, heisst das aber nur, dass mindestens 32
weitere bytes im Buffer Platz haben. Du musst also nach jeweils 32
gesendeten Bytes überprüfen, ob DREQ immer noch high ist. Ist dem so,
kannst du weiter senden, sonst musst du wieder warten.
Ich glaube, dass so wie du es machst immer mal wieder der Buffer 
überläuft und daher auch die Aussetzer kommen.

Ich würde es mal so versuchen:
1
while(1){
2
  
3
4
  MMC_Read (address, buffer);        // Einen Sektor buffern
5
6
  //Schleife 16 Mal durchlaufen (16*32=512)
7
  for(unsigned char zaehler=0;zaehler<16;zaehler++){ 
8
    if(PINB&DREQ){
9
      for (lauf=0;lauf<32;lauf++)
10
      DEC_SendData(buffer[(zaehler*32)+lauf]);     // Die nächsten 32 aus dem Buffer an Decoder senden
11
    }
12
  }
13
  address++;  // Nächste Speicheradresse
14
}

Kann den Code momentan nicht überprüfen, aber ich glaube das sollte so 
funktionieren ;-)

Nik

von knirps (Gast)


Lesenswert?

Ich habe schon bemerkt, dass ich nur 32Bytes auf einmal senden darf..
Bin mir nicht ganz sicher ob das so Funktioniert, ich hätte statt
if (PINB&DREQ)
while (!(PINB&DREQ))
genommen.

ich habe das gefühl, dass mein problem nicht die lesegeschwindigkeit 
ist, irgendwie spielt der Decoder die Audiodaten mindestens doppelt so 
schnell ab als er sollte..
Ich habe einen 24.576 Quart am Decoder, da muss ich das CLOCKF Register 
nicht beschreiben oder?
Das Mode Register ist auf 0x0000 gesetzt, also sollte "fast forward" 
nicht aktiviert sein..

von knirps (Gast)


Lesenswert?

Habe mein Problem gefunden:
Da ich die Fat implementierung noch nicht habe, habe ich über ein selbst 
geschriebenes Programm die MP3 Daten über RS232 auf die Speicherkarte 
kopiert. Anscheinend habe ich dabei immer ein paar Bytes verloren...
Habe jetzt ein Lied über mein USB Cardreader auf die Karte kopiert, die 
Speicherkarte lese ich ab Adresse 0 aus. Am Anfang höhr ich nur ein 
rauschen, bin ich aber mal beim Lied angelangt, spielt es dieses ohne 
unterbrüche ab freu
Wünsche noch einen schönen abend :)

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.