Forum: Mikrocontroller und Digitale Elektronik I2C Datenaustausch - WINAVR


von Peter Bauer (Gast)


Lesenswert?

Hallo Forum,

hätte da ein problem. Ich möchte über ein I2C Multimastersystem
zwischen einem Atmega32 und Atmega8 gegenseitig auf Anforderung Daten
(hauptsächlich Integer) austauschen.
Z.B. Atmega32 fordert vom Atmeg8 einen bestimmten Wert an, und
umgekehrt und evtl mit mehreren Mastern, aber das sollte dann ja kein
größeres Problem mehr darstellen.

Hätte da zufällig jemand ein ungefähr passendes Projekt rumliegen? In
der Codesammlung habe ich für WinAVR nichts gefunden.
Hab es selbst auch schon probiert, doch irgendwie scheitere ich schon
seit einiger Zeit -->Frust!!
Vielleicht könnte mir da ja jemand helfen.

Schon einmal danke an euch alle.

Gruß,

Peter

von Peter Bauer (Gast)


Lesenswert?

Hallo nochmals,

hat von euch wirklich keiner ein projekt, wo zwei ATMEGAS miteinander
über I2C kommuniziert?
Gibt es eventuell andere möglichkeiten einen einfacheren Datenaustausch
zu machen?

Gruß,

Peter

von Gast (Gast)


Lesenswert?

Einfacher ist wohl ne einfache serielle Verbindung via USART. Geht aber
dann logischerweise nur mit zwei Controllern.

von Peter Bauer (Gast)


Lesenswert?

Hallo,
USART geht nicht, es muß ausbaufähig auf mehrere Controller werden. Je
ein ATMEGA soll eine eigenstänig laufende Steuerung werden, die sich
von den anderen bestimmte werte holen kann.
Aber ich habe bereits Probleme mit einem einfachen Polling bei zwei
Controllern. Irgendwie scheint es als wenn der Controller beim
Interrupt abschmiert.
Für WINAVR findet man aber auch nicht viel Quellcode, wo man etwas
spicken kann. Vor allem bei Multimaster oder auch nur bei einem Slave.
Ist mit sicherheit nur eine Kleinigkeit, stehe aber halt voll auf dem
Schlauch.

Gruß,
Peter

von Peter D. (peda)


Lesenswert?

Von Multimaster-I2C kann ich nur dringend abraten !


Die ATMega sind nur scheinbar kompatibel zu den Philips-I2C.

Ich hab in einem super funktionierenden Gerät wegen Abkündigung
(P87C751) einen ATMega8 eingesetzt und mir nen Wolf programmiert, ehe
es lief.

Laufen tut es immer noch nicht richtig, der Bus stürzt ab und zu mal
ab, bis auf dem AVR der Timeout zuschlägt und den AVR resettet.

Irgendwie hat der AVR Probleme mit Multimaster.

Laut I2C-Spezifikation dürfen mehrere Master gleichzeitig starten und
durch die Arbitrierung gewinnt einer. Die Philipser machen das auch
anstandslos.

Die AVR halten aber nicht die minimale Zeit zwischen einem Stop und dem
Beginn des Start ein.
Und manchmal bleiben sie sogar richtig hängen. Dann hält der AVR den
SDA-Pin auf konstant Low und erzeugt aber auch keinen Interrupt, um
diesen Zustand zu beseitigen.

Gelöst habe ich das dadurch, daß ich SDA mit auf einen externen
Interrupt gelegt habe. Im Timerinterrupt wird dann getestet, ob
innerhalb einer bestimmten Zeit eine Flanke aufgetreten ist. Und wenn
nicht, wird das I2C (TWI) disabled und wieder enabled, nur dadurch läßt
sich der blockierte SDA wieder lösen.

Alles in allem ein heiden Aufwand.

Wenn ich das vorher gewußt hätte, hätte ich einen LPC900 genommen und
eben noch den 3,3V-Regler mir raufgesetzt.


Für neue Projekte würde ich daher auf keinen Fall I2C nehmen, sondern
CAN (ATCAN128), da macht alles die Hardware.
Und wenn da Multimaster nicht gehen würde, hätten bestimmt schon einige
Leute Atmel auf den Busch geklopft.

Auf meinen I2C-Bugreport habe ich nur ne Eingangsbestätigung erhalten,
der Rest ist Schweigen.


Peter

von Peter Bauer (Gast)


Lesenswert?

Na das ist ja mal gut zu wissen. Das kann einen richtig Zeit sparen.

Und wie ist das wenn ich nur einen Master habe, der mir die
Sendeerlaubnis auf die einzelnen Controller verteilt? Das müsste dann
ja wieder gehen.

Mir würde es auch schon helfen, wenn jemand ein bzw. zwei Projekte hat
(für WINAVR), die dann miteinander Datenaustausch machen können, also
ohne Multimaster.

Ich finde halt das I2C praktisch ist, weil man beinahe jeden Controller
dran bringt. Mit CAN ist das etwas komplizierter denke ich. Ausserdem
muß man für das TQFP-Gehäuse fast eine Platine ätzen denke ich. Wobei
ich gestehen muß, dass ich auch schon an CAN gedacht hatte, mir aber
der I2C einfacher erschien. Evtl. sollte ich da nochmals drüber
nachdenken.

Wie läuft die Datenbezoge verwaltung beim ATCAN128 ab? Bekommt da jede
Info einen eigenen Speicherplatz oder muß das auch die Software
verwalten. Was braucht der ATCAN128 noch für externe Peripherie,
warscheinlich einen CAN-Treiber-Baustein oder?

Wo bekommt man am besten an die ARMs ran. Reichelt und Conrad haben die
ja nicht im Angebot.

Gruß,
Peter

von Gerald (Gast)


Lesenswert?

Hallo Peter,
ich habe drei ATmega untereinander mit I2C laufen.
Es funktioniert einwandfrei.
Wenn man sich strikt an die Vorgaben im Manual hält, dann funktioniert
es auch.
Habe auch einige Zeit gebraucht um das System zu erkennen.
Für jeden erdenklichen Fall wird doch ein Fehlercode bze. Bestätigung
ausgegeben, danach kann man doch die Entscheidungen fällen.
Meine Programme laufen als Versuch problemlos.

Gruss

Gerald

von Peter Bauer (Gast)


Lesenswert?

Hallo Gerald,

in welcher Sprache hast du das/die Programme geschrieben? ASM oder C,
vielleicht sogar in WINAVR? Wenn du sie in WInAVR oder C geschrieben
hast, könntest du sie evtl ins Forum stellen? Wäre echt super von dir.

Gruß, Peter

von Gerald (Gast)


Lesenswert?

Hallo Peter,

ich programmiere grundsätzlich in Assembler weil ich hauptsächlich
alles sehr hardwarenah entwickel.

Gruss

Gerald

von Peter D. (peda)


Lesenswert?

@Gerald

"Wenn man sich strikt an die Vorgaben im Manual hält, dann
funktioniert es auch."

Den Traum hatte ich auch vorher gehabt.

Ich habe 6 MCs verbunden und die Daten werden so oft gesendet, wie es
sich durch die Antwortzeiten ergibt, da ist also richtig was los auf
dem Bus.
Auch ist die Software so geschrieben, daß jeder Teilnehmer nach
Arbitrierungsverluist sofort neu zu senden versucht.
Erst mit dem ACK auf das letze Datenbyte wird ein Senden als
erfolgreich beendet.

"Für jeden erdenklichen Fall wird doch ein Fehlercode bze. Bestätigung
ausgegeben"

Bei der Blockade des SDA-Pins aber eben nicht !
Ich wäre ja schon zufrieden gewesen, wenn dann ein Bus-Error gekommen
wäre.
Deshalb kann man diesen Zustand auch mit nichts anderem aufheben, als
mit dem Löschen des TWEN-Bits.

Es reichte schon ein AVR aus, um alles außer Tritt zu bringen.
Der SDA-Hänger trat nach etwa 10min bis 8h auf, war also sauschwer,
drauf zu triggern.


Warscheinlich ist Deine Datenrate ist so langsam, daß kein
gleichzeitiges Senden auftritt, d.h. keine Arbitrierung nötig ist.

Trotzdem würde ich unbedingt den SDA-hängt-Timeout einbauen.


Peter

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.