Forum: Mikrocontroller und Digitale Elektronik 16-Bit Mono RAW Audio


von Axel L. (ligonap)


Lesenswert?

Zum Abspielen von RAW-Audio-Dateien (8-bit, unsigned, Mono, 22050Hz) von 
einer MicroSD-Karte über Pin43 (OC0A) auf einem ATMega644 (16MHz) 
verwende ich:
- einen Doppelpuffer / ISR(TIMER1_COMPA_vect)
- Fast PWM mode 3 / Timer0
- Non-inverting PWM auf OC0A
- Kein Prescaling
- CTC Mode - Clkio/8 / Timer1
- Compare Register OCR1A = ((F_CPU / 8) / 22050) - 1

Klappt soweit alles einwandfrei.

Nun möchte ich auf 16-Bit RAW-Audio-Dateien (16-bit, unsigned, Mono, 
22050Hz) wechseln. Dazu habe ich ein paar Fragen:

Kann man einfach 16 Bit einlesen und an den entsprechenden Wert an Pin14 
(OC1A) ausgeben?

Oder müssen zweimal 8 Bit einlesen werden? Falls ja, wie wird dies 
bewerkstelligt?

Leider gibt es im Netz und auch hier im Forum nicht viel zu diesem 
Thema, nur jede Menge zu MP3.

von spess53 (Gast)


Lesenswert?

Hi

>Nun möchte ich auf 16-Bit RAW-Audio-Dateien (16-bit, unsigned, Mono,
>22050Hz) wechseln.

Schon mal daran gedacht, das bei 16MHz deine PWM-Frequenz des 
16Bit-Timers nur noch ca.244Hz beträgt?

MfG Spess

von Axel L. (ligonap)


Lesenswert?

Nun, ChaN schafft es ja auch mit 16MHz:

http://elm-chan.org/works/sd8p/report.html (ATtinyX5)
http://elm-chan.org/works/sd20p/report.html (ATtiny861)

Dies sollte dann erst recht mit einem ATMega644 möglich sein, oder 
nicht?

von spess53 (Gast)


Lesenswert?

Hi

>Dies sollte dann erst recht mit einem ATMega644 möglich sein, oder
>nicht?

Nein. Die ATTiny25/45/85 haben eine PLL, die den Timer mit 64 MHz laufen 
lässt. Und die hat dein ATMega 644 nicht.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Nachtrag: Die o.g. ATTinys besitzen keinen 16 Bit-Timer. Ich gehe davon 
aus, das er bei 16 Bit nur die oberen 8 Bit benutzt. Das mit der PLL 
gilt auch für den ATTiny861.

MfG Spess

von der alte Hanns (Gast)


Lesenswert?

Der ATtiny861 hat einen 10-bit-Timer, damit sind dann 64 MHz/1024 = 62.5 
kHz PWM-Frequenz bzw. 31.25 kHz phasenkorrekt möglich.

von Axel L. (ligonap)


Lesenswert?

Mal zum vertändnis von RAW/WAV: Bisher lese ich immer 512 Byte in den 
Puffer und schiebe sie zu 8-Bit-Einheiten (-128/+128) zum OC0A.
Kann man nicht den Datenstrom auf 1024 Byte erhöhen und paarweise zu 
16-Bit (-32768/+32768) auf den entsprechenden OC1A schieben?

von spess53 (Gast)


Lesenswert?

Hi

>Kann man nicht den Datenstrom auf 1024 Byte erhöhen und paarweise zu
>16-Bit (-32768/+32768) auf den entsprechenden OC1A schieben?

Und was nutzt dir das? Dein Controller ist für eine 16-Bit-PWM einfach 
um Größenordnungen zu langsam.

MfG Spess

von Frank K. (fchk)


Lesenswert?

Du verwendest einfach einen ungeeigneten Controller.
Das hier wäre ideal für Dich und preislich auch nicht teurer als Dein 
Mega644p:

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en532299

Hat einen eingebauten Stereo-DAC, und wenn Dir der nicht reicht, dann 
kannst Du per I2S auch einen externen Codec anschließen. Obendrein hast 
Du damit die dreifache Rechenleistung eines AVR, und noch mehr, wenn Du 
die 40 Bit DSP-Einheit ausnutzt.

fchk

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.