Hallo InFaIN,
den vorgeschlagenen Ansatz von hai1991 kann ich nur unterstützen.
Hier ist mal eine formatierte Version. Es ist nichts geändert, sondern nur mal ordentlich eingerückt. Dann wird der Fehler auch sichtbar.
Wird jetzt mal alles aus dem ersten if() in der while()-Schleife hinter dem Init() entfernt, bleibt nur noch folgendes übrig:Code:#include "asuro.h" #define TRIGGERLEVEL 655 #define HYSTERESIS 10 #define LOW 0 #define HIGH 1 #define GESCHW 65 int main (void) { unsigned int z, ll, rr; unsigned char taste1, taste2 ,taste3, taste4; unsigned int data [2]; signed int status [2] = {0, 0}; signed int difference = 0; int lData [2]; int i, donl, doffl, donr, doffr, l, r; MotorDir (FWD, FWD); Init (); while (1) { taste4 = PollSwitch (); taste2 = PollSwitch (); taste1 = PollSwitch (); taste3 = PollSwitch (); if (taste1 && taste1 == taste2 && taste3 == taste4 && taste1 == taste3 && taste1 == taste4) { ll = 0; rr = 0; if (taste1 == 1) { ////////////////////////////////////////////// ///// Kolision ////////////////////////////////////////////// while (1) { taste4 = PollSwitch (); taste2 = PollSwitch (); taste1 = PollSwitch (); taste3 = PollSwitch (); if (taste1 && taste1 == taste2 && taste3 == taste4 && taste1 == taste3 && taste1 == taste4) { l = 0; r = 0; if (taste1 == 1) { l = 120; r = 0; } if (taste1 == 2) { l = 0; r = 160; } if (taste1 == 4) { l = 0; r = 120; } if (taste1 == 8) { l = 120; r = 0; } if (taste1 == 16) { l = 160; r = 0; } if (taste1 == 32) { l = 0; r = 120; } StatusLED (RED); MotorDir (RWD, RWD); MotorSpeed (l, r); for (z = 0; z < 250; z++) { Sleep (255); } } else { StatusLED (GREEN); MotorDir (FWD, FWD); MotorSpeed (120, 120); } taste2 = 0; taste1 = 0; } return 0; ////////////////////////////////////////////// ///// Kolision ////////////////////////////////////////////// } if (taste1 == 2) { ////////////////////////////////////////////// ///// Odometer ////////////////////////////////////////////// while (1) { // 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); // Zaeldifferenz passend auf die Motoren verteilen if (difference > 0) MotorSpeed (255 - difference - 50, 255 - 50); else MotorSpeed (255 - 50, 255 + difference - 50); } return 0; ////////////////////////////////////////////// ///// Odometer ////////////////////////////////////////////// } if (taste1 == 4) { ////////////////////////////////////////////// ///// Linien ////////////////////////////////////////////// while (1) { FrontLED (OFF); // Umgebungslicht filtern Sleep (10); // kurz warten bis LED aus LineData (lData); // LineData (lData); // doffl = lData [0]; // doffr = lData [1]; // FrontLED (ON); // Sleep (10); // kurz warten bis LED an LineData (lData); // LineData (lData); // donl = lData [0]; // donr = lData [1]; // l = donl - doffl; // r = donr - doffr; // r und l sind nun die werte von T9 und // T10 mit gefiltertem Umgebungslicht i = (l + r) / 2; if (l < r) // gegenlenken { MotorSpeed (GESCHW - i + 68, GESCHW + i); } else { MotorSpeed (GESCHW + i + 68, GESCHW - i); } } return 0; ////////////////////////////////////////////// ///// linien ////////////////////////////////////////////// } if (taste1 == 8) { l = 120; r = 0; } if (taste1 == 16) { l = 160; r = 0; } if (taste1 == 32) { l = 0; r = 120; } StatusLED (RED); taste2 = 0; taste1 = 0; } return 0; } }Das geht zwar durch den Compiler, aber dieses Programm verläßt die main()-Funktion mehr oder weniger sofort nach dem einschalten wieder. Und das ist leider falsch.Code:#include "asuro.h" #define TRIGGERLEVEL 655 #define HYSTERESIS 10 #define LOW 0 #define HIGH 1 #define GESCHW 65 int main (void) { unsigned int z, ll, rr; unsigned char taste1, taste2 ,taste3, taste4; unsigned int data [2]; signed int status [2] = {0, 0}; signed int difference = 0; int lData [2]; int i, donl, doffl, donr, doffr, l, r; MotorDir (FWD, FWD); Init (); while (1) { taste4 = PollSwitch (); taste2 = PollSwitch (); taste1 = PollSwitch (); taste3 = PollSwitch (); if (taste1 && taste1 == taste2 && taste3 == taste4 && taste1 == taste3 && taste1 == taste4) { } return 0; } }
Wenn alle 'return 0'-Zeilen entfernt werden sollte es auf alle Fälle schon mal besser gehen.
Wird der Asuro eingeschalte, sollte das 'Menü' aktiv sein:
- Taste1 = 1: Kollision
- Taste1 = 2: Odometer
- Taste1 = 4: Linien
- Taste1 = 8: Variablen l und r setzen, aber nichts weiteres.
- Taste1 = 16: Sollten hier Motorbewegungen angestoßen werden?
- Taste1 = 32: Es scheint dann ein MotorSpeed() zu fehlen
Ob die Funktionen bei Taste1 = 1, 2, 4 gehen weiss ich nicht.
Das formatieren kostet viel überflüßige Zeit, wenn man es nicht sofort macht.
Gruß Sternthaler
P.S.: Versuch einmal, ob der Asuro anders reagiert, wenn du sofort nach dem Einschalten einen der ersten 3 Taster drückst.
Dann sollte das 'Menü' ja schon ausgewählt werden. Aber ob dann nicht die 4-fach-Tastenabfrage blockiert?







Zitieren

Lesezeichen