Speicherbedarf Mp3-Player

#1341171
Lesenswert?

Hallo

Ich wollte bloß wissen, welchen ATMega ich mindestens nehmen muss, um 
den Code für nen MP3-Player mit lesen von SD-Karte und der Ansteuerung 
eines MP3-Decoderchips unterzubringen?
Und: welche Taktfrequenz ist mindestens für ein entspanntes Abspielen, 
im Worst Case von MP3s mit 320kbit/s, nötig?


Danke euch
Persönliche Seite #1341211
Lesenswert?

Also das hier ist der letzte Benchmark, den ich jetzt von dieser 
FAT-Implantierung gefunden habe:

http://www.roland-riegel.de/sd-reader/benchmarks/


Ausschnitt:
1
 
2
Read FAT-16
3
Chunk size (Bytes): 2048  
4
Time (s)          : 10.0
5
Data rate (kB/s)  : 204.8
6

7
Test conditions: ATmega128 at 14.745 MHz, 128 MB SD card, FAT16-only configuration, 2 MB file, FAT16-only configuration, buffered access, without timestamps.
8

9

10
Read FAT-32
11
Chunk size (Bytes): 2048  
12
Time (s)          : 8.5
13
Data rate (kB/s)  : 240.9
14

15
Test conditions: ATmega128 at 14.745 MHz, 4 GB SDHC card, FAT32, 2 MB file, buffered access, without timestamps.
Persönliche Seite #1341281
Lesenswert?

Johannes Hofmann schrieb:
> Ich möchte ja die Dateien direkt von meiner Muckesammlung auf die
> SD-Karte ziehen.
> Aber da benötige ich ja FAT32. Da wird's ja noch enger...
>
> Naja, mal ausprobieren.

Nö, passt doch. FAT32 ist sogar noch schneller!
320 kbits (Kilobits) entsprechen 40 kbs (Kilobytes).

Nach dem Benchmark von Holger schafft seine FAT32-Implantierung bei 
14,745 MHZ 240 kbs

Das ist etwa 6mal so schnell, wie du für die Wiedergabe von 320 kbits 
brauchst!

Müsste also dicke reichen.
Gast #1341292
Lesenswert?

>Wenn es mit nem Mega8 klappen würde, wär ich sehr beglückt
>(Platinengröße).

Kommt auf deine Sonderwünsche an. Wenn Grafik-LCD mit Menüsteuerung,
Fernbedienung, alphabetisches sortieren der Songs, Anzeige ID-Tags,
Playlist Support und so weiter gewünscht ist, dann landest du irgendwann
bei einem ATMega128 mit 64kB externem RAM.

ATMega8: Text LCD für aktuelle Songanzeige plus ein paar Taster
zur Bedienung. Keine Menüführung, nix sortieren, keine Playlists.
Also ein simples Ding. Vorspulen ist schon fast Luxus ;)
#1341305
Lesenswert?

holger schrieb:
> ATMega8: Text LCD für aktuelle Songanzeige plus ein paar Taster
> zur Bedienung. Keine Menüführung, nix sortieren, keine Playlists.
> Also ein simples Ding. Vorspulen ist schon fast Luxus ;)

Kann ich so absolut bestätigen:
In meinem mp3 Player werkelt ein mega8 @ 8MHz, angeschlossen ist eine SD 
Karte, ein VS1011, ein Inkrementalgeber mit Taster und ein 2x20 VFD.
Nachdem ich die Unterstützung von langen Dateinamen und dem ID3 Tag 
eingebaut habe, war der Speicher nahezu komplett voll (man kann die 
Anzahl an freien Bytes an Händen und Füßen abzählen).
Song vor, zurück, lauter, leiser und Pause. Mehr brauche ich nicht und 
mehr gibt es auch nicht.

Normale 192kbit/s mp3s spielt er übrigends bei einer nicht 
fragmentierten Speicherkarte selbst @ 4MHz noch problemlos ab.
Da der VS10xx einen 2kByte großen Puffer hat, ist die Datenrate sowie 
das Dateisystem alles andere als kritisch. Solange man die Taster nicht 
per Warteschleife entprellt, sollte es da also keine Probleme geben, 
selbst wenn alles nicht perfekt optimiert ist.

Als Software für das Dateisystem kann ich die hier übrigens sehr 
empfehlen:
http://elm-chan.org/fsw/ff/00index_e.html
Das ist mit Abstand das am meisten ausgereifte was es so an freier 
Software gibt.
#1341332
Lesenswert?

Hallo,

ich habe vor Zeiten mal einen Player mit dem 8515 mit 32k externem Ram 
gebaut, 8MHz getaktet, Decoder war ein MAS3507D. Quelle eine 2,5"HD 6GB, 
Filesytem das Amiga FastFileSystem. Einfach, weil es dafür ideal war und 
ich noch einen Amiga in Betrieb hatte. Ende 2000 habe ich mich wohl 
nicht mit FAT rumärgern wollen.

Display 2x16 Zeichen, unten dynamische Menüanzeige, oben Titeldaten.
Angezeigt wurde nur MP3-Tag (der alte), der scrollte auch zur Laufzeit, 
Steuerung des MAS3507 für Lautstärke, Höhen und Tiefen über I2C auch zur 
Laufzeit ohne Aussetzer. Geteste allerdings damals nur bis 192kBit.

Wirklich kritisch war nur die Buffersteuerung zwischen HD und Ram und 
MAS.
Der Ram diente vor allem zum Preload der Startsektoren der Titel und war 
Batterie gepuffert. Sonst raspelte nach dem Start des Players die Platte 
erstmal 1-2 Minuten rum und suchte die Titel zusammen.

Die Problemstelle ist wirklich der SD-Karten-Zugriff. es ist auch 
relativ nutzlos, sich über die maximale Transferrate zu freuen.
Kritisch ist die minimale z.B. beim Sektorwechsel, die muß der Buffer 
und der Decoder 100% sicher überbrücken können, sonst gibt es Aussetzer.

Ich würde auch heute erstmal einen AVR auf ein Steckbrett nageln, 
SD-Karte und MP3-Decoder ran und die Sachen zum Spielen unter allen 
Umständen bringen.
Dabei muß dann genug Rechenzeit für den Rest übrigbleiben.
Wenn man z.B. in der Titelliste blättern will, während gespeilt wird, 
dann muß die im Ram parat liegen. Sonst würde ich da keine reale Chance 
sehen.

Würde mich vermutlich auch heute zum Mega8515 + 32k/64k S-Ram bringen, 
mir gefällt die Kombination. ;-)

Gruß aus Berlin
Michael
#1354375
Lesenswert?

Wenn man alles auf einmal macht und vorher noch nichts auf einem der 
Teilgebiete davon gemacht hat, und auch wirklich alles verstehen möchte, 
also nicht nur aus fertigen Libs etwas zusammenbauen möchte, dann Wochen 
bis Monate.

Ich hatte z.B. SD Karten und FAT vorher schon mehrmals verwendet, daher 
dafür auch fertigen Code.
Für meinen mp3 Player habe ich vom Entwurf bis zur ersten abgespielten 
mp3 rund 1-2 Tage gebraucht. Bis die Software und das Gehäuse usw. 
fertig war, hat es aber Wochen gedauert, da man immer wieder kleine 
Fehler beheben muss, die man nur im Betrieb bemerkt. Außerdem kommen 
immer wieder neue Features hinzu (auslesen der LFN, des ID3 Tag usw.).

Der VS ist im Vergleich zur SD Karte und dem Dateisystem aber extrem 
einfach.
Daher würde ich ein fertiges Dateisystem verwenden, das garantiert 
funktioniert (wie z.B. das von elm-chan). Alternativ kann man eine kurze 
mp3 auch mal in den Flash packen oder über UART streamen. Zum Testen des 
VS reicht das.
#1354397
Lesenswert?

Ich hab mir schon zig Projekte runtergeladen nur fehlt halt der große 
Überblick. Bspweise weiß ich nicht, wie ich den fertigen Code, etwa von 
elmchan in mein Projekt integrierern kann. Explizit, welche 
Softwareschnittstellen ich ansprechen muss.
Z.B. wenn der FAT-Code einen neuen Sektor benötigt, wie ich diesen 
Befehl der SD-Karten-Routine übergebe.
Hab vorher noch gar nichts Derartiges gemacht.
#1381300
Lesenswert?

An DO der SD Karte muss ein Pullup sein, denn nur dann kann man zwischen 
Tristate und Low unterscheiden. Ansonsten ist die Init der SD Karte ein 
Glücksspiel.
Ein Pullup am CS Anschluss der SD Karte ist sinnvoll, damit diese z.B. 
beim Programmieren des AVRs nicht auch Daten auf die SPI Leitungen 
treibt. Der Pulldown an SCK ist nicht ganz so wichtig.
Gast #1381666
Lesenswert?

1 Hardware in Gang bringen
1.1 ATMega
1.2 SD-Karte
1.3 MP3-Decoder
1.4 D/A-Wandler, Verstärker, usw

2 Software in Gang bringen
2.1 Kommunikation Atmega <-> SD Karte
2.2 Kommunikation Atmega <-> MP3-Decoder (ein MP3-Stream könnte für 
Debugzwecke über Seriell vom PC eingelesen werden)
2.3 FAT-Dateisystem der Karte lesen
2.4 MP3-Datei lesen
2.5 zum Decoder und dann zum Lautsprecher
Gast #1381842
Lesenswert?

fopen() gibts nur wenn du ein darunterliegendes Betriebssystem hast, das 
dir ein Dateihandle zur Verfügung stellt. Haste beim Atmega sehr 
wahrscheinlich nicht ;-) Also wird dir nix anderes übrig bleiben als mal 
nach FAT-Treibern für ATMega zu googeln (da gibts schon einige recht 
gute) oder alles im Alleingang zu programmieren.
#1381931
Lesenswert?

Ja, genau. Allerdings ist das Byteweise übertragen sehr ineffizient wie 
man hier sieht:
http://elm-chan.org/fsw/ff/img/rwtest.png

Da der VS10xx mindestens 32 Bytes frei hat, solange DREQ aktiv ist, 
würde ich immer 32Byte Blöcke senden. Das dürfte deutlich effizienter 
sein.

Aber einen Schritt nach dem anderen. Bring das ganze erstmal soweit zum 
Laufen, dass du dir über f_opendir und f_readdir den Verzeichnisinhalt 
ausgeben lassen kannst.
#1383598
Lesenswert?

Bei den ElmChan-Samples http://elm-chan.org/fsw/ff/ffsample.zip
gibt es für den AVR unter Main.c eine IOinit.
Doch ich konnte nicht finden, wo der Herr Chan den uC deklariert, bzw. 
dass in der io.h der richtige uC ausgewählt wird.
Auch versteh ich nicht, warum, er in der IOinit gleich mehrere Ports auf 
"HIGH" setzt.

Könnt ihr mir da mal wieder aushelfen?
#1383609
Lesenswert?

Johannes Hofmann schrieb:
> Doch ich konnte nicht finden, wo der Herr Chan den uC deklariert, bzw.
> dass in der io.h der richtige uC ausgewählt wird.

Das macht der Compiler automatisch wenn man dem den richtigen µC 
mitteilt. Darum musst du dich also nicht kümmern.

> Auch versteh ich nicht, warum, er in der IOinit gleich mehrere Ports auf
> "HIGH" setzt.

Das Beispielprogramm verwendet nicht nur die MMC/SD Karte sondern auch 
noch CF oder IDE. Die haben einen 16bit Datenbus.
#1387149
Lesenswert?

Hallo
Was mach ich denn mit der Fehlermeldung?
Es wurde auch keine .hex-Datei zum Programmieren erstellt.


gcc plug-in: Error: Object file not found on expected location 
C:\User\....\default\MP3.elf

Der Code compilierte ohne Probleme.

1
int main (void){
2

3
  FATFS *fs;         // Work area (file system object) for logical drives
4
    FIL fsrc, fdst;      // file objects
5
    BYTE buffer[4096];   // file copy buffer
6
    FRESULT res;         // FatFs function common result code
7
    UINT br, bw;         // File R/W count
8

9

10
    // Register work area for logical drives
11
    f_mount(0, &fs[0]);
12

13

14
    // Open source file on the drive 1
15
    res = f_open(&fsrc, "srcfile.dat", FA_OPEN_EXISTING | FA_READ);
16

17

18
    
19

20
    // Close all files
21
    f_close(&fsrc);
22

23
    // Unregister work area before discard it
24
    f_mount(0, NULL);
25

26

27

28
}
#1387186
Lesenswert?

Hab mal nen DJ MP3-Player nach dem Vorbild des berühmten CDJ100 von 
Pioneer in nen Mega32 reingepresst. Mit Cue-Punkt im Titel setzen usw.
Hatte außerdem noch so ne lustige 8ter Tastenreihe wo man Jingles 
drauflegen konnte die bei Knopfdruck abgespielt wurden.
Das ganze komplett in ASM geschriebene.
FAT16 von SD/MMC Karte und über den gleichen Hardware-SPI wieder raus an 
den MP3-Decoder.
Mit alphabetischem Ordnen in den Verzeichnissen, ID3-Tags, Playtime (+ 
und -), Display und FAT Schreibroutinen zum speichern der 
Jingle-Tasten-Belegung waren die 2k RAM fast bis aufs letzte Bit 
ausgereizt. War schon ne ganzschöne Trickserei.
320kbit hat er aber Problemlos abgespielt. (Ob er das in C programmiert 
auch geschafft hätte, weiß ich allerdings nicht)
#1403412
Lesenswert?

Hallo

Ich bin jetzt bei Disk_initialize().
Doch irgendwie wird das CS der karte nicht auf LOW gezogen.
1
#define SELECT()  PORTD &= ~(1<<PD4)  /* MMC CS = L */ 
2
#define  DESELECT()  PORTD |= (1<<PD4)  /* MMC CS = H */

Aufruf in der Send_CMD-Funktion ist ja
1
  DESELECT();  
2
  SELECT();

Da müsste ja auch mal was passieren. Hab ne LED an CS angeschlossen und 
die müsste ja dann mal ausgehen, wenn SELECT aktiviert ist.

Ist bestimmt ein simpler Fehler, den ich nicht seh...
#1404587
Lesenswert?

Ok auf dem SPI tut sich überhaupt nix!

Hier ist die Initialisierung, die direkt zu Beginn ausgeführt wird(Das 
ist aus dem fertig übernommenen Code):
1
  PORTB = 0b10110101;      /* Enable drivers */
2
  DDRB  = 0b11000111;
3
  SPCR = 0b01010000;      /* Initialize SPI port (Mode 0) */
4
  SPSR = 0b00000001;

Ich habe auch mal den Programmer abgeklemmt, der auch am SPI hängt, aber 
keine Besserung.
Muss was Internes sein.
Das Fusehäkchen im AVR-Studio-Programmer-Menü ist gesetzt und grau 
unterlegt mit nem roten Fragezeichen. Es lässt sich auch nicht 
entfernen.

ChipSelect funktioniert.
Gast #1404694
Lesenswert?

>So im Gegensatz zu voher ist jetzt der SPi Teiler 128 anstatt nur 2. Der
>uC läuft jetzt auch mit 1 MHz
>Da seh ich nur an der SCK-Leitung bischen was wackeln. Das krebst so bei
>3mV rum.

SCK läuft dann immer noch mit ca. 8kHz. Da siehst du nix mit
dem Multimeter.

Wo genau hängt das Programm jetzt?

Schaltplan?
Schaltplan?
Schaltplan?
Schaltplan?
#1404705
Lesenswert?

Hier ist er endlich ;-)

So die Orange Leitung hängt ist MOSI/DI, Grün ist SCK und Blau MISO/D0
Und dann noch paar Dioden, die mir zur Fehlersuche dienen.
Abblockkondensatoren an den VCC-Pins des uC hab ich auch dran.

Ich hatte wie gesagt die Karte schon mal initialisiert, aber da hatte 
ich eben Software SPI und da war die Schaltung auch auf ner 
Lochrasterplatine verlötet. Die Leitungslängen zur SD-Karte waren aber 
ähnlich lang.
Angehängte Dateien:
#1407067
Lesenswert?

Fällt euch noch was ein, wo der Fehler stecken könnte?
Die Software ist ja bereits erfolgreich vom Ersteller gestestet worden, 
zwar an einem anderen Atmega als meinem, aber das wird's wohl nicht 
sein.

Ich halte mal fest:
SPI funktioniert und ist korrekt angeschlossen
Ports auch korrekt
Spannungsversorgung ist auch i.O.
SD-Karte ist auch i.O.
der uC funktioniert auch

An der Schaltung ist bis auf die etwas längeren Kabelverbindungen auch 
nix verkehrt.

Wenn über SPI ein Byte geschickt wird, dann wird doch bitweise auch das 
MISO-Register des Slave durchgeschoben oder?
Also müsste man auf der Leitung ja auch ein Wackeln sehen, wenn ständig 
Daten über den SPI geschickt werden, gell?
#1414377
Lesenswert?

Hallo

Ich hab hier mal mein Projekt angefügt. Es wäre toll, wenn jemand von 
euch das mal bei sich reinladen könnte und mir sagen könnte, ob der Code 
so funktioniert.
Ich zweifle nämlich langsam an meinen Fähigkeiten, weil ich diese simple 
Grütze nicht zum Laufen kriege.

Ihr müsst praktisch nur den Ausgangspin für das Chipselect in der mmc.c 
ändern.

Vielen Dank
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren