Forum: Mikrocontroller und Digitale Elektronik TDA 1543 und Atmega8


von Ralf (Gast)


Lesenswert?

Hallo,
ich hab eine kleine Schaltung mit einem ATmega 8, dem TDA 1543
Mikrofonverstärker und nem EEPROM.
Sinn der Schaltung soll sein Sprache aufzuzeichen und wiederzugeben,
aber irgendwie bekomme ich keine Ausgabe über den TDA 1543 hin. Ich
habe wie im Datenblatt beschrieben noch einen OP hinter den TDA
geschaltet und sende Daten im 2er Komplement. Aber irgendwie kommt
außer knacken nicht viel, wenn überhaupt.

Hat von euch zufällig jemand schon einen source in C an dem ich mich
orientiren könnte?

MfG
Ralf

von Ludwig W. (lordludwig)


Lesenswert?

hab seit einiger zeit das gleiche problem in grün...

von alfsch (Gast)


Lesenswert?

sind deine daten i2s , 2 kanalig ?

von Ludwig W. (lordludwig)


Lesenswert?

protokoll:
http://www-user.tu-chemnitz.de/~omat/Mikrocontroller/TDA1543-5.gif

hab auch ein asm Programm, muss ich aber noch kommentieren, sonst fallt
ihr um

von Ralf (Gast)


Lesenswert?

Jup sind sie. Ich gebe immer 8 Bit aus und Toggle vor dem LSB die
WS-Ltg.
Hab leider kein Oszilloskop um mir das ganze mal anzusehen. Ich hoffe
mal das der Avr nicht zu schnell ist, läuft mit 12 MHz, wobei nur alle
125µs Daten ausgegeben werden.

Ralf

von Ralf (Gast)


Lesenswert?

Momentan hab ich zwei funktionen zur Ausgabe. Vielleicht hat jemand ne
bessere Idee:

void send_byte (unsigned char byte) {
  unsigned char i, value;

  value = 0x80;
  for (i = 0; i < 8; i++) {
    TOGGLE_BCK;
    if ((byte & value) != 0) PORTD |= (1 << PIND6);
    else PORTD &= ~ (1 << PIND6);
    TOGGLE_BCK;
    value = value >> 1;
    if (i == 6) TOGGLE_WS;
  }
}

void output_sample (unsigned char byte) {
  unsigned char right, left;

    right = ~byte + 1;
    left = ~byte + 1;
    send_byte (right);
    send_byte (left);
}

von Ludwig W. (lordludwig)


Lesenswert?

ich gebe 16 bit aus und Toggle vor dem LSB die WS Laitung :-)

in den 2. kanal (rechts) schicke ich jedoch nur 2 dummybits um zeit zu
sparen, da ich nur den linken kanal brauch.

Das ganze findet mit 8kHz statt und der AVR läuft mit sehr genauen 8Mhz
(=125ns zwischen zwei takten, laut spec min. 22ns also OK)

von Ludwig W. (lordludwig)


Angehängte Dateien:

Lesenswert?

So hab mal das wichtige rausgeschnitten und ausführlich kommentiert...

Vlt. kann ja einer sagen was ihm auffällt oder was ned passt, danke
schonmal!!!

ne recht ausführliche seite die mir auch gut geholfen hat:
http://www-user.tu-chemnitz.de/~omat/Mikrocontroller/TDA1543.htm

von Ralf (Gast)


Lesenswert?

Sendest Du Daten im 2er Komplement?

The TDA1543 accepts input serial data formats in two's complement with
any bit length. Left and right data words are
time multiplexed. The most significant bit (bit 1) must always be
first.

von Ludwig W. (lordludwig)


Lesenswert?

jo, wav is bei 16 bit automatisch im 2er komplement und das sende ich

von Frank Simon (Gast)


Lesenswert?

Hallo,
im Anhang ein funktionierende Code, als externe Assembler-Funktion für
den WinAVR C-Compiler.
Bevor ihr Euch zu sehr freut: der Code muss sicherlich angepasst
werden. Die Hardware ist nämlich etwas spezieller:
1. Es handelt sich um drei TDA1543, die zeitgleich angesteuert werden.
Deshalb werden recht viele Bits jongliert.
2. Es wird in jedem Chip nur der rechte Kanal angesprochen.
Wenn Ihr das merkwürdig findet: das hab ich so gemacht, weil ich nur 50
Mikrosekunden für die Ausgabe hatte)
Noch ein Tip: Du bist mit nem 16 MHz-uC nie zu schnell, das hab ich
alles oszillographiert, also keine Sorge.
Viel Erfolg
Frank Simon

von Frank Simon (Gast)


Angehängte Dateien:

Lesenswert?

...hab natürlich den Anhang vergessen...

von Ludwig W. (lordludwig)


Lesenswert?

ich blick noch ned ganz durch, aber mal ne frage:

Muss ich wenn ich links 16 bit schreibe rechts auch 16 bit schreiben,
oder sollte mein Code eig. funktionieren?

Kannst du dir meinen Code mal ganz kurz ansehen? Müsste schnell gehen,
das meiste wiederholt sich 16 mal... nur wegen der anzahl der bits und
den timings (der vorher angehängte code wird mit 8kHz ausgeführt)

deinen code blick ich noch ned so ganz aber ich werd mal schaun ob sich
was draus machen lässt, währe halt besser wenn mein code so
funktioniert!

von Frank Simon (Gast)


Lesenswert?

...ups, geht leider nicht, weil ich genau jetzt in Urlaub fahre.
Vielleicht nächste Woche, falls das Internetcafe billig ist...
Gruß
Frank

von Ludwig W. (lordludwig)


Lesenswert?

viel spaß wenns noch ned zu spät is :-)

von Ludwig W. (lordludwig)


Lesenswert?

bist du wieder da und könntest dir das vlt. jetzt mal ansehen???

währe echt super!!!

von Frank Simon (Gast)


Lesenswert?

Hallo Ludwig,
also, ob Deine Variblen stimmen und die Ports richtig konfiguriert
sind, weiß ich natürlich nicht. Ich geb Dir mal meine Abfolge in Form
Deiner Kommentare als Quasi-Code an. Bedenke, dass ich den linken Kanal
nicht benutze, sondern nur den rechten. Und dann hab ich das ganze als
Schleife formuliert und Du eben nicht (warum nicht?). Wenn ich das
richtig sehe, sind Deine wesentlichen Fehler, dass Du die Bits in der
falschen Reihenfolge rausgibst und die Sonderrolle für das jeweils
letzte Bit nicht eingebaut hast: WS muss vor dem letzten Clockpuls
getoggelt werden.
mfg
Frank Simon


; nur Vor der ersten Übertragung nötig:
CloCK auf HI
WS auf LO



; Dummy links, nur ein Bit nötig:
DATA-Pin setzen (oder nicht, egal)
WS auf HI
Clock auf LO
Clock auf HI


; Daten rechts:
DATA-PIN setzen (Bit 7)
Clock auf LO
Clock auf HI
DATA-PIN setzen (Bit 6)
Clock auf LO
Clock auf HI

;usw. bis Bit 1:

DATA-PIN setzen (Bit 1)
Clock auf LO
Clock auf HI
;Achtung, Extrawurst fürs unterste Bit:
WS auf LO
DATA-PIN setzen (Bit 0)
Clock auf LO
Clock auf HI

;Fertig

von Frank Simon (Gast)


Lesenswert?

Nachtrag: Hab grad nochmal bis unten nachgelesen, meine Fehleranalyse
ist ja wohl falsch. Egal, meine Ausgabe funktioniert, kannst Du Dich
drauf verlassen...

von Ludwig W. (lordludwig)


Lesenswert?

ah, also ich muss zuerst das 7. bit und dann das 0. bit ausgeben oder?

muss ich dann auch zuerst die hinteren 8bit der 16bit ausgeben oder
muss ich nur jeweils die 2x8bit "falsch herum" ausgeben?

danke auf jeden fall für deine analyse

von Frank Simon (Gast)


Lesenswert?

Nein, meine Reihenfolge ist:

WS schon auf rechts setzen
einziges bit links ausgeben
BCK Impuls
Bits rechts von oben herab (15 bis 1) ausgeben, jedes Mal BCK-Impuls
ws schon auf links setzen
Bit 0 (rechts) ausgeben
BCK Impuls
fertig

Also ich seh grad: bei Dir ist doch der BCK-Puls falsch rum, daran
könnte es liegen.
Viel Erfolg weiterhin
Frank Simon

PS: Übrigens: Meine Hardware ist mittlerweile im Einsatz, ich verwende
den Strom-Spannungswandler wie in der von dir genannten Quelle
beschrieben, funktioniert super, ich steuere von -18 V bis +18 V,
gleichspannungsgekoppelt.

von Ludwig W. (lordludwig)


Lesenswert?

>Bits rechts von oben herab (15 bis 1) ausgeben, jedes Mal BCK-Impuls

ich gebe es ja anders herum aus oder? also ich habe 16bit WAV-Daten
(zweierkomplement) vorliegen und gebe von den ersten 8 bit der datei
die bits 0-7 aus und dann von den zweiten 8 bit der datei die bits 0-6
aus, WS toggeln und bit 7 ausgeben... is wohl falsch herum.

Muss ich jetzt nur immer bit 7-0 der beiden 8bit in der richtigen
reihenfolge ausgeben (d.h. liegen sie in der WAV datei schon "falsch
herum") oder muss ich zuerst vom 2. byte die bits 7-0 ausgeben und
dann von 1. byte die bits 7-1 und dann WS toggeln und dann bit 0
ausgeben?

Beispiel:

Das sind meine 16 bit: 0110111011101100

Liegen die 16 bit dann so vor(also "falsch herum"): 11101100
01101110

Oder liegen sie so vor(richtig herum, also so das ich den zähler auf
byte 2 setzen muss, dann auf byte 1 und dann auf byte 3 weil das währe
ziemlich umständlich): 01101110 11101100

>Also ich seh grad: bei Dir ist doch der BCK-Puls falsch rum, daran
>könnte es liegen.

Die bits werden doch bei steigender Flanke übernommen, also müsste es
mit deiner und mit meiner Lösung gehen, oder?

von Frank Simon (Gast)


Lesenswert?

Ich kenne das wav-Format nicht. Sieht nicht so schön aus...
http://de.wikipedia.org/wiki/WAV_(Format)
Der Chip will jedenfalls die Bits superstur einfach von links nach
rechts, also Vorzeichenbit, dann Bit 14, Bit 13 usw. Du kannst
aufhören, wann Du willst, nur halt WS toggeln vor dem untersten.
Beim BCK-Signal hast Du recht, es gilt die pos. Flanke.
Noch was: wenn Dein Signal richtig schön knarzt, heißt das doch, dass
der ADC jedesmal wandelt. Dann liegt es nicht mehr an der Abfolge von
WS und BCK, sondern nur noch an der Reihenfolge der Bits.
mfg
Frank Simon

von Ludwig W. (lordludwig)


Lesenswert?

>Noch was: wenn Dein Signal richtig schön knarzt, heißt das doch, dass
>der ADC jedesmal wandelt. Dann liegt es nicht mehr an der Abfolge von
>WS und BCK, sondern nur noch an der Reihenfolge der Bits.

Genau das tut er eben nicht...

von Frank Simon (Gast)


Lesenswert?

Ich würd jetzt das wav Format erstmal lassen, eine Zahl hochzählen und
sie jeweils ausgeben, sollte ja einen Sägezahn geben, ist schön zu
hören.
Port-Chips sind initialisiert? DDR..
Bist Du sicher, dass Deine Hardware heile ist?
-- Ich hatte schon fast aufgegeben, weil ich rechts ausgegeben und
links gehorcht hatte.
-- Ein anderes Mal ist der ADC aus unbekanntem Grund abgeraucht, er
wird im Normalbetrieb wirklich schön handwarm.
-- Als ich ihn dann ersetzt hatte, brauchte es einige Zeit, bis ich
bemerkte, dass er die Porttreiber des Mega8 mit gekillt hatte, ich
wusste gar nicht, dass das geht...
mfg
Frank Simon

von Ludwig W. (lordludwig)


Lesenswert?

anscheinend is das im little endian-format abgelegt und noch dazu LSB
first.

Das heißt wenn das meine Daten sind: 0101101101110100
Werden die 2x8bit so abgelegt: 00101110 11011010

Stimmt das so weit?

weil sonst währe des ne wahnsinnige schieberei. (vom 2.byte zum 1. byte
von dort aus zum 4. und von dort aus wieder zum 3. usw.)

Dann werde ich mir die bits warscheinlich erst mal am PC
zurechtschieben.

von Ludwig W. (lordludwig)


Lesenswert?

mist, hab deinen Post zu spät gesehen... eig. ne gute idee... der TDA
wird handwarm und zieht auch seine massen an strom (is ja ned grad
billig was der brauch... is aber auch ned lang an)

wenn du was fertiges da hast, was auf dem linken (oder rechten, lässt
sich ja leicht ändern) kanal was zum testen ausgibt dann bin ich gerne
bereit das zu testen :-)

Kann bei der hitze so schlecht denken... aber das wird schon noch, wenn
du ned zufällig was da hast brauchste jetzt aber nix extra zu
schreiben... das mach ich dann schon, halt erst heut abend wenns kühl
is.

danke auf jeden fall für die hilfe (endlich mal einer der damit schon
gearbeitet hat)

von Ludwig W. (lordludwig)


Lesenswert?

>Port-Chips sind initialisiert? DDR..

was is ein Port-chip? :-)

von Frank Simon (Gast)


Lesenswert?

> was is ein Port-chip? :-)
Hier ist es auch so heiß, ich glaub, da war bei mir auch was
abgeraucht..., ich meine natürlich Port-Pins
Ein einfaches Testding hab ich nicht zu bieten, aber Du kannst die oben
angegebene Routine auch mit call ... vom Assembler aus aufrufen.
mfg
Frank Simon

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.