Ohne den Code: Nur Glaskugel-Lesen!
Gruß Dirk
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
Ja richtig, hätte mir auch auffallen können.
Ich hoffe es ist lesbar, ist noch niocht kommentiert und auch nicht Gesäubert.
Code:$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
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.
"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.
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)
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
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
Lesezeichen