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
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.