-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Anfänger braucht Hilfe

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.02.2008
    Beiträge
    24

    Anfänger braucht Hilfe

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo an Alle erstmal, ich hätte eine Frage an die Speziallisten in diesem Forum. Zunächst zum Hintergrund. Ich habe einen quasi Software PWM zusammengebaut mit Bascom 8051 und auf einem AT89S8252 mit dem flashboard von Elektor laufen. Das Programm läuft auch sehr gut. Die Zeiten sind über Tasten einzustellen. Die Zeiten sind zum teil sehr lang. Z.B. Arbeitszeit 2 Min Pausenzeit 5 Min, können aber auch viel länger sein.
    Das Problem ist nun, daß das Programm irgendwann, meist erst nach Stunden , sporadisch stehenbleibt. Ich habe es schon mit watchdog probiert, ist aber nicht die richtige Lösung. Denn zum Beginn des Programms muß der User die Zeiten eingeben. Also geht das Programm nach einem reset in die Sub für die Eingabe der Zeiten.
    Nun die Frage. Ist es möglich nach einem watchdog reset eine bestimmte Stelle des Programms anzuspringen?
    Vorab schon vielen Dank für Eure Hilfe.
    Gruß, Harald

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Vielleicht gäbe es doch eine Watchdog-Lösung, wenn Du ein Bit als Flag benutzt, das nach erfolgter Eingabe der Zeiten auf 1 gesetzt wird. Dann müsstest Du zum Programmstart nur abfragen ob das Bit 1 ist und das Programm in diesem Fall an die gewünschte Stelle springen lassen, ansonsten geht´s zur Zeiteingabe weiter

    Aber dass das Programm stehenbleibt ist ja schon irgendwie merkwürdig. Gibt´s dafür denn eine plausible Ursache?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.02.2008
    Beiträge
    24
    Hallo erst mal,
    danke für Deine schnelle Antwort. Also ich habe das schon probiert indem ich eine If Anweisung an den Anfang des Programms gestellt habe. Falls verschiedene Variablen nicht -0- sind soll das Programm quasi dort hinspringen wo es unterbrochen hat. Allerdings ohne Erfolg.
    Das komische ist, ich habe das Programm nun längere Zeit beobachtet, dass das Programm immer an der gleichen Stelle stehenbleibt. Obwohl es sich um zwei gleiche Schleifen handelt bleibt es in der ersten hängen. Aber wie gesagt erst nach einiger Zeit. Ich habe mal den betreffenden Code als Textdatei angehängt. Störe Dich bitte nicht um diesen Spagetti code, ist alles noch im Aufbau.
    Nochmals Danke, dass Du Dir die Zeit nimmst.
    Gruß, Harald

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    21.02.2008
    Beiträge
    24
    Sorry, hab vergessen die Datei anzuhängen.
    Angehängte Dateien Angehängte Dateien

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    hmm.. das sieht aber nicht wie original Bascom aus. Oft steckt der Fehler in ganz blöden, klitzekleinen details - deshalb wäre es hilfreich, wenn Du den Code absolut 1:1 reinstellst, genau so wie Du ihn kompilieren lässt.

    Am besten geht das mit dem "Code"-Button (rechts neben der Horde Smilies), dann sieht das nämlich für alle so hübsch aus:

    Code:
    Code...
    Code...
    Code...
    Also - lass mal alles sehen, vielleicht findet sich ja dann des Lösels Rätsung

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    21.02.2008
    Beiträge
    24
    Hallo,
    wie meinst Du das. Den Code als bas Datei?
    Also es ist Code geschrieben in Bascom 8051 nicht Bascom AVR. Da gibt es einige kleine Unterschiede.
    Also wie gesagt beim Controller handelt es sich um einen 8051er Kern.
    Nochmals schau bitte nicht so genau auf die Struktur, wenn ich fertig bin bringe ich das Ganze in die richtige Form.
    Gruß, Harald
    Angehängte Dateien Angehängte Dateien

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    21.02.2008
    Beiträge
    24
    Ach sooo, so funktioniert das. Sorry ich mußte erst einmal ausprobieren wie das geht. Ich hoffe so ist es o.k.

    Code:
    'Tasten Aufwärts und Abwärts
    
    $regfile = "89s8252.dat"
    Config Lcd = 20 * 4
    $lcd = &H8000
    $lcdrs = &H8002
    '$Sim
    Cls Lcd
    Cursor Off Noblink
    
    
    
    
    Dim A As Integer                                              'Variable A = Arbeitszeit
    Dim E As Byte                                                 'Variable zum ein und ausschalten Hindergrundbeleuchtung, LED Anzeige und Relai
    Dim D As Byte                                                 'Varible D wird P1 für LED's
    Dim N As Integer                                              'Varible N = Counter
    Dim P As Integer                                              'Varible P = Pausenzeit
    Dim Ba As Integer                                             'Variable für Basis PWM
    Declare Sub Auf(a As Integer)
    Declare Sub Aufb(a As Integer)
    Config Watchdog = 2048
    
    E = 255
    P3 = E
    D = 255
    P1 = D
    A = 0
    
    
    
    If Ba > 0 And A > 0 Then Goto Ausgabe
    
    While 1 = 1
       While P1.4 = 0                                             '
             Call Aufb()
             Cls Lcd
             Locate 1 , 1
             Lcd "Basiszeit"
             Locate 1 , 12
             Lcd Ba
       Wend
    
       While P1.5 = 0                                             '
             Call Abb()
             Cls Lcd
             Locate 1 , 1
             Lcd "Basiszeit"
             Locate 1 , 12
             Lcd Ba
       Wend
    
       While P1.0 = 0                                             '
             Call Auf()
             Cls Lcd
             Locate 1 , 1
             Lcd "Arbeitszeit"
             Locate 1 , 13
             Lcd A
    
       Wend
    
       While P1.1 = 0                                             '
             Call Ab()
             Cls Lcd
             Locate 1 , 1
             Lcd "Arbeitszeit"
             Locate 1 , 13
             Lcd A
       Wend
          If P1.2 = 0 Then Gosub Ausgabe                          'Nach Eingabe der Zeiten springe zu Ausgabe
    Wend
    
    
    
    Ausgabe:
       For N = A Downto 1
             'Start Watchdog
          P3.0 = 0                                                'Einschalten der Anzeige LED
          P3.2 = 0                                                'Einschalten des Relais
             Stop Watchdog
          Wait 1                                                  'Warte eine Sekunde
             Start Watchdog
          Cls Lcd
          Locate 1 , 1
          Lcd "Sollarbeit"   'Also genau hier bleibt das Programm stehen. Der Text Sollarbeit wird noch angezeigt 
          Delay
          Locate 1 , 13
          Lcd A
          Locate 3 , 1
          Lcd "Arbeit"
          Locate 3 , 11
             'Reset Watchdog
          Lcd N
             If P1.3 = 0 Then Goto Abbruch                        ' Ist Taste an P1.3 gedrückt wird die Ausgabe abgebrochen
    
       Next N
    
          P = Ba - A                                              'Hier wird die Pausenzeit aus Basisizeit und Arbeitszeit gebildet
    
       For N = P Downto 1
             'Start Watchdog
          P3.0 = 1                                                'Ausschalten der Anzeige LED
          P3.2 = 1                                                'Ausschalten des Relais
             Stop Watchdog
          Wait 1
          Cls Lcd
          Locate 1 , 1
          Lcd "Sollpause"
          Locate 1 , 13
          Lcd P
          Locate 3 , 1
          Lcd "Pause"
          Locate 3 , 11
          Lcd N
             If P1.3 = 0 Then Goto Abbruch
       Next N
             If A <> 0 Then Gosub Ausgabe                         'Endlosschleife für Ausgabe zum verlassen muß die Taste P1.3 gedrückt werden                        '
    
    Return
    
    
    Sub Aufb()
    'If Ba = 600 Then Goto Fertigb
    'If Ba > A Then Goto Fertigb
       Incr Ba                                                    'Aufwärtszählen der Basiszeit
       Waitms 500
       P3.1 = 0
       Fertigb:
    End Sub
    
    Sub Abb()
    'If A = 0 Then Goto Endeb
       Decr Ba                                                    'Abwärtszählen der Basiszeit
       Waitms 500
    Endeb:
    End Sub
    
    
    Sub Auf()
    'If A > Ba Then Goto Fertig
       Incr A                                                     'Aufwärtszählen der Arbeitszeit
       Waitms 500
    Fertig:
    End Sub
    
    Sub Ab()
    If A = 0 Then Goto Ende                                       'Abbruchbedingung dass bis 0 und nicht bis minus abwärts gezählt wird
       Decr A                                                     'Abwärtszählen der Arbeitszeit
       Waitms 500
    Ende:
    End Sub
    
    
    Abbruch:
    Do
       Cls Lcd
       Locate 1 , 1
       Lcd "Abbruch"
       Wait 1
       Cls Lcd
       P3.0 = 1
       P3.1 = 1
       P3.2 = 1
    Loop Until P1.4 = 0
    Return
    Vieleicht kannst Du mir auch etwas feedback geben, ob ich mit dem programmieren auf der richtigen Spur bin. Das ist mein erstes Projekt in Bascom.
    Gruß, Harald
    Was ich noch vergessen habe, nicht stören an den auskommentierten Stellen, die sind noch zum testen. Auch den Watchdog habe ich normalerweise nicht aktiviert.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Also, mit 8051 und dem dazugehörigen Bascom kenne ich mich so gar nicht aus. Und mit Gosubs nur wenig, habe ich bisher praktisch nie benutzt. Ich habe mich aber auch bei weitem noch nicht durch alles durchgearbeitet, was Bascom zu bieten hat. Es gibt also noch viel zu entdecken

    Ich glaube aber, dass bei jedem Gosub neue Werte in den Stack geschrieben werden (man möge mich bitte verbessern, senn dem nicht so ist). Und das könnte Dein Problem sein, weil Du mit der Zeile

    Code:
    If A <> 0 Then Gosub Ausgabe
    aus der Gosub-Routine in die gleiche Routine springst, und dadurch ständig neue Daten in den Stack dazukommen, ohne dass die vorhergehenden abgearbeitet und gelöscht werden. Das soll irgendwann zum Stack-Overflow führen - und dann bleibt das Ding stehen.

    Probier´s doch mal mit ´nem GOTO...

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Ja, ich denke auch, dass die Zeile:
    If A <> 0 Then Gosub Ausgabe
    ... einen Stacküberlauf produziert.

    Auch die Zeile:
    If Ba > 0 And A > 0 Then Goto Ausgabe
    ... ist nicht ok.

    Regel:
    Ein Unterprogramm, das mit Return endet, darf nur mit Gosub aufgerufen werden. Der Gosub-Aufruf muss auch von außerhalb des Unterprogramms kommen.

    Gruß Dirk

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    21.02.2008
    Beiträge
    24
    hey
    es funzt, danke Mann. Deine Vermutung war absolut richtig. Jetzt funktioniert das Programm wunderbar. Habe es die ganze Nacht durchlaufen lassen.
    Jetzt kann ich endlich weitermachen.
    War wahrscheinlich ein absoluter Anfänger Fehler.
    Jetzt müßt Ihr mich nur noch aufklären, was steckt hinter den Mechanismen von Goto vs. Gosub. damit mir das nicht wieder passiert.
    In diesem Sinne also vielen Dank.
    Gruß, Harald

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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