Forum: Mikrocontroller und Digitale Elektronik AVR + DISPLAY + I²C = PROBLEM *** AVR übertrgt das Protokoll nicht richtig


von Alex F. (electronicfox)


Angehängte Dateien:

Lesenswert?

Hallo!

Im vorhinein, dies ist ein Umschulungsprojekt welches ich fertig stellen 
wollte, allerdings ist da der Wurm drin. Die sache äußert sich dadurch, 
dass feste werte sauber übertragen werden, aber VOL, BASS, TREBLE und 
Daten aus dem internen EEPROM des AVRs nicht ankommen. Pull-Ups sind 
1k-Widerstände, interner Takt des µC 4MHz, der Bus ist schon gedrosselt, 
da ich zuerst dachte, der wäre zu schnell und verursacht das Problem, 
was alerdings nicht der Fall war. Fehlercodes gibt es auch keine, hab 
extra dafür ein Script geschrieben, das am Display anzeigt ob der Bus 
blockiert ist oder der jeweilige IC am Bus nicht antwortet.

Das heißt der Bus ist frei und die ICs geben Antwort.
Da ich DAC0 vom TDA8444 als 0 / +5V PIN nutze, sah ich, das der Kanal 
gesteuert wird, nur die anderen nicht. Der Display macht eigentlich 
genau das was ich will. Wahrscheinlich habe ich einen Topfen im Script 
eingebaut, finde allerdings den Fehler nicht. Der Bus ist aber am 
arbeiten und weil ich noch in der Testphase bin ist alles am Steckbrett 
drauf und keine Leitung länger als 5cm.

Im Anhang ist die Assemblerfile, nicht das Beste, aber ich hab versucht 
es Übersichtlich zu gestalten.

Ich hoffe da kann mir einer weiter helfen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

22.5K fremden Assemblercode mit spärlichen Kommentaren und ohne 
Struktogramm debuggen ist stramm.

Verdächtig erscheint mir, dass sich Variablen mit R24-R27 überlappen. 
Genau die Variablen mit denen du Probleme hast.
1
.def vol       = r24
2
.def bass      = r25
3
.def treble    = r26
4
.def sreg_save = r27
5
; ...
6
.def  i2cdelay= r24      ; Delay loop variable
7
.def  i2cdata  = r25      ; I2C data transfer register
8
.def  i2cadr  = r26      ; I2C address and direction register
9
.def  i2cstat  = r27      ; I2C bus status register

Tipp #1:
Erläutere die Grundarbeitsweise deines Programms und wie genau der 
Fehler hervorgerufen wird. Kürze wenn möglich Teile raus, aber so, dass 
der Fehler bestehen bleibt.

Tipp #2:
Ergänze den Quelltext. Jede Funktion bekommt einen Anfangskommentar und 
da steht drin,

* welche Register als Eingabe benutzt werden
* welche Register als Ausgabe benutzt werden
* welche Register intern benutzt werden, d.h. verschmutzt sind

Tipp #3:
Die .def variable = register sind gut und schön, machen aber die 
Sache etwas unübersichtlicher. Ich würde zumindest beim Debuggen den 
Registernamen mitführen (ala bass_r25 o.ä.). Mit Suchen&Ersetzen ganzer 
Worte und Groß-/Kleinschreibung ist das schnell erledigt und ggf. wieder 
einfach rückgängig zu machen.

von Alex F. (electronicfox)


Angehängte Dateien:

Lesenswert?

Hallo Stefan!

Hab jetzt die Registergeändert und siehe da, es geht. Ich muss wohl 
blind gewesen sein. Jeden Falls vielen Dank für die Hilfe. Im Anhang der 
geänderte Code.

von Alex F. (electronicfox)


Angehängte Dateien:

Lesenswert?

Hier noch einige Pics vom fliegenden Aufbau. So schaut das Teil aus wenn 
es funktioniert ;-)

Der Display ist von Batron, die Kontrastplatte davor von einem 
ausgedienten VCR. Die TDAs sind aus alten TV-Geräten.

von Alex F. (electronicfox)


Angehängte Dateien:

Lesenswert?

Hallo!

Von Stefan bekam ich einen guten Tipp für das EEPROM. Nun habe ich das 
so geändert, das immer erst das EEPROM beschrieben wird, wenn nur die 
Lautstärke geändert wird.

Auf die Frage warum der TDA8444 dran hängt, der TDA8444 dient als 
Analogausgabe von Bässe, Höhen, Lautstärke, festen Remoteausgang und 
LED-Treiber für die Klangfarbenanzeige.

Das Teil kommt, wenns mal auf der Platine ist, in ein Auto zwischen 
Autoradio-Lineout und Breitbandendstufe und Subwooferendstufe. 
Freigegeben werden die Endstufen erst dann, wenn alles initialisiert ist 
und das Plppen ist auch dann weg. Vorne am Amaturenbrett sitz dann der 
Display und das Bedienteil. Hinten bei den Endstufen findet man später 
die Klangfarbenstatus-LEDs und TDA8444. Falls 3m zulang für den I²C-Bus 
sein sollten, plane ich jetzt schon mal einen Pegelwandler an ;-).

Fotos folgen dann ;-)

von Alex F. (electronicfox)


Angehängte Dateien:

Lesenswert?

Hier die richtigen Datein.

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.