also was mir spontan auffällt, ist dass die main funktion nur ein einziges mal durchlaufen wird, wenigstens der teil mit den tastern. ist das absicht? warum? wofür sind die tasterabfragen da? eine einfache abfrage der PollSwitch.Funktion, ganz besonders kurz nach dem einschalten, ist sehr ungenau. meist werden falsche werte zurückgeliefert. verschiedene lösungen: mehrfahce abfragen, kurze pause davor (Sleep(216) ist etwa 3 ms), den kondensator bei den tastern (ich glaub c6) entfernen..
vielleicht schaffst du es, eine funktion LinieVerloren() zu schreiben, die durch kurzes, vorsichtiges hin- und herdrehen prüft, ob noch eine linie vorhanden ist. wenn ja, dann wieder FollowLine(), wenn nein, dann so lange drehen bis die linie wieder vorhanden ist.
in der while schleife würde dann sowas stehen:
Code:
StatusLED(GREEN);
FollowLine();
StatusLED(RED);
LinieVerloren();
dann weisst du, wenn die lampe grün ist, dann folgt er ihr ein stück, und wenn sie rot ist, prüft er ob sie nicht schon zu ende ist.
die funktion LinieVerloren() müsste
- den asuro eine FESTE zeit nach LINKS drehen, und dann wieder zurück, und prüfen ob in dieser zeit der RECHTE fototransistor einen sehr niedrigen wert geliefert hat (also über die linie gekommen ist).
- dann den asuro die GLEICHE ZEIT nach RECHTS drehn und dann prüfen, ob auch der LINKE fototransistor die linie "gesehen" hat (doppelte abfrage, ich weiss, aber doppelt hält besser =)
- wenn offensichtlich eine linie vorhanden ist, dann kann die funktion verlassen werden, in der while(1) schleife wird ja dann wieder FollowLine aufgerufen.
- wenn keine linie mehr vorhanden ist, dann muss der asuro sich so lange drehen, BIS wieder eine linie vorhanden ist. dann wird die schleife beendet, und mit FollowLine wird zurückgefahren.
wenn es dir nur darum geht, aus der while(1) schleife rauszukommen, dann mach doch einfach while(zeit<100) hin. sowie zeit>100 ist, wird die schleife dann beendet.
ABER:
vor dem return(0); muss dann nochmal while(1); hin (mit dem semikolon), damit das programm nie "beendet" wird. es kann sonst passieren, dass alte code-inhalte des speichers ausgeführt werden. der asuro sollte am ende, wenn er seine aufgabe erledigt hat, immer in einer while(1); schleife "eingefangen" werden.
Die Sleep-Funktion lässt den asuro einfach einige millisekunden den aktuellen zustand beibehalten, wenn er fährt, dann fährt er weiter, wenn er steht, dann bleibt er stehen. sie hat nichts mit "schlafen" im sinne von "anhalten" zu tun. die zeit, die er während dieser funktion nichts (neues) macht kannst du so ausrechnen:
Sleep(x);
x=anzahl der 72000stel sekunden
also z.B. Sleep(216) ist:
216*(1/72000)=216/72000=3/1000 also 3 tausendstel sekunden(millisekunden)
allerdings darf der wert in der funktion 255 nicht übersteigen. um also eine sekunde zu warten, würde folgendes gehn:
for(i=0;i<500;i++)
{Sleep(144)}
er wartet dann 500*144*1/72000 sekunden, also 1000 millísekunden, also eine sekunde. (aber auch nur ungefähr... eine sekunde reine wartezeit, plus "rechenzeit").
alternative:
lade dir die neue asuro lib runter, mit der funktion Msleep() kannst einfach die anzahl der zu wartenden millisekunden angeben.
Lesezeichen