- Labornetzteil AliExpress         
Ergebnis 1 bis 9 von 9

Thema: Wartezeit nach PWM-Eingabe - brauche Hilfe

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Wartezeit nach PWM-Eingabe - brauche Hilfe

    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
    66
    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
    39
    Beiträge
    3.416
    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 08:37 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    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.

Ä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, 08:43
  2. Hilfe nach Kurzschluss
    Von TrainMen im Forum Robby RP6
    Antworten: 22
    Letzter Beitrag: 15.04.2014, 12:35
  3. Ich brauche mal (Nach)Hilfe
    Von oderlachs im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 20.02.2013, 09:04
  4. VHDL unerklährliche Wartezeit nach Tastendruck
    Von todo im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 3
    Letzter Beitrag: 24.09.2009, 00:25
  5. Auf der Suche nach dem Richtigen Befehl brauche Hilfe
    Von becki133 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 09.07.2008, 23:07

Berechtigungen

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

12V Akku bauen