Forum: Mikrocontroller und Digitale Elektronik I²C (TWI) CodeVison - Problem bei Pinbelegung


von Xine (Gast)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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.

von Xine L. (xine)


Lesenswert?

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?

von Wolfram (Gast)


Lesenswert?

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.

von Xine L. (xine)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

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



von Xine L. (xine)


Lesenswert?

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

von TechInfo (Gast)


Lesenswert?

Joa häng den Code doch mal hier an.

Die übliche Übertragungsrate für I2C ist eigentlich 100kHz.

von Xine L. (xine)


Angehängte Dateien:

Lesenswert?

Hier der Transmitter Code (geht weiter unten richtig los, davor ist 
allg. init und eine LCD-Ausgabefunktion).

von Xine L. (xine)


Angehängte Dateien:

Lesenswert?

Und hier der Receiver.

von Wolfram (Gast)


Lesenswert?

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.

von Xine L. (xine)


Lesenswert?

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

von Wolfram (Gast)


Lesenswert?

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

von Xine L. (xine)


Lesenswert?

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
Noch kein Account? Hier anmelden.