mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega SD-Card Player in C?


Autor: chris (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Hat jemand von euch Efahrung?

Ja. Siehe hier: Beitrag "SD-Karten-Wave-Recorder"

Autor: chris (Gast)
Datum:

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

Autor: Olaf (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: chris (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Olaf (Gast)
Datum:

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

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: chris (Gast)
Datum:

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

Autor: Matze (Gast)
Datum:

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

Autor: Olaf (Gast)
Datum:

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

Autor: Lukas K. (carrotindustries)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man das FAT weglässt, so vermindert sich der Hauptspeicherverbrauch 
und das ganze wird ein wenig zeitunkritischer.

Autor: holger (Gast)
Datum:

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

Autor: chris (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: chris (Gast)
Datum:

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

Autor: ingo (Gast)
Datum:

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

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.