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:
1) das programm reagiert aber recht träge auf das drücken, bzw. hier loslassen der taste. ist das normal?Code:do { // mSleep(50); releasedMultiIOButtonNumber = checkMultiIOReleasedButtonEvent(); task_I2CTWI(); if (releasedMultiIOButtonNumber == 2) main(); } while (releasedMultiIOButtonNumber);
2) gibt es alternativen zum manuellen beenden einer unterschleife und der rückkehr ins hauptprogramm als die, die ich hier anwende?









Lesezeichen