Forum: Mikrocontroller und Digitale Elektronik *.wav während des Sampling auf SD ausgeben


von Kalle (Gast)


Lesenswert?

Hi,

habe da mal eine Frage nach Erfahrungen oder Wissen ob und wie ich 
folgendes realisieren kann.

Ich möchte wav-Daten die ich über den ADC am Atmega644p erzeuge, während 
des Samling auf SD-Karte schreiben. Ich nutze Bascom im Verbund mit 
AVR-DOS für die Dateisystemverwaltung.

Kann ich nun während des Sampling die Daten direkt auf die SD-Karte 
schreiben?

Ich weiss ja (durch die eine Sekunde) am Anfang schon die Dateigröße. So 
könnte ich den "Header" der wav-Datei schreiben, anangen zu samplen und 
die Bits so schreiben wie sie kommen.

öffne neue wav
schreibe den header der wav
DO solange die Sekunde noch nicht rum ist
   lese ADC1
   schreibe ADC1-Wert auf die SD
   warte 12us oder so
LOOP
schließe wav


Bei 8Bit/8Khz Sampling bekomme ich so 8kb/sec. Verlangsame ich dadurch 
den Samplingprozess? Wenn ja, kann ich berrechnen um wiviel ich ihn 
verlangsame?

Vielleicht merkt man an der Fragestellung dass ich ziemlich am Anfang 
der uControler-Entwicklung stehe^^

Gruß
Kalle

von Benedikt K. (benedikt)


Lesenswert?

So wird das nichts, denn das Schreiben auf die SD Karte dauert zwischen 
wenigen µs und einigen 100ms je nachdem ob gerade ein neuer 
Sektor/Cluster angefangen wird.
Bau dir zwei Puffer im RAM, in die du die Sampledaten in einem Timer 
Interrupt schreibst. Ist ein Puffer voll, wird dieser auf die Karte 
geschrieben und währenddessen der andere Puffer gefüllt. Worst Case muss 
dieser Puffer aber jeweils >1kByte groß sein. Kleinere Puffer können 
(und werden warscheinlich) funktionieren, müssen aber nicht. Es wird mit 
Sicherheit SD Karten geben die ab und zu Probleme machen.

von Kalle (Gast)


Lesenswert?

Hi,

danke für diesen Denkansatz. Ich benutze einen Atnega644p, dadurch bin 
ich glücklicherweise in der Situation diese beiden Kb frei zu haben.

Du schreibst:
> µs und einigen 100ms je nachdem ob gerade ein neuer
Sektor/Cluster angefangen wird.

Was denkst Du, erfahrungsgemäß, wie schlimm die Ausreiser "einige 100ms" 
wohl höchstens sein könnten?

Wenn ich 1kb-Blöcke schreibe, so habe ich 125ms pro Puffer. Wird das 
denn auch im extremfall ausreichen?

gruß
Kalle

von Benedikt K. (benedikt)


Lesenswert?

Kalle wrote:

> Was denkst Du, erfahrungsgemäß, wie schlimm die Ausreiser "einige 100ms"
> wohl höchstens sein könnten?

Einige 100ms können ab und zu durchaus vorkommen, wenn gerade das 
wear-leveling etwas zu tun hat, siehe auch hier:
Beitrag "Schnelle SD-Karte im SPI-Modus?"

> Wenn ich 1kb-Blöcke schreibe, so habe ich 125ms pro Puffer. Wird das
> denn auch im extremfall ausreichen?

2x 1k (1k=1024Byte=2 Sektoren) Puffer sollte für viele Fälle reichen, 
aber es wird bestimmt einige wenige SD Karten geben, bei denen das ab 
und zu nicht reicht.

von holger (Gast)


Lesenswert?

>Wenn ich 1kb-Blöcke schreibe, so habe ich 125ms pro Puffer. Wird das
>denn auch im extremfall ausreichen?

Nein, ich habe auch schon 300ms gemessen.
Wenn du mit 125ms auskommen musst, dann musst du
eine Karte finden die halt kein längeren Aussetzer macht.
Viel Spaß beim suchen :(

von Kalle (Gast)


Lesenswert?

okay,

nicht sehr motivierend ;)

Hat denn jemand Erfahrungen welche Speicherkarten als gut gelten und 
welche nicht? Gibt es einen besonders guten Hersteller?

Manhört ja viel, doch auch wird viel das Marketing dazu beitragen, oder 
ist eine Kingston oder SanDisk Karte wirklich besser als andere?

Gruß
Kalle

von Tobias P. (hubertus)


Lesenswert?

Von SanDisk gibt es ja besondere 'Ultra Highspeed SD-Karten'.
Vielleicht taugen die für sowas?

So ganz nebenbei frage ich mich natürlich schon: Warum dauert das bis zu 
mehreren 100 ms?
Das ist ja völlig unbrauchbar, zumal man ja im Voraus nicht wissen kann, 
ob demnächst der Schreibvorgang 100ms oder 100 us dauert.

von Benedikt K. (benedikt)


Lesenswert?

Tobias Plüss wrote:

> So ganz nebenbei frage ich mich natürlich schon: Warum dauert das bis zu
> mehreren 100 ms?

Eine SD Karte hat größere Sektoren als nur 512Byte. Daher müssen in der 
Karte z.B. 2 oder 4kByte gelesen werden und wo anderst hingeschrieben 
werden (wear Leveling). Dazu kommt noch, dass die FAT Tabelle 
aktualisiert werden muss usw.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

2kB Puffer werden für die meisten Karten nicht reichen. Ich habe 6kB als 
Ringpuffer ausgeführt und ab und zu noch Aussetzer, hauptsächlich in den 
vorderen Sektoren der verschiedenen Karten. Um alle Aussetzer 
wegzubekommen, muß man mindestens 300ms des aktuellen Sampleaufkommens 
puffern können. Die Geräte, für die SD-Karten eigentlich gedacht sind, 
haben meistens genug Speicher an Board, Mikrocontroller tun sich hier 
etwas schwer oder man braucht halt externe Bausteine und dementsprechend 
viele Portpins.

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.