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)
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 ?
Hallo, Wenn ich richtig gerechnet und verstanden habe arbeitest Du mit 222kHz CL Clock Speed 8MHz / (16+(2*10*1)) = 222'222.222 Hz Gruss Ruedi
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.
Der kleinste Wert für TWPS ist 1 (4^0).(Beide Bits in TWPS sind dann 0). Die Rechnung von Beda Ruedi stimmt also ^^.
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.
Hallo Olli Bitte um Zusendung des ASM-Codes für TWI Vielen Dank Günter
Hallo Olli, da ich z.Zt. ähnliche Probleme mit dem TWI habe hätte ich auch gerne deinen ASM-Code Gruß -=jens=-
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.