Nochmal kurz ein Aktueller Stand meines Progs,
- Asuro fährt los und die Odometrieregelung funktioniert
- Sobald ein Taster gedrückt wird wird die Schleife verlassen
so weit so gut....
aber
-das prog springt weder in firstcol() noch in fahren(), sondern lässt den Asuro nur noch rückwärts fahren bei roter StatusLED.
Aktueller Code:
Hat wirklich niemand eine Ahnung wie dieses Verhalten zu stande kommt?Code:#include "asuro.h" #include "myasuro.h" #define TRIGGERLEVEL 830 #define HYSTERESIS 10 #define LOW 0 #define HIGH 1 #define keine_taste (PINC & (1<<PC4)) volatile unsigned int i; void Fahren(void) /* Vorwärts fahren */ { unsigned int data[2]; signed int status[2]={0,0}; signed int difference=0; MotorDir(FWD, FWD); while(keine_taste){ // Helligkeitswerte der Lichtschranken auslesen OdometrieData(data); // Wechsel linker Sensor von niedrig auf hoch? if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) { status[0]=HIGH; difference++; } // Wechsel linker Sensor von hoch auf niedrig? if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) { status[0]=LOW; difference++; } // Wechsel rechter Sensor von niedrig auf hoch? if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) { status[1]=HIGH; difference--; } // Wechsel rechter Sensor von hoch auf niedrig? if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) { status[1]=LOW; difference--; } // zur Sicherheit: verhindern, dass der Differenzz?ler // den erlaubten Wertebereich verl?st if (difference<-255) difference=-255; if (difference>255) difference=255; // Status-LED noch entsprechend der erkannten Segmente // aufleuchten lassen, grn fr links, rot fr rechts StatusLED(status[0]+status[1]*2); // Z?ldifferenz passend auf die Motoren verteilen if (difference>0) MotorSpeed(180-difference,180); else MotorSpeed(180,180+difference); } } void Anhalten(void) /* Anhalten */ { StatusLED(RED); BackLED(OFF,OFF); MotorDir(BREAK,BREAK); } void Zurueck(void) /* Zurück fahren */ { Encoder_Init(); Go(-10,200); } void KurveR(void) /* Kurve Rechts 90° */ { Encoder_Init(); Turn(60,200); } void KurveL(void) /* Kurve rückwärts Rechts */ { Encoder_Init(); Turn(-50,200); } void Drehung(void) /*180° Kurve*/ { Encoder_Init(); Turn(120,200); } void Firstcol(void) /* Programm Rechtskurve im Parcour 1. Kollision */ { Anhalten(); Msleep(250); Zurueck(); Msleep(15); Anhalten(); Msleep(10); KurveR(); Msleep(400); Anhalten(); Msleep(250); switched = 0; StartSwitch (); } void Secondcol(void) /* Programm Linkskurve im Parcour, 2. Kollision */ { Anhalten(); Msleep(250); Zurueck(); Msleep(10); Anhalten(); Msleep(250); Drehung(); Msleep(355); Anhalten(); Msleep(250); Anhalten(); Msleep(250); switched = 0; StartSwitch(); } void Thirdcol(void) /* Programm Sackgasse im Parcour, 3. Kollision */ { Anhalten(); Msleep(250); Zurueck(); Msleep(10); KurveL(); Msleep(310); Anhalten(); Msleep(250); switched = 0; StartSwitch(); } void Disco(void) /* PARTYTIME! -15mal blinken/piepsen-*/ { for(i = 0; i < 16; i++) { MotorDir(FWD,FWD); MotorSpeed(50,50); BackLED(OFF,OFF); StatusLED(OFF); FrontLED(OFF); Msleep(200); MotorDir(BREAK,BREAK); BackLED(ON,ON); StatusLED(RED); FrontLED(ON); Msleep(200); } } int main (void) /* Hauptprogrammbeginn */ { unsigned int data[2]; /* Speicherplpatz für Helligkeitswert */ unsigned int Summe; Init (); switched = 0; /* Kollisionserkennung auf 0 setzen */ StartSwitch (); /* Taster-Interrupt aktivieren */ FrontLED(ON); LineData(data); /* Speichern von Helligkeitswert in data[0,1] */ Summe = data[0]+data[1]; /* Summe der Werte beider Fototransistoren */ while (1) { if (switched == 1) /* Wenn 1. Kollision, dann Rechtskurve 90° aus */ { Firstcol(); for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für 2. Kollision */ { if (switched == 1) /* Wenn 2. Kollision, dann Drehung 180° */ { Secondcol(); for(i = 0; i < 25000; i++) /* Setze Zeitschlaufe für dritte Kollision */ { if (switched == 1) /* Wenn 3. Kollision, dann Linksdrehung 90° */ { Thirdcol(); } else /* Keine 3. Kollision, Fahre normal */ { Fahren(); } } } else /* Keine 2. Kollision, Fahre normal */ { Fahren(); } } } else /* gar keine Kollision, Fahre normal, Stopp bei Linie */ { LineData(data); if(data[0]+data[1]+200 > Summe) /* Untergrundhelligkeitsdifferenz feststellen */ { Fahren(); } else { Disco(); /* Party gut - Alles gut */ while(1) {} /* Endlosschleife - Ende des Programmes */ } } } return 0; }
MfG
G3tzR@zor







Zitieren

Lesezeichen