PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem: mehrere Do..Loop Schleifen



Marten83
15.11.2007, 21: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

Dirk
15.11.2007, 21:14
Ohne den Code: Nur Glaskugel-Lesen!

Gruß Dirk

Marten83
15.11.2007, 21: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

Gento
16.11.2007, 06:07
Bekommt <Frameindex> keinen , oder keinen neuen Wert , kein Wunder das es nicht läuft.

Gento

Marten83
16.11.2007, 06: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, 12: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, 15: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, 08: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, 08: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