So wie du task_SRF02() definiert hast, hat die Funktion keinen Ausgabewert.RP6M32_I2CSlave.c:92: error: void value not ignored as it ought to be
Werbung
So wie du task_SRF02() definiert hast, hat die Funktion keinen Ausgabewert.RP6M32_I2CSlave.c:92: error: void value not ignored as it ought to be
Gruß
Dirk
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)?
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:
Jedoch klappt das dann nicht, ich bekomme wieder Fehler:Code:I2CTWI_readRegisters[I2C_RF02_DIST_LOW] = (SRF02_Dist & 0x00ff); I2CTWI_readRegisters[I2C_RF02_DIST_HIGH] = (SRF02_Dist & 0xff00) >> 8;
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
Jetzt habe ich versucht, eine Funktion direkt im Slave aufzurufen, da es ja mit der fremden Lib nicht geht:
Meine Abfrage dann im Register: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; }
Jedoch wieder nur Fehler. Das #include "SRF02ControlLibrary.h" habe ich aber schon rausgenommen.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;
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
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
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.
Lesezeichen