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
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
Einfacher ist wohl ne einfache serielle Verbindung via USART. Geht aber dann logischerweise nur mit zwei Controllern.
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 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
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
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
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
Hallo Peter, ich programmiere grundsätzlich in Assembler weil ich hauptsächlich alles sehr hardwarenah entwickel. Gruss Gerald
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.