-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Master-Slave-Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2008
    Beiträge
    7

    Master-Slave-Problem

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    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!

    Dirk

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2008
    Beiträge
    7
    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

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    375
    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.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2008
    Beiträge
    7
    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

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    32
    Beiträge
    1.514
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    26.12.2008
    Beiträge
    7
    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. \/ *freu*
    Vielen Dank für eure Mühen. Jedoch bin ich mir sicher, dass sich noch weitere Fragen diesbezüglich bei mir aufdecken werden.
    Nochmals besten Dank!

    XAro

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Filou89
    Registriert seit
    24.12.2010
    Ort
    Thun, Switzerland
    Alter
    28
    Beiträge
    116
    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
    Geändert von Filou89 (18.07.2011 um 21:20 Uhr)

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    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

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    @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.
    Gruß
    Dirk

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •