PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit I2C/TWI-Slave -> Master funktioniert



Florian
12.03.2005, 17:39
Hi @ all!
Ich habe mich in letzter Zeit intensivst mit dem Hardware-I2C/TWI-Bus der AVR's beschäftigt.
Der Mastertransmitter (AT-Mega16) funktioniert mittlerweile einwandfrei.
Ich habe ihn mit dem Porterweiterungsbaustein PCF8574 ausprobiert.
Der PCF8574 hat die Adresse 0b01000000 (0x40).
Die selbe Adresse habe ich dem Slavereceiver (AT-Mega8) auch gegeben.
Mit einem Test (LED's an PORTD) habe ich herausgefunden, dass der Slave die Adresse erhält und mit einem ACK bestätigt (Statuscode 0x60), doch die Daten bestätigt er nicht (Statuscode 0x80).
Stattdessen gibt er seine Slaveadresse an PORTD aus!
Woran könnte das liegen, die Leitungen sind alle durchgeprüft!
Unten findet ihr die Codes, Befehle wie "cbi PORTD , 0" sind nur für den oben beschriebenen Test!

Danke für eure Hilfe! :o)

Pascal
12.03.2005, 20:53
könnte es daran liegen, dass du zwei Geräten dieselbe Addresse gibst, ich weiß zwar nicht, welche Fehler daraus resultieren, aber, änder halt mal die Addresse des ATMEGA8, vielleicht hilfts ja

Florian
12.03.2005, 20:58
N'Abend Pascal! :o)
Leider liegt es daran nicht, denn ich nehme immer den anderen vom Bus ab! :o(
Trotzdem Danke! :o)

Pascal
12.03.2005, 21:16
sei ; Interrupts global aktivieren ---> braucht man das überhaupt? ;o)

ich denke schon, ansonsten hast du doch keine Interrupts...

bei mir war das so, dass ich nach dem "sei" noch das TWINT-Bit im TWCR-Register auf 1 setzen musste, ansonsten ging es glaube ich nicht
hab ich das bei dir übersehen, oder geht das auch so?

weiterhin musst du in der ISR des TWI das TWINT-Bit wieder auf 1 setzen, sonst arbeitet das TWI-Modul nicht weiter(das schaltet sich nicht automatisch auf 1)

Florian
12.03.2005, 21:36
Hallo Pascal! :o)
Beim Slave war mir das klar, aber beim Master, muss man da auch sei setzen?
Was meinst Du mit ISR?
Was die beiden letzten Punkte angeht, so werde ich das gleich einmal ausprobieren!

Danke für Deine Hilfe! :o)

Pascal
12.03.2005, 22:01
ups, hab mich nicht deutlich ausgedrückt...wenn du den Interrupt beim Master nicht verwendest, brauchst du das sei auch nicht, ich hab mich auf den Slave bezogen, nur nicht darauf hingewiesen...

ISR = Interrupt Service Routine(ich hab gedacht, dass das ist eine gängige Abkürzung ist)

Florian
12.03.2005, 22:08
Gut, dann kann ich das beim Master ja be-sei-tigen! ;o)

Ich habe schon gerätselt und war garnicht weit weg!
Ich hatte im Kopf: "Interrupt Slave Routine"
Naja, jetzt bin ich schlauer! ;o)

Ich probiere es jetzt gleich mal aus und melde mich dann wieder!
Danke! :o)

Pascal
12.03.2005, 22:46
ich hab mir grad den Mastercode ein wenig angeschaut...ich finde, 0x3 ist als Wert für TWBR recht wenig, ich verwende 0xA und das ist auch das, was das Datenblatt als Minimum empfiehlt

vielleicht ist die Bezeichnung ISR auch nicht die normale, ich hab sie halt mal irgendwo aufgeschnappt und seitdem verwende ich die

Florian
12.03.2005, 22:50
Hallo Pascal!
Ich habe schon von vielen gehört, dass die nur 0x1 usw. benutzen!
Bei 16MHz brauche ich Prescaler = 1 und Bitrate = 3, da ich sonst nicht auf glatte 400kHz komme!
Der PCF8574 frissts ja! *lol*

Naja, das Missverständnis ist ja aufgeklährt! ;o)

Bin gleich soweit, das mit dem sei weglassen im Mastercode funzt und den Rest probiere ich jetzt auch gleich aus! :o)

Florian
12.03.2005, 22:57
Hast Du TWCR erst nach dem sei eingestellt?

Warum und wo muss ich denn das TWINT wieder setzen?

Pascal
12.03.2005, 23:02
teilweise...ich habs folgendermaßen gemacht
TWCR = 0x45;
sei();
TWCR |= 0b10000000;

der letzte Befehl ist eine Oder-Verknüpfung, der das MSB(Bit Nummer 7, also das höchste) setzt
wenn ich das vor dem sei stehen hab, gehts nicht, und was ist, wenn ich das sei vor die ganze Prozedur setze, hab ich noch nicht probiert, da es eben so ging

Florian
12.03.2005, 23:10
Also bei mir ändert sich nichts, wenn ich das umschreibe!
Warum und wo muss ich denn das TWINT wieder setzen?

Pascal
12.03.2005, 23:15
du musst das TWINT am Ende der ISR(in ASM also vor dem ret, oder was zum Teufel man da verwendet) wieder auf 1 setzen
du musst das setzen, weil ansonsten das TWI-Modul nichts mehr macht
dieses wird bei einem Interrupt, also wenn das TWINT-Bit gleich 0 ist, gestoppt, damit man zB Daten auswerten kann
aber das TWINT wird nicht automatisch nach der ISR wieder auf 1 gesetzt, das muss man manuell machen

Florian
12.03.2005, 23:18
Ok, ich probiere es gleich aus!

Florian
12.03.2005, 23:27
Hmmmm, schade!
Der µC gibt leider noch immer, trotz der Änderungen, nur seine eigene Adresse aus, komisch!

Florian
12.03.2005, 23:39
Naja, ich gehe jetzt erstmal ins Bett, trotzdem Danke für Deine Hilfe! :o)

Pascal
13.03.2005, 09:32
kannst du bitte mal den aktuellen Code posten?
ich weiß nicht, ob du es inzwischen geändert hast, aber in dem von dir geposteten Code für den Slave wartest du ja immer darauf, dass TWINT gleich 1 gesetzt wird, das wird aber nicht passieren, weil du das manuell machen musst

Florian
13.03.2005, 10:19
Guten morgen Pascal!
Also im Datenblatt-Beispielcode des Mastertransmitters habe ich das so verstanden, dass der Master immer auf die Bestätigung durch TWINT=1 wartet, bevor er den Statuscode abfragt.
Das Prinzip habe ich auf den Slavereceiver übertragen.
Mit dem Statuscode 0x60 scheint das ja auch zu funktionieren, aber mit dem Statuscode 0x80 nicht.
Ich kann es gelich auch mal ohne ausprobieren! :o)

Mittlerweile vermute ich sogar, dass mein Mega8 kaputt ist, denn ein anderer Mega8 gibt etwas ganz anderes aus, nämlich nicht seine eigene Adresse, sondern garnichts.
Ich werde mir gleich einen neuen Mega8 aus der Kiste kramen und es nochmals ausprobieren.
Im Notfall werde ich auf den Mega8 mal den Mastertransmitter aufspielen und dann sehen, ob er so funktioniert!

Den aktuellen Code werde ich gleich posten! :o)

Pascal
13.03.2005, 11:16
Also im Datenblatt-Beispielcode des Mastertransmitters habe ich das so verstanden, dass der Master immer auf die Bestätigung durch TWINT=1 wartet, bevor er den Statuscode abfragt.

das ist ja auch richtig, zB beim Senden von START, schreibst du was ins TWCR-Register und wartest dann darauf, dass er damit fertig ist, um dann die Addresse zu senden
beim Slave ist das aber anders, wenn der TWI-Interrupt ausgelöst wird, wird das TWINT=0 gesetzt, das TWI ist dann solange inaktiv bis du das TWINT wieder gleich 1 setzt, erst dann arbeitet das TWI-Modul wieder

Florian
13.03.2005, 11:19
Achso, naja dann war das wohl ein Denkfehler meinerseits! :o(
Leider muss ich jetzt ersteinmal für meine Physikprüfung am Di. üben, aber nachher melde ich mich nochmal und probiere es weiter!