Du könntest einen Wait-Befehl einfügen:
wait 1 'eine Sekunde warten
waitms 1500 '1,5 sekunden warten
Hallo
Ich bin gerade dabei das Programm für meinen Bot zu schreiben.
Der Bot verfügt am Anfang (tja das Geld ^^) nur über 2 Kollisionstaster als Sensoren. Die Taster sind links und rechts von der Front des Bots positioniert.
Wenn der (auf die Wand gesehen) linke Sensor was meldet, soll der Bot seine 2 Räder gegeneinander drehen (nocht nicht das Problem) und das nur für eine ganz bestimmte Zeit. Maybe 1,5s. Wie mache ich das genau mit der Zeit?
Hier mal mein ganzer Code:
Bitte die Motoreneingänge und deren Anschlüsse mal außen vor lassen. Habe ich nur kurz geschrieben, ich weis ned ob der so entgegensetzt drehen würde. Dienen nur als Orientierung. Es geht ja eher um die Dauer.Code:'Version 1.0 '---------------------------------------------------------- $regfile = "m8def.dat" 'ATmega8 $crystal = 3686411 'Quarz: 3686411 Hz Ddrd = &B01111000 'Pin PD3 bis PD6 als Ausgänge Portd = &B00000000 'Pin PD3 bis PD6 auf Low Ddrb = &B00000000 'Pin PB4 und 5 als Eingang Portb = &B00110000 'Pin PB4 und 5 auf High Do Portd.3 = 1 'Motoren drehen in gleiche Richtung Portd.5 = 1 If Pinb.4 = 0 Then Portd.3 = 1 Portd.4 = 0 Portd.5 = 0 Portd.6 = 1 'Motoren drehen gegeneinander Else Portd.3 = 1 Portd.4 = 0 Portd.5 = 1 Portd.6 = 0 Loop End
Würde das so denn bis jetzt funktionieren? Die Platine ist leider noch nicht fertig, möchte mich nur mal im Vorfeld damit vertrauter machen damits nachher leichter läuft.
Du könntest einen Wait-Befehl einfügen:
wait 1 'eine Sekunde warten
waitms 1500 '1,5 sekunden warten
MFG Moritz
www.free-webspace.biz/update
Naja er soll ja nicht warten, er soll ja die If-Schleife eine ganz bestimmte Zeit lang durchführen.
Hi!
Hm. Das ist schon schwiriger! Du könntest einen Timer 1,5 Sec warten lassen, und dann in der ISR eine Variable ändern, die dann die IF-Abfrage abschaltet.
Also mal quick & dirty:
Grüße,Code:'* Timer Configurieren und starten Dim stop as byte stop = 255 '... '... '* Timer Starten Do while stop = 255 ' Hier dein Code... ... ... ... loop 'rest d. codes... ... ... '... '... End timer_ISR: '... Initialisierungs. und anderer Kram stop = 0
Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Also er soll doch, wenn er die Wnad berührt (Pinb.4 = 0?) sich 1,5 Sekunden lang drehen und dann weiter fahren, oder? Ich gehe mal davon aus, das PortD.3 bis 6 die Richung vorgeben?!
Also eignetlich musst du doch nur die Ausgägne so setzen wie du willst, 1, 5 Sekunden warten und dann wieder zurücksetzen. Leider werde ich aus deinem Code nciht ganz schlau, aus deiner Frage leider auch nicht
MFG Moritz
www.free-webspace.biz/update
HI RCO!
Vielleicht möchte er während des drehens weitere Kollisionschecks druchfüren...
Grüße,
tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Dann wäre eigentlich sinnfoller, die Sensoren direkt über Interrupts laufen zu lassen. Man könnte z.B. auch mehrere Kollisionstaster über Dioden an einen Interrupt legen und dann in der Routine schauen, welcher Taster es denn nun war.
MFG Moritz
www.free-webspace.biz/update
Ok ich versuchs mal zu erklären, war glaub echt Käse
Am Besten wir fangen nochmal von vorne an.
Also mal angenommen am Pin PB4 wäre ein Taster
Sobald der Taster gedrückt wird soll/ist PINB.4 = 0.
Daraufhin sollen die Motorenausgänge zum Einleiten des Ausweichens eingeleitet werden.
Portd.3 = 1 für Motor 1 bekommt Saft und Portd.6 = 1 für Motor 2 ebenfalls. Die anderen 2 Ausgänge für die Motoren stehen so lange auf 0 (Portd.4 = 0 ; Portd.5 = 0). Die Motoren drehen jetzt gegeneinander und er wendet sich. Das soll er dann zum Beispiel 1,5s lang tun und danach in die Hauptroutine zurückfallen in denen er den Pins PD3 und PD5 Saft gibt und die anderen 2 auf Null setzt.
Hi!
Ja! Dann ist deine Funktion wait 1 oder waitms 1500.
Also (quick & dirty):
Wie RCO das so meint.Code:'Code drehsequenz einleiten waitms 1500 'Weiterer Code
Interrupts sind sowieso eine super Idee!
Grüße,
Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Vielleicht besteht da ein Missverständniss, "wait" heißt ja nicht, das er garnix macht, sondern nur das der Prozessor nix macht, alle Zustände bleiben ja erhalten, hast du also Pins/Ports gesetzt und sagst "Waitms 1500" dann wird er, wenn vorher so eingestellt sich 1,5 Sekunden lang drehen.
MFG Moritz
www.free-webspace.biz/update
Lesezeichen