- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 16

Thema: Anleitung: neue Lib einbinden

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773

    Anleitung: neue Lib einbinden

    Hallo liebe RP6-ler,

    habe ein neues Problem, für das ich noch keine (voll) zufriedenstellende Antwort gefunden habe.
    Ich habe ein Slave-Programm für die M32, jedoch soll sie nun auch über I2C einen Kompass (CMPSxx) und einen US (SRF02) auslesen und in die eigenen I2C-Register schreiben.
    Meine ganzen Libs sind in einem Ordner:
    .../Firmware/Library und dann eben /RP6control und so weiter, wie mans eben kennt.
    Mein Slave der M32 liegt auf:
    .../Firmware/M128 - Master/M32 - Slave

    Nun die Frage:
    Was genau muss ich dafür tun, um die einzubinden???
    Welcher Pfad muss ins Makefile...

    Sorry, aber sowas habe ich noch niemals gemacht.

    Danke euch!

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @fabqu:
    Mit diesem Teil:
    Code:
    ###############################################################################
    # Specify relative path to RP6 library files here.
    # This is "../../RP6lib" or "../RP6lib" usually.
    RP6_LIB_PATH=../../RP6lib
    RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6control $(RP6_LIB_PATH)/RP6common
    ###############################################################################
    ... kannst du den Pfad zu deinen Libs RELATIV zum Verzeichnis deines .c-Programms eintragen.
    Die wesentliche Zeile ist: RP6_LIB_PATH=
    Wenn dein Programm (Prog.c) im Verzeichnis /Firmware/M128 - Master/M32 - Slave/ ist, dann brauchst du 2x ../ , um (in der Baumstruktur der Verzeichnisse rückwärts) ins Verzeichnis /Firmware zu kommen, danach must du noch /Library anhängen, um (in der Baumstruktur aufwärts) in dein Hauptverzeichnis der Libs zu kommen:
    RP6_LIB_PATH=../../Library
    Wenn du die Zeile RP6_LIB_PATH_OTHERS= so läßt, werden deine Libs auch in den Unterverzeichnissen /RP6control und /RP6common gefunden.

    Die Libs werden dann wie üblich in den SRC += Zeilen eingetragen, z.B.:
    SRC += $(RP6_LIB_PATH)/RP6control/MyOwnLib.c
    ... wenn die Lib in /Firmware/Library/RP6control ist.
    Gruß
    Dirk

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    danke dir!
    Wird ausprobiert, wenn die neuen Teile da sind

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    So, SRF02 ist angeschlossen, LIB sollte eingebunden sein.

    Dennoch bekomme ich eine Fehlermeldung.
    Hier mein Code aus der SRF02-Lib:
    Code:
    // wurde früher aus PCConnection aufgerunfen, jetzt aus Slave!!
    uint8_t messageBuf[8];
    void checkSRFStatus(uint8_t dataRequestID){
        static uint8_t dist_tmp;
        switch(dataRequestID)
        {
            case MEASURE_US_HIGH: // High data register
                // get received data ...
                I2CTWI_getReceivedData(messageBuf, 2);
                dist_tmp = (messageBuf[0]);
                // ... and request low data byte:
                I2CTWI_transmitByte(SRF_ADR, 3);
                I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_LOW, 1);
    
            break;
            case MEASURE_US_LOW: // low data byte:
                I2CTWI_getReceivedData(messageBuf, 2);
                gemesseneEntfernungSRF = messageBuf[0] + (dist_tmp << 8);
            
            break;
            default:break;
        }
    }
    
    void task_SRF02(void)
    {
        if(messungOkay>=1){
            static uint8_t measureInProgress = false;
            if(!measureInProgress) // Start measurement ONCE only
            {
                if(TWI_operation == I2CTWI_NO_OPERATION) // If there is no request in progress...
                {
                    I2CTWI_transmit2Bytes(SRF_ADR, 0, 81); // 81 means return distance in cm
                    measureInProgress = true;
                    setStopwatch7(0);
                }
            }
            else if(getStopwatch7() > 70)  // 120ms (measurement delay)
            {
                I2CTWI_transmitByte(SRF_ADR, 2); // range register high byte
                I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_HIGH, 1); // receive it
                measureInProgress = false;     // allow to start new measurement
                setStopwatch7(0);
                
                // Die Messung mitteln
                zaehler++;
                SRF02_zwischenergebnis=SRF02_zwischenergebnis+gemesseneEntfernungSRF;
            }        
            
            if(zaehler>=3){
                SRF02_Dist = SRF02_zwischenergebnis/zaehler;
                zaehler = 0;
                SRF02_zwischenergebnis = 0;
            }
            
        }else{
            SRF02_Dist=-1;
            
        }
    }
    Und hier, wie ichs in meiner M32-Slave aufrufe:
    Code:
    uint16_t mic = getMicrophonePeak();
            uint16_t SRF02_Dist = task_SRF02();
            I2CTWI_readRegisters[I2C_BUTTON] =                  (getPressedKeyNumber());
            I2CTWI_readRegisters[I2C_MICROPHONEPEAKLOW] =    (mic & 0x00ff);
            I2CTWI_readRegisters[I2C_MICROPHONEPEAKHIGH] =     (mic & 0xff00) >> 8;
            I2CTWI_readRegisters[I2C_ADC_2] =                  (uint16_t)readADC(ADC_2);
            I2CTWI_readRegisters[I2C_ADC_3] =                  (uint16_t)readADC(ADC_3);
            I2CTWI_readRegisters[I2C_ADC_4] =                  (uint16_t)readADC(ADC_4);
            I2CTWI_readRegisters[I2C_ADC_5] =                  (uint16_t)readADC(ADC_5);
            I2CTWI_readRegisters[I2C_ADC_6] =                  (uint16_t)readADC(ADC_6);
            I2CTWI_readRegisters[I2C_ADC_7] =                  (uint16_t)readADC(ADC_7);
            I2CTWI_readRegisters[I2C_RF02_DIST_LOW] =          (SRF02_Dist & 0x00ff);
            I2CTWI_readRegisters[I2C_RF02_DIST_HIGH] =          (SRF02_Dist & 0xff00) >> 8 ;
    In der Zeile mit uint16_t SRF02_Dist... kommt dieser Fehler:
    Code:
    RP6M32_I2CSlave.c: In function 'task_updateRegisters':
    RP6M32_I2CSlave.c:92: error: void value not ignored as it ought to be
    make: *** [RP6M32_I2CSlave.o] Error 1
    Danke Euch!


    EDIT: Ich habe zum EInen vergessen, "checkSRFStatus" in meiner Slave aufzurufen... Wie und wo??
    Geändert von fabqu (27.01.2012 um 15:09 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    RP6M32_I2CSlave.c:92: error: void value not ignored as it ought to be
    So wie du task_SRF02() definiert hast, hat die Funktion keinen Ausgabewert.
    Gruß
    Dirk

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Ok, richtig. Habe ein "return SRF02_Dist;" angehängt und die Fkt. "uint16_t task_SRF02(void)" genannt, statt "void task_...". Gleiches Problem... Kann es daran liegen, dass ich im task und in meiner update_Register-Funktion denselben Namen verwende (SRF02_Dist)?

Ähnliche Themen

  1. Einbinden der avr.h
    Von chaka im Forum Assembler-Programmierung
    Antworten: 8
    Letzter Beitrag: 03.09.2009, 18:08
  2. Library einbinden
    Von fofi1 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 03.02.2009, 22:48
  3. Bascom asm. einbinden
    Von philiph im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 23.10.2006, 15:00
  4. AVR-GCC: *.C und *.H aus Unterverzeichnis einbinden
    Von Hans Meier im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 10.10.2006, 16:28
  5. Anleitung: Tastatur einbinden
    Von Reeper im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 08.08.2006, 19:46

Berechtigungen

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

Solar Speicher und Akkus Tests