- LiTime Speicher und Akkus         
Ergebnis 1 bis 9 von 9

Thema: Problem: mehrere Do..Loop Schleifen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    Problem: mehrere Do..Loop Schleifen

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ohne den Code: Nur Glaskugel-Lesen!

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Bekommt <Frameindex> keinen , oder keinen neuen Wert , kein Wunder das es nicht läuft.

    Gento

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    "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.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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)

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus