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
Code:
#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;
}
SRF Code
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
Lesezeichen