PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwei M32 Erweiterungen möglich? / M128 Slaveprogramm?



Matthias1172
05.03.2010, 14:14
Hallo,
ist es möglich zwei M32 zu betreiben, wenn ja, wie stelle ich das an?
Und nochwas anderes:
Wo gibt es für die M128 ein Slave-Beispielprogramm oder wie mache ich am besten eins, damit ich mit der M32 die I/O der M128 ansteuern kann?
Danke euch schonmal für die Antworten. :D

yaro
05.03.2010, 16:54
Da gibts unterschiedliche Möglichkeiten. Stichwörter dazu: TWI , SPI , usart.
Das sind Bus-Systeme, mit denen du deine Prozessoren kommunizieren lassen kannst. Beispielprogramme lassen sich in Datenblättern deines Controllers finden.
Wenns dir nur um die IO geht, dann kannst du auch eine Porterweiterung nutzen (z.B. PCF8574A), die du dann mit einem der beiden Bus-Systeme ansteuerst.

Gruß, Yaro

justin
05.03.2010, 17:15
Ich denke mal, er meint die M32-Erweiterung für den RP6...

yaro
05.03.2010, 17:28
Oh.....dann ist das natürlich was anderes.... =) Sorry

Dirk
05.03.2010, 18:38
Hallo Matthias1172,

ja, es geht, zwei M32 auf den RP6 zu setzen. Einfach draufschrauben und mit den Steckern verbinden.
Bei der I2C-Kommunikation darf aber nur 1 uC (der auf der Base oder einer der 2 auf den M32) als Master arbeiten, die anderen 2 als Slave.
Hier habe ich am 13.1. mal ein Beispiel für die M32 als I2C-Slave gepostet:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=52031

Gruß Dirk

Matthias1172
05.03.2010, 20:10
Ok, danke schonmal, aber wie programmiere ich dann die I/O? Die heißen doch auf beiden M32 gleich, wie definiere ich dann ob ich den I/O des Masters oder des Slaves ansprechen will?

Dirk
05.03.2010, 20:18
Wenn du zwei M32 auf den RP6 setzt, dann hast du am I2C-Bus ja drei Microprozessoren. Einer muss Master sein, die anderen beiden Slave mit je einer eigenen I2C-Adresse.
In den Examples sieht eine Adresse so aus:
RP6CONTROL_I2C_SLAVE_ADR 10

Davon brauchst du dann 2, z.B. so:
RP6CONTROL_I2C_SLAVE_1_ADR 10
RP6CONTROL_I2C_SLAVE_2_ADR 12

Dann kann der Master beide Slaves ansprechen und von ihnen Werte lesen oder Werte zum Slave schicken.


Gruß Dirk

yaro
05.03.2010, 20:38
Ich kenn mich zwar mit dem RP6 nicht aus, jedoch passt folgendes trotzdem hier rein: I2C erlaubt es auch, mehrere Master zu haben.
Im Multimaster Betrieb können Controller als Master und als Slave (gleichzeitig) agieren. Das I2C Protokoll regelt dabei den Verkehr so, dass keiner gestört wird. natürlich muss das alles sinvoll programmiert werden...
Kann ja sein, das man, wenn man 3 Boards hat, sie unabhängig von einander kommunizieren lassen will...dann ist sowas sehr nützlich.

Gruß, Yaro

Matthias1172
05.03.2010, 20:41
Ahja ok, und wenn ich den Base als Slave und eine der M32 als Master und die andere ebenfalls Slave haben will?
Und wie mach ich das dann, wenn ich z.B. den setLEDs Befehl auf beiden M32 benutzen möchte, wie regel ich das dann, welche M32 ich mit dem Befehl ansprechen will?
Sorry wenn ich so dumm frage, aber ich hab erst vor kurzem mit C und Robotern angefangen, daher habe ich noch null Erfahrung damit.
Danke für die Geduld

Dirk
05.03.2010, 20:53
@yaro: Klar, die RP6 I2C-Libs sind aber leider nicht Multi-Master-fähig...

@Matthias1172:

und wenn ich den Base als Slave und eine der M32 als Master und die andere ebenfalls Slave haben will?
Ja, das geht gut.

wenn ich z.B. den setLEDs Befehl auf beiden M32 benutzen möchte, wie regel ich das dann, welche M32 ich mit dem Befehl ansprechen will?
Wenn du 3 Teilnehmer am I2C-Bus hast, must du ja jeden der 3 eigenständig programmieren. Wenn du auf einer M32 den setLEDs Befehl anwendest, dann hat das natürlich nur da eine Wirkung.
Wenn du vom Master aus die LEDs auf einem Slave schalten willst, dann must du dir "Befehle" ausdenken, die der Master zum Slave über I2C schickt.
Z.B.: Wenn der Master erst ein Byte mit 99 schickt und danach ein Byte mit 0b0001, dann must du den Slave so programmieren, dass er die 99 als Befehl zum LED-Umschalten erkennt und dann die 0b0001 als Anweisung versteht, eine LED bei sich einzuschalten. Das wird er dann mit setLEDs(0b0001); tun.

Klar so?
Gruß Dirk

Matthias1172
06.03.2010, 00:24
Ok, jetzt hab ichs verstanden, nur ledier für meine Programmierkenntnise etwas kompliziert, da ich z.B. nicht weiß wie ich ein Byte sende und dieses am Slave verarbeite.
Mal schaun wie ich da was hinbekomme.
Danke euch.

Dirk
06.03.2010, 07:43
jetzt hab ichs verstanden, nur ledier für meine Programmierkenntnise etwas kompliziert, da ich z.B. nicht weiß wie ich ein Byte sende und dieses am Slave verarbeite.
In meinem Beitrag vom 13.1. (link weiter vorn!) sind ja einfache Beispiele drin.
Einfach mal probieren und dann einen eigenen Entwurf hier einstellen!

Gruß Dirk

P.S.: Wird klappen! O:)