Hi
Ich versuche gerade aus dem TDA1543 einen Ton heraus zubekommen - leider
mit wenig Erfolg. Da ich erstmal nur einen Kanal nutzen möchte, habe ich
WS per PWM so getoggelt, dass immer der Linke Kanal beim schreiben aktiv
ist. Ich sende derzeit 8bit per SPI, danach wird WS 2xgetogglt und im
nächsten Interrupt werden die nächsten Daten gesendet. Das einzige, was
man hört, ist ein Knacken im rechten Kanal nach einen Reset des Avrs.
Der IC wird geschätzt 50-60°C heiß. Einen passenden Kühlkörper für DIP8
besitze ich leider nicht.
Der PWM (WS) Takt beträgt 33,5KHz (nachgemessen, µC läuft intern mit
8Mhz). Für die restlichen Leitungen wäre ein Logikanlyser sinnvoll (habe
ich natürlich auch nicht).
Die Schaltung habe ich nach
http://www-user.tu-chemnitz.de/~heha/Mikrocontroller/TDA1543.htm
aufgebaut (für Audio), die Verbindungen auch schon mehrmals überprüft.
Der TDA wird übrigens mit 8V betrieben, der µC mit 5V. Trotzdem sollte
der TDA die 5V als High erkennen. Laut Simulator sollte auch alles
funktionieren, was es aber in der Praxis nicht tut.
http://www.docethifi.com/TDA1543_.PDF
1
.include "m8515def.inc"
2
3
.def low_bufend = r8
4
.def temp = r16
5
.def temp2 = r17
6
.def next_data = r21
7
8
9
.equ BUFLEN = 256
10
11
.equ SPI_DDR = DDRB
12
.equ MOSI = PB5
13
.equ SCK = PB7
14
.equ SS = PB4
15
16
.org 0x000
17
rjmp INIT
18
.org OVF0addr ;Die folgenden Interrupts sind unwichtig, daher werden sie überschrieben
Mit einem out SPDR, next_data wirst du keine Daten an einen TDA1543
übertragen können, und da du vor dem letzten Bit immer WS ändern musst,
kannst du nicht nur einen Kanal beschicken, sondern musst zumindest 1
bit an den anderen Kanal senden.
Danke für deine schnelle Antwort.
Das heißt, wenn ich mit SPI arbeiten möchte muss ich den Zeitpunkt des
PWM-Signals so berechnen, dass es genau beim 7bit umschaltet und dann
noch irgendetwas in den 2. Kanal schreibt. Dafür müsste man den OCR0
Vergleichswert in der ISR neusetzen.
Gibts da etwa keinen eleganteren Weg?
Könnte man auch den Toogle-PWM modus nutzen? Man beschreibt nach jedem
Überlauf ein Kanal, beim nächsten den anderen. Timerfreq wäre x2. Die
beiden Kanäle wären in diesem Falle um ca. 10us verschoben. Kann man das
hören?
Ich hätte gerne 50% Duty beim PWM, da damit zusätzlich eine negative
Spannung erzeugt wird.
Samuel K. schrieb:> Der IC wird geschätzt 50-60°C heiß.Samuel K. schrieb:> Der TDA wird übrigens mit 8V betrieben
Warum zum Geier? Der läuft mit 5V hervorragend, 8V ist die absolut
maximale Obergrenze. Der Chip sollte, wenn überhaupt, dann nur handwarm
sein.
Samuel K. schrieb:> Ich sende derzeit 8bit per SPI, danach wird WS 2xgetogglt und im> nächsten Interrupt werden die nächsten Daten gesendet.
Kannst Du vergessen. Mit SPI bekommst Du kein jitterfreies Signal hin da
Du immer nachladen mußt und somit Pausen erzeugst. So gerät der Wandler
aus dem Takt. Such Dir einen AVR, der sein UART auch als Master-SPI
nutzen kann. Nur damit kannst Du endlose Streams generieren. Einen
direkt gekoppelten Timer, der die Wordclock generiert dazu und dann wird
alles gut. Allerdings wird der Controller mit dem Nachladen der Daten
auch zu 80% ausgelastet sein. Es sei denn, Du hast eine miese Bit- und
Samplerate, wofür Du dann aber den DAC auch nicht brauchst...
Knut Ballhause schrieb:> Warum zum Geier? Der läuft mit 5V hervorragend, 8V ist die absolut> maximale Obergrenze. Der Chip sollte, wenn überhaupt, dann nur handwarm> sein.
Ich habe mich an
http://www-user.tu-chemnitz.de/~heha/Mikrocontroller/TDA1543.htm
gehalten. Unter dem ersten Schaltbild steht er sollte dafür mit 8V
betrieben werden, schließlich beträgt die Ampitude dann auch 2.5V statt
1V.
60°C sollte er aushalten - ich weiß das es besser kälter ist. Ich werde
mich mal nach einem Kühlkörper umschauen. Derzeit habe ich nur einen
Dip16-Kühlkörper, dieser passt aber nicht, da die Koppelkondensatoren
und die ISP-Buchse nah am IC liegen.
Knut Ballhause schrieb:> Kannst Du vergessen. Mit SPI bekommst Du kein jitterfreies Signal hin da> Du immer nachladen mußt und somit Pausen erzeugst. So gerät der Wandler> aus dem Takt. Such Dir einen AVR, der sein UART auch als Master-SPI> nutzen kann. Nur damit kannst Du endlose Streams generieren.
Sollte das wirklich so sein, habe ich ein kleines Problem, da die
Platine schon geätzt ist. Ich habe auf das Datenblatt vertraut:
1
The data in the input registers is simultaneously latched in the output
2
registers which control the bit switches.
Demnach hat der TDA1543 ein 2x16bit Latch und braucht keine Regelmäßiges
Signal. Ich hoffe nur ein kommt auch mit 11Mbit zurecht und nicht nur
mit 9.2Mbit, da ich einen 22Mhz Quarz auf der Platine habe. Bisher läuft
er deswegen mit interem RC-Osc.
Wenn ich mich richtig erinnere, kann der Atmega8515 Uart im SPI-Mode
laufen lassen, allerdings stimmt dafür die Platine nicht.
Laut Beitrag "TDA1543 DAC mit SPI ansteuern" muss nur das WS Signal
regelmäßig sein. Das heißt, es wäre am einfachsten wenn man die alle
Audiodaten logisch um eins nach rechts schiebt.
Um dem Problem näher zu kommen, hab ich mir jetzt doch einen kleinen
Logikanalyser gebaut. Die Abtastfrequenz beträgt 5.3Mhz, was für 4Mhz
SPI Takt reichen sollte (mehr als 5.3Mhz ist mit einem Atmega bei 16Mhz
auch nicht zu erreichen). Das Diagramm ist leider falsch dargestellt. Es
ist mir aber erst jetzt aufgefallen. Oben bedeutet low. Wenn das
Diagramm richtig deute funktioniert das SPI nicht. Es werden viel zu
wenig Clocks gesendet. Außerdem stimmen die Daten nicht.
Im Code habe ich nur die ISR und die Timer initialisierung geändert:
1
.NOLIST
2
.include "m8515def.inc"
3
.LIST
4
5
.def low_bufend = r8
6
.def sregtmp = r9
7
.def rorsreg = r10
8
.def temp = r16
9
.def temp2 = r17
10
.def next_data = r21
11
12
.org 0x000
13
rjmp INIT
14
15
.equ BUFLEN = 256
16
17
.equ SPI_DDR= DDRB
18
.equ MOSI = PB5
19
.equ SCK = PB7
20
.equ SS = PB4
21
22
.org OC0addr ;Die folgenden Interrupts sind unwichtig, daher werden sie überschrieben
23
out SPDR, next_data
24
Ld next_data, X+ ;nächste Audiodaten laden, diese müssen nun nach rechts geschoben werden
25
in sregtmp, SREG
26
out SREG, rorsreg ;voriges LSB laden (darf erst nach dem WS-Flankenwechsel gesendet werden)
27
ror next_data ;nach rechts schieben, dabei wird das LSB an die MSB geschoben
Neuer Versuch: Ich habe den Code von
Beitrag "Soundausgabe funktioniert nicht!!!" umgeändert und damit
endlich mal ein paar Töne erzeugen können. Allerdings alles andere als
der geplante Sinus.
Hat keiner eien Idee was noch falsch sein könnte?
Kleiner Fehler: Es darf natürlich nicht nur inc ZL heißen, sondern adiw
Z, 1.
Jetzt kann ich ein Rechteckton ausgeben. Sinus will immer noch nicht.
Dieser sieht genauso aus wie im vorigen Anhang.
Zudem sieht die Rechteckschwingung nicht sehr sauber aus.
Keiner eine Idee?
Ein paar Anhaltspunkte würden mir schon helfen. Ich weiß shcon gar nicht
mehr was ich alles noch überprüfen könnte, um dem Problem näher zu
kommen.
Der Sinus wird doppelt so hoch abgespielt wie das Rechteck. Sägezahn
wiederum doppelt so hoch wie der Sinus. Eigentlich dürfte das nicht so
sein, da alle Samples 256 8bit Werte einer Schwingung enthalten.