- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 10

Thema: (gelöst) do loop - schleife instabil?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221

    (gelöst) do loop - schleife instabil?

    Anzeige

    Powerstation Test
    Hallo, erst mal die besten Neujahrswünsche an die Roboter-Gemeinde!!!

    Ich habe ein kleines problem mit einem Programm:

    eine spezielle abfolge von tasterbetätigungen soll einen port ein-und anschließend wieder schalten. Dann neu starten.

    (taster1, dann taster2, und während dieser gedrückt gehalten wird nochmal taster1)
    wenn die abfolge 2 mal falsch hintereinander erfolgt, dann soll das Programm stoppen.

    Eine LED gibt hierüber auskunft.

    das problem: das programm funktioniert anfänglich. wenn es aber längere Zeit auf „bereitschaft“ stehen soll (in der ersten do loop schleife), dann verselbständigt es sich. das äußert sich, indem z. B. nach langer Zeit (z.B. 20 stunden oder so) die LED aufleuchtet und das Programm somit gestoppt ist. oder eine richtige eingabe vom programm als falsch quittiert wird.

    es scheint, als würde der taster während der (loop)zeit eine (geisterhafte) betätigung erfahren...

    nach reset geht wieder alles einwandfrei, bis zur nächsten längeren wartezeit...

    was könnte die ursache für dieses phänomen sein?



    gruß

    Holger

    Code:
    $regfile = "m32def.dat"
    
    $crystal = 8000000                                          '=interner Quarz, 9000000 für externen Quarz
    
    $baud = 9600
    
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    
    
     Config Portb = Output
     Config Portd.2 = Output                                    'leds
     Config Portd.3 = Output
     Config Portd.4 = Output
     Config Portd.5 = Input
     Config Portd.6 = Input
     Config Porta = Input                                       'taster
    
      Porta.0 = 1
      Porta.2 = 1
    
     Dim A As Word
     Dim B As Word
    
    
    Program:
    
    Portb.1 = 0                                                 'Led
     Do
     Loop Until Pina.0 = 0 Or Pina.2 = 0
     If Pina.2 = 0 Then
     Portb.1 = 1
     Goto Abbruch
     Else
     End If
     Waitms 300
     Do
     Loop Until Pina.0 = 0 Or Pina.2 = 0
     If Pina.0 = 0 Then
     Portb.1 = 1
     Goto Abbruch
     Else
     End If
     Waitms 10
    
     Do
     Loop Until Pina.0 = 0 Or Pina.2 = 1
     If Pina.2 = 1 Then
     Portb.1 = 1
     Goto Abbruch
     Else
     End If
     Waitms 100
    
     Portb.0 = 1
     Waitms 1200                                                'relais an
     Portb.0 = 0
    
     A = 5
    
    Goto Program
    
     
    
    Abbruch:
    
    Wait A
    A = A + 5
    If A >= 15 Then
    Stop
    
    Else
    Goto Program
    
    End If
    
    End

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.11.2005
    Ort
    QTH: JO43BC
    Alter
    56
    Beiträge
    112
    Hallo,

    also ehrlich gesagt sieht das etwas nach ner "GOTO Spaghetti-Programmierung" aus. GOTO's sind irgendwie unschoen. Dafuer bietet Bascom wesentlich bessere Moeglichkeiten.
    Diesen Befehl habe ich bisher noch nie gebraucht. Bei umfangreichen Programmen kann man da schnell den Faden verlieren. Und wer weiss was der Controller dann fuer unerwartete Dinge macht.
    In jedem meiner Programme habe ich eine Haupt Do-Loop Schleife. Gleich dahinter das End. Und der Rest besteht aus Sub-Routinen, ISR, usw. Das funktioniert immer wunderbar. Und dieses Programm-Grundgeruest sieht man ueberall.
    Und hier in Deinem Falle laesst sich sicherlich einiges evt. mit nem GOSUB-RETURN loesen?

    Mit freundlichen Gruessen
    Digitali

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221
    Hallo,
    ich denke nicht dass mir gosub weiterhilft.
    das programm funktioniert ja eigentlich.
    zudem gibt es in diesem programm nur 2 gotos: einmal zu „abbruch“ und einmal zu „program“. das dürfte ja nicht besonders kompliziert sein.
    woran kann es liegen, dass das programm nicht über mehrere stunden stabil in der (ersten) do loop schleife bleibt?
    ich hab jetzt mal die taster komplett abgeklemmt, so dass tatsächlich keine eingabe (z.B. durch wackelkontakt o.ä. ) erfolgen kann. mal sehen, ob irgendwann die led aufleuchtet...

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich kann keinerlei Entprellung sehen. Dann ist der Eingang natürlich schon empfndlich auf irgendwelche Schnackler von aussen

    Mach doch einfach mal einen Sicherheitscheck:
    (meinethalben auch mit "pfui-gack" Goto, was soll's)
    Code:
    CK_1:
        Do 
        Loop Until Pina.0 = 0 Or Pina.2 = 0                    ' check, ob einer 0
        IF Pina.0 = 1 AND Pina.2 = 1 THEN GOTO CK_1   ' noch immer ?
    Man könnt' auch dazwischen noch einen Waitms 1 einfügen, das wär einer drauf.

    Bei jedem Test wenigstens 20 Stunden warten, ist natürlich schon verschärft, aber da fällt mir nix ein.
    Bist du bei einer Fehlfunktion gleich ausgesperrt und brauchst das THW ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221
    hi robert,
    nein, es ist fast noch schlimmer: ich komme jedesmal zu spät zur arbeit, weil ich das garagentor mit der hand öffnen muss!

    danke für deinen tipp, es könnte tatsächlich an der entprellung liegen.
    hab jetzt die taster schon 24 stunden abgeklemmt und bisher tut das programm nichts...keine led...
    o.k. das heißt ich könnte deinen sicherheitscheck am anfang inkl. des waitms einfügen. dann sollte es stabil sein!?!
    reicht 1 ms zur entprellung?
    ohne waitms ist doch bei deinem Vorschlag auch nichts entprellt, oder?

    gruß
    holger

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.11.2003
    Beiträge
    355
    Hi, zum entprellen finde ich den Befehl Debounce ganz praktisch. Ist zwar nicht die effizienteste Art zu entprellen, aber ich würde mal sagen, wennn dein Prog 1ms langsamer ist, und du deswegen zu spät kommst, musst du einen Wecker anschaffen, der dich 1ms ehr weckt

  7. #7

    Re: do loop - schleife instabil?

    Zitat Zitat von xxrider
    es scheint, als würde der taster während der (loop)zeit eine (geisterhafte) betätigung erfahren...
    Du kannst dir das mit einem Oszilloskop oder über die Soundkarte deines PCs anschauen, dann siehst du, was der µcontroller sieht. Es wird wahrscheinlich so sein, daß Betätigen des Tasters nicht zu einer sondern mehreren annähernd diskreten Übergängen zwischen H & L führt. Wenn du das erstmal gesehen hast, kannst du auch eine Softwareroutine drumrum schreiben bzw. kann man das auch analog lösen. Stichwort Entprellen.
    Wie Deutsche Werbung verstehen:
    Come in and find out (Douglas) = Komm rein und finde wieder heraus.
    Drive alive (Mitsubishi) = Fahre lebend.
    Powered by emotion = Kraft durch Freude.

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    WaitmS: DEr Bascom brauch schon einige Zyklen, bis er diese Checks alle gemacht hat, aber Waitms schad' auch nix.
    Der "Debounce" Befehl ist (glaub ich) nix für dich, weil du ja zwei Pins abfragen musst.
    Aber insgesamt bewirkt alles das gleiche: Man schaut, ob der Pin seinen Zustand länger beibehält, bevor man ihn ernst nimmt.

    Bei die geht's doch sehr um Betriebssicherheit und nicht um extra-schnelle Reaktion. Wenns unsere Vorschläge also nicht wirklich nutzen, machen wir dir eine mega-ober-spezielle-cool-Funktion, die wirklich wasserdicht ist,
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221
    hey cool!
    also ich hab erst mal deinen vorschag angenommen und das programm entsprechend angepasst (alle abfragen entprellt + 5 ms wartezeit).
    Jetzt wollen wir doch mal schauen ob ich montags pünktlich zur arbeit komme!
    ansonsten hab ich ja immer noch euch - herzlichen dank - ich werde berichten und bin jetzt schon zuversichtlich
    Holger

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221
    Also, alles klar, esfunktioniert jetzt und zwar stabil!
    Lag also tatsächlich am entprellen.
    Danke nochmal,
    Holger

Berechtigungen

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

12V Akku bauen