TDA 1543 und Atmega8

Gast #346139
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
Gast #346143
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
Gast #346144
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);
}
#346145
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)
Gast #346149
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
#346151
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!
Gast #346155
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
Gast #346158
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.
#346159
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?
Gast #346160
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
Gast #346162
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
#346163
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.
#346164
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)
Gast #346166
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren