c't Projekte - c't-Bot und c't-Sim -
Mailinglisten
[Voriger (Datum)]
[Nächster (Datum)]
[Voriger (Thread)]
[Nächster (Thread)]
[Nach Datum][Nach Thread]
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_AVAILABLE
static 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 */
#endif
static 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