- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: HILFE: Ledlauflicht Stacküberlauf verhindern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2006
    Beiträge
    10

    HILFE: Ledlauflicht Stacküberlauf verhindern

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    ich habe folgendes Problem, ich habe eine Programm für zwei Led Lauflichter geschrieben aber leider bekomme ich nach kurzer Zeit einen Stacküberlauf.
    Ich finde keine Lösung um das zu verhindern, kann mir gemand helfen??

    Hier ist das Programm, ich habe es für einen AT89S8252 geschrieben und verwende es auf einen AT89S8253.

    Code:
    $large
    Dim A As Byte
    Dim C As Byte
    Dim D As Byte
    Dim L1 As Byte
    Dim R1 As Byte
    Dim R2 As Byte
    Dim L2 As Byte
    Dim Merker1 As Byte
    Dim Merker2 As Byte
    
    
    P0 = &HFF
    P1 = &HFF
    P2 = &HFF
    P3 = &HFF                                                     ' Enstellung Links Laufband 2 =1
    A = 1
    D = 1
    Merker1 = 0
    Merker2 = 0
    
    
    
    Main:
    Do
    Zulauflicht1:
       If P0.0 = 0 And Merker1 = 0 Then
       Set L1
       Print L1
       Gosub Zu_lauflicht1
             Else
                If L1 = 1 Then
                Gosub Zu_lauflicht1
                   Else
    Auflauflicht1:
                      If P0.0 = 0 And Merker1 = 1 Then
                      Set R1
                      Print R1
                      Gosub Auf_lauflicht1
                         Else
                            If R1 = 1 Then
                            Gosub Auf_lauflicht1
                            Else
                               If L2 = 1 Then
                               Gosub Zu_lauflicht2
                               End If
                            End If
                      End If
                End If
       End If
    
    Zulauflicht2:
    
       If P0.3 = 0 And Merker2 = 0 Then
       Set L2
       Print L2
       Gosub Zu_lauflicht2
             Else
                If L2 = 1 Then
                Gosub Zu_lauflicht2
                   Else
    Auflauflicht2:
                      If P0.3 = 0 And Merker2 = 1 Then
                      Set R2
                      Print R2
                      Gosub Auf_lauflicht2
                         Else
                            If R2 = 1 Then
                            Gosub Auf_lauflicht2
                               Else
                                  If L1 = 1 Then
                                  Gosub Zu_lauflicht1
                                  End If
                            End If
                      End If
                End If
       End If
    Loop
    
    Zu_lauflicht1:
       If L1 = 0 Then
       Goto Main
       Else
       If A = 1 Then
       P0.6 = 0
       Waitms 0.2
       A = A + 1
       Goto Zulauflicht2
       Else
          If A = 2 Then
          P0.7 = 0
          Waitms 0.2
          A = A + 1
          Goto Zulauflicht2
          Else
             If A = 3 Then
             P1.0 = 0
             Waitms 0.2
             A = A + 1
             Goto Zulauflicht2
             Else
                If A = 4 Then
                P1.1 = 0
                Waitms 0.2
                A = A + 1
                Goto Zulauflicht2
                Else
                   If A = 5 Then
                   P1.2 = 0
                   Waitms 0.2
                   A = A + 1
                   Goto Zulauflicht2
                   Else
                      If A = 6 Then
                      P1.3 = 0
                      Waitms 0.2
                      A = A + 1
                      Goto Zulauflicht2
                      Else
                         If A = 7 Then
                         P1.4 = 0
                         Waitms 0.2
                         A = A + 1
                         Goto Zulauflicht2
                         Else
                            If A = 8 Then
                            P1.5 = 0
                            Waitms 0.2
                            A = A + 1
                            Goto Zulauflicht2
                            Else
                               If A = 9 Then
                               P1.6 = 0
                               Waitms 0.2
                               A = A + 1
                               Goto Zulauflicht2
                               Else
                                  If A = 10 Then
                                  P1.7 = 0
                                  Waitms 0.2
                                  A = A + 1
                                  Goto Zulauflicht2
                                  Else
                                     If A = 11 Then
                                     P2.0 = 0
                                     Waitms 0.2
                                     A = A + 1
                                     Goto Zulauflicht2
                                     Else
                                        If A = 12 Then
                                        P2.1. = 0
                                        Waitms 0.2
                                        A = A + 1
                                        Goto Zulauflicht2
                                        Else
                                           If A = 13 Then
                                           P2.2 = 0
                                           Waitms 0.2
                                           A = A + 1
                                           Goto Zulauflicht2
                                           Else
    
                                           L1 = 0
                                           Merker1 = 1
    
                                           Goto Main
                                           End If
                                        End If
                                     End If
                                  End If
                                End If
                              End If
                         End If
                      End If
                  End If
               End If
             End If
          End If
          End If
      End If
    Return
    End
    
    
    Zu_lauflicht2:
    If L2 = 0 Then
       Goto Main
       Else
       If D = 1 Then
       P2.3 = 0
       Waitms 0.2
       D = D + 1
       Goto Zulauflicht1
       Else
          If D = 2 Then
          P2.4 = 0
          Waitms 0.2
          D = D + 1
          Goto Zulauflicht1
          Else
             If D = 3 Then
             P2.5 = 0
             Waitms 0.2
             D = D + 1
             Goto Zulauflicht1
             Else
                If D = 4 Then
                P2.6 = 0
                Waitms 0.2
                D = D + 1
                Goto Zulauflicht1
                Else
                   If D = 5 Then
                   P2.7 = 0
                   Waitms 0.2
                   D = D + 1
                   Goto Zulauflicht1
                   Else
                      If D = 6 Then
                      P3.0 = 0
                      Waitms 0.2
                      D = D + 1
                      Goto Zulauflicht1
                      Else
                         If D = 7 Then
                         P3.1 = 0
                         Waitms 0.2
                         D = D + 1
                         Goto Zulauflicht1
                         Else
                            If D = 8 Then
                            P3.2 = 0
                            Waitms 0.2
                            D = D + 1
                            Goto Zulauflicht1
                            Else
                               If D = 9 Then
                               P3.3 = 0
                               Waitms 0.2
                               D = D + 1
                               Goto Zulauflicht1
                               Else
                                 If D = 10 Then
                                 P3.4 = 0
                                 Waitms 0.2
                                 D = D + 1
                                 Goto Zulauflicht1
                                 Else
                                     If D = 11 Then
                                     P3.5 = 0
                                     Waitms 0.2
                                     D = D + 1
                                     Goto Zulauflicht1
                                     Else
                                        If D = 12 Then
                                        P3.6 = 0
                                        Waitms 0.2
                                        D = D + 1
                                        Goto Zulauflicht1
                                        Else
                                           If D = 13 Then
                                           P3.7 = 0
                                           Waitms 0.2
                                           D = D + 1
                                           Goto Zulauflicht1
                                           Else
    
                                           L2 = 0
                                           Merker2 = 1
    
                                           Goto Main
                                           End If
                                        End If
                                     End If
                                  End If
                                End If
                              End If
                         End If
                      End If
                  End If
               End If
             End If
          End If
          End If
      End If
    Return
    End
    
    Auf_lauflicht1:
       If R1 = 0 Then
       Goto Main
       Else
       If A = 14 Then
       P2.2 = 1
       Waitms 0.2
       A = A - 1
       Goto Zulauflicht2
       Else
          If A = 13 Then
          P2.1 = 1
          Waitms 0.2
          A = A - 1
          Goto Zulauflicht2
          Else
             If A = 12 Then
             P2.0 = 1
             Waitms 0.2
             A = A - 1
             Goto Zulauflicht2
             Else
                If A = 11 Then
                P1.7 = 1
                Waitms 0.2
                A = A - 1
                Goto Zulauflicht2
                Else
                    If A = 10 Then
                    P1.6 = 1
                    Waitms 0.2
                    A = A - 1
                    Goto Zulauflicht2
                    Else
                        If A = 9 Then
                        P1.5 = 1
                        Waitms 0.2
                        A = A - 1
                        Goto Zulauflicht2
                        Else
                          If A = 8 Then
                          P1.4 = 1
                          Waitms 0.2
                          A = A - 1
                          Goto Zulauflicht2
                          Else
                              If A = 7 Then
                              P1.3 = 1
                              Waitms 0.2
                              A = A - 1
                              Goto Zulauflicht2
                              Else
                                 If A = 6 Then
                                 P1.2 = 1
                                 Waitms 0.2
                                 A = A - 1
                                 Goto Zulauflicht2
                                 Else
                                    If A = 5 Then
                                    P1.1 = 1
                                    Waitms 0.2
                                    A = A - 1
                                    Goto Zulauflicht2
                                    Else
                                      If A = 4 Then
                                      P1.0 = 1
                                      Waitms 0.2
                                      A = A - 1
                                      Goto Zulauflicht2
                                      Else
                                         If A = 3 Then
                                         P0.7 = 1
                                         Waitms 0.2
                                         A = A - 1
                                         Goto Zulauflicht2
                                         Else
                                            If A = 2 Then
                                            P0.6 = 1
                                            Waitms 0.2
                                            A = A - 1
                                            Goto Zulauflicht2
                                            Else
                                            R1 = 0
    
                                            Merker1 = 0
                                           End If
                                        End If
                                     End If
                                  End If
                                End If
                              End If
                         End If
                      End If
                  End If
               End If
             End If
          End If
       End If
        End If
    Return
    End
    
    Auf_lauflicht2:
    If R2 = 0 Then
       Goto Main
       Else
       If D = 14 Then
       P3.7 = 1
       Waitms 0.2
       D = D - 1
       Goto Zulauflicht1
       Else
          If D = 13 Then
          P3.6 = 1
          Waitms 0.2
          D = D - 1
          Goto Zulauflicht1
          Else
             If D = 12 Then
             P3.5 = 1
             Waitms 0.2
             D = D - 1
             Goto Zulauflicht1
             Else
                If D = 11 Then
                P3.4 = 1
                Waitms 0.2
                D = D - 1
                Goto Zulauflicht1
                Else
                    If D = 10 Then
                    P3.3 = 1
                    Waitms 0.2
                    D = D - 1
                    Goto Zulauflicht1
                    Else
                        If D = 9 Then
                        P3.2 = 1
                        Waitms 0.2
                        D = D - 1
                        Goto Zulauflicht1
                        Else
                          If D = 8 Then
                          P3.1 = 1
                          Waitms 0.2
                          D = D - 1
                          Goto Zulauflicht1
                          Else
                              If D = 7 Then
                              P3.0 = 1
                              Waitms 0.2
                              D = D - 1
                              Goto Zulauflicht1
                              Else
                                 If D = 6 Then
                                 P2.7 = 1
                                 Waitms 0.2
                                 D = D - 1
                                 Goto Zulauflicht1
                                 Else
                                    If D = 5 Then
                                    P2.6 = 1
                                    Waitms 0.2
                                    D = D - 1
                                    Goto Zulauflicht1
                                    Else
                                      If D = 4 Then
                                      P2.5 = 1
                                      Waitms 0.2
                                      D = D - 1
                                      Goto Zulauflicht1
                                      Else
                                         If D = 3 Then
                                         P2.4 = 1
                                         Waitms 0.2
                                         D = D - 1
                                         Goto Zulauflicht1
                                         Else
                                            If D = 2 Then
                                            P2.3 = 1
                                            Waitms 0.2
                                            D = D - 1
                                            Goto Zulauflicht1
                                            Else
                                            R2 = 0
    
                                            Merker2 = 0
                                           End If
                                        End If
                                     End If
                                  End If
                                End If
                              End If
                         End If
                      End If
                  End If
               End If
             End If
          End If
       End If
        End If
    Return
    End
    EDIT: das heisst "CODE" und nicht "QUOTE" Picnick

    MFG Matthias

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    ganz schön krank dein code.
    Zu_lauflicht1:
    If L1 = 0 Then
    Goto Main
    mir ist Bascom fremd, aber wenn du mit gosub reingehst, musst du natürlich mit return wieder raus. sonst liegt die rücksprungadresse noch aufm stack und es gibt logischerweise recht schnell einen overflow.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2006
    Beiträge
    10
    Vielen Dank für die nette Antwort!!!

    Ich bin doch jedesmal mit return rausgegangen, oder ? Es ist mein erstes Programm.

    MFG
    Matthias

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    schon gut, war ja nicht bös gemeint
    ich muss gestehen, dass ich da nicht durchblicke, was du genau machst.
    aber die von mir zitierte stelle wird mit gosub aufgerufen, und springt (if(...)) mit goto zurück nach main. entweder das geschieht niemals, dann ist die stelle überflüssig, oder es geschieht eben doch, und der stack wird zunehmend voller.
    kurz gesagt, ich bin fast sicher, dass dein stacküberlauf an "vergessenen" rücksprungadressen liegt, die sich dort ansammeln.

    gruesse

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2006
    Beiträge
    10
    Hallo robocat,

    kannst du mir Bitte ein kleines Beispiel,an meinem Code geben, wie ich die Rücksprunge nach "Main" umschreiben muß, damit der Stack nicht überläuft?.

    MFG
    Matthias

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    unabgesehen von goto,gosub & Co ich habe den Code nur überflogen.

    Vermeige in sich verschaltete if
    end if
    end if
    end if
    & noch 20x

    Das bringt den zum Überlauf / & Stack erhöhen.

    Sieht grausam aus Dein Rattenschwanzcode

    Gento

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    22.08.2006
    Beiträge
    10
    Hallo,
    wie ich so lese ist mein Code wohl nicht so gut gelungen, ich kann mein Problem mit dem Stacküberlauf leider nicht lösen.
    Ich würde das Prgramm neu schreiben, aber ich weiß leider nicht, wie ich anders (als ich es bis jetzt programmiert habe) 2 etwa simultan laufende LED Lauflichter ansteuern kann.

    Zum Programm:
    Ich brauche 2 Taster (P0.0 und P0.3)
    Je Taster:
    1. mal tasten LEDs schalten sich nacheinander an und bleiben an.
    2. mal tasten LEDs schalten sich nacheinander aus und bleiben aus.

    Es muß sein das die LED Lauflichter gleichzeitig an/aus getastet werden oder zeitversetzt. Mein altes Programm hat diese Anforderungen erfühlt aber leider bekomme ich einen Stack überlauf.

    Kann mir jemand Helfen?

    MFG
    Matthias

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2006
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    321
    Ich habe auch keine Ahnung von Basic aber an Robocats Aussage is was dran. Geh deinen Code mal Stück für Stück durch und schau dir an, wie oft du an ein Return kommst und wie oft du stattdessen wieder mit goto nach Main springst.
    Wenn ich was wie ein Lauflicht wollte, dann würde ich wahrscheinlich eine 1 an den Port schreiben und die dann durchschieben, bis ich die 1 rausgeschoben hab und dann von vorn mit ner 1 anfangen. Wie das mit Basic geht, weiß ich nicht. Auf alle Fälle verstehe ich deinen Code nicht :/ Sorry... Kannst du die Funktion deines Programms nochmal in Worte fassen?
    Ein Lauflicht ist für mich einfach, dass eine LED immer an ist und diese dann weiterwandert, um am Ende wieder umzuspringen auf den Anfang...
    Deine Beschreibung mit den 2 Tastern kann ich mir nicht vorstellen... Kannst du das nochmal präzisieren?
    Ich brauche 2 Taster (P0.0 und P0.3)
    Je Taster:
    1. mal tasten LEDs schalten sich nacheinander an und bleiben an.
    2. mal tasten LEDs schalten sich nacheinander aus und bleiben aus.
    Also sobald man Taster 1 drückt, gehen alle LEDs an und bleiben das auch und bei Taster 2 gehen sie der Reihe nach wieder aus? Ist das richtig so?

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Vermeide goto's

    Zähle die nur Tastendrücke und Werte aus mit Case.

    Gento

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2006
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    321
    Soll pro Tastendruck eine weitere LED angehen und diese auch wieder durch Drücken des 2. Tasters abgezogen werden können?

    Wenn Taster 1 (LED hoch) gedrückt wird, dann kannst du ja einfach machen Portwert * 2 + 1
    Multiplikation mit 2 müsste die "1" genau um eine Stelle nach links verschieben und die 1 füllt die neu entstandene Lücke auf.
    wenn Taster 2 gedrückt wird, dann einfach Portwert / 2 und schon hat man ne Stelle weniger.
    Keine Garantie...
    [1=LED leuchtet, 0=LED aus]
    00000001 = 1
    00000011 = 3
    00000111 = 7
    00001111 = 15
    00011111 = 31
    00111111 = 63
    01111111 = 127
    11111111 = 255
    Also wenn du grad 5 LEDs anhast, dann hat dein Port den Wert 31. Dann drückt einer den Taster 2, also durch 2 teilen = 15.5 (da es kein Kommawert gibt, wird die 5 hinterm Komma weggeworfen und das Ergebnis ist 15, was genau den 4 angeschalteten LEDs entspricht.)
    Also musst du nur deinen Wert irgendwo in ner Variablen haben und bei Tasterdruck multiplizieren bzw. teilen und ihn dann an deinen Port zuweisen.

    EDIT: Das ist zwar nicht die Antwort auf deine Frage, wieso der Stack voll wird und wie man deinen Code verbessern könnte, damit das in Zukunft nicht mehr passiert aber ich versteh den Code absolut nicht (mach dir nix draus... Meine ersten Programme waren auch nie der Hammer und sind sie heute manchmal auch nicht...).

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress