- LiFePO4 Speicher Test    Werbung      
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
    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)?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Hmm. Also im Header habe ich den task als "void task_SRF02(void)" benannt. Und "SRF02_Dist" als externe uint16_t. Das heißt doch, dass wenn ich den Task in meiner Hauptschleife immer wieder aufrufe, dass dann die Variable SRF02_Dist stets neu beschrieben wird und auch in meinen anderen Funktionen verfügbar ist, ich brauche also keinen Rückgabewert im Tast (kein return ...). Und ich muss den Wert auch nicht mehr extra zuweisen, den sollte ja die Variable SRF02_Dist schon haben. Ich kann also einfach schreiben:
    Code:
            I2CTWI_readRegisters[I2C_RF02_DIST_LOW] =          (SRF02_Dist & 0x00ff);
            I2CTWI_readRegisters[I2C_RF02_DIST_HIGH] =          (SRF02_Dist & 0xff00) >> 8;
    Jedoch klappt das dann nicht, ich bekomme wieder Fehler:
    Code:
    avr-gcc -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6M32_I2CSlave.o -I../../Library -I../../Library/RP6control -I../../Library/RP6common -std=gnu99 -MD -MP -MF .dep/RP6M32_I2CSlave.elf.d RP6M32_I2CSlave.o ../../Library/RP6control/RP6ControlLib.o ../../Library/RP6common/RP6uart.o ../../Library/RP6common/RP6I2CslaveTWI.o ../../Library/RP6control/RP6ControlServoLib.o ../../Library/RP6common/RP6RemotrolCommon.o --output RP6M32_I2CSlave.elf -Wl,-Map=RP6M32_I2CSlave.map,--cref    -lm
    RP6M32_I2CSlave.o: In function `task_updateRegisters':
    C:\Users\Fabian\Dropbox\BA_Robotik\Firmware\M128 - Master\M32 - Slave/RP6M32_I2CSlave.c:104: undefined reference to `SRF02_Dist'
    C:\Users\Fabian\Dropbox\BA_Robotik\Firmware\M128 - Master\M32 - Slave/RP6M32_I2CSlave.c:104: undefined reference to `SRF02_Dist'
    RP6M32_I2CSlave.o: In function `main':
    C:\Users\Fabian\Dropbox\BA_Robotik\Firmware\M128 - Master\M32 - Slave/RP6M32_I2CSlave.c:275: undefined reference to `task_SRF02'
    make: *** [RP6M32_I2CSlave.elf] Error 1

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Jetzt habe ich versucht, eine Funktion direkt im Slave aufzurufen, da es ja mit der fremden Lib nicht geht:
    Code:
    #define    SRF02_Adr    0xE0                            //Standardadresse des SRF02
    void task_SRF02(void);
    {
        I2CTWI_transmit2Bytes(SRF02_Adr, 0, 81);        //Gib Distanz in cm zurück
            mSleep(100);
            I2CTWI_transmitByte(SRF02_Adr, 2);
            uint8_t highbyte = I2CTWI_readByte(2);
            I2CTWI_transmitByte(SRF02_Adr, 3);
            uint8_t lowbyte = I2CTWI_readByte(3);
            uint16_t SRF02_Dist = (highbyte*256)+lowbyte;
            writeString_P("\n distance:");
            writeInteger(distance,DEC);
            return SRF02_Dist;
    }
    Meine Abfrage dann im Register:
    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;
    Jedoch wieder nur Fehler. Das #include "SRF02ControlLibrary.h" habe ich aber schon rausgenommen.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Das mit der Funktion funktioniert jetzt, nur verwende ich die drei Master-Funktionen in meinem Slave-Programm:
    - I2CTWI_transmit2Bytes
    - I2CTWI_transmitByte
    - I2CTWI_readByte
    Die Master-Lib für diese Funktionen darf ich aber nicht einbinden, da nur Slave ODER Master geht.
    Welche Funktionen kann ich denn statt dessen verwenden? "I2CTWI_writeRegisters" geht ja auch nicht.

    Danke Euch!
    Fabian

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    41
    Beiträge
    1.516
    Ein Slave überträgt nichts aktiv. Der Master ZIEHT im das sozusagen alles aus der Nase.
    Also klar das die transmit Funktionen nicht verwendet werden können.

    Alles in die passenden Register reinschreiben - fertig.
    Ggf. noch das externe Interrupt Signal schalten um den Master zu informieren.

    oh und das hier:
    > uint16_t SRF02_Dist = task_SRF02();

    und das hier:

    > void task_SRF02(void);
    > {

    ist beides nicht korrekt.

    MfG,
    SlyD

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    773
    Danke dir, SlyD!
    Die beiden Voids und so habe ich glaube ich schon richtig gestellt.
    Nur in welche Register soll ichs dann schreiben?
    Ich will ja, dass der Slave diese Aufgabe übernimmt... Die M32 hat bei mir außer Beepen, Servos und Taster nix zu tun.
    Aber natürlich soll sie auch noch die eigenen Register abarbeiten, die von der M128 kommen.

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    41
    Beiträge
    1.516
    ah mmm - Ich hatte den Anfang vom Thread nicht gelesen:


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


    Wenn die M128 Master ist, dann MUSS diese ALLE I2C Slaves kontrollieren.
    Du kannst nicht einfach einen der Slaves verwenden um andere Slaves auszulesen das kann also nicht richtig funktionieren.

    --> Dazu wäre eine Mulit-Master I2C Implementierung notwendig.
    Die standard Lib unterstützt das nicht.

    Du könntest allenfalls eine Software I2C Master Implementierung auf der M32 probieren und zwei frei I/O Ports für ein separates I2C Bus Segment nutzen. Also keine direkte Verbindung zum Haupt Bus. Macht aber eigentlich keinen Sinn.

    MfG,
    SlyD

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

    Werbung      Labornetzteil AliExpress