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
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
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
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); }
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)
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
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.
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
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!
...ups, geht leider nicht, weil ich genau jetzt in Urlaub fahre. Vielleicht nächste Woche, falls das Internetcafe billig ist... Gruß Frank
bist du wieder da und könntest dir das vlt. jetzt mal ansehen??? währe echt super!!!
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
Nachtrag: Hab grad nochmal bis unten nachgelesen, meine Fehleranalyse ist ja wohl falsch. Egal, meine Ausgabe funktioniert, kannst Du Dich drauf verlassen...
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
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.
>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?
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
>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...
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
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.
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)
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.