- Labornetzteil AliExpress         
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 Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Moin Fabian,

    die Werte der beiden ADCs stehen schon im readReg-Feld. Das sind die vier Werte ab Index I2C_REG_ADC_ADC0_L.

    Du kannst mehr Werte anfügen, indem Du noch defines an die Liste anhängst, ABER: die sollten die Länge des Feldes I2CTWI_readRegisters nicht überschreiten. Die ist in der RP6-Lib definiert (ich glaube 48, bin aber nicht ganz sicher) .

    Die beiden ADC-Variablen sind als uint16_t (als zwei Byte lang) definiert, das readReg-Feld besteht aber aus unit8_t (ein Byte). Mit den vier Befehlen, nach denen Du fragst, wird ein zwei-Byte-Wert in zwei Ein-Byte-Werte geschrieben.

    Warum willst Du die M32 als slave benutzen? Das Teil ist viel leistungsfähiger als die Base. (Ich habe gerade ein Programm laufen, in dem die Base nur die Steuerung und das Ausweichen übernimmt, und die M32 dann ein paar Werte auf dem Display anzeigt. Später soll dann die M32 noch weitere Aufgaben übernehmen.

    Sorry, ich glaube ich frage wieder mal totales Anfänger-Zeugs
    .

    Ja und? Wir haben doch alle mal angefangen Wer nicht fragt, bleibt auch Anfänger

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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Danke Dir
    Ich wollte ursprünglich noch die M128 draufsetzen, aber ich glaube ich machs jetzt erst mal einfacher:
    Ich nehme nun doch nur die Base als Slave und die M32 als Master. Die M128 lasse ich weg, weil ich einfach nicht durchblicke, was ich noch alles verändern müsste.

    Die Base hat 4 I/Os, 2 ADCs. Ich möchte die ADC-Werte (genauer Wert) und zwei der I/O-Werte (1 oder 0) auf den I2C schreiben.
    Die M32 soll diese beiden ADC-Werte der Base, die beiden I/O-Werte der Base auslesen und via Bluetooth senden.
    Außerdem soll die M32 die beiden übrigen I/Os der Base an-/aus- schalten können.
    Außerdem soll die M32 alle 6 eigenen ADC-Werte (genaue Werte, nicht nur high und low) via Bluetooth senden, die 8 I/Os der M32 verwende ich komplett für Servos.

    Für die Base liegt der Code zum Register oben, hier muss ich wohl noch die beiden I/Os, die ich auslesen will, anfügen. Aber wo muss ich die I/Os anfügen, die ich schalten will? Sie müssen ja von der M32 aus geschaltet werden.

    Der Code für das Auslesen der Rigister von der M32 ist hier:

    Code:
    /*****************************************************************************/
    // Sensors/ADCs: 
    
    // ADCs:
    uint16_t adcBat;
    uint16_t adcMotorCurrentLeft;
    uint16_t adcMotorCurrentRight;
    uint16_t adcLSL;
    uint16_t adcLSR;
    uint16_t adc0;
    uint16_t adc1;
    
    // Measured Speed:
    uint8_t mleft_speed;
    uint8_t mright_speed;
    
    // Distance
    uint16_t mleft_dist;
    uint16_t mright_dist;
    
    // Desired Speed:
    uint8_t mleft_des_speed;
    uint8_t mright_des_speed;
    
    // Power
    uint8_t mleft_power;
    uint8_t mright_power;
    
    uint8_t sensorBuf[24]; 
    
    /**
     * In order to use the same register names as in the RP6Lib, this
     * function reads all ADC channels and all motor parameters into
     * the same values as in the RP6Lib. 
     * Of course this function needs some time to read all these
     * 24 registers via the I2C Bus. 
     */
    void getAllSensors(void)
    {
        I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_POWER_LEFT, sensorBuf, 24);
        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);
    }
    
    /**
     *
     */
    void getLightSensors(void)
    {
        I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_LSL_L, sensorBuf, 4);
        adcLSL = sensorBuf[0] + (sensorBuf[1]<<8);
        adcLSR = sensorBuf[2] + (sensorBuf[3]<<8);
    }
    Und hier der Code für die M32, für das Senden der Daten über RS232:

    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");
            }
            
            if(HasSRF02)
            {
                writeString_P("Distance:");
                writeInteger(SRF02_Dist, DEC);
                writeString_P("\n");
            }
    
            if(HasM32)
            {
                writeString_P("Mic:");
                writeInteger(getMicrophonePeak(),DEC);
                writeString_P("\n");
            }    
            EndDataFrame();
        }    
    }
    
    void SendDebugData(void)
    {
        if (getStopwatch1() >=timeBetweenFrames)
        {
            getAllSensors();
            getLightSensors();
            printSensors();                
            setStopwatch1(0);
        }    
    }
    Und ich glaube das hier ist der Code, der die PC-Befehle empfängt und verarbeitet (in der M32):

    Code:
    void task_Commands(void)
    {
        if(getBufferLength()) 
        {
            char tmp = readChar(); 
            if (tmp =='#') 
            {
                mSleep(10); 
                counter = 0; 
            }
            text[counter] = tmp; 
            text[counter + 1] = '\0';
            counter++;
            clearPosLCD(1,0,15);
            setCursorPosLCD(1,0);
            writeStringLCD(text);
        }
        int cmd = getCommand();     
        if(cmd)
        {            
            switch(cmd)
            {
                case CMD_SET_SPEED:
                        moveAtSpeed(params[1],params[2]);
                        changeDirection(params[3]); 
                    break;
                case CMD_SET_SERVO:
                    servo_position[params[2]] = params[3];
                    break;
                case CMD_SET_LEDS:
                        switch(params[1])
                        {
                            case LEDS_RP6:
                                setRP6LEDs(params[2]);
                            break;
                            case LEDS_M32:
                                setLEDs(params[2]);
                            break;
                        }
                    break;
                case CMD_SET_BEEP: 
                    beep(params[2],params[3]);
                break;
                case CMD_SET_START_MELODY:
                {
                    uint8_t ToneCount = params[1];
                    uint8_t currCount = params[2];
                    uint8_t currPitch = params[3];
                    uint16_t currTime = params[4];
                    SPI_EEPROM_writeByte(3,ToneCount);
                    while(SPI_EEPROM_getStatus() & SPI_EEPROM_STAT_WIP);
                    uint8_t buffer[3];
                    buffer[0] = currPitch;
                    buffer[1] = currTime & 0x00ff;
                    buffer[2] = (currTime & 0xff00) >>8;
                    SPI_EEPROM_writeBytes(4+((currCount-1)*3),buffer,3);
                    while(SPI_EEPROM_getStatus() & SPI_EEPROM_STAT_WIP);
                    if(ToneCount == currCount)
                    {
                        SPI_EEPROM_writeByte(0,8);    //Die Checkbytes schreiben
                        SPI_EEPROM_writeByte(1,12);
                        SPI_EEPROM_writeByte(2,91);
                    }
                }
                break;
                case CMD_SET_FEATURE:
                    switch(params[1])
                    {
                        case SET_FEATURE_RP6:
                            HasRP6 = params[2];
                        break;
                        case SET_FEATURE_M32:
                            HasM32 = params[2];
                        break;
                        case SET_FEATURE_SERVOM32:
                            HasServoM32 = params[2];
                        break;
                        case SET_FEATURE_LCDM32:
                            HasLCDM32 = params[2];
                        break;
                        case SET_FEATURE_SRF02:
                            HasSRF02 = params[2];
                        break;
                        case SET_FEATURE_SRF02_1:
                            HasSRF02_1 = params[2];
                        break;
                        case SET_FEATURE_SRF02_2:
                            HasSRF02_2 = params[2];
                        break;
                        case SET_FEATURE_SRF08:
                            HasSRF08 = params[2];
                        break;
                    }                    
                    break;
                case CMD_SET_STOP: stop();
                    break;    
                case CMD_SET_CONNECTION_SPEED:
                        if(params[1] < 0)
                        {
                            sendData = 0;
                            timeBetweenFrames = 1000;
                        }
                        else
                        {
                            sendData = 1;
                            timeBetweenFrames = params[1];
                        }
                    break;
                case CMD_SET_MELODY:
                {
                    int current;
                    int all;
                    int currTime;
                    int currPitch;
                    current = params[1];
                    all = params[2];
                    currTime = params[3];
                    currPitch = params[4];
                    if((current >= 0 && current < 100) || current == -99)
                    {
                        if(current == -99)
                        {
                            PlayMelody(all);
                            return;
                        }
                        MelodyTimes[current] = currTime;
                        MelodyPitches[current] = currPitch;
    
                    }
                    else
                    {
                        StartDebugFrame();
                        writeString_P("Ton-Counter ist falsch!Counter: ");
                        writeInteger(current,DEC);
                        EndDebugFrame();
                    }
                }
                break;
                case CMD_SET_ACSPOWER:
                    I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, params[1]);
                break;
                case CMD_SET_TEST:
                    switch(params[1])
                    {
                        case TEST_LCD:
                            TestLCD();
                        break;
                        case TEST_BEEPER:
                            TestBeeper();
                        break;
                        case TEST_LED:
                            TestLEDs();
                        break;
                        case TEST_EXTERNAL_MEMORY:
                            TestExternalMemory();
                        break;
                        case TEST_I2CLED:
                            TestI2CLEDs();
                        break;
                        case TEST_I2CMOTOR:
                            TestI2CMotor();
                        break;
                        case TEST_MIC:
                            TestMic();
                        break;
                    }
                break;
            }
            cmd= 0;
        }
    }
    Was muss ich denn jetzt hier machen?
    Sorry, ist wohl echt viel Zeugs...
    Aber danke Euch schon mal für Eure Hilfen!

    Grüße,
    Fabian
    Geändert von fabqu (25.09.2011 um 09:50 Uhr)

  3. #3
    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

  4. #4
    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

  5. #5
    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

  6. #6
    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

  7. #7
    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)

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress