Hallo Alle, hat schon mal jemand versucht, einen WAV-Player mit einem Atmega und SD-Karte zu bauen? Ich weiß, es gibt so ein Projekt von Elm-Chan in Assembler mit einer Attiny. Ich würde aber liebe C verwenden. Jetzt frage ich mich, ob z.B. die Datenrate der SD-Karte wie z.B. mit http://code.google.com/p/sdfatlib/ ausreichen würde, um einen WAV-Player zu bauen. Hat jemand von euch Efahrung?
Hallo TravelRec, schönes Projekt. Wie ich sehe, verwendest Du einen relativ flotten XMega. Ich würde gerne eine Player mit einem Atmega8 bauen, der nur MONO-WAV Files mit 8Khz auf seinen PWM Ausgang ausgibt. Daher frage ich mich, ob es eine fertige FAT-Lib gibt, die diese Geschwindigkeit erreichen kann. Gruß, chris
> Ich würde gerne eine Player mit einem Atmega8 bauen, der nur MONO-WAV > Files mit 8Khz auf seinen PWM Ausgang ausgibt. Ich hab das fuer erste Tests mal mit dem SH7262 gemacht. Das ist natuerlich eine ganz andere Klasse als dein Mega8. In der Praxis sind zumindest meine alten SD-Karten meist ein kleines bisschen zu langsam um 16Bit PCM Stereo zu schaffen. Und das liegt auch wirklich an den SD-Karten. Kann man ja einfach messen indem man mal mit dem SPI-Clock rumpielt. Fuer 8Bit Mono-WAV sollte es aber locker reichen. Dein Problem ist aber ein ganz anderes. Ich lese einfach ein paar Sektoren in einen Buffer ein und waehrend ich lese spielt der Prozessor das WAV mit seinen DMA direkt aus dem Buffer ab. Diese Gleichzeitigkeit hast du nicht. Du wirst sie also mit einem schnellen IRQ loesen muessen und das zieht den Mega8 natuerlich noch weiter runter. Zusatzlich hat dieser MagerController auch nur sehr wenig Ram, du hast also kaum Luft. Ich glaube nicht das es unmoeglich ist, aber du wirst dich schon etwas anstrengen muessen. :-) Olaf
chris schrieb: > Wie ich sehe, verwendest Du einen relativ flotten > XMega. Ja, war nötig aufgrund der Anforderungen an die Wave-Auflösung und Bittiefe. chris schrieb: > Ich würde gerne eine Player mit einem Atmega8 bauen, der nur MONO-WAV > Files mit 8Khz auf seinen PWM Ausgang ausgibt. Das hört sich aber grauselig an. Da bist Du mit einem mp3-Decoder mit 128kbps besser beraten. chris schrieb: > Daher frage ich mich, ob es eine fertige FAT-Lib gibt, die diese > Geschwindigkeit erreichen kann. Das sollte noch zu schaffen sein. Mit dem Handling dürfte ein Mega8 aber schon ganz ordentlich zu tun haben, da er auch recht wenig SRAM besitzt. Eine SD-Karte liefert und will minimal 512Bytes pro Sektor.
>Ich glaube nicht das es unmoeglich ist, aber du wirst dich schon etwas >anstrengen muessen. :-) Das ist schon klar, deshalb genau interessiert mich das Projekt. >Das hört sich aber grauselig an. Da bist Du mit einem mp3-Decoder mit >128kbps besser beraten. Es ist kein Hifi. Mit 8Khz und 8 Bit erhält man aber schon gute Telefonqualitätt ( siehe ISDN ). >Das sollte noch zu schaffen sein. Mit dem Handling dürfte ein Mega8 aber >schon ganz ordentlich zu tun haben, da er auch recht wenig SRAM besitzt. >Eine SD-Karte liefert und will minimal 512Bytes pro Sektor 512 Byte hört sich noch gut an, der Atmega hat ja 1024. Hier gibt es 2GB SD Karten für 3 Euro. Zusammen mit einem Atmega8 für 1,20€ ließen sich damit wunderbar billigt Spielgerätchen bauen.
chris schrieb: > Es ist kein Hifi. Mit 8Khz und 8 Bit erhält man aber schon gute > Telefonqualitätt ( siehe ISDN ). ISDN arbeitet mit Kompression. Siehe hier: http://www.elektronik-kompendium.de/sites/kom/0312291.htm chris schrieb: > 512 Byte hört sich noch gut an, der Atmega hat ja 1024. Ja. Aber nur ein Pufferspeicher ist unschön und unnötig kompliziert. chris schrieb: > Hier gibt es 2GB SD Karten für 3 Euro. Zusammen mit einem Atmega8 für > 1,20€ ließen sich damit wunderbar billigt Spielgerätchen bauen. Wenn nur der Preis zählt, dann ja.
> 512 Byte hört sich noch gut an, der Atmega hat ja 1024.
Hm..je laenger ich darueber Nachdenke um so mehr glaube ich der olle
Mega8 ist damit ueberfordert.
Du brauchst 512Byte Puffer um von deiner Speicherkarte zu lesen. Du
brauchst allermindestns 512Byte Buffer fuer PCM Daten die gerade
abgespielt werden. Oh..und du brauchst vielleicht noch ein paar andere
Variablen und einen Stack. Mit anderen Worten ist wuerde das nicht mit
einem Controller machen der nicht wenigstens 2k hat, besser noch 8k
damit das Filesystem nicht so auf Kante genaeht ist und man vielleicht
noch 1-2Buffer mehr fuer die PCM Daten hat.
Olaf
Jaja, der gute alte Elm-Chan. Meiner Meinung nach der beste Elektronikbastler auf dieser Welt. Ich kannte das Projekt schon. Er hat die zeitkritischen Routinen in Assembler ausgelagert. Für mich war die Frage interessant, ob es in pur C möglich ist. Vieleicht müsste man dem Atmega dann einen 16MHz Quarz verpassen. Den Kompromis würde ich noch eingehen.
Vergiss es, du brauchst min. 2k RAM. 512 Byte Lesepuffer für die Daten von der SD, 512 Byte Ausgangspuffer und noch 512 Byte in dem du den aktuellen Teil der FAT liegen läßt, sonst mußt du nach jedem Block Daten wieder 512 Byte FAT einlesen, was die eh schon langsame Geschwindigkeit nochmal halbiert. Ich hatte mal mal nen MP3 Player gebastelt, der lief ähnlich und war knallhart in Assembler auf Geschwindigkeit optimiert. SD -> SPI -> Mega23 -> SPI -> MP3-Decoder Maximum waren Dateien mit ca 250 Kilobit/s und die 2k RAM waren bis aufs letzte Byte ausgenutzt MfG
> Jaja, der gute alte Elm-Chan. Meiner Meinung nach der beste > Elektronikbastler auf dieser Welt. Nachdem was ich in der Transistor Gijutsu so sehe ist Elm einfach nur gehobener japanischer Standard. Er unterscheidet sich von den meisten anderen nur darin das er auch noch English kann und wir ihn deshalb lesen koennen. > Jaja, der gute alte Elm-Chan. Meiner Meinung nach der beste > Elektronikbastler auf dieser Welt. Sicher ist das zeitkritisch, aber ich denke das sich C und Assembler da nicht so viel nehmen. Das Problem sehe ich eher im Ramverbrauch. Ich hab mir jetzt sein petitfs nicht so genau durchgelesen. Es kann sein das er z.B mit kleineren Sektoren als 512Byte arbeitet. Viele Karten sollen das ja beim lesen auch unterstuetzen. Aber alle? Und was macht er wenn das Filesystem fragmentiert ist? Ich glaube er wird sich darauf verlassen das dies nicht der Fall ist oder? Aber jetzt kommen ja viele lange dunkle Winterabende. Also beweis ihm das du besser bist und mach es in C. :-) Das Programmieren von Musikanwendungen ist uebrigens gefaehrlich. Nachdem ich beim implementieren von libmad die Ark von Brendon Perry ungefaehrt 3424245235235mal gehoert habe bis alles fehlerfrei lief wurde ich langsam weich im Keks. Ich hab schon gedacht ich hoere Stimmen aus dem Jenseits, aber es war dann doch nur ein Bufferueberlauf. :-D Olaf
Wenn man das FAT weglässt, so vermindert sich der Hauptspeicherverbrauch und das ganze wird ein wenig zeitunkritischer.
>hat schon mal jemand versucht, einen WAV-Player mit einem Atmega und >SD-Karte zu bauen? Ja, ich;) >Ich würde gerne eine Player mit einem Atmega8 bauen, der nur MONO-WAV >Files mit 8Khz auf seinen PWM Ausgang ausgibt. Das ist kein Problem. Mit 16MHz Takt kann man auch 22kHz und 44kHz 8Bit Mono abspielen. 1kB RAM reicht gerade noch für 22kHz. SD Sektor 512 Bytes, DoubleBuffer für AudioIRQ 2x128. Der Rest geht dann quasi für Stack usw. drauf. Viel Luft ist da nicht mehr. Aber es gibt ja auch noch ATMega328;) >Ich hatte mal mal nen MP3 Player gebastelt, der lief ähnlich und war >>knallhart in Assembler auf Geschwindigkeit optimiert. SD -> SPI -> >Mega23 -> SPI -> MP3-Decoder >Maximum waren Dateien mit ca 250 Kilobit/s und die 2k RAM waren bis aufs >letzte Byte ausgenutzt MP3s mit 320kBps kann man auf einem AVR ab 8MHz problemlos abspielen. Das bekommt man locker mit C hin.
>>hat schon mal jemand versucht, einen WAV-Player mit einem Atmega und >>SD-Karte zu bauen? >Ja, ich;) Hast Du es in reinem C hin bekommen? Mich würde interessieren, wie Du es gemach hast.
>Hast Du es in reinem C hin bekommen? Mich würde interessieren, wie Du es >gemach hast. Ja, klar. Siehe hier: Beitrag "Re: Sprachausgabe mit AVR" Es gibt noch eine verbesserte Version wo die Samplerate aus dem Wave Header gelesen wird, aber die muss ich erst mal aufräumen;)
Hey, vielen Dank :-) Ich habe den Code mal kurz überflogen. Der Play-Buffer scheint 256 Byte groß zu sein, so dass das Programm auch mit einem Atmega8 mit 1KB statt dem Atmega32 mit 2KB funktionieren könnte. BTW: wie schafft man es eigentlich, einen Link innerhalb vom MC-Netz auf eine bestimmte Stelle in einem anderen Thread zu setzen?
> BTW: wie schafft man es eigentlich, einen Link innerhalb vom MC-Netz auf > eine bestimmte Stelle in einem anderen Thread zu setzen? Über jedem Beitrag ist ein Link, über den er direkt angesprungen werden kann (mit dem orangenen Hintergrund) mfG ingo
Auch wenn die Frage schon etwas älter ist, hier noch meine Implementierung dazu, die sogar auf einem Tiny13 läuft: Beitrag "WAV-Wiedergabe von SD-Karte mit einem ATTINY13(A)" Gruß, Stefan
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.