-         

Ergebnis 1 bis 3 von 3

Thema: Über i2c etwas senden

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66

    Über i2c etwas senden

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,

    ich habe mir einen Servo-Controller zugelegt. Modell SD21.
    Das möchte ich nun ansteuern.
    Nachdem ich die Library von Peter Fleury eingebunden habe, und mir das Beispielprogramm angesehen habe, bin ich zu der Erkenntnis gekommen das man zunächst das INIT durchführen muss, dann kommt die Addrese oder das Register in dem man schreiben möchte und als nächstes dann der Wert. Zum Schluß dann ein Stop.

    In der Doku von dem Controller ist dann folgendes aufgeführt (Auszug):
    Register Servo Function
    0 1 Speed
    1 1 Low byte
    2 1 High byte


    Soweit sogut, die Addresse, damit sich das Ding überhaupt angesprochen fühlt ist 0xC2 ($C2).


    Nun habe ich folgendes probiert:



    Code:
    #define Dev24C02  0xC2      // device address of EEPROM 24C02, see datasheet
    
    int main( void )
    {
    
    uint16_t two_bytes = 0x3E8;
    uint8_t  high_byte = two_bytes & 0xff00;
    uint8_t  low_byte  = two_bytes & 0x00ff;
    
       
        i2c_init(); // initialize I2C library
        i2c_start_wait(Dev24C02+I2C_WRITE);
        i2c_write(0x00);  //Adresse (Speed)
        i2c_write(0x00);  //Wert
        i2c_stop();
    
        i2c_start_wait(Dev24C02+I2C_WRITE);
        i2c_write(0x01);		//Adresse	(Pos lowByte)
        i2c_write(low_byte);	//Wert
        i2c_stop();
    
        i2c_start_wait(Dev24C02+I2C_WRITE);
        i2c_write(0x02);		//Adresse	(Pos highByte)
        i2c_write(high_byte);	//Wert
        i2c_stop(); 
       
    
    
    while(1)
    	{
    	}
    }

    Es passiert rein gar nichts.
    Nun frage ich mich was da so alles falsch dran ist.


    In dem Beispielprogramm der Doku zu dem SD21 war folgendes zu lesen:
    I2COUT SDA, SD21, Servo1, [Speed, Servo.LOWBYTE, Servo.HIGHBYTE]

    Die senden das also in einem Rutsch rüber. Das liegt aber vielleicht daran, das das BASIC ist und die Funktioinen komplett anders laufen.

    Wer kann mir helfen?

    Gruß, Andreas





    /////////////////EDIT/////////////
    Habe den ersten Fehler gefunden:
    Die Pinne am Controller waren vertauscht. Irgendwie taugen diese Wannenstecker nix.

    Aktueller Stand:
    Der Servocontroller schickt den Servo ins Nirvana. Es läuft auf den Endanschlag und würde gern noch weiter. Dabei wird es recht warm.

    Also wird wohl etwas beim senden schief laufen.
    Diese HighByte / LowByte Geschichte oben ist auch nur zusammenkopiert. Ist da vielleicht ein Fehler drin?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Ein Fehler liegt hier:
    uint8_t high_byte = two_bytes & 0xff00;
    Damit ist das high_byte immer Null, da bei der Uwandlung auf 8bit die oberen Bits abgeschnitten werden. (gibt es da eigentlich eine Compilerwarnung?)

    Besser so:
    uint8_t high_byte = (uint8_t)((two_bytes & 0xff00)>>8);
    Die oberen Bits maskieren, dann ins untere Byte schiben, und dann zur Sicherhiet noch auf den richtigen Typ casten.

    Und letztlich kann man dabei auf die Maskierung verzichten, da das untere Byte sowieso beim Schieben wegfällt.
    uint8_t high_byte = (uint8_t)((two_bytes>>8);

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Vielen Dank, nun geht es. Das war der Fehler.

    Gruß, Andreas

Berechtigungen

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