Forum: Mikrocontroller und Digitale Elektronik Two - Wire Interface


von Torsten O. (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei das TW-Interface zu programmieren, ich arbeite mit 
zwei ATMEGA32. Ich bin soweit, dass vom Master die Startcondition 
gesendet wird. Jetzt habe ich das Datenblatt so verstanden, dass der 
Slave die Startcondition bestätigen muss. Macht er das automatisch oder 
muss ich das via Software machen?

Vielen Dank im voraus


lg Torsten

von AVRuser (Gast)


Lesenswert?

Hallo,

bei TWI gibt es nur für Daten-Telegramme eine Quittierungs-Option 
(Acknowledge) durch den Empfänger; Start- und Stop-Bedingungen werden 
"einfach so" gesendet.

von Torsten O. (Gast)


Lesenswert?

Okay, danke. Also ich bin jetzt soweit, dass die Startcondition gesendet 
ist und habe (also vom Master aus) die Zieladresse gesendet. Wie kann 
der Slave jetzt feststellen ob er seine Slaveadresse empfangen hat? Die 
eigene Slaveadresse steht schon im Adressregister drin.

lg Torsten

von gast (Gast)


Lesenswert?

Macht er intern. Sobald seine Adresse ankommt, fühlt er sich
angesprochen und teilt dem Master mit, das er bereit ist,
Daten zu empfangen.

von Torsten O. (Gast)


Lesenswert?

Ah okay, danke. Also da er das NICHT macht muss ich wohl irgendwo noch 
einen Fehler haben. Dann suche ich mal.

lg Torsten

von AVRuser (Gast)


Lesenswert?

Hallo,

noch zur Ergänzung: zur Überprüfung des Zustandes vom TWI-Interface ist 
das TWI-Statusregister und das TWInt-Flag wichtig. Das Flag teilt eine 
Änderung des Status mit, und das Statusregister liefert den Status-Code 
der stattgefundenen Aktion. Entweder macht man die Abarbeitung in einer 
ISR, oder man prüft das TWInt-Flag, ob es gesetzt ist, und reagiert 
anhand des Statuscodes entsprechend (incl. Rücksetzen des TWInt-Flags).

Das Ganze ist recht genau im Mega32-Datenblatt beschrieben; auch einige 
Beispiele sind dort zu finden (sowohl für die Master- als auch für die 
Slave-Seite).

von H.j.Seifert (Gast)


Lesenswert?

Ich habe eigentlich immer Software-I2C genommen. So richtig bin ich mit 
der Hardwarelösung nie klargekommen, und da es bei mir immer nur um 
ziemlich wenig traffic ging (Uhr, Poti oder ein paar Daten an ext. 
EEProm),  bin ich dabei geblieben. 1000fach bewährte Routinen, da hatte 
ich keine Lust, stundenlang dran zu bleiben.
Gibt auch noch einige andere hier, die Probleme mit TWI hatten.

von Torsten O. (Gast)


Lesenswert?

Hm... also das Statusregister lasse ich mir über fünf LED's am PortB 
ausgeben, so wie sie jetzt leuchten würde das bedeuten, dass im 
Statusregister eine 0x48 steht. Laut Datenblatt gibt es diesen Status 
aber nicht. Hat jemand noch eine Idee?

lg Torsten

von Jörg G. (joergderxte)


Lesenswert?

Wie sieht denn dein Programm aus?
Den slave musst du eben passend einstellen:
 - passende Adresse
 - twi eingeschaltet ;)
 - als slave
 - soll auf empfangene Bytes antworten (TWEA)
 - Lösch das TWINT (falls gesetzt)

Beachte:
a) Das TWEA muss grundsätzlich eingestellt werden bevor das 
Byte/Adresse übertragen wird.
b) TWINT muss immer von Hand gelöscht werden (1 reinschreiben!)
c) der ganze Bus ist blockiert (=low-pegel), solange bei irgendeinem 
angeschlossenen AVR das TWINT gesetzt ist.

hth. Jörg
ps. bei Atmel gibt's dazu App. Notes inkl. Code

von (prx) A. K. (prx)


Lesenswert?

Torsten Ohne schrieb:

> Statusregister eine 0x48 steht. Laut Datenblatt gibt es diesen Status
> aber nicht.

In meinem schon. Im master receive mode.

von Torsten O. (Gast)


Lesenswert?

Aber wenn ich als Zieladresse 0x11 sende bin ich doch im 
Master-Transmitter-Mode, oder nicht?

lg Torsten

von (prx) A. K. (prx)


Lesenswert?

Es gibt zwei gängige Konventionen über den Umgang mit Adressen. 
Offiziell sind das 7 Bit 00-7F und das R/W Bit wird rechts angefügt, 
anderseits findet man sie oft als 8 Bit 00-FE, mit dem untersten Bit als 
R/W-Bit.

Wenn du zur zweiten Fraktion zählst, dann ist 0x11 eine Leseadresse.

Von welcher Seite ist hier eigentlich die Rede? Vom Master oder vom 
Slave?

von Torsten O. (Gast)


Lesenswert?

Mit Zieladresse meine ich den Slave. Ich habe das Datenblatt so 
verstanden, dass ich in den oberen sieben Bits die Adresse festlege und 
das unterste Bit (also das Nullte Bit) gibt an ob ich an den Slave 
senden will ( = 1) oder ob ich vom Slave lesen will ( = 0). Ist das 
falsch?

lg Torsten

von (prx) A. K. (prx)


Lesenswert?

Yep, das ist falsch, weil genau andersrum.

von (prx) A. K. (prx)


Lesenswert?


von Torsten O. (Gast)


Lesenswert?

Oops, danke - ohne dieses Forum und ohne eure Hilfe wäre ich echt 
aufgeschmissen. Dann versuche ich mal den nächsten Schritt, vielen Dank 
:)


lg Torsten

von Torsten O. (Gast)


Lesenswert?

Also ich muss doch noch einmal nachfragen. Aus den Quelltexten im 
Internet werde ich nicht schlau. Ich habe mir zwischenzeitlich einige 
Funktionen gebaut, die mir einen blinkenden Fehlercode anzeigen. So kann 
ich Schritt für Schritt vorgehen und merke genau an welche Stelle ich 
nicht weiter komme. Die Zieladresse ist mit dem "Schreibbit" beim Slave 
angekommen, ich habe versucht an eine andere Adresse zu senden - da 
kommt dann eine Fehlermeldung. Das bedeutet, dass der richtige Slave 
definitiv geantwortet hat.

Wenn ich jetzt das erste Datenbyte übertrage kommt allerdings keine 
positive Meldung vom Slave. Ich würde ja vermuten, dass ich das 
empfangene Datenbyte aus dem Datenregister lesen muss. Leider wird der 
TWI-Interrupt (0x20) im Slave aber nicht ausgelöst, also weiß meine 
Software nicht wann etwas angekommen ist. Ich Controlregister sind die 
Bits TWEA, TWEN und TWIE gesetzt. Kann mir da jemand noch einen Tipp 
geben was ich noch falsch gemacht haben könnte?

lg Torsten

von Spezi (Gast)


Lesenswert?

Wird nach Abarbeiten der TWI-Bearbeitungsroutine auch das TWInt-Bit im 
Control-Register durch Schreiben einer 1 zurückgesetzt? Sonst hängt der 
Slave fest und kann nichts mehr annehmen, bis das Bit gelöscht wird.
Die gesendete Adresse zum Schreiben ist korrekt? (LSB der Adresse = 0)?

von Torsten O. (Gast)


Lesenswert?

Ich würde ja gerne das Interruptflag zurück setzen, aber es passiert ja 
im Slave nichts. Hier ist mal die Main-Routine :

Main:

lds  Value, 0x3b        ; PortA lesen
ldi  Math, 0x01
eor  Value, Math
sts  0x3b, Value        ; PortA0 toggeln

lds  Value, 0x21
sbrc  Value, 0x01
rcall  twowire_Receive_Function

rjmp  Main

In den ersten vier Zeilen lasse ich lediglich eine LED blinken, damit 
ich eine Kontrolle habe ob der Prozessor auch in der Mainroutine 
arbeitet. In den drei nächsten Zeilen prüfe ich den Interrupt des TWI, 
wenn er gesetzt ist soll das Programm verzweigen - macht es aber nicht. 
Ich glaube ich mache das was grundlegendes falsch.


lg Torsten

von Torsten O. (Gast)


Lesenswert?

Die letzten drei Zeilen in der Mainroutine sind natürlich Schwachsinn, 
ich hätte mal gestern eher Feierabend machen sollen.

lg Torsten

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.