Hallo zusammen, kommt jemandem folgendes Programm bekannt vor???: Ich nutze den AT90CAN128 und arbeite mit dem TWI. Als Compiler nutze ich Codevision. Wenn man dort den CodeWizard benutzt, um grundlegende Einstellungen vorab zu machen, gibt es dort ja zwei Felder, die man aktivieren sollte, um TWI zu aktivieren: 1. "Two-Wire (I2C)", wo man angeben kann, ob der General Call enabled werden soll, welche Slaveadresse man dem Device geben möchte, welche Bit Rate man nutzen möchte, ob man ACK-Pulse generieren möchte und Intererrupts nutzen möchte. 2. "I2C": Dort kann man wählen, an welchem Port I2C angeschlossen ist und welche Bits dieses Ports SDA und SCL sein sollen. Punkt 1. läuft wunderbar. Wenn ich jedoch 2. aktiviere (bei mir ist I2C an Port D, dabei SDA D0 und SCL D1), gibt es folgenden Fehlermeldung: "The I2C Port is conflicting with the 2 Wire port SDA bit." ...was völliger Quark in meinen Augen ist, da ich ja laut Datenblatt weiß, welcher Pin wofür ist... Xine
nene, ist schon alles richtig. -2Wire für Hardware-I2C, dann musst du auch die entsprechenden Controllerpins benutzen -I2C für Software-I2C, dann kannst du beliebige Pins benutzen. Man kann auch beides gemeinsam benutzen, dann natürlich die Software-I2C-Pins nicht auf den Anschlüssen für das Hardware-Interface.
Also genügt es, wenn ich lediglich 1. benutze? Sprich, wenn ich nur TWI (also 1.) benutze im Wizard, versteht er dann automatisch, dass ich die TWI-Pins zum Senden und Empfangen nutze? Den Software-I2C brauche ich nur, wenn ich den i2c-header benutzen möchte, denn die Funktionen darin sind anscheinend so geschrieben, dass sie die Einstellungen unter 2. (I2C) benötigen. Hab ich das richtig verstanden?
Du hast mttlerweile 2? alte Threads reaktiviert, leider postest du in keinem irgendwelche verwertbaren Infos, wie Schaltung, Programmcode der nicht funktioniert, Problembeschreibung, gewünschte Geschwindigkeit, etc. Zu den Pullups, je nach Geschwindigkeit sind die zu wählen. In der Spec steht noch etwas von 3mA.
Merci für die Pull Up Antwort, auch wenn ich im anderen Thread mit ihr gerechnet hätte. ;-) Weitere Infos gebe ich gerne, wenn benötigt. Andere konnten mit den Infos genug anfangen, habe sehr hilfreiche Reaktionen bekommen. Geschwindigkeit ist erstmal wurscht, Hauptsache es läuft, später so hoch wie möglich. Btw. Zum Rest: Sonst wird man hier kritisiert, wenn man sich ältere Posts nicht durchliest (angeblich) und auf sie eingeht. Nun ist es andersherum. Ist doch nur hilfreich, wenn oben drüber schon mehr zum Thema steht, dann muss man doch nicht extra einen neuen Thread aufmachen...
>Geschwindigkeit ist erstmal wurscht, Hauptsache es läuft, später so hoch >wie möglich. daran hängt aber die Größe des Pullups, je schneller du werden willst um so kleiner der Pullup. Richtwert 10K..3,3K. Kontrolliere mit dem Sozi ob SCL schnell genug ist. >wenn man sich ältere Posts nicht durchliest (angeblich) und auf sie eingeht. durchlesen soll man sie schon, aber nicht dann das ganze verstreuen Niemand hindert dich auf alte Threads zu verweisen. Wenn ich das richtig gelesen habe hast du 2 AVR die du über I2C verbindest mit Codevision C. Irgendwas funktioniert nicht. Es kann nun sein du bist der absolute Überflieger und hast 3 Probleme die du genau umreißen kannst. Sollte dies nicht so sein und du bist wirklich am "verzweifeln" ist es sehr ungünstig die Informationen über 3 Threads zu streuen. Da ist ein Thread besser mit Zielvorstellung, Schaltplan, Code und genauer Problembeschreibung.
Ok, danke. Den besagten Thread von mir gab es bereits, jedoch kam keine Antwort drauf. Deswegen dann nach einiger Zeit die vereinzelte Fehlersuche. Ja, genau, ich verbinde 2 AT90CAN128 über I²C. Ein Master Transmitter, ein Slave Empfänger. Gesendet werden soll lediglich ein Byte zu Testzwecken. Die beide Boards hab ich Programme geschrieben, nur funktioniert das Ganze nicht. (Will als Anfängerin auch nicht abstreiten, dass meine Programme die Bugs beinhalten...;-)) Im Statusregister des Masters steht, dass die START-Bedingung erfolgreich gesendet wurde. Als nächstes wird jedoch kein ACK vom Slave empfangen auf den Versuch hin, ihn mit seiner Adresse anzuprechen. Sprich im TWSR des Masters steht der Wert für ein Slave Address NACK. Hab die Rate nun auf 160 kHz runter gesetzt bzw. zwischenzeitlich auch schon auf 32. Hat aber nix geändert. Als Pullups habe ich 10K verwendet auf den Platinen. Die header files aus Codevision zum I2C hab ich auch versucht zu verwenden, ging aber nicht. Da hat man aber auch leider nicht die Möglichkeit sich den Inhalt der dort zur Verfügung gestellten Funktionen anzuschauen. Deswegen die selbst geschriebenen Programme. Joa, das so als Zusammenfassung. Wenn Du ne Idee hast: gerne her damit! Wenn ich die Codes anhängen soll, gib mir ein Zeichen. :) Xine
Joa häng den Code doch mal hier an. Die übliche Übertragungsrate für I2C ist eigentlich 100kHz.
Hier der Transmitter Code (geht weiter unten richtig los, davor ist allg. init und eine LCD-Ausgabefunktion).
ich hätte gedacht den TWI-Slave machst interruptbasiert. Wenn ich das richtig sehr blockierst du bei jedem Durchlauf 1500 ms. Wo setzt du die Adresse des Slaves? >Im Statusregister des Masters steht, dass die START-Bedingung >erfolgreich gesendet wurde. was heißt das (Was bekommst du zurück)? Aus eigener Erfahrung weiß ich wie fehlerträchtig das ganze sein kann. Dabei kann sowohl die Sender als auch die Empfängerseite Ursache sein, da beide blockieren können. Ideal sind 2 STK500 beide mit JTAG, dazu sollte man die TWI Sektion im Datenblatt sehr genau studiert haben und sich beim Senden an die TWI-Demo im WINAVR halten. In die spec von Philips mal reinzuschauen ist auch nicht falsch. Mit dem Oszi sollte man kontrollieren ob die Slewrate auf der scl leitung ausreicht, sonst den Pullup nachdimensionieren. Das letzte Byte wird mit anderer TWCR Einstellung gesendet.
> ich hätte gedacht den TWI-Slave machst interruptbasiert. Wenn ich das > richtig sehr blockierst du bei jedem Durchlauf 1500 ms. Wo setzt du die > Adresse des Slaves? Ja, das mit dem interruptbasiert überlege ich gerade. Macht vielleicht Sinn. Die Slave-Adresse setze ich in iic_init(): TWAR=0xAB. Sprich Slave-Adresse 0x55 und dann eine 1 für General Call Enable. >>Im Statusregister des Masters steht, dass die START-Bedingung >>erfolgreich gesendet wurde. > was heißt das (Was bekommst du zurück)? Sobald die Bedingung gesendet wurde, wird das TWINT-Flag gesetzt und im Statusregister TWSR kann man dann den Wert 0x08 auslesen. Das ist möglich, also wurde diese Übertragen. Der Slave jedoch reagiert auf diese noch nicht (muss er nicht!), erst, wenn er mit seiner Adresse angesprochen wurde. > Aus eigener Erfahrung weiß ich wie fehlerträchtig das ganze sein kann. > Dabei kann sowohl die Sender als auch die Empfängerseite Ursache sein, > da beide blockieren können. Ideal sind 2 STK500 beide mit JTAG, dazu > sollte man die TWI Sektion im Datenblatt sehr genau studiert haben und > sich beim Senden an die TWI-Demo im WINAVR halten. In die spec von > Philips mal reinzuschauen ist auch nicht falsch. Mit dem Oszi sollte man > kontrollieren ob die Slewrate auf der scl leitung ausreicht, sonst den > Pullup nachdimensionieren. Die TWI-Sektionen kenne ich fast auswendig, genauso wie die Spec von Philips. Mit WinAVR hab ich nicht gearbeitet. Meinste das ist sinnvoll, sich die Demo da mal anzuschauen? > Das letzte Byte wird mit anderer TWCR Einstellung gesendet. Slave Adresse und Daten werden mit der gleichen Einstellung im TWCR gesendet, bin ich der Meinung (laut Datasheet)! Nur die Stopbedingung wieder mit einer anderen Einstellung.
>Meinste das ist sinnvoll,sich die Demo da mal anzuschauen
zumindest den Code zum senden
schau dir noch vergleichend an wie ein I2C EEprom sich verhält.
noch einen Tipp zur Verdrahtung und Konfiguration:
Wenn du 2 STK500 benutzt unbedingt brownout aktivieren. Wenn das eine
Board ausgeschaltet wird ,wird der Controller über das andere
mitversorgt. Es liegt dann eine Spannung an bei der er teilweise schon
läuft(ohne Brownout)
TWI ist eine Statemachine, wenn du nicht sauber resetest kann der Bus
weiterhin blockiert sein.
Danke nochmal, die Codes laufen mittlerweile. War ein Fehler, der mit dem verwendeten Display zusammenhing, über das ich die Funktionalität der Übertragungsstrecke ausgeben lassen wollte... Shit happens. ;-) Xine.
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.