PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit der Streckenberechnung



Der_Anfänger
12.07.2007, 19:09
Hi,

Ich hab ein Problem mit der Streckenberechnung an meinem Bot bzw. ich verstehe etwas nicht. Gehen wir mal davon aus ich schreibe



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

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:

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

TobiWan
12.07.2007, 22:01
Schau dir mal in der Bascom Hilfe den Teil über Timer/Counter an ;-)

Der_Anfänger
13.07.2007, 10:13
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 (https://www.roboternetz.de/wissen/index.php/Bascom_und_Timer) 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:

$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

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...

Gruß, Felix

Der_Anfänger
13.07.2007, 13:51
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?

peterfido
13.07.2007, 15:21
Du musst natürlich auch x wieder auf 0 setzen damit es wieder auf 5 kommen kann.

Der_Anfänger
14.07.2007, 11:22
Ist es doch, schau mal ins unterprogramm Stopp da steht X= 0... oder muss das an ne andere Stelle???

milkbubi
14.07.2007, 13:13
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

Der_Anfänger
15.07.2007, 12:25
Vielen Dank, jetzt funktioniert es einwandfrei! \:D/

Gruß Felix

milkbubi
15.07.2007, 14:16
Super, das freut mich für dich.

peterfido
15.07.2007, 18:50
Sorry, hatte ich übersehen. Ich habe mich auf den QC im ersten Post eingeschossen.

Der_Anfänger
16.07.2007, 11:01
Macht ja nichts, hauptsache ist, das alle Fragen geklärt wurden :-).