Multi Master Betrieb mit Due, Uno und Mega über i2c/TWI


hallo zusammen,

diese frage richtet sich hier die elektronik freaks und weniger die programmierer denke ich :)

also folgendes thema:

ich habe ein system gebaut, aus 4 arduinos besteht und das ganze soll im multimaster betrieb über den i2c bus kommunizieren.

ich habe das problem, dass ich unterschiedliche daten von einem arduino anfragen möchte, sich mit der einfachen request methode aus der wire library leider nicht machen lässt. es funktioniert bei mir so, dass der haupt master einen request stellt, dieser aber nicht mit der methode für einen request, sondern als transmit übertragen wird. die übertragenen daten haben zur folge, dass der empfänger darauf antwortet (und ebenfalls wieder einen transmit ausführt).

der haupt master weiß immer, wann er einen transmit mit erwarteter antwort sendet und schiebt solange nichts anderes mehr über den bus, bis die erwartete antwort kommt. das habe ich programmcode verankert und auch mehrfach getestet.

verbaut sind 2 megas, 1 uno und 1 due. der due übernimmt die funktion des "master of masters" und kontrolliert somit alles, über den bus läuft

so... das problem:
der due arbeitet in der 3,3v ebene und der mega bzw. der uno in der 5v ebene, braucht man einen logil level converter, damit die miteinander sprechen können. ich habe mir einen von msx bestellt: klick!

der erste test, wo ich einen mega bzw. einen uno mit dem due sprechen lassen habe, hat auch soweit ganz gut funktioniert.

was aber nicht funktioniert hat, ist die folgende konstallation:



mit dieser konstellation ist der bus einfach nicht funktionsfähig gewesen und hat sich ab dem start aufgehängt.



desweiteren habe ich folgende weitere konstellation getestet:



damit ging es leider auch nicht... es hat wenigstens zu anfang funktioniert, aber nach ca. 15 sekunden hat der bus ebenfalls aufgehängt und ich musste wieder die fehlermeldungen lesen, dass auf die requests keine antworten gekommen sind.



völlig frustriert nach mehreren stunden des probierens habe ich dann einen letzten test gemacht:



und da brat mir doch einer einen storch... es funktioniert einwandfrei und läuft jetzt seit 6 stunden stabil. keine abbrüche, keine hänger, keine verlorenen daten und nicht ein request ohne antwort.



ich würde vermuten, dass es mit den pullups zu tun hat. die arduinos haben ja pullups aufgelötet und die logic level converter ebenfalls. wenn ich 3 arduinos parallel in eine linie hänge sind dann jeweils 3 pullups parallel plus die pullups von dem converter... macht insgesamt 4 pullups pro ader, die relativ dicht zusammen parallel hängen. kann das sein, dass das ein problem ist?

folgender code soll angeblich pullups deaktivieren:

deklaration im sketch:
code: [select]
#ifndef cbi
#define cbi(sfr, bit) (_sfr_byte(sfr) &= ~_bv(bit))
#endif


einsatz im "setup()" nach "wire.begin(x)":
code: [select]
 #if defined(__avr_atmega168__) || defined(__avr_atmega8__) || defined(__avr_atmega328p__)
    // deactivate internal pull-ups twi
    // per note atmega8 manual pg167
    cbi(portc, 4);
    cbi(portc, 5);
  #else
    // deactivate internal pull-ups twi
    // per note atmega128 manual pg204
    cbi(portd, 0);
    cbi(portd, 1);
  #endif


quelle: klick!

hat bei mir leider nicht funktioniert, ob mit oder ohne den befehl hat keinen unterschied gemacht. auch die messung auf den sda und scl aders mit multimeter hat ergeben, dass der pegel trotzdem auf 5v blieb. die pullups werden wohl fest aufgelötet sein und lassen sich nicht deaktivieren...





tja... soweit gut, es funktioniert ja jetzt alles, aber nur, wenn ich einen eigenen logic level converter für jeden der 5v arduinos einsetze, mir nicht gefällt. ich bin froh, dass ich mir gleich 4 converter bestellt habe und nicht nur einen, sonst wäre ich da wohl nie drauf gekommen.

wäre super, wenn mir jemand dazu etwas sagen kann und vielleicht weiß wie sich das alles technisch mit diesem bus system verhält!

hi,

nachdem sda- und scl-pin ja auch als "normale" digitale pins genutzt werden können, ist da wohl nix fix verlötet, sondern die pullups werden gezielt aktiviert. ich würde mal in der wire.cpp danach suchen.

gruß stefan


Arduino Forum > International > Deutsch (Moderator: uwefed) > Multi Master Betrieb mit Due, Uno und Mega über i2c/TWI


arduino

Comments