Code:
#include "RP6RobotBaseLib.h"
#include "RP6I2CmasterTWI.h"
#define SRF_LEFT_ADR 0xE6
#define SRF_MIDDLE_ADR 0xE4
#define SRF_RIGHT_ADR 0xE2
#define TSL_2561_ADR 0x39
#define MEASURE_US_LEFT_LOW 0
#define MEASURE_US_LEFT_HIGH 1
#define MEASURE_US_RIGHT_LOW 2
#define MEASURE_US_RIGHT_HIGH 3
#define MEASURE_US_MIDDLE_LOW 4
#define MEASURE_US_MIDDLE_HIGH 5
#define MEASURE_TSL_DATA_LOW 6
#define MEASURE_TSL_DATA_HIGH 7
uint16_t distance_left = 0;
uint16_t distance_right = 0;
uint16_t distance_middle = 0;
uint16_t lux = 0;
//I2C Bus Werteabfrage auf Adressen
void I2C_requestedDataReady(uint8_t dataRequestID)
{
uint8_t messageBuf[8];
static uint8_t dist_tmp;
switch(dataRequestID)
{
case MEASURE_US_LEFT_HIGH:
I2CTWI_getReceivedData( messageBuf, 2 );
dist_tmp = messageBuf[0];
I2CTWI_transmitByte(SRF_LEFT_ADR, 3);
I2CTWI_requestDataFromDevice(SRF_LEFT_ADR, MEASURE_US_LEFT_LOW, 1);
break;
case MEASURE_US_LEFT_LOW:
I2CTWI_getReceivedData( messageBuf, 2 );
distance_left = messageBuf[0] + (dist_tmp << 8);
writeString_P("SRF_L: ");
writeInteger(distance_left, DEC);
writeString_P(" cm ");
break;
case MEASURE_US_RIGHT_HIGH:
I2CTWI_getReceivedData( messageBuf, 2 );
dist_tmp = messageBuf[0];
I2CTWI_transmitByte(SRF_RIGHT_ADR, 3);
I2CTWI_requestDataFromDevice(SRF_RIGHT_ADR, MEASURE_US_RIGHT_LOW, 1);
break;
case MEASURE_US_RIGHT_LOW:
I2CTWI_getReceivedData( messageBuf, 2 );
distance_right = messageBuf[0] + (dist_tmp << 8);
writeString_P("\tSRF_R: ");
writeInteger(distance_right, DEC);
writeString_P(" cm");
break;
case MEASURE_US_MIDDLE_HIGH:
I2CTWI_getReceivedData( messageBuf, 2 );
dist_tmp = messageBuf[0];
I2CTWI_transmitByte(SRF_MIDDLE_ADR, 3);
I2CTWI_requestDataFromDevice(SRF_MIDDLE_ADR, MEASURE_US_MIDDLE_LOW, 1);
break;
case MEASURE_US_MIDDLE_LOW:
I2CTWI_getReceivedData( messageBuf, 2 );
distance_middle = messageBuf[0] + (dist_tmp << 8);
writeString_P("\tSRF_M: ");
writeInteger(distance_middle, DEC);
writeString_P(" cm\n");
break;
case MEASURE_TSL_DATA_HIGH:
I2CTWI_getReceivedData( messageBuf, 2 );
dist_tmp = messageBuf[0];
I2CTWI_transmitByte(TSL_2561_ADR, 3);
I2CTWI_requestDataFromDevice(TSL_2561_ADR, MEASURE_TSL_DATA_LOW, 1);
case MEASURE_TSL_DATA_LOW:
I2CTWI_getReceivedData( messageBuf, 2 );
lux = messageBuf[0] + (dist_tmp << 8); //
writeString_P("\tTSL: ");
writeInteger(lux, DEC);
writeString_P(" lux\n");
break;
}
}
//I2C Bus Fehlerausgabe
void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR --> TWI STATE IS: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}
//SRF08 Sensorenfunktion
void task_SRF(void)
{
static uint8_t measureInProgress = false;
static uint8_t channel = 0;
if(!measureInProgress) // Start measurement ONCE only
{
if(TWI_operation == I2CTWI_NO_OPERATION) // Busverkehrüberwachung, freie Transfermöglichkeit
{
if(channel == 0)
I2CTWI_transmit2Bytes(SRF_LEFT_ADR, 0, 81);
else if(channel == 1)
I2CTWI_transmit2Bytes(SRF_RIGHT_ADR, 0, 81);
else if(channel == 2)
I2CTWI_transmit2Bytes(SRF_MIDDLE_ADR, 0, 81);
measureInProgress = true;
setStopwatch1(0);
}
}
else if(getStopwatch1() > 500) // 500ms Messverzögerung
{
if(channel == 0)
{
I2CTWI_transmitByte(SRF_LEFT_ADR, 2);
I2CTWI_requestDataFromDevice(SRF_LEFT_ADR, MEASURE_US_LEFT_HIGH, 1);
channel = 1;
}
else if(channel == 1)
{
I2CTWI_transmitByte(SRF_RIGHT_ADR, 2);
I2CTWI_requestDataFromDevice(SRF_RIGHT_ADR, MEASURE_US_RIGHT_HIGH, 1);
channel = 2;
}
else if(channel == 2)
{
I2CTWI_transmitByte(SRF_MIDDLE_ADR, 2);
I2CTWI_requestDataFromDevice(SRF_MIDDLE_ADR, MEASURE_US_MIDDLE_HIGH, 1);
channel = 0;
}
measureInProgress = false;
setStopwatch1(0);
}
}
int task_TSL()
{
static uint8_t measureInProgress = false;
static uint8_t channel = 0;
uint8_t DataLow = 0;
uint8_t DataHigh = 0;
uint8_t Channel3 = 0;
if(!measureInProgress)
{
if(TWI_operation == I2CTWI_NO_OPERATION)
{
if(channel == 3)
I2CTWI_transmit2Bytes(TSL_2561_ADR, 140, DataLow);
I2CTWI_transmit2Bytes(TSL_2561_ADR, 141, DataHigh);
measureInProgress = true;
setStopwatch2(0);
}
else if(getStopwatch2() >500)
I2CTWI_transmitByte(TSL_2561_ADR, 2);
I2CTWI_requestDataFromDevice(TSL_2561_ADR, MEASURE_TSL_DATA_HIGH, 1);
}
measureInProgress = false;
setStopwatch2(0);
Channel3 = DataHigh*256+DataLow;
return(Channel3);
}
int main(void)
{
initRobotBase();
I2CTWI_initMaster(100);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
setLEDs(0b111111);
mSleep(500);
setLEDs(0b000000);
powerON();
startStopwatch1(); //SRF
startStopwatch2(); //TSL2561
startStopwatch3();
while(true)
{
task_TSL(); //kommt noch...
task_SRF();
task_I2CTWI();
task_RP6System();
}
return 0;
}
Lesezeichen