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
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
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 ;-)
Da die MMC bis 50MBit/s lesen koennen, sollte es eigentlich bei passender Pufferung keine Probleme mit Aussetzern geben.
Das ist klar, aber ich kann mit dem ATMega16 und 8MHz Quarz niemals die 50MBit/s auslesen.
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
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..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.