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