hi Dirk,
alle änderungen ausgeführt, beim ersten drücken des buttons 1 stimmt die ausgabe (diesmal dir_neu = 360), beim 2ten drücken immer noch 256...
irgendwie haben die 256 mit der definition der variablen zu tun, aber wie?Code:#include "RP6ControlLib.h" #include "RP6I2CmasterTWI.h" #include "RP6Control_OrientationLib.h" //#include "RP6Control_I2CMasterLib.h" #include "RP6Control_MultiIOLib.h" #define I2C_RP6_BASE_ADR 10 uint8_t ch; char item[12]; char dir[3]; int16_t new_dir; //neue richtung int16_t old_dir; //gemessene richtung int16_t temp; //berechnung korrektur richtung /* void I2C_requestedDataReady(uint8_t dataRequestID) //macht was? { checkRP6Status(dataRequestID); } */ void calculateDir(char* dir, uint16_t heading) //setzt headingwerte grob in himmelsrichtungen um { dir[1] = ' '; dir[2] = '\0'; if ((heading <= 22) || (heading >=338)) dir[0] = 'N'; if ((heading >= 23) && (heading <= 67)) {dir[0] = 'N'; dir[1] = 'E';} if ((heading >= 68) && (heading <= 112)) dir[0] = 'E'; if ((heading >= 113) && (heading <= 157)) {dir[0] = 'S'; dir[1] = 'E';} if ((heading >= 158) && (heading <= 202)) dir[0] = 'S'; if ((heading >= 203) && (heading <= 247)) {dir[0] = 'S'; dir[1] = 'W';} if ((heading >= 248) && (heading <= 292)) dir[0] = 'W'; if ((heading >= 293) && (heading <= 337)) {dir[0] = 'N'; dir[1] = 'W';} } 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); } /*******************sensorwerte holen*************************/ void sensorwerte_holen(void) { intreg2dm = readHDMM01(); // holt sersorwerte if (!intreg2dm) //daten gültig? { normalizeHDMM01(); // daten werden "normalisiert" heading2dm = headingHDMM01(); // berechnung der headingwerte } } /******************heading auf LCD schreiben**************/ void heading_ausgeben(void) { setCursorPosLCD(0, 0); //headingwerte werden auf LCD geschrieben writeStringLCD_P("Heading "); writeIntegerLCD(heading2dm, DEC); } /*******************berechnung der richtungswerte***********/ void richtung_berechnen(void) { calculateDir(dir, heading2dm); //berechnung der richtung (N,S,W,E) } /**************ausgabe der richtungswerte*******************/ void richtung_ausgeben(void) { setCursorPosLCD(1, 0); writeStringLCD_P("direction "); writeStringLCD(dir); //ausgabe der richtung } int main(void) { initRP6Control(); multiio_init(); initLCD(); orientation_init(); //COMPASS_2D_init(); setLEDs(0b1111); mSleep(500); setLEDs(0b0000); I2CTWI_initMaster(100); //I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);//macht was? I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); //aktiviert I2C fehlermeldungen showScreenLCD(" RP6Control M32", " gyro_quadrat"); mSleep(2500); clearLCD(); 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://richtung NORD setLEDs(0b0001); //LED 1 leuchtet { new_dir = 360; sensorwerte_holen(); heading_ausgeben(); old_dir = heading2dm; setCursorPosLCD(1, 0); writeStringLCD_P("dir "); writeIntegerLCD(old_dir, DEC); writeStringLCD_P(" "); writeIntegerLCD(new_dir, DEC); mSleep(1000); } // move(150, FWD, DIST_MM(500), true); //fährt 50cm mSleep(1000); // rotate(50, 3, 90, 1); //dreht um 90° clearLCD(); break; case 2: setLEDs(0b0010); break; case 3: setLEDs(0b0100); break; case 4: setLEDs(0b1000); break; } } } return 0; }







Zitieren

Lesezeichen