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.htmchris 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
>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 ausgenutztMP3s 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