Hallo !
Ich habe einen funktionierenden Wav-Player mit einem Atmega168
aufgebaut. Ich bin aber mit der Soundqualität nicht so wirklich
zufrieden. Die Ausgabe mache ich über fast-PWM, kriege es aber einfach
nicht hin, den 16-Bit Timer richtig zu füttern um eine 16bit Datei
abzuspielen.
Der Code ist zum Teil abgeschaut, so in voller Gänze habe ich die Timer
noch nicht verstanden.
Kann mir bitte jemand helfen ?
Wenn Dein Atmega 24Mhz hat und Du ein Signal mit 16bit Auflösung der PWM
ausgeben willst, dann schaffts Du max. nur 366Hz und nicht 44.1kHz.
Kann also nicht gehen!
Gruss,
avrGerd
Ansich ist es ganz einfach:
du musst die 20Mhz einfach mal durch 2^16 teilen, da ergibt sich maximal
306 Hz. Ich empfehle eine deutlich geringere Auflösung zu verwenden. bei
10 bit sinds immerhin noch 20khz.
Hi
>Wie berechnest du diese Frequenz ?>Mein Atmega läuft mit 20MHz.
Bei dir: 20MHz/65536=305,1758Hz
Du must dich entscheiden. Entweder 16Bit oder 44,1kHz.
>bei 10 bit sinds immerhin noch 20khz.
Oder 9Bit/44,1KHz bei 22,1184MHz.
MfG Spess
Ahhhh...
so langsam fällt der Groschen.
War jetzt auf dem Holzweg... das 16bit doppelt so viel wie 8bit sind...
aber das ist ja expotentiell... Anfägerfehler
Hi
>Gut, dadurch, dass es ein 8 bit Prozessor ist und ich 16 bit>benutzen will:
Das hat nichts mit 8-Bit-Controller zu tun. Wenn du eine Auflösung von
16 Bit haben willst brauchst du auch eine 16-Bit PWM. In deinem Programm
hat die PWM eine Auflösung von etwa 8,8 Bit.
MfG Spess
Machen 10Bit/20kHz einen Qualitätsunterschied zu 8Bit/44,1kHz ?
Und vor allem mit welchen Programm kann ich eine wav Datei so verändern?
(Die meisten bieten nur den Standart an: 8/16, 22,05/44,1)
Sven W. schrieb:> Wie rechne ich das im Programm um ??? und wo?
hast du das Programm geschrieben oder nur kopiert?
> i=*rptr++;
i = i >> 6;
> OCR1A = i + (i>>1)+33;
schon wird eine 16bit datei als 10bit ausgegeben (PWM muss aber noch
angepasst werden)
Peter II schrieb:> Sven W. schrieb:>> Wie rechne ich das im Programm um ??? und wo?>> hast du das Programm geschrieben oder nur kopiert?
Teilsweise kopiert, aber auch viel selbst ausgedacht.
Wie schon gesagt, das mit den Timern und PWM habe ich noch nicht so ganz
verstanden - also das zusammenspiel der beiden.
>>> i=*rptr++;> i = i >> 6;>> OCR1A = i + (i>>1)+33;
Danke für den Tipp. (Bitverschiebung, eigendlich ganz logisch...)
>> schon wird eine 16bit datei als 10bit ausgegeben (PWM muss aber noch> angepasst werden)
spess53 schrieb:> Ja, mit ICR=65535 wären es 16 Bit. Aber mit ICR1=451 hast du nur noch> die erwähnten 8,8Bit.
Das bedeutet: 16Bit, mono, 44,1khz Wav-Dateien funktionieren dann mit
meinem Programm ? Oder sind da noch andere Anpassungen zu machen ?
z.B. bei den OCRxx Registern ?
Gibt es eigendlich ein gutes Buch zum Thema Atmega ?
> Ja, mit ICR=65535 wären es 16 Bit. Aber mit ICR1=451 hast du nur noch> die erwähnten 8,8Bit.
Ich habe darüber gerade mal (versucht) nachzudenken.
Die 451 resultiren ja aus der Rechnung CPU-Takt / 44.1kHz.
Nach meinem Verständnis heißt das:
Nach 451 Zählern (Takten) löse Interrupt aus und führe Routine
ISR(TIMER1_OVF_vect)aus, also lade Register für PWM neu.
Mit ICR1=451 441000 mal die Sekunde
Mit ICR1=65535 305 mal die Sekunde
Oder????
Aber ich will doch alle 451 Takte mein Register neu laden. nur muss ich
jetzt den 16 Bit PWM laden und da weiß ich nicht wie.