-
        

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

Thema: [gelöst] debounce und inputbin laufen nicht zusammen ???

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2004
    Beiträge
    101

    [gelöst] debounce und inputbin laufen nicht zusammen ???

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,

    Ich habe ein funktionierendes Programm(Platine 1), wo ich in der Hauptschleife meine Taster per Debounce abfrage.
    Das läuft auch alles.

    Jetzt schicke ich von einem anderen AVR(Platine 2)eine Variable über Printbin und empfange die auf Platine 1 mit Inputbin.
    Auch das läuft gut und ich kann die veränderte Variable wieder an Platine 2 schicken.

    Wenn ich aber nun die Debounce Befehle und Inputbin in meiner Platine 1 beide zusammen in die Hauptschleife einbinde, dann laufen alle debounce Befehle nicht mehr. Die Verbindung über Printbin/Inputbin läuft aber

    Woran kann das liegen ???

    Gruß
    Papsi

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2004
    Beiträge
    101
    Habe da noch was rausgefunden:

    In meiner Hauptschleife der Platine 1 sieht es ungefähr so aus:

    Code:
    ...
    Start:
    Do
        Toggle Led1                                   ' Testweise
        Inputbin #1 , A
        If A = 10 Then Goto XYZ
    ...
    mehrere Debounche Abfragen
    ...
    mehrere If then Abfragen
    Loop
    ...
    XYZ:
    Mache was
    Goto Start
    Wenn ich das Programm starte, dann wird die Led1 auch eingeschaltet und dann bleibt der bei Inputbin stehen und wartet, bis da was kommt.

    Der soll aber weiterlaufen in seiner Hauptschleife und das macht er nicht.
    Wenn ich jetzt was sende und mittels Inputbin was empfangen hat, dann springt er zu XYZ und danach wieder zu Start, dann wird die Led1 getogglet und dann bleibt der wieder bei Inputbin stehen.

    Wie kann ich das ändern, das der dort nicht stehen bleibt ???

    Gruß
    Papsi

    PS
    www.ab-ins-bett.de

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    43
    Beiträge
    377
    Zitat Zitat von Papsi
    Der soll aber weiterlaufen in seiner Hauptschleife und das macht er nicht.
    Hallo Papsi!

    Prüfe vorher mit ISCHARWAITING ob ein Zeichen anliegt. Wenn nicht, dann führst du INPUTBIN nicht aus. So wird die Schleife nicht unterbrochen.

    mfg
    Gerold
    :-)

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2004
    Beiträge
    101
    Kannst Du mir mit einem Codeschnippsel mal weiterhelfen ?

    Bekomme es irgendwie nicht hin...

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    43
    Beiträge
    377
    Hall Papsi!

    http://avrhelp.mcselec.com/index.html?ischarwaiting.htm

    Statt WAITKEY kannst du dein INPUTBIN verwenden. Und bei ISCHARWAITING musst du als Parameter ``#1`` übergeben.

    mfg
    Gerold

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    43
    Beiträge
    377
    Hallo Papsi!

    Mehr Beispiele und Erklärungen findest du hier:
    http://avrhelp.mcselec.com/index.html?uart.htm

    mfg
    Gerold
    :-)

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2004
    Beiträge
    101
    Hallo,

    ich habe jetzt fast 2 Tage probiert - aber - es will einfach nicht so laufen wie ich will.

    Kann man das nicht noch anders lösen?

    Ich habe jetzt so viele Varianten probiert und mal gehen zum Anfang nur die Debounce und dann einmal die Inputbin und danach dann wieder die Debounce nicht.

    Komme nicht weiter...

    ???

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    43
    Beiträge
    377
    Hallo Papsi!

    Zeige mal deinen Testcode den du schon hast. Nicht nur einen Ausschnitt davon.

    mfg
    Gerold

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo,
    stelle doch mal dein Programm ein, dann ist es viel einfacher, dir zu helfen.
    Deine Aufgabe ist etwas umfangreich, als das dir einer das ganze Programm schreibt.
    Wenn du beim Senden mit einem bestimmten Zeichen endest, welches sonst nicht vorkommt, dann kannst du dir den Empfang dieses Zeichens auch über einen Interrupt anzeigen lassen (CONFIG SERIALIN BYTEMATCH). Dann ist die Auswertung sehr simpel. Geht aber meistens nur, wenn du Strings sendest, weil dann die ASCII Zeichen unter 32 normalerweise nicht vorkommen.
    Ohne Ende-Zeichen hast du auch das Problem zu erkennen, wann Schluss ist mit der Übertragung, oder schickst du immer eine feste Anzahl Bytes?

    Gruß

    Rolf

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2004
    Beiträge
    101
    Hallo,

    Soll ich wirklich den ganzen Code posten?
    Sind fast 700 Programmzeilen.
    (Habe einen Teil gelöscht, da ich über die Max Zeichengröße des Betrages gekommen bin.)

    Hier die Empfängerplatine:
    Code:
    $regfile = "m16def.dat"
       $crystal = 8000000
    
       Config Porta = Input
       Config Portb = Input
       Config Portc = Output
       Config Portd = Input
    
       Dim Timer As Word
       Timer = 55800
       Config Timer1 = Timer , Prescale = 1024
       Enable Timer1
       On Timer1 Sekundentakt
       Enable Interrupts
       Timer1 = Timer
    
       Tasterx1hoch Alias Pina.6
       Tasterx1runter Alias Pina.5
       Tasterx2hoch Alias Pina.2
       Tasterx2runter Alias Pina.1
       Tasterx3hoch Alias Pind.5
       Tasterx3runter Alias Pind.4
       Tasterx4hoch Alias Pind.1
       Tasterx4runter Alias Pind.0
       Tasteralleshoch Alias Pind.7
       Tasterallesrunter Alias Pina.7
    
       Relaisx1hoch Alias Portc.4
       Relaisx1runter Alias Portc.3
       Relaisx2hoch Alias Portc.5
       Relaisx2runter Alias Portc.2
       Relaisx3hoch Alias Portc.6
       Relaisx3runter Alias Portc.1
       Relaisx4hoch Alias Portc.7
       Relaisx4runter Alias Portc.0
    
       Eingang1 Alias Pinb.0
       Eingang2 Alias Pinb.1
       Eingang3 Alias Pinb.2
       Eingang4 Alias Pinb.3
       Eingang5 Alias Pinb.4
       Eingang6 Alias Pinb.5
       Eingang7 Alias Pinb.6
       Eingang8 Alias Pinb.7
    
       Dim X1hoch As Word
       Dim X2hoch As Word
       Dim X3hoch As Word
       Dim X4hoch As Word
    
       Dim X11hoch As Word
       Dim X21hoch As Word
       Dim X31hoch As Word
       Dim X41hoch As Word
    
       Dim X13hoch As Bit
       Dim X23hoch As Bit
       Dim X33hoch As Bit
       Dim X43hoch As Bit
    
       Dim X13runter As Bit
       Dim X23runter As Bit
       Dim X33runter As Bit
       Dim X43runter As Bit
    
       Dim X1runter As Word
       Dim X2runter As Word
       Dim X3runter As Word
       Dim X4runter As Word
    
       Dim X11runter As Word
       Dim X21runter As Word
       Dim X31runter As Word
       Dim X41runter As Word
    
       Dim Zeitx1hoch As Byte
       Dim Zeitx1runter As Byte
       Dim Zeitx2hoch As Byte
       Dim Zeitx2runter As Byte
       Dim Zeitx3hoch As Byte
       Dim Zeitx3runter As Byte
       Dim Zeitx4hoch As Byte
       Dim Zeitx4runter As Byte
    
       Dim Alleshoch As Bit
       Dim Allesrunter As Bit
    
       Dim X1ganzhoch As Bit
       Dim X1ganzrunter As Bit
       Dim X2ganzhoch As Bit
       Dim X2ganzrunter As Bit
       Dim X3ganzhoch As Bit
       Dim X3ganzrunter As Bit
       Dim X4ganzhoch As Bit
       Dim X4ganzrunter As Bit
    
       Dim A As Byte
    
       Relaisx1hoch = 0                               'Relais X1 hoch aus
       Relaisx1runter = 0                             'Relais X1 runter aus
       Relaisx2hoch = 0                               'Relais X2 hoch aus
       Relaisx2runter = 0                             'Relais X2 runter aus
       Relaisx3hoch = 0                               'Relais X3 hoch aus
       Relaisx3runter = 0                             'Relais X3 runter aus
       Relaisx4hoch = 0                               'Relais X4 hoch aus
       Relaisx4runter = 0                             'Relais X4 runter aus
    
       Zeitx1hoch = 10                                'wielange soll X1 hoch an bleiben
       Zeitx1runter = 10                              'wielange soll X1 runter an bleiben
       Zeitx2hoch = 10                                'wielange soll X2 hoch an bleiben
       Zeitx2runter = 10                              'wielange soll X2 runter an bleiben
       Zeitx3hoch = 10                                'wielange soll X3 hoch an bleiben
       Zeitx3runter = 10                              'wielange soll X3 runter an bleiben
       Zeitx4hoch = 10                                'wielange soll X4 hoch an bleiben
       Zeitx4runter = 10                              'wielange soll X4 runter an bleiben
    
       X1hoch = 2
       X2hoch = 2
       X3hoch = 2
       X4hoch = 2
    
       X11hoch = 1
       X21hoch = 1
       X31hoch = 1
       X41hoch = 1
    
       X13hoch = 0
       X23hoch = 0
       X33hoch = 0
       X43hoch = 0
    
       X1runter = 2
       X2runter = 2
       X3runter = 2
       X4runter = 2
    
       X11runter = 1
       X21runter = 1
       X31runter = 1
       X41runter = 1
    
       X13runter = 0
       X23runter = 0
       X33runter = 0
       X43runter = 0
    
       Alleshoch = 0
       Allesrunter = 0
    
       X1ganzhoch = 0
       X1ganzrunter = 0
       X2ganzhoch = 0
       X2ganzrunter = 0
       X3ganzhoch = 0
       X3ganzrunter = 0
       X4ganzhoch = 0
       X4ganzrunter = 0
    
    '-------------------------------------------------------------------------------
    '    S T A R T    H A U P T P R O G R A M M
    '-------------------------------------------------------------------------------
    Start:
    Do
       
    '-------------------------------
    '   I N P U T B I N T E S T
    '-------------------------------
        Toggle Led1                                   ' Testweise
        Inputbin #1 , A
        If A = 10 Then Goto XYZ 
    
       If Relaisx1hoch = 0 And Relaisx2hoch = 0 And Relaisx3hoch = 0 And Relaisx4hoch = 0 Then
          Alleshoch = 0
          X13hoch = 0
          X23hoch = 0
          X33hoch = 0
          X43hoch = 0
       End If
    
       If Relaisx1runter = 0 And Relaisx2runter = 0 And Relaisx3runter = 0 And Relaisx4runter = 0 Then
          Allesrunter = 0
          X13runter = 0
          X23runter = 0
          X33runter = 0
          X43runter = 0
       End If
    
       Debounce Tasterx1hoch , 0 , X1hoch , Sub       'Tasterabfrage
       Debounce Tasterx1runter , 0 , X1runter , Sub
       Debounce Tasterx2hoch , 0 , X2hoch , Sub
       Debounce Tasterx2runter , 0 , X2runter , Sub
       Debounce Tasterx3hoch , 0 , X3hoch , Sub
       Debounce Tasterx3runter , 0 , X3runter , Sub
       Debounce Tasterx4hoch , 0 , X4hoch , Sub
       Debounce Tasterx4runter , 0 , X4runter , Sub
       Debounce Tasteralleshoch , 0 , Alleshoch , Sub
       Debounce Tasterallesrunter , 0 , Allesrunter , Sub
    
    
       If X1hoch = X11hoch Then                       'Relais aus, wenn Zeit um
          Relaisx1hoch = 0
          X11hoch = 1
          X1ganzhoch = 1
       End If
    
       If X2hoch = X21hoch Then                       'Relais aus, wenn Zeit um
          Relaisx2hoch = 0
          X21hoch = 1
          X2ganzhoch = 1
       End If
    
       If X3hoch = X31hoch Then                       'Relais aus, wenn Zeit um
          Relaisx3hoch = 0
          X31hoch = 1
          X3ganzhoch = 1
       End If
    
       If X4hoch = X41hoch Then                       'Relais aus, wenn Zeit um
          Relaisx4hoch = 0
          X41hoch = 1
          X4ganzhoch = 1
       End If
    
       If X1runter = X11runter Then                   'Relais aus, wenn Zeit um
          Relaisx1runter = 0
          X11runter = 1
          X1ganzrunter = 1
       End If
    
       If X2runter = X21runter Then                   'Relais aus, wenn Zeit um
          Relaisx2runter = 0
          X21runter = 1
          X2ganzrunter = 1
       End If
    
       If X3runter = X31runter Then                   'Relais aus, wenn Zeit um
          Relaisx3runter = 0
          X31runter = 1
          X3ganzrunter = 1
       End If
    
       If X4runter = X41runter Then                   'Relais aus, wenn Zeit um
          Relaisx4runter = 0
          X41runter = 1
          X4ganzrunter = 1
       End If
    
    Loop
    
    '-------------------------------------------------------------------------------
    '    K L E M M E    X 1
    '-------------------------------------------------------------------------------
    X1hoch:
       If Alleshoch = 1 And X13hoch = 1 Then Goto Weiterx1hoch
       If Relaisx1hoch = 1 And Alleshoch = 1 Then Goto X2hoch       'Relais bleibt an, wenn alles hoch gedrückt wird
    
    Weiterx1hoch:
       If Relaisx1runter = 1 Then                     'Relais aus, wenn gegenüberliegende gedrückt wird
          Relaisx1runter = 0
          X13runter = 1
          X11runter = 1
          Goto Start
       End If
    
       If Relaisx1hoch = 1 Then                       'Relais aus, wenn wiederholt gedrückt wird
          Relaisx1hoch = 0
          X11hoch = 1
          Goto Start
       End If
    
       If X1ganzhoch = 1 And Alleshoch = 1 Then Goto X2hoch
    
       If X1ganzhoch = 1 Then Goto X1runter
    
       Relaisx1hoch = 1                               'Relais X1 Hoch zieht an
       X1ganzrunter = 0
       X11hoch = X1hoch + Zeitx1hoch                  'Laufzeitermittlung
       If X11hoch > 65000 Then                        'Überlaufsperre
          X1hoch = 1                                  'Überlaufsperre
          X11hoch = Zeitx1hoch                        'Überlaufsperre
       End If
    
       If X13hoch = 1 Then Goto Start
    
       If Alleshoch = 1 Then
          Waitms 200
          Goto X2hoch
       End If
    
       Goto Start
    
    X1runter:
       If Allesrunter = 1 And X13runter = 1 Then Goto Weiterx1runter
       If Relaisx1runter = 1 And Allesrunter = 1 Then Goto X2runter       'Relais bleibt an, wenn alles hoch gedrückt wird
    
    Weiterx1runter:
       If Relaisx1hoch = 1 Then                       'Relais aus, wenn gegenüberliegende gedrückt wird
          Relaisx1hoch = 0
          X13hoch = 1
          X11hoch = 1
          Goto Start
       End If
    
       If Relaisx1runter = 1 Then                     'Relais aus, wenn wiederholt gedrückt wird
          Relaisx1runter = 0
          X11runter = 1
          Goto Start
       End If
    
       If X1ganzrunter = 1 And Allesrunter = 1 Then Goto X2runter
    
       If X1ganzrunter = 1 Then Goto X1hoch
    
       Relaisx1runter = 1                             'Relais X1 Runter zieht an
       X1ganzhoch = 0
       X11runter = X1runter + Zeitx1runter            'Laufzeitermittlung
       If X11runter > 65000 Then                      'Überlaufsperre
          X1runter = 1                                'Überlaufsperre
          X11runter = Zeitx1runter                    'Überlaufsperre
       End If
    
       If X13runter = 1 Then Goto Start
    
       If Allesrunter = 1 Then
          Waitms 200
          Goto X2runter
       End If
    
       Goto Start
    Sekundentakt:
       Timer1 = Timer
    
       Incr X1hoch
       Incr X2hoch
       Incr X3hoch
       Incr X4hoch
    
       Incr X1runter
       Incr X2runter
       Incr X3runter
       Incr X4runter
    
       If X1hoch = 65000 Then X1hoch = 1
       If X2hoch = 65000 Then X2hoch = 1
       If X3hoch = 65000 Then X3hoch = 1
       If X4hoch = 65000 Then X4hoch = 1
    
       If X1runter = 65000 Then X1runter = 1
       If X2runter = 65000 Then X2runter = 1
       If X3runter = 65000 Then X3runter = 1
       If X4runter = 65000 Then X4runter = 1
    
       Return
    Den Programmcode der Senderplatine habe ich noch nicht fertig.
    Hier mal der Anfang zum testen:
    Code:
    $regfile = "m16def.dat"
    $crystal = 8000000
    
    Dim A As Byte
    
    A = 1
    
       Config Pind.6 = Output
       Config Pind.5 = Input
    
    Open "COMA.7:2400,8,N,1,inverted" For Output As #1       ' PA.7 ist Sender
    Open "COMC.6:2400,8,N,1,inverted" For Output As #2       ' PC.6 ist Sender
    
    Start:
    Do
      If Pind.5 = 0 Then Goto Senden
    Loop
    
    Senden:
       Set Portd.6
       Waitms 500
       Reset Portd.6
       A = 10
      Printbin #1 , A
    Goto Start
    Wenn ich also auf der Senderplatine den Pind.5 setze, dann sendet er mir die Variable A mit 10 an die Empfängerplatine.
    Und wenn die 10 empfangen worden ist, dann soll sie nach XYZ springen.

    Das klappt auch alles schp
    öm, nur wie beschrieben, der bleibt immer bei Inputbin hängen und ignoriert den Rest.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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