- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 6 von 6

Thema: Zusammenspiel der BASE und M32 Control

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180

    Zusammenspiel der BASE und M32 Control

    Anzeige

    E-Bike
    Hi allerseits,


    Ich habe mir jetzt auch das M32 Modul gekauft und möchte in Zukunft versuchen mich in der Programmierung darauf zu konzentrieren...

    In einem der Bespiele sind diese Code-schnipsel für das Ausführen von z.B. des move Befehls durch den Base-Prozessor verantwortlich:

    Code:
    #include "RP6I2CmasterTWI.h"	// I2C Master Library
    #include "RP6Control_I2CMasterLib.h" //RP6 Control I2C Master library
    Code:
    void watchDogRequest(void)
    {
    	static uint8_t heartbeat2 = false;
    	if(heartbeat2)
    	{
    		clearPosLCD(0, 14, 1);
    		heartbeat2 = false;
    	}
    	else
    	{
    		setCursorPosLCD(0, 14);
    		writeStringLCD_P("#"); 
    		heartbeat2 = true;
    	}
    }
    
    // I2C Requests: 
    
    /**
     * The I2C_requestedDataReady Event Handler
     */
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	checkRP6Status(dataRequestID);
    }
    
    // I2C Error handler
    
    /**
     * This function gets called automatically if there was an I2C Error like
     * the slave sent a "not acknowledge" (NACK, error codes e.g. 0x20 or 0x30).
     */
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR - TWI STATE: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    Code:
    	// ---------------------------------------
    	WDT_setRequestHandler(watchDogRequest); 
    	
    	// ---------------------------------------
    	// Init TWI Interface:
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    	
    	// ---------------------------------------
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    In der BASE ist „RP6Base_I2CSlave.hex“ geladen.


    Fragen:

    - Wäre es vorstellbar diesen Code in eine Funktion, meinetwegen „void master-slave(void)„ auszulagern und bei Bedarf als „master-slave();“ in ein Programm (Hauptschleife) ähnlich wie z.B. „task_motionControl();“ einzutragen?

    - wäre/ist mit dem einbinden der obigen Code-schnipsel sichergestellt, dass alle in der BASE-lib-Dateien vorhandene Funktionen zwar in/durch das Programm im Controlmodul initiiert, aber im Base-Prozessor ausgeführt werden, oder ist das viel komplizierter als ich es mir hier vorstelle?
    gruß inka

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Hallo Inka,

    hast Du schon die RP6-M32 Beispielprogramme bis zuende angeschaut?
    Da wird ziemlich genau das in ein paar Schritten zusammengebastelt.
    Im Beispiel example_10_move2 hat man dann eine nahezu vollständige Abbildung der RP6Base Funktionen auf dem M32 Erweiterungsmodul. Die Funktionen heissen dann auch fast genau so - move, rotate, moveAtSpeed, ...

    Und ja, die Kommandos die über den I2C Bus übertragen werden, werden auf dem Prozessor auf der RP6Base ausgeführt (Bewegungsbefehle...) und die Sensorik wird auch dort ausgewertet (ACS, Bumper usw. ) und bei Änderungen die M32 Erweiterung informiert.

    In dem genannten Beispiel sind die Avoid und Escape Verhaltensmuster aus den normalen RP6Base Examples auf die M32 portiert worden.


    > eine Funktion, meinetwegen „void master-slave(void)„ auszulagern

    Die Funktion heisst zwar nicht maste-slave
    aber die beiden hier
    task_checkINT0();
    task_I2CTWI();

    zusammen machen denke ich in etwa das was Du meinst.
    Wobei die allerdings indirekt einiges anderes auslösen was dann in anderen Funktionen abgearbeitet wird, z.B. in checkRP6Status...

    MfG,
    SlyD

    PS:
    Falls Du gemeint hast wie Du die oben genannten I2C_... Funktionen aus deinem eigenen Programm "raus" bekommst wegen Übersichtlichkeit - kannst die natürlich auch einfach mit in die RP6Control_I2CMasterLib.c mit reinpacken.
    Die Watchdog Funktion ist allerdings Programmspezifisch weil die Ausgaben auf dem LCD macht also sollte die nicht in die Lib mit rein...

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi SlyD,

    ich muss meine fragen ein bischen konkretisieren - ich möchte die grundsätzlichen zusammenhänge verstehen, ohne die details der einzelnen funktionen zu kennen...

    - durch das anschließen der M32-Control werden programme die in die BASE geflasht wurden nicht ausgeführt, mit ausnahme von RP6Base_I2CSlave.hex, wenns in der BASE geflasht ist - ok?
    Diese RP6Base_I2CSlave.hex ermöglicht den zugrif von CONTROL auf die BASE grundfuntionen - ok?

    - der befehl "move" ist in der "RP6RobotBaseLib.c" und in der "RP6Control_I2CMasterLib.c" enthalten. Wenn ein programm in der CONTROL den befehl "move" beinhaltet, wird auf die "RP6Control_I2CMasterLib.c" zugegriffen und durch die befehlsfolge:

    Code:
     I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
       I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
       I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    dafür gesorgt, dass dieser/diese befehle im BASE prozessor ausgeführt wird/werden?
    gruß inka

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    > - durch das anschließen der M32-Control werden
    > programme die in die BASE geflasht wurden nicht ausgeführt,

    Nö.
    Es sind zwei völlig voneinander unabhängige Mikrocontroller. Die haben erstmal gar nix miteinander zu tun, sind nur lose über den I2C Bus miteinander verbunden.
    (so wie eine Netzwerk Verbindung bei einem PC - zwei vernetzte PCs sind auch erstmal unabhängig voneinander, kannst aber natürlich per Remote Desktop oder SSH oder... den einen durch den anderen fernsteuern).

    Die Beispielprogramme sind aber drauf ausgelegt das die I2CSlave.hex in die Base geflasht wurde sonst ist eben niemand da der auf die gesendeten Befehle reagiert.


    > zugegriffen und durch die befehlsfolge:

    Warum Du nun genau diese Befehle rausgekramt hast ist mir nicht so ganz klar. Da wird das ACS eingestellt und der Watchdog Timer aktiviert.

    Für move wird CMD_MOVE und die entsprechenden parameter (Geschwindigkeit, Strecke, Richtung) über den Bus übertragen - das ist aber nur EINE I2C Transaktion.

    s.
    Code:
    /**
     * Move function - just the same as with RP6Lib!
     */
    void move(uint8_t desired_speed, uint8_t dir, uint16_t distance, uint8_t blocking)
    {
    	transmit_buffer[0] = 0;
    	transmit_buffer[1] = CMD_MOVE;
    	transmit_buffer[2] = desired_speed;
    	transmit_buffer[3] = dir;
    	transmit_buffer[4] = ((distance>>8) & 0xFF);
    	transmit_buffer[5] = (distance & 0xFF);
    	I2CTWI_transmitBytes(I2C_RP6_BASE_ADR, transmit_buffer, 6 );
    	waitForTransmitComplete();
    	while(blocking && !drive_status.movementComplete) 
    	{
    		task_checkINT0();
    		task_I2CTWI();
    	}
    }
    Zentral ist dabei
    I2CTWI_transmitBytes(I2C_RP6_BASE_ADR, transmit_buffer, 6 );
    (alle vorher in das Array geschriebene 6 Bytes über den Bus übertragen)

    Der Rest ist nur vor und nacharbeit.

    MfG,
    SlyD

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi SlyD,

    Es sind zwei völlig voneinander unabhängige Mikrocontroller. Die haben erstmal gar nix miteinander zu tun, sind nur lose über den I2C Bus miteinander verbunden.
    (so wie eine Netzwerk Verbindung bei einem PC - zwei vernetzte PCs sind auch erstmal unabhängig voneinander, kannst aber natürlich per Remote Desktop oder SSH oder... den einen durch den anderen fernsteuern).

    Die Beispielprogramme sind aber drauf ausgelegt das die I2CSlave.hex in die Base geflasht wurde sonst ist eben niemand da der auf die gesendeten Befehle reagiert.
    ok, verstanden...

    ich habe jetzt die beiden (BASE & CONTROL) programmspeicher gelöscht, dann in die BASE das beispiel "RP6Base_LEDs.hex" und in CONTROL "RP6Control_LCD.hex" geflasht, beide programme liefen parallel ab. Ich hatte aber auch schon mal fälle, nur das in CONTROL geladene programm lief, das in BASE nicht. Hier fehlt mir noch die "regel", nach der das abläuft. Welches programm nun durch den druck auf den taster (neben dem flash-stecker) gestartet wird...
    Aber egal, wenn ich mich auf das CONTROL modul konzentrieren will, sollte ich in der BASE wohl maximal das I2C slaveprogramm geladen haben, oder den programmspeicher löschen...
    Warum Du nun genau diese Befehle rausgekramt hast ist mir nicht so ganz klar. Da wird das ACS eingestellt und der Watchdog Timer aktiviert.

    Für move wird CMD_MOVE und die entsprechenden parameter (Geschwindigkeit, Strecke, Richtung) über den Bus übertragen - das ist aber nur EINE I2C Transaktion.
    es sollte nur ein beispiel sein für eine funktion, die von der BASE quasi stellvertretend für CONTROL ausgeführt werden soll..

    Zentral ist dabei
    I2CTWI_transmitBytes(I2C_RP6_BASE_ADR, transmit_buffer, 6 );
    (alle vorher in das Array geschriebene 6 Bytes über den Bus übertragen)
    hierzu werde ich sicher noch fragen haben...

    danke erstmal...
    gruß inka

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    523
    Eigentlich sollten immer beide Programme ausgeführt werden.
    Eine Regel in diesem Sinne gibt es nicht.
    Also hast du entweder nicht mitbekommen, dass das Programm auf der Base läuft oder es wurde durch irgendeinen nicht näher bekannten Fehler nicht gestartet.

Berechtigungen

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

Solar Speicher und Akkus Tests