PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (gelöst) do loop - schleife instabil?



xxrider
02.01.2008, 19:41
Hallo, erst mal die besten Neujahrswünsche an die Roboter-Gemeinde!!!

Ich habe ein kleines problem mit einem Programm:

eine spezielle abfolge von tasterbetätigungen soll einen port ein-und anschließend wieder schalten. Dann neu starten.

(taster1, dann taster2, und während dieser gedrückt gehalten wird nochmal taster1)
wenn die abfolge 2 mal falsch hintereinander erfolgt, dann soll das Programm stoppen.

Eine LED gibt hierüber auskunft.

das problem: das programm funktioniert anfänglich. wenn es aber längere Zeit auf „bereitschaft“ stehen soll (in der ersten do loop schleife), dann verselbständigt es sich. das äußert sich, indem z. B. nach langer Zeit (z.B. 20 stunden oder so) die LED aufleuchtet und das Programm somit gestoppt ist. oder eine richtige eingabe vom programm als falsch quittiert wird.

es scheint, als würde der taster während der (loop)zeit eine (geisterhafte) betätigung erfahren...

nach reset geht wieder alles einwandfrei, bis zur nächsten längeren wartezeit...

was könnte die ursache für dieses phänomen sein?



gruß

Holger


$regfile = "m32def.dat"

$crystal = 8000000 '=interner Quarz, 9000000 für externen Quarz

$baud = 9600

$hwstack = 64
$swstack = 64
$framesize = 64


Config Portb = Output
Config Portd.2 = Output 'leds
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Input
Config Portd.6 = Input
Config Porta = Input 'taster

Porta.0 = 1
Porta.2 = 1

Dim A As Word
Dim B As Word


Program:

Portb.1 = 0 'Led
Do
Loop Until Pina.0 = 0 Or Pina.2 = 0
If Pina.2 = 0 Then
Portb.1 = 1
Goto Abbruch
Else
End If
Waitms 300
Do
Loop Until Pina.0 = 0 Or Pina.2 = 0
If Pina.0 = 0 Then
Portb.1 = 1
Goto Abbruch
Else
End If
Waitms 10

Do
Loop Until Pina.0 = 0 Or Pina.2 = 1
If Pina.2 = 1 Then
Portb.1 = 1
Goto Abbruch
Else
End If
Waitms 100

Portb.0 = 1
Waitms 1200 'relais an
Portb.0 = 0

A = 5

Goto Program



Abbruch:

Wait A
A = A + 5
If A >= 15 Then
Stop

Else
Goto Program

End If

End

digitali
02.01.2008, 23:23
Hallo,

also ehrlich gesagt sieht das etwas nach ner "GOTO Spaghetti-Programmierung" aus. GOTO's sind irgendwie unschoen. Dafuer bietet Bascom wesentlich bessere Moeglichkeiten.
Diesen Befehl habe ich bisher noch nie gebraucht. Bei umfangreichen Programmen kann man da schnell den Faden verlieren. Und wer weiss was der Controller dann fuer unerwartete Dinge macht.
In jedem meiner Programme habe ich eine Haupt Do-Loop Schleife. Gleich dahinter das End. Und der Rest besteht aus Sub-Routinen, ISR, usw. Das funktioniert immer wunderbar. Und dieses Programm-Grundgeruest sieht man ueberall.
Und hier in Deinem Falle laesst sich sicherlich einiges evt. mit nem GOSUB-RETURN loesen?

Mit freundlichen Gruessen
Digitali

xxrider
03.01.2008, 10:22
Hallo,
ich denke nicht dass mir gosub weiterhilft.
das programm funktioniert ja eigentlich.
zudem gibt es in diesem programm nur 2 gotos: einmal zu „abbruch“ und einmal zu „program“. das dürfte ja nicht besonders kompliziert sein.
woran kann es liegen, dass das programm nicht über mehrere stunden stabil in der (ersten) do loop schleife bleibt?
ich hab jetzt mal die taster komplett abgeklemmt, so dass tatsächlich keine eingabe (z.B. durch wackelkontakt o.ä. ) erfolgen kann. mal sehen, ob irgendwann die led aufleuchtet...

PicNick
03.01.2008, 13:27
Ich kann keinerlei Entprellung sehen. Dann ist der Eingang natürlich schon empfndlich auf irgendwelche Schnackler von aussen

Mach doch einfach mal einen Sicherheitscheck:
(meinethalben auch mit "pfui-gack" Goto, was soll's)



CK_1:
Do
Loop Until Pina.0 = 0 Or Pina.2 = 0 ' check, ob einer 0
IF Pina.0 = 1 AND Pina.2 = 1 THEN GOTO CK_1 ' noch immer ?

Man könnt' auch dazwischen noch einen Waitms 1 einfügen, das wär einer drauf.

Bei jedem Test wenigstens 20 Stunden warten, ist natürlich schon verschärft, aber da fällt mir nix ein.
Bist du bei einer Fehlfunktion gleich ausgesperrt und brauchst das THW ?

xxrider
03.01.2008, 20:33
hi robert,
:-) nein, es ist fast noch schlimmer: ich komme jedesmal zu spät zur arbeit, weil ich das garagentor mit der hand öffnen muss!

danke für deinen tipp, es könnte tatsächlich an der entprellung liegen.
hab jetzt die taster schon 24 stunden abgeklemmt und bisher tut das programm nichts...keine led...
o.k. das heißt ich könnte deinen sicherheitscheck am anfang inkl. des waitms einfügen. dann sollte es stabil sein!?!
reicht 1 ms zur entprellung?
ohne waitms ist doch bei deinem Vorschlag auch nichts entprellt, oder?

gruß
holger

MrNiemand
03.01.2008, 20:55
Hi, zum entprellen finde ich den Befehl Debounce ganz praktisch. Ist zwar nicht die effizienteste Art zu entprellen, aber ich würde mal sagen, wennn dein Prog 1ms langsamer ist, und du deswegen zu spät kommst, musst du einen Wecker anschaffen, der dich 1ms ehr weckt ;)

Ausbilder 'Durchdrücker'
03.01.2008, 21:14
es scheint, als würde der taster während der (loop)zeit eine (geisterhafte) betätigung erfahren...
Du kannst dir das mit einem Oszilloskop oder über die Soundkarte deines PCs anschauen, dann siehst du, was der µcontroller sieht. Es wird wahrscheinlich so sein, daß Betätigen des Tasters nicht zu einer sondern mehreren annähernd diskreten Übergängen zwischen H & L führt. Wenn du das erstmal gesehen hast, kannst du auch eine Softwareroutine drumrum schreiben bzw. kann man das auch analog lösen. Stichwort Entprellen.

PicNick
04.01.2008, 16:03
WaitmS: DEr Bascom brauch schon einige Zyklen, bis er diese Checks alle gemacht hat, aber Waitms schad' auch nix.
Der "Debounce" Befehl ist (glaub ich) nix für dich, weil du ja zwei Pins abfragen musst.
Aber insgesamt bewirkt alles das gleiche: Man schaut, ob der Pin seinen Zustand länger beibehält, bevor man ihn ernst nimmt.

Bei die geht's doch sehr um Betriebssicherheit und nicht um extra-schnelle Reaktion. Wenns unsere Vorschläge also nicht wirklich nutzen, machen wir dir eine mega-ober-spezielle-cool-Funktion, die wirklich wasserdicht ist,

xxrider
04.01.2008, 16:38
hey cool!
also ich hab erst mal deinen vorschag angenommen und das programm entsprechend angepasst (alle abfragen entprellt + 5 ms wartezeit).
Jetzt wollen wir doch mal schauen ob ich montags pünktlich zur arbeit komme!
ansonsten hab ich ja immer noch euch - herzlichen dank - ich werde berichten und bin jetzt schon zuversichtlich :-)
Holger

xxrider
12.01.2008, 10:41
Also, alles klar, esfunktioniert jetzt und zwar stabil!
Lag also tatsächlich am entprellen.
Danke nochmal,
Holger