ich versuche mir eine teststruktur für software-varianten aufzubauen:
Code:
#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_MultiIOLib.h"
#include "RP6Control_I2CMasterLib.h"
#include "RP6Control_MultiIO.h"
#include "RP6ControlServoLib.h"
#define I2C_RP6_BASE_ADR 10
uint16_t servopos;
uint8_t i;
uint8_t taste;
/*********************I2C-fehlermeldungen******************/
void I2C_transmissionError(uint8_t errorState) //gibt I2C fehlermeldungen über LCD aus
{
clearLCD();
writeStringLCD_P("I2C ERROR -->");
setCursorPosLCD(1, 0); // line 2
writeStringLCD_P("TWI STATE: 0x");
writeIntegerLCD(errorState, HEX);
}
/*************** hauptprogramm ***********/
int main(void)
{
initRP6Control();
multiio_init();
initLCD();
setLEDs(0b1111);
mSleep(500);
setLEDs(0b0000);
I2CTWI_initMaster(100);
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); //aktiviert I2C fehlermeldungen
showScreenLCD(" RP6Control M32", " servo_test");
mSleep(1500);
clearLCD();
setServoPower(0);
while(true)
{
/*****************anzeige gedrückter buttons****************/
clearLCD();
pressedMultiIOButtonNumber = getMultiIOPressedButtonNumber();
setCursorPosLCD(0, 0);
writeStringLCD("Button: ");
writeIntegerLCD(pressedMultiIOButtonNumber, DEC);
mSleep(500);
uint8_t key = getMultiIOPressedButtonNumber();
/********************funktion der buttons*********************/
if(key)
{
switch(key)
{
case 1://
setLEDs(0b0001);
multiio_init();
servopos = SERVO1_LT;
while(true)
{
setServoPower(1);
initSERVO(SERVO1 | SERVO2 | SERVO3 );
setLEDs(0b0001);
setServo(1, servopos);
mSleep(50);
servopos += 5;
if (servopos > SERVO1_MP) servopos = SERVO1_LT;
mSleep(100);
setLEDs(0b0001);
setServo(2, servopos);
mSleep(50);
servopos += 5;
if (servopos > SERVO1_MP) servopos = SERVO1_LT;
mSleep(100);
task_SERVO();
setCursorPosLCD(0, 0);
writeStringLCD_P("Servopos.: ");
writeIntegerLCD(servopos, DEC);
writeStringLCD_P(" ");
mSleep(50);
setServoPower(0);
}
break;
//main();
case 2://
setLEDs(0b0010);
taste=2;
multiio_init();
setServoPower(1);
initSERVO(SERVO1 | SERVO2 | SERVO3);
while(true)
{
clearLCD();
setCursorPosLCD(0, 0);
writeStringLCD("Funktion: ");
writeIntegerLCD(taste, DEC);
setServo(3, SERVO_75);
mSleep(500);
setServo(3, SERVO1_MP);
mSleep(500);
setServo(3,SERVO_105);
mSleep(500);
/*
do
if (pressedMultiIOButtonNumber == 4)
main();
while (pressedMultiIOButtonNumber);
*/
do
{
// mSleep(50);
releasedMultiIOButtonNumber = checkMultiIOReleasedButtonEvent();
task_I2CTWI();
if (releasedMultiIOButtonNumber == 2)
main();
}
while (releasedMultiIOButtonNumber);
task_SERVO();
}
main();
break;
// main();
// setServoPower(0);
case 3://
setLEDs(0b0100);
multiio_init();
setServoPower(1);
initSERVO(SERVO1 | SERVO2 | SERVO3 );
for (i=1; 5;i++);
{
setServo(3, SERVO_75);
mSleep(500);
setServo(3, SERVO1_MP);
mSleep(500);
setServo(3,SERVO_105);
// mSleep(5000);
task_SERVO();
}
break;
setServoPower(0);
case 4://
setLEDs(0b1000);
break;
}
// setServoPower(0);
//main();
}
}
return 0;
}
in dem code ist bei case2 folgender code in der while schleife eingefügt:
Code:
do
{
// mSleep(50);
releasedMultiIOButtonNumber = checkMultiIOReleasedButtonEvent();
task_I2CTWI();
if (releasedMultiIOButtonNumber == 2)
main();
}
while (releasedMultiIOButtonNumber);
1) das programm reagiert aber recht träge auf das drücken, bzw. hier loslassen der taste. ist das normal?
2) gibt es alternativen zum manuellen beenden einer unterschleife und der rückkehr ins hauptprogramm als die, die ich hier anwende?
Lesezeichen