Arduino ShiftIn

Guten Abend!

Ich brauch mal wieder eure Hilfe :wink:
Folgendes Problem:
Ich muss eine Kommunikation zwischen 3 Arduino Megas herstellen. 2 Arduinos, die Daten empfangen( NUR empfangen! ) und ein Arduino der Daten sendet ( NUR senden!). Da ich an den 2 Arduinos, die empfangen, noch einige PINS ├╝brig habe, aber leider keine kompletten Ports, habe ich mich entschieden per ShiftIn einen weiteren "Port" an den Arduino zu h├Ąngen.
Die Daten die ├╝bertragen werden sind jeweils 2 mal numerische Werte im Bereich von 0 - 279. Daher 5 Datenleitungen bin├Ąr an einen Port, so f├Ąllt das schreiben und lesen mit Direkt-Port-Manipulation relativ leicht.

Nun ist meine Frage: Ist es m├Âglich ein Schieberegister (4014B) als ganzen Port anzusehen?
Brauche ich m├Âglicherweise einen anderen Baustein?
W├╝rde es auch ├╝ber Serielle Kommunikation funktionieren? (Wobei ich dann das Problem habe, das ich die Ports in einer Interrupt-Routine auslese und das mit Serial.read() nicht ganz funktionieren d├╝rfte, da ich ja wahrscheinlich manchmal zu sp├Ąt, manchmal zu fr├╝h lese. Liege ich mit dieser annahme richtig?)

Noch einen sch├Ânen Guten Abend und danke f├╝r jegliche Hilfe im vorraus!
Mit vielen Gr├╝├čen

Sind die Dinger relativ nahe beieinander? Dann kannst du I2C nehmen. Das ist simpel einfach, hat die Adressierung schon im Protokoll eingebaut und braucht nur 2 Leitungen.

Die Arduinos liegen alle 3 direkt nebeneinander.

Du denkst dabei an soetwas?

So wie ich das beim fl├╝chtigen dr├╝berschauen grade gesehen habe, ist das ja wieder eine Interrupt-Routine. "Bekriegen" sich die TimerOne Library und diese Interrupt-Routine gegenseitig?

Ja. Das ist es.

Auf dem AVR k├Ânnen sich Interrupts nicht gegenseitig unterbrechen. Jeder Interrupt Vektor hat eine Warteschlange die eins tief ist. Das hei├čt wenn gerade dein Timer Interrupt werkelt und eine I2C Interrupt kommt, wird die Timer ISR fertig abgearbeitet. Dann pr├╝ft der Prozessor ob Interrupt Flags gesetzt sind und springt in den entsprechenden Interrupt Vektor. Erst wenn w├Ąhrend einer ISR zwei Interrupts auf dem gleichen Vektor eintreffen gehen Informationen verloren.

Wow.
Wunschlos Gl├╝cklich und das nach so einer kurzen Zeit!

Vielen herzlichen Dank Serenifly!

Halt! Eine Frage noch!

Ein Mega hat doch nur PIN 20 SDA und PIN 21 SCL, ├╝ber welche I2C Kommunikation stattfinden kann? Irre ich schon wieder?

Korrekt

http://arduino.cc/en/Main/ArduinoBoardMega2560

TWI: 20 (SDA) and 21 (SCL). Support TWI communication using the Wire library.

Ich ben├Âtige aber von einem Arduino eine Kommunikation zu 2 Arduinos :S

Du kannst mit einem Master glaube ich 127 Slaves ansprechen.

Jeder Slave bekommt eine andere Adresse bei Wire.begin().
Diese Adresse gibt der Master bei Wire.beginTransmission() an bevor die Daten geschickt werden.

Sprich ich habe von meinem "Sende"-Arduino nur PIN 20 und 21 in Verwendung. Die beiden anderen Arduinos verbinde ich mit diesen beiden PINS und fertig ist die Sache? Einfach aus beiden Kabeln, je 2 Kabel machen und fertig. Gigantisch. Die welt kann so einfach sein!

Danke dir :slight_smile:

Das habe ich mit "simpel einfach" gemeint :slight_smile:
Und du brauchst dir keine extra Adressierung zu ├╝berlegen weil das die Wire Lib schon macht.

Du willst zwar nur Master nach Slave, aber theoretisch kann der Master auch Daten von den Slaves anfordern und man k├Ânnte sogar von Slave zu Slave Daten schicken wenn der Master periodisch fragt ob Daten da sind, diese abholt und verteilt. Das einzige was nicht geht ist das die Slaves unaufgefordert Senden.

Noch einfacher gehts wenn Du je eine serielle Schnittstelle an jedem Arduino Mega nimmst. Der Mega ha ja 4 St├╝ck und nur 1 ist benutzt. ALso TX vom sende-Arduino an RX jedes der BEIDEN Empfangs-Arduinos verbinden. Und das war's.
Gr├╝├če Uwe

Stellt sich mir nur eine Frage. Habe nun alles fertig verkabelt, aber ankommen tut nur falsches. Daher hab ich nochmal gegoogelt und dabei dieses Bild gefundne:

Ich nehme an, dass bei allen 3 Arduinos GND und VCC wegen der Phasenverschiebung verbunden sind ?
Theoretisch kann es das aber nicht sein, weill alle 3 Arduinos vom selben Netzteil betrieben werden (Standard PC-Netzteil). Oder doch?

Du brauchst du gleiche Masse. Nicht unbedingt die gleiche Versorgungsspannung. Steht auch auf der Arduino Seite:

Connect pin 5 (the clock, or SCL, pin) and pin 4 (the data, or SDA, pin) on the master Arduino to their counterparts on the slave board. Make sure that both boards share a common ground

Die Schaltung muss einfach das selbe Bezugspotential haben. Das ist aber bei Elektronik allgemein so.