Schau dir mal in der Bascom Hilfe den Teil über Timer/Counter an
Hi,
Ich hab ein Problem mit der Streckenberechnung an meinem Bot bzw. ich verstehe etwas nicht. Gehen wir mal davon aus ich schreibe
Das ist jetz natürlich kein realistisches Programm, ich habe es mir als Beispiel schnell ausgedacht und der einfacheit halber alle Infos wie etwa $regfile und so weiter weggelassen.. Jetz aber zu meiner Frage:Code:Dim Zahl as Integer Do Portb.0 = 1 portb.1 = 1 'das sind die zwei Motoren waitms 600 If Pinb.4 = 1 then 'Das ist der Taster zur Streckenberechnung gosub Zaehlen End if If Pind.2 = 1 then 'Noch ein Taster gosub Auswertung End if loop zaehlen: Zahl = Zahl + 1 'hier wird der Wert addiert return Auswertung: Print "Der Roboter hat eine Strecke von " ;Zahl; "cm zurückgelegt waitms 500 return
So wie das Programm jetzt ist, überprüft der µC erst nach dem waitms ob der Taster genau in diesem Moment gedrückt wird... Ich will aber, das er das während desd waitms Befehls macht. Ich weiß das ein µC nur einen Befehl nach dem anderen Abbarbeiten kann aber wie habt ihr das (in meinen augen große Problem) gelöst?
Vielen Dank schonmal im Vorraus für eure Antworten.
Gruß, Felix
- Status meines ersten Bot BUG 1.0 : Mit dem US-Sensor rumärgern
- Meine Homepage
Schau dir mal in der Bascom Hilfe den Teil über Timer/Counter an
Oh, manchmal hat man einfach ne vorm Kopf . Aber in Bascom Hilfe ist das extrem verwirrend, keine Angaben was man wie einzustellen hat und kein Beispiel. Im RN-Wissensbereich ist das aber sehr gut erklärt, vielen Dank Roberto (Der Autor^^)
EDIT:
Hallo nochmal, ich hab jetzt aber doch ein Problem: Ich habe folgendes Programm in meinen Robby reingeschrieben:
Dann drücke ich den Taster: Alles wunderbar es funktioniert und nach 5 Sekunden stehen die Motoren wieder still. Wenn ich dann jedoch noch mal die Taste drücke dann laufen die Motoren an aber weder die LED blinkt noch stoppen die Motoren nach 5 Sekunden sondern laufen Munter weiter... Findet jemand einen Fehler in meinem Programm?? Also ich finde keinen...Code:$regfile = "m8def.dat" $crystal = 8000000 $baud = 9600 Config Portb.0 = Output Config Portb.1 = Output Config Portc.0 = Output Config Pind.2 = Input Config Timer1 = Timer , Prescale = 256 On Timer1 Isr_von_t1 Enable Interrupts Timer1 = 34285 Dim X As Byte Main: Do If Pind.2 = 1 Then 'Wenn ein Taster gedrückt wird Enable Timer1 'wird der Timer angeschalten Portc.0 = 0 Portb.0 = 1 'Die LED soll low bleiben Portb.1 = 1 'die beiden Motoren gegen an End If If X = 5 Then Gosub Stopp 'wenn x = 5 dann zum Unterprogramm stopp End If Loop Isr_von_t1: 'Unterprogramm wird aufgerufen wenn T1 overflow hat X = X + 1 'zu x wird eins addiert Timer1 = 34285 'der timer soll wieder bei 34258 anfangen zu zählen Toggle Portc.0 'Die LED wird umgeschalten Return 'Return in die Main-schleife Stopp: Stop Timer1 'der timer wird gestoppt X = 0 'X wird auf 0 zurückgesetzt Portb.0 = 0 'die beiden Motoren gegen aus Portb.1 = 0 Gosub Main 'Und man kehrt in das Main-Programm zurück
Gruß, Felix
- Status meines ersten Bot BUG 1.0 : Mit dem US-Sensor rumärgern
- Meine Homepage
Kann mir denn niemand hekfen? Ich weiß echt nicht weiter, keine Ahnung an was es liegt, dass die Motoren dann dauerhaft laufen und die LED gar nichts mehr macht, hier noch einmal ne Beschreibung was das Programm machen soll.
Der Timer wird aktiviert, wenn Der Taster (Pind.2) gedrückt wird. Nachdem der Timer aktiviert ist, laufen die Motoren an. Sobald der Timer "überläuft" springt das Programm zum Unterprogramm des Timers, dort wird zu der Variablen x eine 1 addiert, dann soll der Timer wieder bei 34285 anfangen zu zählen, und durch return kehrt es wieder zurück in das Hauptprogramm. Dort steht die Ifthen-verzweigung, sobald also X den wert 5 errecht spring das Programm in das Unterprogramm stopp. Dort wird der Timer gestoppt, Die Motoren gehen aus, danach springt das Programm wieder zurück in das Hauptprogramm. WEnn man jetz wieder den Taster drückt müsste das Programm eigentlich wieder genauso ablaufen, das tut es aber nicht! Beide Motoren laufen an, aber die LED geht nicht an und die Motoren gehen auch nicht mehr aus. Weiß jemand an was das liegt?? Hängt sich das Programm durch irgendein Programmierfehler vlt. auf?
- Status meines ersten Bot BUG 1.0 : Mit dem US-Sensor rumärgern
- Meine Homepage
Du musst natürlich auch x wieder auf 0 setzen damit es wieder auf 5 kommen kann.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Ist es doch, schau mal ins unterprogramm Stopp da steht X= 0... oder muss das an ne andere Stelle???
- Status meines ersten Bot BUG 1.0 : Mit dem US-Sensor rumärgern
- Meine Homepage
Hi, also ich hab jetzt den code nur überflogen aber müsste in deiner if-Verzweigung nicht start timer stehen anstatt enable timer. Soweit ich weiß ist enable global zum aktivieren des timers generell. probier mal start.
mfg milkbubi
edit: also enable müsste dann trotzdem noch vor deine main-schleife
Vielen Dank, jetzt funktioniert es einwandfrei! \/
Gruß Felix
- Status meines ersten Bot BUG 1.0 : Mit dem US-Sensor rumärgern
- Meine Homepage
Super, das freut mich für dich.
Sorry, hatte ich übersehen. Ich habe mich auf den QC im ersten Post eingeschossen.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Lesezeichen