Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem: mehrere Do..Loop Schleifen
Marten83
15.11.2007, 22:07
Guten Abend zusammen!
Folgendes Problem:
Ich habe ein Hauptprogramm mit mehreren Unterprogrammen.
Eines davon soll nach seinem Aufruf in einer eigenen Schleife laufen bis ich sie, durch ein Ereignis ausgelöst, wieder verlasse.
Das UNterprogramm wird mittels Select-Case-Anweisung aufgerufen.
Mir ist erst nach einiger Zeit aufgefallen, dass die Schleife des Unterprogramms keine Wirkung hat und über die Select-Case-Anweisung und die Hauptschleife immer wieder Ausgeführt wird.
Das will ich allerdings nicht und sehe auch keinen Grund warum sowas nicht funktionieren soll.
Eine Schleife mir While...Wend habe ich auch schon erfolglos versucht.
Ich hoffe jemand kennt eine Lösung für dieses Problem oder weiss eine Alternative.
MfG Marten83
Ohne den Code: Nur Glaskugel-Lesen!
Gruß Dirk
Marten83
15.11.2007, 22:21
Ja richtig, hätte mir auch auffallen können.
Ich hoffe es ist lesbar, ist noch niocht kommentiert und auch nicht Gesäubert.
$regfile = "m32def.dat"
$crystal = 1000000
$lib "glcdKS108.lbx"
Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portc , Ce = 2 , Ce2 = 3 , Cd = 4 , Rd = 5 , Enable = 6 , Reset = 7
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Config Pind.2 = Input
Config Pind.3 = Input
Config Pind.1 = Input
Set Portd.2
Set Portd.3
Set Portd.1
'Enable Timer2
Dim Frameindex As Byte
Dim V1 As Byte , V2 As Byte , V3 As Byte
Dim Helligkeiteram As Eram Byte
Dim Merker1 As Bit
Setfont Font8x8
Cls
V1 = Helligkeiteram
Ocr2 = Lookup(v1 , Helligkeitswerte)
Merker1 = 0
Frameindex = 8
Do 'Hauptschleife
Select Case Frameindex
Case 0 : Gosub Menue
Case 1:
Case 8 : Gosub Beleuchtung
End Select
Loop
End
Beleuchtung:
Line(22 , 30) -(105 , 30) , 255
Line(22 , 41) -(105 , 41) , 255
Line(22 , 31) -(22 , 40) , 255
Line(105 , 31) -(105 , 40) , 255
Lcdat 1 , 1 , "Beleuchtung"
Lcdat 2 , 1 , V1
'For V3 = 0 To V1
'V2 = V3 * 8
'V2 = V2 + 16
'Showpic V2 , 35 , Balken8x8
'Next
Do
V2 = V1 * 10
Lcdat 4 , 47 , V2 ; "%"
Lcdat 3 , 1 , V1
Debounce Pind.2 , 0 , Heller
Debounce Pind.3 , 0 , Dunkler
Debounce Pind.1 , 0 , Speichern1
Loop Until Merker1 = 1
Merker1 = 0
Return
Heller:
If V1 = 10 Then
Return
Else
V1 = V1 + 1
Ocr2 = Lookup(v1 , Helligkeitswerte)
V2 = V1 * 8
V2 = V2 + 16
Showpic V2 , 35 , Balken8x8
End If
Return
Dunkler:
If V1 = 0 Then
Return
Else
V2 = V1 * 8
V2 = V2 + 16
Showpic V2 , 35 , Balken8x8 , 1
V1 = V1 - 1
Ocr2 = Lookup(v1 , Helligkeitswerte)
End If
Return
Speichern1:
Helligkeiteram = V1
Frameindex = 0
Merker1 = 1
Cls
Return
Helligkeitswerte:
Data 0 , 3 , 5 , 8 , 12 , 21 , 34 , 56 , 93 , 154 , 255
Bekommt <Frameindex> keinen , oder keinen neuen Wert , kein Wunder das es nicht läuft.
Gento
Marten83
16.11.2007, 07:43
Frameindex bekommt vor der Hauptschleife den Wert 8.
Dadurch springt er dann in die Sub "Beleuchtung"
und wenn ich Pind.1 drücke, wird das "Menü" aufgerufen.
Das klappt alles soweit ganz wunderbar, nur halt nicht in der jeweils eigenen Do..Loop schleife.
PS.: Das erkenne ich übrigens daran, dass Lcdat 2 , 1 , V1 , welches sich ausserhalb der Schleife befindet, die Variable V1 ändert, wenn ich den Helligkeitswert ändere.
Marten83
edit: Habe gerade auch ein Goto-Konstrukt versucht....gleiches Ergebnis.
stefan_Z
16.11.2007, 13:47
"Merker1" muss von einem Interrupt "gezündet" werden, ansonsten kommt er ja nie an den Punkt, dass die Variable den Richtigen Wert zum wegspringen hat.
Allerdings wird "FrameIndex" - wie schon erwähnt - niemals was anderes als "0", daher bringt dir deine Hauptschleife nichts...
Mach in jede Sub eine Abfrage auf FrameIndex und eine Interrupt-Sub, die dir die Variablke immer hochzählt, bis sie bei 2 wieder auf 0 kippt (CaseSelect). In den Subs wird mit While FrameIndex = 0 (oder 1 oder 2) gearbeitet. Mach ich auch so, funktioniert.
Marten83
16.11.2007, 16:45
Merker1 wird durch die Subroutine Speichern1 "gezündet". Und was ich vergessen habe mit zu posten (werde ich nacholen, wenn ich wieder zu hause bin) ist, dass am Anfang, also im Deklarationsteil der frameindex auf 8 gesetzt wird. Ich kann auch wunderbar in das Hauptmenü springen und speichern tut er auch.
Das mit While Frameindex werde ich probieren, obwohl ich erstens nicht ganz verstehe warum das da passiert und zweitens will ich eigentlich nicht ständig den Frameindex abfragen bzw über die Hauptschleife mit der Select-Case Anweisung laufen.
Im Grunde soll das Programm, solange keine Taste gedrückt wird, schön in der Subroutine bleiben und seine Endlosschleife durchlaufen (von Do
V2 = V1 * 10
bis
Loop Until Merker1 = 1
Merker1 = 0
Return)
Marten83
18.11.2007, 09:56
Guten Morgen!
Ich habe gerade etwas (vielleicht) herausgefunden und will mal hören ob das plausibel sein kann.
Folgendes:
Wie oben im Code zu sehen springe ich ja von der Hauptschleife durch das Case select in das Unterprogramm "Beleuchtung". Da frage ich ja nun die Pins mittels Debounce ab, welcher wiederum in ein Unterprogramm führt.
Kann es nun sein, dass das "Return" dieses zweiten Unterprogramms (Debounce) das "Return" des ersten Unterprogramms (Beleuchtung) beeinflusst!?
Kann ich dieses Verhalten duch z.B. "Return Beleuchtung" oder so unterbinden?
edit: Habs gerade ausprobiert: geht nicht so!
MfG Marten83
Marten83
20.11.2007, 09:51
Hallo nochmal!
Ich will mal allgemein Fragen, sonst komme ich nicht weiter:
Ist es möglich eine Schleife in einem Unterprogramm auszuführen, ohne Durchlauf des Hauptprogramms?
Wenn das nicht geht werde ich wohl im Kopf jedes Unterprogramms eine Abfrage machen müssen, ob das Unterprogramm das erste Mal ausgeführt wird oder nicht.
Vielen Dank!
Marten83
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.