mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MP3/MMC lesegeschwindigkeit


Autor: knirps (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: zero_gravity (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: knirps (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
while (PINB&DREQ)                  // Solange DREQ
{
  MMC_Read (address, buffer);        // 512Bytes von MMC Karte lesen
  for (lauf=0;lauf<512;lauf++)
    DEC_SendData (buffer[lauf]);     // 512Bytes an Decoder senden
  address++;                         // Nächste Speicheradresse
}

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 ;-)

Autor: nop(); (Gast)
Datum:

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

Autor: knirps (Gast)
Datum:

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

Autor: Nik Bamert (nikbamert)
Datum:

Bewertung
0 lesenswert
nicht 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:
while(1){
  

  MMC_Read (address, buffer);        // Einen Sektor buffern

  //Schleife 16 Mal durchlaufen (16*32=512)
  for(unsigned char zaehler=0;zaehler<16;zaehler++){ 
    if(PINB&DREQ){
      for (lauf=0;lauf<32;lauf++)
      DEC_SendData(buffer[(zaehler*32)+lauf]);     // Die nächsten 32 aus dem Buffer an Decoder senden
    }
  }
  address++;  // Nächste Speicheradresse
}

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

Nik

Autor: knirps (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: knirps (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.