-
        

Ergebnis 1 bis 3 von 3

Thema: (eigentlich unwichtige) Fragen zu getCommand aus RP6Base_I2CSlave.c

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164

    (eigentlich unwichtige) Fragen zu getCommand aus RP6Base_I2CSlave.c

    Anzeige

    Moin *,

    nur des Verständnisses wegen (weil ich gerade mit dem I2C-Bus kämpfe ).

    Zur Funktion:
    Code:
    uint8_t getCommand(void)
    {
    	if(I2CTWI_writeRegisters[I2C_REGW_CMD] && !I2CTWI_writeBusy) 
    	{
    		cmd = I2CTWI_writeRegisters[I2C_REGW_CMD]; // store command register
    		I2CTWI_writeRegisters[I2C_REGW_CMD] = 0; // clear command register (!!!)
    		param1 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM1]; // parameters 1-6...
    		param2 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM2];
    		param3 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM3];
    		param4 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM4];
    		param5 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM5];
    		param6 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM6];
    		return true;
    	}
    	return false;
    }
    1. Die if-Bedingung würde ich umdrehen:
    Code:
    if (!I2CTWI_writeBusy && I2CTWI_writeRegisters[I2C_REGW_CMD])
    Wenn der Compiler optimiert, braucht der "teure" Indexzugriff nicht ausgeführt werden, wenn die erste Bedingung schon falsch ist. Oder?

    2. clear command register
    Code:
    I2CTWI_writeRegisters[I2C_REGW_CMD] = 0;
    Wenn ich das richtig verstanden habe, dann dient das Zurücksetzen dazu, dem Master zu signalisieren, dass der Slave den Befehl verstanden und die Parameter gespeichert hat. Sollte das denn nicht am Ende (nach den param-Zuweisungen) stehen? So wie oben könnte doch ein ungeduldiger Master die Parameter schon wieder überschrieben haben. Oder?

    Ja - ich weiß - es steht in vielen Kommentaren, dass die Programme Raum für Verbesserungen bieten (und SlyD hat das ja auch mehrfach betont!). Gehört diese Funktion auch dazu?

    viele Grüße
    Andreas
    Geändert von danimath (25.08.2011 um 19:23 Uhr)
    #define true ('/'/'/')
    #define false ('-'-'-')

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

    Zu 1:
    Das ist relativ egal da beide Variablen sehr selten gesetzt werden aber NUR dann wenn in dem writeRegister was drin steht auch was gemacht werden soll (und nur DANN wird auch geschaut ob das gerade geht oder ob noch ein Schreibvorgang läuft).


    Zu 2:

    > ... dann dient das Zurücksetzen dazu, dem Master zu signalisieren, ...

    Nö. Das ist damit beim nächsten Aufruf von getCommand in

    I2CTWI_writeRegisters[I2C_REGW_CMD]

    eine 0 drin steht. Sonst würde das gleiche Kommando ja nochmal ausgeführt.
    Der Master bekommt davon nix mit der hat auch gar keinen lesenden Zugriff auf die writeRegister (read und write Regsiter sind zwei verschiedene Arrays!)


    > So wie oben könnte doch ein ungeduldiger Master die Parameter schon wieder überschrieben haben.

    Eigentlich nicht, da vorher getestet wird (writeBusy) ob gerade irgendwas geschrieben wird (die Variable ist solange 0 bis Adresse+W empfangen wurde).
    Wenn nicht wird sehr schnell der Code ausgeführt und der aktuelle Befehl in Variablen zwischengespeichert.
    Der I2C Bus läuft nur mit maximal 400kHz versus den 8MHz des ATMEGA selbst wenn direkt nach der if Abfrage writeBusy = 1 werden sollte käme
    des I2C Bus nicht so schnell hinterher. Der schreibt ja da auch erstmal welches Register überhaupt beschrieben werden soll und erst danach
    kommen die Daten und die Register werden tatsächlich geändert...


    MfG,
    SlyD

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Zitat Zitat von SlyD Beitrag anzeigen
    > ... dann dient das Zurücksetzen dazu, dem Master zu signalisieren, ...

    Nö. Das ist damit beim nächsten Aufruf von getCommand in

    I2CTWI_writeRegisters[I2C_REGW_CMD]

    eine 0 drin steht. Sonst würde das gleiche Kommando ja nochmal ausgeführt.
    OK - habbich verstanden.

    Zitat Zitat von SlyD Beitrag anzeigen
    Der Master bekommt davon nix mit der hat auch gar keinen lesenden Zugriff auf die writeRegister (read und write Regsiter sind zwei verschiedene Arrays!)
    Ach ja - wenn der danimath mal seine eigenen Eselbrücken anwenden würde "read" und "write" sind ja immer aus Mastersicht.

    Danke für die ausführliche Anwort!
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

Ähnliche Themen

  1. Was brauche ich eigentlich?
    Von tintenfrosch im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 21
    Letzter Beitrag: 17.09.2011, 00:27
  2. LDR auf SF08. Wieso eigentlich ?
    Von PicNick im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 30.09.2005, 08:56
  3. Was bracuhe ich eigentlich...
    Von Art im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 05.08.2005, 23:16
  4. was brauche ich eigentlich?
    Von im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 20.05.2005, 13:14
  5. Was ist eigentlich genau der Ankerstrom ?
    Von UGMode im Forum Motoren
    Antworten: 4
    Letzter Beitrag: 28.04.2005, 20:53

Berechtigungen

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