Forum: Projekte & Code WAV-Wiedergabe von SD-Karte mit einem ATTINY13(A)


von Stefan K. (nukeman)


Angehängte Dateien:

Lesenswert?

Hallo liebe Freunde der Mikroelektronik!

ich möchte hier gerne eine aktuelle Entwicklung von mir zum Besten 
geben.
In dieser minimalistischen Form habe ich das im Netz bisher noch nicht 
finden können.
Den grössten Teil des Wissens und der Software dazu habe ich aus dem 
Netz bezogen, dann stark optimiert und möchte das Ergbnis jetzt gerne 
hier veröffentlichen.
Dies ist eine C-Software, die WAV-Files mit 18,75kHz Samplerate, 8 Bit 
PCM Mono mittels eines ATTINY13(A) = 30ct-Prozessors (9.12.2017 ebay als 
5er Pack) von einer "normal neu formatierten und beschriebenen" 
FAT16-SD-Karte wiedergibt.
Die Qualität ist auch ohne aufwändige externe Filter schon ganz 
ordentlich und viel besser als man das entsprechende 4/8kHz 4/8-Bit 
Grusskarten-Gequäke bisher kennt. Vom ATTINY13 wird in 
Minimal-Konfiguration nur die Hälfte
des verfügbaren RAMs (=32Byte) benötigt (ja, die Standard-Sektor-Grösse 
bleibt 512 Bytes, spielt kaum eine Rolle) und im Flash sind auch noch 
ein paar Bytes(max. 146) frei, so dass evtl. sogar noch eine kleine zus. 
Anwendung
auf diesem Proz laufen kann, Pins müssten dann für zusätzliche 
Funktionen gemultiplext werden. Kann schnell auf andere Prozessoren mit 
mehr Pins/Ressourcen portiert werden. Es braucht an HW-Unterstützung nur 
den Timer0 mit OC0A
als Hardware-PWM, SPI ist Software. Die SD-Karte MUSS FAT16 formatiert 
sein und darf nicht fragmentiert sein, die maximale Wiedergabe-Dauer 
liegt dann bei etwa 1,84GB nutzbarem Inhalt: 1,84GB / 18.7kBytes/s = 
~27h, sollte für die
allermeisten Anwendungsfälle ausreichen :)
Der "Trick" ist, dass die Karte per Double-Buffering mit nur 16 bzw. 32 
Byte-Vorhalt gelesen wird und jedes Sample nur für 2 PWM-Perioden 
anliegt.
In reinem Assembler würde man den Flash-Verbrauch wahrscheinlich noch 
auf etwa die Hälfte drücken können.
Anleitungen zur Erstellung der SD-Karte, HW-Minimal-Schaltung, 
Beispiel-Sound-Aufnahme, Anleitung zur Konvertierung des WAV-Files und 
fertiges HEX-File etc. siehe angehängte ZIP-Datei und enthaltene 
readme.txt.

Fotos vom Serviervorschlag "DIP-Sockel an SD-Adapter-Karte in 
Freiluft-Verdrahtung" habe ich mal beim dicken Kim in Übersee 
hinterlegt:
https://mega.nz/#F!ZwsEiKRL!IRHqlOjgTfNEtaYAxG9Q6g

Have fun!
Q.E.D.


Gruß,
Stefan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefan K. schrieb:
> Fotos vom Serviervorschlag "DIP-Sockel an SD-Adapter-Karte in
> Freiluft-Verdrahtung" habe ich mal beim dicken Kim in Übersee
> hinterlegt:

Warum? Warum nicht einfach als Anhang hier hochgeladen?

von Georg G. (df2au)


Lesenswert?

Vermutlich bin ich blind... aber ein Schaltbild wäre hilfreich.

von Äxl (geloescht) (Gast)


Lesenswert?

Gut gemacht, mitm Tiny13 ;)
Schön wäre es, wenn er die Samplerate aus dem Header ausliest und den 
Timer entsprechend einstellen würde. Aber: ich hab keine Ahnung von 
"sowas".


> Vermutlich bin ich blind... aber ein Schaltbild wäre hilfreich.
1
/*
2
3
 Ports auf Eval-Board
4
  
5
Fkt.     AT11/12/13   2313     JP40
6
-----------------------------------
7
Out      5-PB0 OC0A   17-PB5
8
MISO     6-PB1 OC0B   18-PB6
9
SCK      7-PB2        19-PB7
10
CS       2-PB3        16-PB4
11
MOSI     3-PB4        15-PB3

das habe ich in der sdread.c gefunden

Äxl

von Stefan K. (nukeman)



Lesenswert?

@rufus:
Weil das Formular hier schon zu Datensparsamkeit bei den Anhängen 
aufruft, dachte ich, das "Beiwerk" könnte vielleicht besser ausgelagert 
werden.
Hab die Fotos hier jetzt mal zusätzlich angehängt, dann ist hier auch 
alles komplett.

@Äxl,Georg:
Prinzipiell wäre es natürlich möglich die Samplerate aus dem WAV-Header 
zu lesen, aber zumindest der Tiny13 ist mit der eigentlichen Wiedergabe 
schon fast völlig ausgequetscht und absolut auf maximale 
Wiedergabe-Performance getrimmt. Da fand ich es sinnvoller, mit einem 
einzelnen Kommando auf dem PC vorher das passende Format zu erzeugen.
Wahrscheinlich wäre es a la "1 links 1 rechts, 2 fallen lassen" möglich, 
ein passendes Downsampling zu implementieren.

Wegen Schaltplan war ich wirklich etwas spärlich, in der gleichen Datei 
ist
direkt unter der Tabelle eine "Zeichnung" wie der DIP-Sockel am Besten 
an die SD-Karte passt. Gut, die Ansicht des Sockels ist von unten, das 
erklärt sich vielleicht nicht unmittelbar von selbst :)  :
1
  SD-Card
2
     
3
  /  1   2  3   4   5   6   7
4
  9  CS  DI GND VDD SCK GND DO  NC NC
5
     |   |  |
6
     |   |  |
7
     |   |  |
8
  1  2   3  4
9
  /R CS  MO GND
10
  
11
  
12
     SCK
13
  VCC    MI Out
14
  8  7   6  5
15
  
16
  DIP-Socket

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan K. schrieb:
> Weil das Formular hier schon zu Datensparsamkeit bei den Anhängen
> aufruft,

Das ist doch nur, weil es völlig nervig ist, wenn bedenkenlos die
zig Megapixel Rohformat der Kamera den Nutzern aufs Auge gedrückt
werden, um dann einen ATtiny13 abzulichten, den man vielleicht mit
maximal 10 x 10 cm² vor sich auf dem Bildschirm dargestellt haben
möchte.  Schließlich muss sich dann jeder mehrere Megabyte laden,
nur dafür, dass sie jeder einzelne Computer im Anschluss auf ein
darstellbares Maß reduziert.

Aber Bilder an sich sind durchaus gewünscht – danke fürs Hochladen!

Beitrag #5248277 wurde von einem Moderator gelöscht.
von Georg G. (df2au)


Lesenswert?

Stefan K. schrieb:
> Wegen Schaltplan war ich wirklich etwas spärlich

Den Anschluss der SD-Karte kann man aus dem Quelltext heraus 
nachvollziehen.
Aber, was für einen Lautsprecher hast du genommen, was für einen 
Tiefpass? Das sind die Ecken, über die ein Anfänger sofort stolpert.

von Stefan K. (nukeman)


Lesenswert?

Bei dem analogen Teil habe ich es mir sehr einfach gemacht:
Die Aufnahme im Anfangspost ist tatsächlich nur mit dieser Beschaltung
gemacht worden:
1
Pin 5-----+
2
          |
3
          -
4
         | | 2.2k Poti
5
         \ |
6
         |\|                
7
         | \-------------(  3.5mm Klinke
8
         | |
9
          -
10
          |
11
         GND
Mit 3.5mm Klinke dann weiter auf so einen Brüllwürfel mit AUX-Eingang.
Ohne DC-Auskopplung auf meiner Seite.
Hatte kurz eine Auskopplung zwischen Pin5 und dem Poti mit 100nF 
versucht, aber das hörte sich dann mumpfelig und leise an, also hab ich 
es weg gelassen und an der Stelle nicht weiter experimentiert. Beim 
Filter-Design habe ich auch wenig Erfahrung.

Bei den anfänglichen Tests hatte ich einfach einen kleinen 16 
Ohm-Lautsprecher 0,5W mit vorgeschaltetem 470 Ohm Widererstand 
betrieben:

Pin 5------[ 200-600R ]--- LSP --- GND

Wieder keine Auskopplung. Das geht natürlich nicht besonders laut und so 
ein frei rumliegender Lautsprecher gibt auch kein Klangwunder ab. Für 
den Funktionstest reichte es aber.

Beitrag #5266430 wurde vom Autor gelöscht.
von Stefan K. (nukeman)


Angehängte Dateien:

Lesenswert?

Da ich noch weitere Rückfragen zum Schaltplan bekommen habe, hier eine 
kleine Skizze, wie ich das bei mir genau verdrahtet habe.

von Thomas (Gast)


Lesenswert?

Die ersten Töne sind aus dem lautsprecher gekommen.
deshalb habe ich volgende Frage:
muss die komplette Musik oder was auch immer in ein einziges Wav file 
hinein oder kann man mehrer Files auf die Karte schreiben und die werden 
dann nacheinander abgespielt?

von Stefan K. (nukeman)


Lesenswert?

Super! Es wird nur das erste File wiedergegeben, mehrere Sound-Dateien 
müsste man vorher auf dem PC zu einer Datei zusammenpacken.
Es wäre theoretisch möglich, mehrere Files abzuklappern, aber zumindest 
beim Tiny13 wird es dann mit dem Flash-Speicher (zu) eng.

von Arne (Gast)


Lesenswert?

Moin,

nicht ganz so kompakt, dafuer aber 5V-kompatibel und mit Filter:
http://www.elektronik-labor.de/AVR/T13contest/sdsound-tn13.htm

von Stefan K. (nukeman)


Lesenswert?

Moin Arne,

sehr schönes Projekt von Dir und alles sehr ausführlich und detailliert 
dokumentiert!
Das hatte ich echt trotz Recherche vorher nicht gesehen, bevor ich mich 
an mein Projekt gemacht hatte. Wieder nur Zweiter :D
Bei Dir ist es für den Anwender etwas aufwändiger, die SD-Karte schon 
auf Sektor-Ebene zu präparieren, aber dafür wird man nachher mit mehr 
Bedienkomfort belohnt.

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
Noch kein Account? Hier anmelden.