-
        

Ergebnis 1 bis 9 von 9

Thema: Wartezeit nach PWM-Eingabe - brauche Hilfe

  1. #1

    Wartezeit nach PWM-Eingabe - brauche Hilfe

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo. Ich habe das folgende Problem und komme nicht weiter:

    Ich möchte einen RC-Kanal mittels Controller (ATMega einlesen und anschließend mit jedem Druck auf eine Fernsteuerungstaste einen Zähler um 1 erhöhen.
    Das Problem ist, dass der Controller jedes Low-Signal als Grund dafür anerkennt, mit dem nächsten High erneut den Zähler zu erhöhen. Das soll so aber nicht sein. Versuche, Wartezeiten mit Wait einzubauen, waren weniger die Lösung zum Erfolg.
    Wenn ich die Taste drücke, dann soll der Zähler einmalig um den Wert 1 erhöht werden, solange die Taste gedrückt wird. Erst beim Loslassen der Taste soll der Low-Pegel als Solcher erkannt werden, sodass beim nächsten Tastendruck der Zähler erneut um den Wert 1 erhöht werden kann.

    Hat jemand von euch einen Vorschlag oder gibt es irgendwo Beispiele, an denen ich mich orientieren kann?

    Hab auch schon versucht, eine Art "Sicherheitsvariable" einzubauen, die beim Drücken immer weiter zählt und erst beim Loslassen wieder auf Null fällt, aber der Zählvorgang ist so schnell, dass selbst eine als String deklarierte Variable noch immer die LED's lustig flackern lässt.

    Ich hoffe und zähle auf euch.


    LG - Maik

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo Maik,

    Nun, sehr gute Taster prellen so 2-3ms, praktisch muss man mit 5-10ms rechnen und manche Schaltertypen, wie z.B. Schiebeschalter, prellen so lange sie bewegt werden.
    Hinzu kommt, dass die Prellzeit mit dem Alter zu nimmt.
    Die Prellzeit hat man vor allem beim Schliessen des Kontakts, beim Öffnen ist sie meistens sehr kurz.

    Du musst das Ganze mikroskopisch betrachten:
    Die Oberfläche eines Kontakts sieht dann aus wie eine Alpenlandschaft.

    Bei einem Schiebekontakt werden die Kontaktflächen gegeneinander verschoben, das hüpft dann durch die sich verhakenden Alpen, also dauernde Erdbeben. Entsprechend hast du mal kontakt und mal nicht.

    Bei den meisten anderen Kontakten werden diese über ein Feder aufeinander gedrückt, unter diese Kontakte fallen auch die meisten Relais. Der Kontakt hüpft dann wie ein Ball auf dem Anderen.

    Die Elektronik ist nun halt so schnell, dass sie jeden Hüpfer als einzelne Betätigung erkennt.

    Also zuerst solltest du wissen, was für Kontakte dein Taster hat. Normalerweise ist die Prellzeit im Datenblatt angegeben.

    damit die Abfrage funktioniert, braucht man zwei Trick:
    1. Du brauchst eine Hilfsvariable, welche den Zustand der Taste zwischenspeichert.
    Nach dem Einlesen der Taste vergleichst du den Wert mit der Hilfsvariablen. Ist der Wert identisch hat sich nichts an der Taste geändert.
    Sind die Werte ungleich, wurde die Taste verändert. Am aktuellen Wert kannst du erkennen ob sie gedrückt oder losgelassen wurde.
    Dann speicherst du den aktuellen Zustand in der Hilfsvariablen,

    2. Wenn sich die Taste verändert hat, wartest du 10-20ms bevor du die nächste Abfrage machst. Länger als 50-100ms solltest du die Zeit nicht machen, da gehen schon einzelne Tastendrücke verloren, wenn jemand nur kurz die Taste drückt. Wer fflink ist, bekommt schon 20 Betätigungen pro Sekunde hin.
    Anstatt zu warten, kann man die Taste auch in einem Interrupt z.B. alle 20ms abfragen.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #3
    Danke sehr für deine Antwort.

    Die Abfrage per Interrupt klingt interessant, auch wenn ich da momentan noch keinen wirklichen Plan habe, wie das geht. So weit bin ich noch nicht...

    Ich kann nicnt sagen, ob es an der mangelnden Entprellung liegt.
    Das Programm hatte ich mit Hilfsvariablen aufgebaut, verbunden mit einer Wartezeit von 1,5 Sekunden nach jedem Tastendruck, als Prellzeit hätte das locker reichen müssen.

    Im Programm sah es dann jedoch so aus, dass beim Hochzählen nach dem ersten Tastendruck beide Ausgänge nacheinander einschalteten, als hätte ich 2mal gedrückt. Beim nächsten Tastendruck wurde dann jedoch, wie gewollt, auf Null zurück gesprungen - also beide Ausgänge aus. Manchmal passierte aber auch gar nichts, und die Ausgänge blieben an, sooft man auch den Taster betätigte, als wäre das Programm zeitweise stehengeblieben. Auf dem Testboard hatte ich statt des Tasters einen Servotester angeschlossen - mit dem ging es jedoch einwandfrei.

    Nutze übrigens den Befehl Pulsein, vielleicht liegt es daran...


    LG - Maik

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    ich komme bei deiner Beschreibung leider noch nicht so ganz mit, könntest du eventuell mal ein paar fetzen deines Machwerks präsentieren ?

    ich komme gerade noch nicht ganz darauf klar wie du das PWM Signal auswertest, PulseIn ist schonmal grundsätzlich ein guter Gedanke, aber wie wertest du ihn aus ?
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Hallo,

    den Code habe ich nur daheim, nicht auf meinem Tablet (bin Unterwegs und habe grad Frühschluck ).

    Ich kann so viel sagen, dass ich alles in der Mainloop schreibe, ohne Unterprogramme.
    Zu Beginn habe ich es so festgelegt, dass der Controller mit dem Programm nur dann fortfährt, wenn der Pulsein-Wert >85 liegt.
    Danach soll ein Flag gesetzt werden, wenn der PulseIn-Wert kleiner 110 ist (relativ nahe am Anschlag) und das Flag zurückgesetzt, bei einem Wert größer 115, um eine Hysterese zu schaffen. Dazwischen ist Totraum.

    Im weiteren wird das Flag abgefragt und soll mit jedem Setzen auf 1 den Zähler einer Select-Case um 1 erhöhen.
    Bei 0 sind alle Ausgänge 0. Bei 1 Ausgang B.1 auf 1, bei 2 Ausgang B.2 auf 1 und bei 3 der Zähler wieder auf 0.


    Habe verschiedenste Sachen probiert. übergabe in eine weitere Variable, Toggeln der Flag, Weglassen des Flag-Rücksetzbefehls, Flag-Pufferwartezeit nach dem Setzen (100-300ms, allerdings erfolgt die Reaktion erst nach Ablauf der Pufferzeit), Wartezeiten von 1-2 Sek zeitgleich bei Setzen der entsprechenden Ports.

    Könnt ihr damit vielleicht etwas anfangen?

    Jetzt fällt mir ein, dass das Programm selbst mit dem Servotester nur passabel lief. Wenn das Flag gesetzt wurde, wurde es auch gleich wieder zurück gesetzt. Ohne Wartezeit blinkten die Led also sehr schnell, mit irgendwas um die 20Hz.

    Meine Suche nach Bascom-Programmen für einen RC-Memory-Schalter waren bislang nicht das, was ich mir vorstelle und alle ohne Pulsein-Befehl aufgebaut.



    LG - Maik

    - - - Aktualisiert - - -

    Könnte es vielleicht daran liegen, dass ich keinen konkreten Wertebereich mit Anfangs- und Endwert bei der Messung der Flankenwechsel eingetragen habe? Ich sage dem Controller ja bisher, er soll bei einem Wert ab 85 erst mit der Messung beginnen und lediglich bei einem Wert kleiner 110 das Flag setzen. Kann es sein, dass ich ihm sagen muss, dass er das Flag nur bei Werten zwischen 85 und 110 setzt oder wäre das nur doppelt-gemoppelt?


    LG - Maik
    Geändert von stardust19322 (17.08.2016 um 09:37 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    Dein FEhler liegt in deiner Interpretationslogik, 20Hz ist (ungefähr) die PWM Frequenz!
    Die Pulse werden ja zyklisch weiderholt, nur die Pulsbreite verändert sich.

    Logisch wäre also eine Interpretation nach dem Muster:
    if (IN_OLD==LOW) && (TIME > 115) -> IN_NEW=HIGH
    else if (IN_OLD==HIGH) && (TIME < 85) -> IN_NEW=LOW //für die Hysterese
    if (IN_OLD==HIGH) && (IN_NEW==LOW) -> COUNT++
    IN_OLD=IN_NEW

    unter der annahme 85 ist dein pegel ab dem LOW erkannt werden soll und 115 dein Pegel ab dem High erkannt werden soll

    das könnte man natürlich auch noch etwas zusammenfassen und 1 variable und 1 if sparen, aber so ist es übersichtlicher
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    Hallo und danke dir sehr für deine Antwort.

    Jetzt muss ich aber gleich mal fragen: Ist das, was du mir geschrieben hast, ein Bascom-Code oder eine Schematik?
    Als Code kenne ich das so noch nicht.

    In etwa kann ich mir das jedoch vorstellen - probiere es heute Abend gleich aus.


    LG - Maik

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    Pseudo Code
    ich tu mich schwer immer gleich in fertigem Quellcode zu tippen, das fühlt sich dann immer so nach vorkauen an

    daher auch meine kleine vorfrage zu existierendem code ... wäre da sowas wie "hab noch garnix gemacht" bekommen hätt ich wohl weniger ausführlich geholfen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  9. #9
    - das ist auch gut so, man soll sich ja auch ein wenig anstrengen ^^.

    Da ich nun Feierabend habe und endlich Daheim bin, hier der Code - hoffe, es ist nicht zu unübersichtlich...

    --------------------------------------------------------------------------------
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 32
    $framesize = 60
    $baud = 9600


    'Konfiguriere Ports
    Config Portb = Output
    Config Portc = Input

    'Portb.3 = 1 'optional
    'Portb.4 = 1 'optional
    'Portb.5 = 1 'optional
    'Portb.0 = 1 'optional
    Portb.1 = 1
    Portb.2 = 1


    'Umbenennen der Eingänge
    'Taster1 Alias Pinc.0 '### Optional ###
    'Taster2 Alias Pinc.1 '### Optional ###


    'Umbenennen der Ausgänge

    Unterwasser Alias Portb.1
    Beleuchtung Alias Portb.2
    'Kabine Alias Portb.3 '### Optional ###


    'Variablendeklaration
    Dim Kanal3 As Byte 'Verdrahtet zu PinC.2
    Dim Zaehler As Byte
    Dim Flag As Bit





    '_________________________________________________ ______________________________

    ' *************************************
    ' ***** Hauptprogramm *****
    '*******************************************

    Do


    Pulsein Kanal3 , Pinc , 2 , 1 'Signallänge an PWM-Eingang stetig abfragen
    If Kanal3 > 85 Then
    If Kanal3 < 110 Then
    Set Flag
    Elseif Kanal3 > 112 Then
    Reset Flag
    End If

    If Flag = 1 Then
    Incr Zaehler : Waitms 500
    End If

    Select Case Zaehler
    Case 0 : Beleuchtung = 0 : Unterwasser = 0
    Case 1 : Beleuchtung = 1 : Waitms 1000
    Case 2 : Unterwasser = 1 : Waitms 1000
    Case 3 : Zaehler = 0 : Waitms 1000
    End Select




    End If


    Loop

    End

    - - - Aktualisiert - - -

    Hallo Freunde,

    habe ein wenig am Programm gebastelt und es würde definitiv funktionieren, wenn, ja wenn da nicht meine Fernsteuerung wäre, die mir einen gaaaanz klitzekleinen Strich durch die Rechnung macht

    Das Problem ist nämlich, dass der 3te Kanal an meiner Fernsteuerung bereits ein reiner Schaltkanal ist. Demzufolge bräuchte ich im Grunde keinen Zähler, würde ich nur einen Ausgang schalten wollen.
    Nun ist es jedoch so, dass bei EINMALIGEM Drücken des Tasters der Ausgang auf High gesetzt wird und so auch verbleibt. Erst bei erneutem Drücken des Tasters wird der Ausgang auf Low-Pegel gesetzt.
    Wie ihr unten seht, habe ich mir den Rat zu Herzen genommen und ein wenig gebastelt. Allerdings bleiben auch hier gesetzte Flags nicht stehen, sondern fluktuieren, wenngleich auch nicht mehr mit der Geschwindigkeit wie bei meinem ersten Programmversuch.
    Bedeutet, dass der zu setzende Zähler noch immer einfach weiter läuft, solange die Bedingung erfüllt wurde, warum auch immer das so ist.

    Wie das jetzt jedoch gehen soll, weiß ich beim besten Willen nicht - das ist so weit von meinen Basics entfernt, dass ich momentan mit diesem kleinen Schritt in die richtige Richtung eher zufrieden bin als mich gefrustet an weitere Versuche zu setzen. Zumindest heute nicht .
    Werde aber definitiv dran bleiben, den Code sprichwörtlich zu "knacken".

    Vorab jedoch eine Frage: Kann ich das Basis-Programm als Solches dafür nutzen oder muss ich ein neues Prog mit einem entsprechend konfigurierten Timer schreiben?
    Timer mögen bei mir immer nicht so ganz. Sobald das Prog ein wenig voller wird, setzen die Timer aus, geraten aus der Phase und die Interrupt-Zeiten spielen komplett verrückt. Da hilft dann alles rechnen nichts mehr.


    Danke sehr für die Hilfe. Wenn ihr noch was wisst - ich freue mich sehr darüber, wenn ihr mir den Weg weist.




    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 32
    $framesize = 60
    $baud = 9600


    'Konfiguriere Ports
    Config Portb = Output
    Config Portc = Input

    'Portb.3 = 1 'optional
    'Portb.4 = 1 'optional
    'Portb.5 = 1 'optional
    'Portb.0 = 1 'optional

    Portb = &B11111111

    'Umbenennen der Eingänge
    'Taster1 Alias Pinc.0 '### Optional ###
    'Taster2 Alias Pinc.1 '### Optional ###


    'Umbenennen der Ausgänge

    Underwater Alias Portb.1
    Lights Alias Portb.2
    'Kabine Alias Portb.3 '### Optional ###


    'Variablendeklaration
    Dim Channel3 As Byte 'Verdrahtet zu PinC.2
    Dim Count As Byte
    Dim Flag As Bit
    Dim Old_value As Bit
    Dim New_value As Bit




    '_________________________________________________ ______________________________

    ' *************************************
    ' ***** Hauptprogramm *****
    '*******************************************

    Do


    Pulsein Channel3 , Pinc , 2 , 1 'Signallänge an PWM-Eingang stetig abfragen


    If Channel3 < 110 And Old_value = 0 Then New_value = 1
    If Old_value = 1 And Channel3 > 85 Then New_value = 0
    If Channel3 > 200 And Old_value = 1 Then New_value = 0
    If Old_value = 1 And New_value = 0 Then Incr Count
    Old_value = New_value


    Select Case Count
    Case 0 : Lights = 0 : Underwater = 0 : Waitms 300
    Case 1 : Lights = 1 : Waitms 300
    Case 2 : Underwater = 1 : Waitms 300
    Case 3 : Count = 0 : Waitms 300
    End Select



    Loop

    End
    Geändert von stardust19322 (17.08.2016 um 20:59 Uhr)

Ähnliche Themen

  1. [ERLEDIGT] Wartezeit beim Login und Verfügbarkeit der rn-Projekte
    Von Unregistriert im Forum Anregungen/Kritik/Fragen zum Forum und zum Wiki RN-Wissen
    Antworten: 4
    Letzter Beitrag: 12.04.2016, 09:43
  2. Hilfe nach Kurzschluss
    Von TrainMen im Forum Robby RP6
    Antworten: 22
    Letzter Beitrag: 15.04.2014, 13:35
  3. Ich brauche mal (Nach)Hilfe
    Von oderlachs im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 20.02.2013, 10:04
  4. VHDL unerklährliche Wartezeit nach Tastendruck
    Von todo im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 3
    Letzter Beitrag: 24.09.2009, 01:25
  5. Auf der Suche nach dem Richtigen Befehl brauche Hilfe
    Von becki133 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 10.07.2008, 00:07

Berechtigungen

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