- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 23

Thema: RP6 Slave und M32 Slave

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @fabqu:
    Die I/Os müßten alle in statusLEDs.byte, also im "Register" 29 (I2C_REG_LEDS) zu finden sein, so dass du alle I/Os ohne Änderung des I2C-Slave Programms der Base lesen kannst.
    Auch das Ansteuern der I/Os der Base über I2C von der M32 klappt ohne Änderungen über den Befehl CMD_SETLEDS z.B. so: I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SETLEDS, irgendwas);
    Gruß
    Dirk

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Ah, danke. Schon mal klasse, die ADCs und I/Os der Base sind dann ja schon alle dort, wo ich sie haben will. Ich muss die daten nur noch an den PC schicken, ist aber kein Problem, sollte ja gehen mit Code wie diesem:
    Code:
    writeString_P("ObsR:");
                writeInteger(obstacle_right, DEC);
                writeString_P("\n");
    Ich baue das mal ein und versuche auch die Befehle zum Schalten der Base-I/Os via PC einzubauen. Wenns nicht klappt (bestimmt kalppts bei mir nicht), würd ich mich heut noch mal an Euch Profis wenden

    Grüße und Danke

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    So
    Soweit hat alles geklappt!!! Ich sende die Daten mit dem unteren Code.
    Nur die I/Os der Base fehlen noch, die wusste ich nicht, wie ich die ordentlich einbinden soll.
    Vielleicht gibts da noch nen Tip von Euch?!?

    Code:
    void printSensors(void)
    {    
        if(sendData)
        {
            StartDataFrame();
            
            if(HasRP6)
            {                
                writeString_P("Bat:");
                writeInteger(adcBat, DEC);
                writeString_P("\n");
    
                writeString_P("SpeedL:");
                writeInteger(mleft_speed, DEC);
                writeString_P("\n");
                
                writeString_P("SpeedR:");
                writeInteger(mright_speed, DEC);
                writeString_P("\n");
                
                writeString_P("PowerL:");
                writeInteger(adcMotorCurrentLeft, DEC);
                writeString_P("\n");
                
                writeString_P("PowerR:");
                writeInteger(adcMotorCurrentRight, DEC);
                writeString_P("\n");        
            
                writeString_P("LightL:");
                writeInteger(adcLSL, DEC);
                writeString_P("\n");
                
                writeString_P("LightR:");
                writeInteger(adcLSR, DEC);
                writeString_P("\n");
                
                writeString_P("BumpL:");
                writeInteger(bumper_left, DEC);
                writeString_P("\n");
                
                writeString_P("BumpR:");
                writeInteger(bumper_right, DEC);
                writeString_P("\n");
                
                writeString_P("ObsL:");
                writeInteger(obstacle_left, DEC);
                writeString_P("\n");
                
                writeString_P("ObsR:");
                writeInteger(obstacle_right, DEC);
                writeString_P("\n");
                
                writeString_P("ADC0_Base:");
                writeInteger(adc0, DEC);
                writeString_P("\n");
                
                writeString_P("ADC1_Base:");
                writeInteger(adc1, DEC);
                writeString_P("\n");
                
                writeString_P("ADC2_M32:");
                writeInteger(ADC_2, DEC);
                writeString_P("\n");
                
                writeString_P("ADC3_M32:");
                writeInteger(ADC_3, DEC);
                writeString_P("\n");
                
                writeString_P("ADC4_M32:");
                writeInteger(ADC_4, DEC);
                writeString_P("\n");
                
                writeString_P("ADC5_M32:");
                writeInteger(ADC_5, DEC);
                writeString_P("\n");
                
                writeString_P("ADC6_M32:");
                writeInteger(ADC_6, DEC);
                writeString_P("\n");
                
                writeString_P("ADC7_M32:");
                writeInteger(ADC_7, DEC);
                writeString_P("\n");
                
            }
            
            if(HasSRF02)
            {
                writeString_P("Distance:");
                writeInteger(SRF02_Dist, DEC);
                writeString_P("\n");
            }
    
            if(HasM32)
            {
                writeString_P("Mic:");
                writeInteger(getMicrophonePeak(),DEC);
                writeString_P("\n");
            }    
            EndDataFrame();
        }    
    }
    Und noch eine Sache: Habe gerade die Daten mit hterm angesehen. Zum Die ADCs der M32 sind momentan LEER, da hängt nichts dran, ebenso der ADC1 der Base. Am ADC0 der Base ist ein Sharp-Abstandsmodul.
    Das seltsame: Die Werte, die ich für die ADCs 2 bis 7 der M32 erhalte entsprechen je ihrer Nummer, der ADC1 der Base ist immer gleich mit dem ADC0 der Base:

    Code:
    ADC0_Base:82<\n>ADC1_Base:83<\n>ADC2_M32:2<\n>ADC3_M32:3<\n>ADC4_M32:4<\n>ADC5_M32:5<\n>ADC6_M32:6<\n>ADC7_M32:7
    Stimmt da was nicht?

    Grüße

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Zu den I/Os:
    Wenn du die RP6Control_I2CMasterLib verwendest, werden ja die Register 27..29 nicht gelesen.
    Du könntest das Register 29 über I2C allein in ein Byte einlesen und mit writeInteger(Byte, BIN); binär anzeigen. Dann müßten die I/O-Zustände (1/0) der Bumper bzw. I/O1..4 gut erkennbar sein.

    ADC0/1 der Base:
    Probier mal, ADC1 der Base auf GND oder +5V zu legen. Dann müßte der Wert 0 bzw. 1023 richtig angezeigt werden.
    Gruß
    Dirk

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Du meinst den Teil "void getAllSensors(void)", oder?
    Dort müsste ich dann die beiden I/Os, die ich als Eingänge haben möchte, anfügen.
    Die meisten ADCs werden dort in zwei Buffereinträge geschrieben. (Warum?)
    Aber wie genau meinst du das mit "allein in ein Byte"?
    Meinst du sowas wie "InOut=sensorBuf[29]"? Dort steht ja dann so was wie 0100 (LED 2 an) !?
    Wenns so ist, dann ists einfach.

    Zu Den ADCs der M32: Sie zeigen wieder nur ihre nummer an, auch bei +5V oder Gnd am ADC.
    Aber ich finde den Fehler grad nicht, Code siehe oben, mein letzter Beitrag, die untersten "writeString"-Einträge
    Das Ergebnis ist das gleiche, wenn ich im oberen Code folgendes eingebe:

    writeString_P("ADC2_M32:");
    writeInteger(readADC(2), DEC);
    writeString_P("\n");

    usw für die anderen ADCs.

    Grüße
    Geändert von fabqu (25.09.2011 um 21:49 Uhr)

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Zitat Zitat von fabqu Beitrag anzeigen
    Die meisten ADCs werden dort in zwei Buffereinträge geschrieben. (Warum?)
    Die ADCs werden mit 10 Bit aufgelöst - d.h.: Du hast zwischen min- und max-Wert (0V und 5V) 1024 Abstufungen. 10 Bit passen aber nicht in eine 8-Bit-Variable, deshalb werden zwei 8-Bit-Variablen (bzw. ein 2-Byte-Variable) dafür vorgesehen.

    viele Grüße
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Aber wie genau meinst du das mit "allein in ein Byte"? Meinst du sowas wie "InOut=sensorBuf[29]"?
    Wenn du die RP6Control_I2CMasterLib verändern willst, könntest du die Funktion getAllSensors() so ändern:
    Code:
    void getAllSensors(void)
    {
     I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_POWER_LEFT, sensorBuf, 27);
     mleft_power = sensorBuf[0];
     mright_power = sensorBuf[1];
     mleft_speed = sensorBuf[2];
     mright_speed = sensorBuf[3];
     mleft_des_speed = sensorBuf[4];
     mright_des_speed = sensorBuf[5];
     mleft_dist = sensorBuf[6] + (sensorBuf[7]<<8);
     mright_dist = sensorBuf[8] + (sensorBuf[9]<<8);
     adcLSL = sensorBuf[10] + (sensorBuf[11]<<8);
     adcLSR = sensorBuf[12] + (sensorBuf[13]<<8);
     adcMotorCurrentLeft = sensorBuf[14] + (sensorBuf[15]<<8);
     adcMotorCurrentRight = sensorBuf[16] + (sensorBuf[17]<<8);
     adcBat = sensorBuf[18] + (sensorBuf[19]<<8);
     adc0 = sensorBuf[20] + (sensorBuf[21]<<8);
     adc1 = sensorBuf[22] + (sensorBuf[23]<<8);
     leds = sensorBuf[26];
    }
    Dann stehen die I/Os in der Variablen leds (global als uint8_t definieren!).

    Dort steht ja dann so was wie 0100 (LED 2 an) !?
    Genau.
    Gruß
    Dirk

Ähnliche Themen

  1. Slave Transmitter und Slave Receiver Mode
    Von masasibe im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 26.02.2011, 19:55
  2. I2C Slave
    Von Jada im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 19.06.2010, 11:47
  3. Slave-Master-Slave übertragung geht nicht
    Von Dämmi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 26.11.2008, 00:08
  4. I2C-Slave
    Von liggi im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 02.01.2008, 16:02
  5. Pic als Slave am I2C
    Von kalletronic im Forum PIC Controller
    Antworten: 4
    Letzter Beitrag: 04.08.2006, 19:46

Berechtigungen

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

12V Akku bauen