Ultraschall und Dunkles Licht? Ist doch Licht unabhänig.
Ich hab die Messung und die Behaviour in 2 verschiedene Header dateien.
Ich denke das da dadurch etwas bei der Übergabe schief geht.
Main Code hier
SRF CodeCode:#include "RP6RobotBaseLib.h" #include "SRF.h" #include "Verhalten.h" int main (void) { uint8_t button = 0; initRobotBase(); setLEDs(0b111111); mSleep(2500); setLEDs(0b100100); I2CTWI_initMaster(100); I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady); BUMPERS_setStateChangedHandler(bumpersStateChanged); ACS_setStateChangedHandler(acsStateChanged); powerON(); startStopwatch1(); setACSPwrMed(); while(true) { task_RP6System(); task_SRF(); task_I2CTWI(); behaviourController(); } return 0; }
Code:#ifndef SRF_H #define SRF_H #include "RP6RobotBaseLib.h" #include "RP6I2CmasterTWI.h" // Include the I²C-Bus Slave Library /*****************************************************************************/ // SRF08/SRF10: #define SRF_ADR 0xE2 /*****************************************************************************/ // I2C Event handlers: // I2C Data request IDs: #define MEASURE_US_LOW 0 #define MEASURE_US_HIGH 1 // The measured distance: uint16_t distance; void I2C_requestedDataReady(uint8_t dataRequestID) { uint8_t messageBuf[8]; 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); distance = messageBuf[0] + (dist_tmp << 8); // ---------------------------------- // Output measured distance: //writeString_P("Distance: "); //writeInteger(distance, DEC); //writeString_P(" cm | "); // show a simple text bargraph: //uint16_t dist_count; //for(dist_count = distance; dist_count > 4; dist_count-=2) // writeChar('#'); //writeChar('\n'); // ... of course you can also use "distance" as a normal // variable everywhere else in your program! // ---------------------------------- break; } } /* * The SRF needs some time to perform the measurements - here we use Stopwatch1 * to time the measurement actions. */ void task_SRF(void) { 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; setStopwatch1(0); } } else if(getStopwatch1() > 70) // 70ms (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 setStopwatch1(0); } } #endif







Zitieren

Lesezeichen