Danke Dir 
Ich wollte ursprünglich noch die M128 draufsetzen, aber ich glaube ich machs jetzt erst mal einfacher:
Ich nehme nun doch nur die Base als Slave und die M32 als Master. Die M128 lasse ich weg, weil ich einfach nicht durchblicke, was ich noch alles verändern müsste.
Die Base hat 4 I/Os, 2 ADCs. Ich möchte die ADC-Werte (genauer Wert) und zwei der I/O-Werte (1 oder 0) auf den I2C schreiben.
Die M32 soll diese beiden ADC-Werte der Base, die beiden I/O-Werte der Base auslesen und via Bluetooth senden.
Außerdem soll die M32 die beiden übrigen I/Os der Base an-/aus- schalten können.
Außerdem soll die M32 alle 6 eigenen ADC-Werte (genaue Werte, nicht nur high und low) via Bluetooth senden, die 8 I/Os der M32 verwende ich komplett für Servos.
Für die Base liegt der Code zum Register oben, hier muss ich wohl noch die beiden I/Os, die ich auslesen will, anfügen. Aber wo muss ich die I/Os anfügen, die ich schalten will? Sie müssen ja von der M32 aus geschaltet werden.
Der Code für das Auslesen der Rigister von der M32 ist hier:
Code:
/*****************************************************************************/
// Sensors/ADCs:
// ADCs:
uint16_t adcBat;
uint16_t adcMotorCurrentLeft;
uint16_t adcMotorCurrentRight;
uint16_t adcLSL;
uint16_t adcLSR;
uint16_t adc0;
uint16_t adc1;
// Measured Speed:
uint8_t mleft_speed;
uint8_t mright_speed;
// Distance
uint16_t mleft_dist;
uint16_t mright_dist;
// Desired Speed:
uint8_t mleft_des_speed;
uint8_t mright_des_speed;
// Power
uint8_t mleft_power;
uint8_t mright_power;
uint8_t sensorBuf[24];
/**
* In order to use the same register names as in the RP6Lib, this
* function reads all ADC channels and all motor parameters into
* the same values as in the RP6Lib.
* Of course this function needs some time to read all these
* 24 registers via the I2C Bus.
*/
void getAllSensors(void)
{
I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_POWER_LEFT, sensorBuf, 24);
mleft_power = sensorBuf[0];
mright_power = sensorBuf[1];
mleft_speed = sensorBuf[2];
mright_speed = sensorBuf[3];
mleft_des_speed = sensorBuf[4];
mright_des_speed = sensorBuf[5];
mleft_dist = sensorBuf[6] + (sensorBuf[7]<<8);
mright_dist = sensorBuf[8] + (sensorBuf[9]<<8);
adcLSL = sensorBuf[10] + (sensorBuf[11]<<8);
adcLSR = sensorBuf[12] + (sensorBuf[13]<<8);
adcMotorCurrentLeft = sensorBuf[14] + (sensorBuf[15]<<8);
adcMotorCurrentRight = sensorBuf[16] + (sensorBuf[17]<<8);
adcBat = sensorBuf[18] + (sensorBuf[19]<<8);
adc0 = sensorBuf[20] + (sensorBuf[21]<<8);
adc1 = sensorBuf[22] + (sensorBuf[23]<<8);
}
/**
*
*/
void getLightSensors(void)
{
I2CTWI_readRegisters(I2C_RP6_BASE_ADR, I2C_REG_ADC_LSL_L, sensorBuf, 4);
adcLSL = sensorBuf[0] + (sensorBuf[1]<<8);
adcLSR = sensorBuf[2] + (sensorBuf[3]<<8);
}
Und hier der Code für die M32, für das Senden der Daten über RS232:
Code:
void printSensors(void)
{
if(sendData)
{
StartDataFrame();
if(HasRP6)
{
writeString_P("Bat:");
writeInteger(adcBat, DEC);
writeString_P("\n");
writeString_P("SpeedL:");
writeInteger(mleft_speed, DEC);
writeString_P("\n");
writeString_P("SpeedR:");
writeInteger(mright_speed, DEC);
writeString_P("\n");
writeString_P("PowerL:");
writeInteger(adcMotorCurrentLeft, DEC);
writeString_P("\n");
writeString_P("PowerR:");
writeInteger(adcMotorCurrentRight, DEC);
writeString_P("\n");
writeString_P("LightL:");
writeInteger(adcLSL, DEC);
writeString_P("\n");
writeString_P("LightR:");
writeInteger(adcLSR, DEC);
writeString_P("\n");
writeString_P("BumpL:");
writeInteger(bumper_left, DEC);
writeString_P("\n");
writeString_P("BumpR:");
writeInteger(bumper_right, DEC);
writeString_P("\n");
writeString_P("ObsL:");
writeInteger(obstacle_left, DEC);
writeString_P("\n");
writeString_P("ObsR:");
writeInteger(obstacle_right, DEC);
writeString_P("\n");
}
if(HasSRF02)
{
writeString_P("Distance:");
writeInteger(SRF02_Dist, DEC);
writeString_P("\n");
}
if(HasM32)
{
writeString_P("Mic:");
writeInteger(getMicrophonePeak(),DEC);
writeString_P("\n");
}
EndDataFrame();
}
}
void SendDebugData(void)
{
if (getStopwatch1() >=timeBetweenFrames)
{
getAllSensors();
getLightSensors();
printSensors();
setStopwatch1(0);
}
}
Und ich glaube das hier ist der Code, der die PC-Befehle empfängt und verarbeitet (in der M32):
Code:
void task_Commands(void)
{
if(getBufferLength())
{
char tmp = readChar();
if (tmp =='#')
{
mSleep(10);
counter = 0;
}
text[counter] = tmp;
text[counter + 1] = '\0';
counter++;
clearPosLCD(1,0,15);
setCursorPosLCD(1,0);
writeStringLCD(text);
}
int cmd = getCommand();
if(cmd)
{
switch(cmd)
{
case CMD_SET_SPEED:
moveAtSpeed(params[1],params[2]);
changeDirection(params[3]);
break;
case CMD_SET_SERVO:
servo_position[params[2]] = params[3];
break;
case CMD_SET_LEDS:
switch(params[1])
{
case LEDS_RP6:
setRP6LEDs(params[2]);
break;
case LEDS_M32:
setLEDs(params[2]);
break;
}
break;
case CMD_SET_BEEP:
beep(params[2],params[3]);
break;
case CMD_SET_START_MELODY:
{
uint8_t ToneCount = params[1];
uint8_t currCount = params[2];
uint8_t currPitch = params[3];
uint16_t currTime = params[4];
SPI_EEPROM_writeByte(3,ToneCount);
while(SPI_EEPROM_getStatus() & SPI_EEPROM_STAT_WIP);
uint8_t buffer[3];
buffer[0] = currPitch;
buffer[1] = currTime & 0x00ff;
buffer[2] = (currTime & 0xff00) >>8;
SPI_EEPROM_writeBytes(4+((currCount-1)*3),buffer,3);
while(SPI_EEPROM_getStatus() & SPI_EEPROM_STAT_WIP);
if(ToneCount == currCount)
{
SPI_EEPROM_writeByte(0,8); //Die Checkbytes schreiben
SPI_EEPROM_writeByte(1,12);
SPI_EEPROM_writeByte(2,91);
}
}
break;
case CMD_SET_FEATURE:
switch(params[1])
{
case SET_FEATURE_RP6:
HasRP6 = params[2];
break;
case SET_FEATURE_M32:
HasM32 = params[2];
break;
case SET_FEATURE_SERVOM32:
HasServoM32 = params[2];
break;
case SET_FEATURE_LCDM32:
HasLCDM32 = params[2];
break;
case SET_FEATURE_SRF02:
HasSRF02 = params[2];
break;
case SET_FEATURE_SRF02_1:
HasSRF02_1 = params[2];
break;
case SET_FEATURE_SRF02_2:
HasSRF02_2 = params[2];
break;
case SET_FEATURE_SRF08:
HasSRF08 = params[2];
break;
}
break;
case CMD_SET_STOP: stop();
break;
case CMD_SET_CONNECTION_SPEED:
if(params[1] < 0)
{
sendData = 0;
timeBetweenFrames = 1000;
}
else
{
sendData = 1;
timeBetweenFrames = params[1];
}
break;
case CMD_SET_MELODY:
{
int current;
int all;
int currTime;
int currPitch;
current = params[1];
all = params[2];
currTime = params[3];
currPitch = params[4];
if((current >= 0 && current < 100) || current == -99)
{
if(current == -99)
{
PlayMelody(all);
return;
}
MelodyTimes[current] = currTime;
MelodyPitches[current] = currPitch;
}
else
{
StartDebugFrame();
writeString_P("Ton-Counter ist falsch!Counter: ");
writeInteger(current,DEC);
EndDebugFrame();
}
}
break;
case CMD_SET_ACSPOWER:
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, params[1]);
break;
case CMD_SET_TEST:
switch(params[1])
{
case TEST_LCD:
TestLCD();
break;
case TEST_BEEPER:
TestBeeper();
break;
case TEST_LED:
TestLEDs();
break;
case TEST_EXTERNAL_MEMORY:
TestExternalMemory();
break;
case TEST_I2CLED:
TestI2CLEDs();
break;
case TEST_I2CMOTOR:
TestI2CMotor();
break;
case TEST_MIC:
TestMic();
break;
}
break;
}
cmd= 0;
}
}
Was muss ich denn jetzt hier machen?
Sorry, ist wohl echt viel Zeugs...
Aber danke Euch schon mal für Eure Hilfen!
Grüße,
Fabian
Lesezeichen