-
Master-Slave-Problem
Hallo,
ich bin ganz neu unter den "RP6-Besitzern". Ich habe seit Weihnachten den RP6 mit dem Erweiterungsmodul (RP6 CONTROL M32) + Display. Nun möchte ich gerne den Controler auf der Hauptplatine als Master und den auf der Zusatzplatine (M32) als Slave verwenden. Der Slave soll vorerst zu Testzwecken nur die 4 zusätzlichen LEDs aufleuchten lassen. Leider habe ich bisher keinen Erfolg. Ich habe die Beispielprogramme in beiden Beschreibungen (Basisbeschreibung + Beschreibung des M32) durchgearbeitet. Nur leider habe ich immernoch starke Probleme bzgl. des Verständnisses. Gibt es vielleicht weitere kommentierte Beispiele im Internet, oder aber erbarmt sich jemand von euch mir ein kurzes, hoffentlich leicht verständliches Beispiel zu geben?
Ich füge anbei noch meinen vermutlich sehr schlechten Versuch der Master-Slave-Programmierung an, wobei ihr bitte nicht vergessen sollte, dass ich absoluter Neuling bin (habt also bitte etwas Nachsehen mit mir)
Master
Code:
//Der erste Controler, ohne Display
#include "RP6RobotBaseLib.h"
#include "RP6I2CmasterTWI.h"
int main(void)
{
initRobotBase();
I2CTWI_initMaster(100);
powerON();
I2CTWI_transmitByte(10, 2);
while(true)
{
task_I2CTWI();
}
}
Slave
Code:
//Der zweite Controler, mit dem Display
#include "RP6ControlLib.h"
#include "RP6I2CslaveTWI.h"
int main(void)
{
initRP6Control(); //Controler initialisieren
I2CTWI_initSlave(10); //Adresse 10
initLCD();
showScreenLCD("Hallo", "Test");
mSleep(3000);
int i = 0;
while(true)
{
if(I2CTWI_writeRegisters[0] && !I2CTWI_writeBusy) //irgendein Kommande empfangen und KEIN Schreibzugriff aktiv?
{
uint8_t kommando = I2CTWI_writeRegisters[0];
I2CTWI_writeRegisters[0] = 0; //zuruecksetzen
uint8_t param = I2CTWI_writeRegisters[1];
if(kommando == 2)
setLEDs(0b1111);
}
}
return 0;
}
Ich danke euch schon jetzt für eure Mühe!
lg
XAro
-
Hallo XAro,
eigentlich ist es sinnvoller, die M32 als Master und die RP6Base als Slave zu nehmen. Die Beispiele gehen davon ja auch aus.
Du kannst ja unabhängig von Master/Slave senden und empfangen, so dass du deshalb nicht die Rollen umdrehen must.
Wenn du es aber trotzdem machen willst:
Im Mastercode für die RP6Base fehlt noch der I2C Event Handler für Fehler (void I2C_transmissionError(uint8_t errorState) ). Es reicht auch nicht, die Testbytes nur einmal VOR der Endlosschleife zu senden, sondern du müßtest das in der Hauptschleife tun (z.B. mit der Stopwatch alle 500 ms oder so). Vor dem Senden würde ich mit ...
if (!I2CTWI_isBusy) {}
... testen, ob der Bus zum Senden frei ist.
Der Slavecode für die M32 sieht so ok aus. Müßte eigentlich was werden.
P.S.: Für einen Neuling ein klasse Einstieg! O:)
Dirk
-
Hey, vielen Dank für die wirklich schnelle Antwort. Ich werde mich gleich heute Abend dransetzen und deine Vorschläge versuchen umzusetzen. Ich werde dir dann berichten, ob es geklappt hat. :)
lg
XAro
-
Die Beispiele functionieren problemlos bei mir. Nur die richtige hex-files in der richtige processor uebertragen !! Die basis kann dan mit die identische Befehlsatz von Master (M32) aus gesteuert werden.
-
OK, so ich habe mich noch mal daran versucht und bin leider immer noch nicht viel weiter. Gibt es nicht noch irgendwo KLEINE und LEICHTE Beispiele, die die Funktionsweise des Master-Slave erklären? Oder hat vielleicht jemand von euch die Lust und Zeit dazu ein kleinen Quellcode bzgl. Master-Slave hier einzustellen? Vllt. sowas, dass ne LED oder so aufleuchtet. Das würde mir reichen, nur damit ich mir eine bessere Vorstellung machen kann, wie so ein derartiges Programm aufgebaut sein muss. Das wäre echt super nett.
lg
XAro
-
Darf man fragen wo der Sinn ist den RP6-M32 als Slave laufen zu lassen?
Das Modul ist
a) Schneller getaktet
b) hat weniger zu tun
c) hat mehr freien Speicher
d) hat viele freie I/O Ports
e) hat einen Display Port
f) es gibt viele fertige und funktionierende Beispiele für die Kombination RP6-M32 als Master und RP6-Base als Slave ;)
MfG,
SlyD
-
ok, deine Argumente überzeugen mich SlyD. Ich habe mich gerade nochmal daran versucht (jetzt mit dem RP6-M32 als Master und dem RP6-Base als Slave) und ich habe es endlich geschafft. \:D/ *freu*
Vielen Dank für eure Mühen. Jedoch bin ich mir sicher, dass sich noch weitere Fragen diesbezüglich bei mir aufdecken werden. 8-[
Nochmals besten Dank!
XAro
-
Hallo zusammen,
der Thread ist zwar schon etwas älter. Ich beschäftige mich auch gerade mit dem Master / Slave "Problem". M32 ist Master und die Base ist Slave.
Iht habt geschrieben, dass man dieselben Befehle nun im M32-Programm verwenden kann wie in der Base.
Wie kann man beispielsweise die Batteriespannung auslesen und auf dem Display anzeigen lassen?
Ich hoffe, ihr wisst eine praktische Lösung.
Vielen Dank,
MfG
Filou
-
Du benutzt den I2C Bus und liesst den Register 21 von der BASE aus.
Code:
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 21);
I2CTWI_readBytes(I2C_RP6_BASE_ADR, basubat, 2);
mußt mal in den Beispielen gucken, irgendwo da steht das. Auch die Ausgabe auf dem Display findest Du da.
mfg TrainMen
-
@Filou:
Wenn du in der Base das RP6Base_I2CSlave Programm hast, kannst du auf der M32 die Batteriespannung z.B. so lesen:
I2CTWI_transmitByte(I2C_RP6_BASE_ADR,I2C_REG_ADC_U BAT_L);
I2CTWI_readBytes(I2C_RP6_BASE_ADR, readBuf, 2);
adcBat = (readBuf[1] << 8 ) | (readBuf[0]);
Der ADC-Wert steht danach in adcBat.
Wenn du einen eigenen Slave für die Base geschrieben hast, sieht das evtl. anders aus.