PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Master-Slave-Problem



XAro
01.01.2009, 22:01
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


//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


//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

Dirk
01.01.2009, 23:09
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

XAro
02.01.2009, 12:58
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

RP6conrad
02.01.2009, 21:01
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.

XAro
08.01.2009, 17:47
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

SlyD
08.01.2009, 21:01
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

XAro
09.01.2009, 14:10
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

Filou89
18.07.2011, 20:54
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

TrainMen
19.07.2011, 19:09
Du benutzt den I2C Bus und liesst den Register 21 von der BASE aus.



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

Dirk
19.07.2011, 19:15
@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.

TrainMen
20.07.2011, 06:26
Übrigens, ich bin natürlich auch davon ausgegangen das auf der der Base das RP6Base_I2CSlave läuft und dann kannst du auf der M32 die Batteriespannung z.B. so lesen:



uint8_t basubat[2];
uint16_t basubatges;
// I2C, Einlesen der Daten von der Base. Register 21
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 21);
I2CTWI_readBytes(I2C_RP6_BASE_ADR, basubat, 2);
basubatges = basubat[0] + (basubat[1]<<8);
// Display Ausgabe der Basis Spannung
setCursorPosLCD(1, 0);
writeStringLCD_P("-Spannungswerte-");
setCursorPosLCD(2, 0);
writeStringLCD_P("Basis : ");
writeIntegerLengthLCD((((basubatges/102.4f)+0.1f)), DEC, 2);
writeStringLCD_P(".");
writeIntegerLengthLCD((((basubatges/1.024f)+10)), DEC, 2);
writeStringLCD_P(" V");


mfg TrainMen