ATmega und TWI (SCL-Taktgenerierung)

Gast #51624
Lesenswert?

Servus,

ich versuche gerade mit dem ATmega8535 via TWI (I2C) nen PCF8583
anzusteuern.
Allerdings immer nachdem die Slaveadresse gesendet wurde steht der Wert
0x38 im TWStatusRegister. (Arbitration lost in SLA+W or DATA bytes)

Um Hardwarefehler weitgehendst auszuschließen habe ich im Moment am Bus
nur die PullUP-Wiederstände angeschlossen. Der uC sollte also
eigentlich ein NACK zurückbekommen, da die Leitung wärend des 9.
SCL-Taktes ja auf HIGH gezogen wird.

Noch eine weitere Frage: Muss ich selbst die Taktrate für SCL
einstellen? Irgendwie wird mir das aus dem Datenblatt nicht so ganz
klar. Ich habe nach der Formel nun mal 10 ins TWBR geschrieben und TWPS
auf 1 gesetzt. (100kHz bei 8MHz Clock)

Aber auch wenn ich das weglasse, ändert das nix am Ergebnis.

Wäre nett, wenn mir da jemand weiterhelfen könnte.

Gruss Olli

PS: Auf dem Display steht dann 125 (also DEBUG1, DEBUG2 und
arbitration)
Angehängte Dateien:
Gast #51625
Lesenswert?

Die Dokumentation der TWI Funktionen ist wirklich sehr schlecht. Das
erlebe ich im moment auch gerade.

Zur SCL Frequenz kann ich nur soviel sagen, das man sie selbst
einstellen sollte wenn man Master --> Slave Kommunikation wünscht.
Steht so jedenfalls im Datasheet.
Die Initialwerte von TWBR und TWPS sind alle 0 (bei meinem Mega16).Wenn
ich es richtig verstanden habe kann TWBR maximal 256 (2^8) sein und
TWPS 64 (4³).
Die Statuscodes beziehen sich aber immer auf die Initial-Werte. Ich
frage mich auch wie man denn eine Verbindung zwischen Master/Slave
herstellen soll ohne TWBR/TWPS zu ändern, wenn gleichzeitig gesagt wird
das sich die Statuscodes dann auch ändern. Soll man sich die
Statuscodes dann aus den Fingern saugen oder hab ich da was
missverstanden ?
Gast #51627
Lesenswert?

Im Datenblatt vom ATmega8535 sieht die Formel so aus:

CLOCK / (16+(2*TWBR*4^TWPS)) = SCL-Takt

Bei mir also

8MHz / (16+(2*10*4)) = 83.333,33..Hz

Das sind zwar keine exakten 100kHz aber näher komme ich an die 100
nicht ran. 4^1 ist schon das niedrigste und für TWBR sollte kein Wert
kleiner 10 ins Register geschrieben werden.


"Note: TWBR should be 10 or higher if the TWI operates in Master mode.
If TWBR is lower than
10, the Master may produce an incorrect output on SDA and SCL for the
reminder of the
byte. The problem occurs when operating the TWI in Master mode, sending
Start + SLA
+ R/W to a Slave (a Slave does not need to be connected to the bus for
the condition to
happen)."

Aber irgendwie passt da was nicht. (entweder hab ich da nen Denkfehler
oder die Angaben sind falsch) Im Datenblatt steht, dass ein Bustakt bis
400kHz möglich sei. Mit meinem 8MHz Quarz komme ich bei der Formel aber
nie über die 83kHz.
Gast #51629
Lesenswert?

Ich hab mich heute nochmal damit befasst.

@Peter: Du hast recht. Ich hab das im Datenblatt so verstanden, dass
bei 00 für TWPS der prescalar Value 1 ist und dann gerechnet 4^1.
Wenn ich nun mit 4^0 rechne, ergibt das für TWBR 32 und somit exakt
100kHz.

Ich hab auch noch nen anderen Fehler gefunden. Ich habe TWSTA beim
senden der Slaveadresse ausversehen wieder auf 1 gesetzt.

Fehler behoben und jetzt läufts. Zumindest antwortet der Baustein mit
einem ACK. (Displayausgabe 1233)

Vielen Dank für eure Hilfe.

Gruss Olli


PS: Wen der ASM-Code interessiert kann sich bei mir per eMail melden.
Dateianhang ist zur Zeit leider deaktiviert.

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