Absender: Achim Pankalla
Datum: Fr, 30.03.2007 13:12:44
In-reply-to:
<460CDD44.3050409@xxxxxx>
References:
<460BFC4D.5030809@xxxxxx> <03FA8E8E-224D-4E27-A1A6-2899A0C20B7B@xxxxxxxxxxxxxxx> <460C243C.907@xxxxxx> <FB69CB24-398E-4A0D-A099-3E8751094F34@xxxxxxxxxxxxxxx> <460CC23C.8090408@xxxxxx> <460CD36D.50200@xxxxxxxx> <460CDD44.3050409@xxxxxx>
hallo,habe das problem glaube ich etwas eingegrenzt. im folgenden kodeabschnitt in sensor.c habe ich die uint16 register variable durch unit32 (markiert mit <<<>>>) ersetzt, danach fährt der bot im labyrinth wie gewohnt. ein typcasting in der funktion TIMER_GET_TICKCOUNT_16 brachte nichts.
sensor.c: void sensor_update(void){static uint16 old_pos=0; /*!< Ticks fuer Positionsberechnungsschleife */ static uint16 old_speed=0; /*!< Ticks fuer Geschwindigkeitsberechnungsschleife */
#ifdef MEASURE_MOUSE_AVAILABLEstatic int16 lastMouseX=0; /*!< letzter Mauswert X fuer Positionsberechnung */ static int16 lastMouseY=0; /*!< letzter Mauswert Y fuer Positionsberechnung */
static float lastDistance=0; /*!< letzte gefahrene Strecke */ static float lastHead=0; /*!< letzter gedrehter Winkel */static float oldHead=0; /*!< Winkel aus dem letzten Durchgang */ static float old_x=0; /*!< Position X aus dem letzten Durchgang */ static float old_y=0; /*!< Position Y aus dem letzten Durchgang */ float radius=0; /*!< errechneter Radius des Drehkreises */ float s1=0; /*!< Steigung der Achsengerade aus dem letzten Durchgang */ float s2=0; /*!< Steigung der aktuellen Achsengerade */ float a1=0; /*!< Y-Achsenabschnitt der Achsengerade aus dem letzten Durchgang */ float a2=0; /*!< Y-Achsenabschnitt der aktuellen Achsengerade */
float xd=0; /*!< X-Koordinate Drehpunkt */ float yd=0; /*!< Y-Koordinate Drehpunkt */float right_radius=0; /*!< Radius des Drehkreises des rechten Rads */ float left_radius=0; /*!< Radius des Drehkreises des linken Rads */
#endifstatic int16 lastEncL =0; /*!< letzter Encoderwert links fuer Positionsberechnung */ static int16 lastEncR =0; /*!< letzter Encoderwert rechts fuer Positionsberechnung */ static int16 lastEncL1=0; /*!< letzter Encoderwert links fuer Geschwindigkeitsberechnung */ static int16 lastEncR1=0; /*!< letzter Encoderwert rechts fuer Geschwindigkeitsberechnung */
float dHead=0; /*!< Winkeldifferenz aus Encodern */float deltaY=0; /*!< errechneter Betrag Richtungsvektor aus Encodern */ int16 diffEncL; /*!< Differenzbildung linker Encoder */ int16 diffEncR; /*!< Differenzbildung rechter Encoder */
float sl; /*!< gefahrene Strecke linkes Rad */ float sr; /*!< gefahrene Strecke rechtes Rad */ #ifdef MEASURE_MOUSE_AVAILABLE int16 dX; /*!< Differenz der X-Mauswerte */ int16 dY; /*!< Differenz der Y-Mauswerte */int8 modifiedAngles=False; /*!< Wird True, wenn aufgrund 90 Grad oder 270 Grad die Winkel veraendert werden mussten */ sensMouseY += sensMouseDY; /*!< Mausdelta Y aufaddieren */
sensMouseX += sensMouseDX; /*!< Mausdelta X aufaddieren */#endif <<<<< register uint32 ticks = TIMER_GET_TICKCOUNT_16;>>>>
if (ticks-old_pos > MS_TO_TICKS(50)){ old_pos = ticks; /* Gefahrene Boegen aus Encodern berechnen */ diffEncL=sensEncL-lastEncL; diffEncR=sensEncR-lastEncR; lastEncL=sensEncL; lastEncR=sensEncR; sl=(float)diffEncL*WHEEL_PERIMETER/ENCODER_MARKS; sr=(float)diffEncR*WHEEL_PERIMETER/ENCODER_MARKS; /* Winkel berechnen */ vielleicht weisst das jemanden mit mehr insiderwissen auf das problem hin... gruss achim