c't Projekte - c't-Bot und c't-Sim - Mailinglisten

c't-Bot und c't-Sim


[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

Re: [ct-bot] ->Klappe

Absender: Timo Sandmann
Datum: Mo, 26.01.2009 10:11:18


Hallo Frank,

Am 24.01.2009 um 20:03 schrieb Frank Menzel:
Hallo Timo,
zu dem Punkt: " if (pos == DOOR_CLOSE && sensDoor == 0) {
		return;	// Klappe ist bereits geschlossen
	}"

Ich habe sie auskommentiert aber dann geht gar nichts. Gleich nach
flashen gibt er nur noch ein sich immer wiederholendes Klicken von
sich-keine Anzeige, nichts geht mehr. Wieder die Zeilen rein, alles geht
wieder. Wieder auskommentiert-ticken. Also habe ich die Zeilen drin
gelassen.

o.O was geht denn da ab? Du kommentierst einen if-Block aus, der sowieso nie ausgeführt wird und die Firmware funktioniert schon nicht mehr, bevor die entsprechende Funktion überhaupt erst aufgerufen wird? Hast du das mit einem frisch vom SVN geholten Projekt gemacht oder mit einem, das schon eigene Änderungen drin hatte?

Die Änderung des Aufrufens von bot_servo(data... zu bot_servo(NULL...
hat aber die Lösung gebracht und er kommt damit zu Ende, kein endloses
Ticken mehr.

Mit dem "Ticken" meinst du jetzt das Servo-Geräusch?
Der Nachteil dieser Variante ist natürlich, dass der Aufrufer sofort weiterläuft und nicht erst, wenn das Servoverhalten fertig und der Servo an seiner Endposition angekommen ist. Das ist also keine dauerhafte Lösung.

Bei der ursprünglichen Version ohne NULL-Aufruf, also noch mit dem
endlosen Ticken nach Einfangen, ist mir noch folgendes aufgefallen: Wenn
Objekt eingefangen ist, leuchtet ja die gelbe LED und es kommt das
endlose Ticken. Wenn ich aber den bot nun mit dem eingefangenen Objekt
ein wenig zurückschiebe und die LED verlischt, dann hört auch das Ticken
auf und das Verhalten kommt zum Ende.

Verwendest du Version 1 von bot_catch_pillar()? Die hat ja so etwas im Code:
if (sensTrans == 0) {
    VORWÄRTS;
} else {
    KLAPPE_ZU;
    STATUS = ENDE;
}

Wenn jetzt (warum auch immer) das STATUS = ENDE; nicht ausgeführt wird, gibt's ne Endlosschleife, die den Servo immer wieder "Klappe zu" ausführen lässt (Servo ist ewig aktiv und Verhalten wird nie beendet). Das wäre genau das, was du beschrieben hast, hätte aber nichts mit dem Servo-Code zu tun. Da im Code der Status auf Ende gesetzt wird, dürfte das aber eigentlich gar nicht passieren. Es ist halt nur auffällig, dass dieses Szenario genau zu deinem Fehlerbild führt.

Gruß,
Timo