So, nach viel, viel Arbeit bin ich schon ganz gut vorangekommen mit dem Programm.
Nun habe ich aber folgendes Problem: Ich sende einen Befehl an meine M128 "Setze ACS auf (aus, low, mid, high)", je nachdem.
Der Befehl kommt bei der M128 an und wird verarbeitet.
Jedoch nicht in der Base, und ich weiß nicht, woran das liegen kann. Hier mal ein Auszug aus dem Slave auf der Base, vielleicht könnt ihr mir helfen. Oder ihr sagt, dort muss alles in Ordnung sein, es muss vielleicht doch an der M128 liegen.
Alle anderen Befehle werden jedoch immer auch ausgeführt, nur eben das ACS nicht.
Danke euch!
Code:
/*****************************************************************************/
// Command Registers - these can be written by the Master.
// The other registers (read registers) can NOT be written to. The only way to
// communicate with the Robot is via specific commands.
// Of course you can also add more registers if you like...
// ----------------------
#define I2C_REGW_CMD 0
#define I2C_REGW_CMD_PARAM1 1
#define I2C_REGW_CMD_PARAM2 2
#define I2C_REGW_CMD_PARAM3 3
#define I2C_REGW_CMD_PARAM4 4
#define I2C_REGW_CMD_PARAM5 5
#define I2C_REGW_CMD_PARAM6 6
// ----------------------
uint8_t cmd;
uint8_t param1;
uint8_t param2;
uint8_t param3;
uint8_t param4;
uint8_t param5;
uint8_t param6;
/**
* Checks if a new Command has been received and also reads all
* paramters associated with this command.
* It returns true if a new command has been received.
*/
uint8_t getI2CCommand(void)
{
if(I2CTWI_writeRegisters[I2C_REGW_CMD] && !I2CTWI_writeBusy)
{
cmd = I2CTWI_writeRegisters[I2C_REGW_CMD]; // store command register
I2CTWI_writeRegisters[I2C_REGW_CMD] = 0; // clear command register (!!!)
param1 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM1]; // parameters 1-6...
param2 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM2];
param3 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM3];
param4 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM4];
param5 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM5];
param6 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM6];
return true;
}
return false;
}
/*****************************************************************************/
// Command processor:
uint8_t leds = 1;
// Commands:
#define CMD_POWER_OFF 0
#define CMD_POWER_ON 1
#define CMD_CONFIG 2
#define CMD_RP6_SETLEDS 3
#define CMD_RP6_STOP 4
#define CMD_MOVE_AT_SPEED 5
#define CMD_CHANGE_DIR 6
#define CMD_MOVE 7
#define CMD_ROTATE 8
#define CMD_RP6_SET_ACS_POWER 9
#define CMD_SEND_RC5 10
#define CMD_SET_WDT 11
#define CMD_SET_WDT_RQ 12
/**
* This function checks if commands have been received and processes them.
*/
void task_commandProcessor(void)
{
if(getI2CCommand())
{
switch(cmd)
{
case CMD_POWER_OFF: powerOFF(); status.powerOn = false; break;
case CMD_POWER_ON: powerON(); status.powerOn = true; break;
case CMD_CONFIG: break;
case CMD_RP6_SETLEDS: setLEDs(param1); break;
case CMD_RP6_STOP: stop(); break;
case CMD_MOVE_AT_SPEED: moveAtSpeed(param1, param2); break;
case CMD_CHANGE_DIR: changeDirection(param1); break;
case CMD_MOVE: move(param1, param2, ((param3<<8)+param4), false); break;
case CMD_ROTATE: rotate(param1, param2, ((param3<<8)+param4), false); break;
case CMD_RP6_SET_ACS_POWER:
switch(param1)
{
case ACS_POWER_OFF:
disableACS(); setACSPwrOff(); status.ACSactive = false;
setLEDs(0b000000); //Die LEDS sollen nur anzeigen, ob der Befehl ausgeführt wurde
break;
case ACS_POWER_LOW:
enableACS(); setACSPwrLow(); status.ACSactive = true;
setLEDs(0b100100); //Die LEDS sollen nur anzeigen, ob der Befehl ausgeführt wurde
break;
case ACS_POWER_MED:
enableACS(); setACSPwrMed(); status.ACSactive = true;
setLEDs(0b010010); //Die LEDS sollen nur anzeigen, ob der Befehl ausgeführt wurde
break;
case ACS_POWER_HIGH:
enableACS(); setACSPwrHigh(); status.ACSactive = true;
setLEDs(0b111111); //Die LEDS sollen nur anzeigen, ob der Befehl ausgeführt wurde
break;
}
break;
case CMD_SEND_RC5: IRCOMM_sendRC5(param1, param2); break;
case CMD_SET_WDT: status.watchDogTimer = param1 ? true : false; break;
case CMD_SET_WDT_RQ: status.wdtRequestEnable = param1 ? true : false; break;
}
}
}
____________
EDIT: Hat sich erledigt, ich hab zweimal denselben Funktionsnamen verwendet.
So gehts:
Code:
case CMD_SET_NEW_ACS_POWER:
RP6_writeCMD_1param(RP6_BASE_ADR, CMD_SET_ACS_POWER, params[1]);
und oben eben noch das "#define CMD_SET_ACS_POWER..." in "#define CMD_SET_NEW_ACS_POWER..." ändern.
EDIT2:
Wenn ich fertig bin mit dem Programm, kann ich gern mal ein paar Bilder/Videos zeigen.
Der RP6 kann bisher ferngesteuert werden, alle ADCs, LEDs, Bumper und Taster-Werte werden dargestellt. LEDs sind allesamt schaltbar, an einigen Hängen auch andere Verbraucher dran: Kamera, Snakevision, 2x ACS hinten, 2x Bumper hinten, Scheinwerfer. Außerdem wurde eine Funkkamera eingebunden, die momentan immerhin 2-Euro-Münzen erkennen und anzeigen kann. Und man kann den RP6 entweder mit der Tastatur fernsteuern, oder mit einer TV-Remote. Oder er kann eine Lichtquelle suchen oder aber eine Wärmequelle (Mit SnakeVision). Auch das herumfahren und auf Gegenstände achten geht.

Danke an euch alle, habt mir schon viel geholfen. Vor allem FabianE. mit seinen Programmen für die drei Plattformen! Danke euch!!!
Grüße!!!
Lesezeichen