danke dir!
Wird ausprobiert, wenn die neuen Teile da sind![]()
danke dir!
Wird ausprobiert, wenn die neuen Teile da sind![]()
So, SRF02 ist angeschlossen, LIB sollte eingebunden sein.
Dennoch bekomme ich eine Fehlermeldung.
Hier mein Code aus der SRF02-Lib:
Und hier, wie ichs in meiner M32-Slave aufrufe: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; } }
In der Zeile mit uint16_t SRF02_Dist... kommt dieser Fehler: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 ;Danke Euch!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
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)
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
Lesezeichen