-         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 40 von 40

Thema: Taster mit Kondensator entprellen

  1. #31
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    818
    Blog-Einträge
    7
    Anzeige

    4700µF Elkos würden aber bei weitem den verfügbaren Platz überschreiten
    Das ist mir klar Aber anders .... ?

  2. #32
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    4.024
    Zitat Zitat von Moppi Beitrag anzeigen
    Das ist mir klar Aber anders .... ?
    das wäre genau die Frage ...
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  3. #33
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    818
    Blog-Einträge
    7
    Nimm doch statt delay(x) -> delayMicroseconds(x).
    Du könntest auch mit millis() oder micros() arbeiten, bekommst ja dann die vergangene Zeit. und kannst also die Schleife immer wieder verlassen, solang eine gewisse Mindestzeit nicht vergangen ist.

    Eigentlich wartet man nur darauf, dass der Taster eine gewisse Zeit nicht gedrückt wurde, um sicher zu gehen, dass er nicht mehr gedrückt ist.
    Registriert man während dieser Wartezeit, dass der doch wieder gedrückt wurde oder ist, setzt man den Zähler zurück und wartet weiter, bis er die gewünschte Zeit eben nicht mehr gedrückt ist.
    Mit millis() oder micros() weisst Du, wieviel Zeit vergangen ist und kannst deinen Zähler entspr. anpassen, bis der irgendwann auf 0 ist; dann ist der Taster nicht mehr gedrückt.



    MfG

  4. #34
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    4.024
    Zitat Zitat von Moppi Beitrag anzeigen
    Nimm doch statt delay(x) -> delayMicroseconds(x).
    Du könntest auch mit millis() oder micros() arbeiten, bekommst ja dann die vergangene Zeit. und kannst also die Schleife immer wieder verlassen, solang eine gewisse Mindestzeit nicht vergangen ist.

    Eigentlich wartet man nur darauf, dass der Taster eine gewisse Zeit nicht gedrückt wurde, um sicher zu gehen, dass er nicht mehr gedrückt ist.
    Registriert man während dieser Wartezeit, dass der doch wieder gedrückt wurde oder ist, setzt man den Zähler zurück und wartet weiter, bis er die gewünschte Zeit eben nicht mehr gedrückt ist.
    Mit millis() oder micros() weisst Du, wieviel Zeit vergangen ist und kannst deinen Zähler entspr. anpassen, bis der irgendwann auf 0 ist; dann ist der Taster nicht mehr gedrückt.

    MfG
    moppi,
    es geht um 20ms, die man quasi nach dem 1. Drücken abfeiern muss -
    - da ist es völlig wurscht, ob man die in microseconds oder milliseconds zählt.

    Es darf aber ÜBERHAUPT KEINE WARTEZEIT geben!

    Hast du dir mal die Mühe gemacht, den ButtonClass Code mit seiner State Machine anzusehen, für den die Entprellung gebraucht wird??
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  5. #35
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    818
    Blog-Einträge
    7
    Du wartes da auf gar nichts. Ist ja nicht notwendig. millis() abfragen, vom Zähler abziehen -> Zähler = 0? Nein, zurück, weil Taste noch gedrückt (status mitgeben: bool return x). Ist doch 0? Ja, dann zurück, weil Taste nicht mehr gedrückt (status mitgeben). Die Zeit, die da verbraucht wird, ist halt die, für die paar Befehle. Aber kein Warten in dem Sinn, dass man da so und so viele Micros() oder Millis() in einer Schleife festhängt.


    MfG

  6. #36
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    4.024
    Zitat Zitat von Moppi Beitrag anzeigen
    Du wartes da auf gar nichts. Ist ja nicht notwendig. millis() abfragen, vom Zähler abziehen -> Zähler = 0? Nein, zurück, weil Taste noch gedrückt (status mitgeben: bool return x). Ist doch 0? Ja, dann zurück, weil Taste nicht mehr gedrückt (status mitgeben). Die Zeit, die da verbraucht wird, ist halt die, für die paar Befehle. Aber kein Warten in dem Sinn, dass man da so und so viele Micros() oder Millis() in einer Schleife festhängt.


    MfG
    Das ist mir leider zu allgemein und zu unkonkret.
    Aber wenn du wirklich die konkrete Lösung kennst, dann schreib hier mal hin, wie der Code für die ButtonClass geändert werden muss, damit man
    a) zwar einen Doppelclick und auch einen langen Buttonpress erkennt, aber
    b) schnelles Prellen bei einzelnen Buttonclicks herausgefiltert wird.
    Link: https://github.com/dsyleixa/Arduino/.../ButtonClass.h
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  7. #37
    Erfahrener Benutzer Roboter Genie Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    818
    Blog-Einträge
    7
    Nein, DIE konkrete Lösung für Dein Programm kenne ich nicht.

    Was ich beschrieben habe ist eine allgemeiner Lösungsweg, den man gehen kann.


    Ich denke aber, das Thema: Taster mit Kondensator entprellen


    ist wohl hier jetzt nicht mehr zutreffend. Das per Software zu lösen, waren ja nur noch mal Hinweise von einigen hier.


    Ich habe da mal reingeschaut, Dein Code sieht ziemlich lang aus, scheint mir zu lang, weiß ich aber nicht. Wäre mir zu viel Arbeit drin herum zu werkeln. Lieber gleich neu schreiben. Ich glaub so viel macht der ja nicht. Weiß noch nicht mal genau, was der Code genau tun soll und wozu. Deshalb würde ich vorschlagen, dass Du das selber änderst, Du weißt am besten, wie und was Dein Code macht. Das sollte am Schnellsten erledigt sein.

    Aber da Du ja schon mit millis() arbeitest, an verschiedenen Stellen und dies Konzept die Entprellung nicht berücksichtigt, vielleicht denkt man es dann wirklich gleich noch mal neu und nimmt einen neuen Anlauf, mit neuem Code. Manchmal ist das so. Bevor man den alten Cde so lange verbiegt, bis nichts richtig funktioniert.


    MfG
    Geändert von Moppi (15.05.2019 um 18:52 Uhr)

  8. #38
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    4.024
    Zitat Zitat von Moppi Beitrag anzeigen
    Nein, DIE konkrete Lösung für Dein Programm kenne ich nicht.

    Was ich beschrieben habe ist eine allgemeiner Lösungsweg, den man gehen kann.


    Ich denke aber, das Thema: Taster mit Kondensator entprellen


    ist wohl hier jetzt nicht mehr zutreffend. Das per Software zu lösen, waren ja nur noch mal Hinweise von einigen hier.


    Ich habe da mal reingeschaut, Dein Code sieht ziemlich lang aus, scheint mir zu lang, weiß ich aber nicht. Wäre mir zu viel Arbeit drin herum zu werkeln. Lieber gleich neu schreiben. Ich glaub so viel macht der ja nicht. Weiß noch nicht mal genau, was der Code genau tun soll und wozu. Deshalb würde ich vorschlagen, dass Du das selber änderst, Du weißt am besten, wie und was Dein Code macht. Das sollte am Schnellsten erledigt sein.

    Aber da Du ja schon mit millis() arbeitest, an verschiedenen Stellen und dies Konzept die Entprellung nicht berücksichtigt, vielleicht denkt man es dann wirklich gleich noch mal neu und nimmt einen neuen Anlauf, mit neuem Code. Manchmal ist das so. Bevor man den alten Cde so lange verbiegt, bis nichts richtig funktioniert.


    MfG
    den allgemeinen Weg über Software kenne ich doch und verwende ihn auch!
    Mir geht es um eine konkrete Lösung für meine ButtonClass, für die deine allgemeine Lösung nicht ohne weiteres anwendbar ist - daher hatte ich an die Kondensator-Methode gedacht.
    Allgemeines Gerede wie "Weiß noch nicht mal genau, was der Code genau tun soll und wozu. Deshalb würde ich vorschlagen, dass Du das selber änderst, Du weißt am besten, wie und was Dein Code macht." ist auch nicht gerade besonders nützlich, das müsstest du sicher selbst einsehen. Umschreiben der schon jetzt sehr verzwickten State Machine ist ntl die letzte Option.

    Also bitte immer konkret bleiben - aber du darfst mir natürlich auch gerne meinen Code umschreiben bzw. erweitern, wenn du es kannst!

    - - - Aktualisiert - - -

    PS:
    ich fang jetzt schon mal an, einen oder zwei zusätzliche States einzubauen...
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  9. #39
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.188
    Zitat Zitat von HaWe Beitrag anzeigen
    Ich kann Taster bzw. digital Pins mit ca 400-500ns lesen und toggeln (je nach µC auch etwas schneller oder etwas langsamer), aber vor allem: ich möchte einfach vermeiden, dass rechenintensive Funktionen sowie UART, I2C und SPI - R/W durch delays bei Buttonabfragen ausgebremst werden. 1ms ist da schon 1ms zuviel.

    Da wir hier im Arduino-Unterforum sind: C++11.
    Busse wie UART, I²C und SPI sind vieles, aber ganz sicher nicht rechenintensiv. Das sind normalerweise weitgehend eigenständige Hardwareeinheiten, die von der ALU weitgehend unabhängig laufen. In deren Datenregister wird ein Byte reingeschoben-und je nach Konfiguration war es das entweder, oder die UART/SPI/... meldet sich mit einem Interrupt zurück, daß sie fertig ist. Die CPU-Last beschränkt sich auf das gelegentliche Schreiben/Lesen in ein Register. Manche Controller verfügen auch über eine Funktion, daß die Peripherie selbständig Teile des Speichers auslesen kann, da hat die CPU kaum noch etwas mit zu tun.

    Mit dem Warten sieht es übrigens ähnlich aus: Du kannst stur Zeit vertrödeln, (z.B. einfach nur ein Register inkrementieren), aber du kannst auch einen Timer verwenden. Das ist ein simpler Zähler, der ebenso weitgehend unabhängig von der CPU inkrementiert wird. Je nach Funktion kann das Inkrementieren mit einem Vorteiler noch verlangsamt werden. Der Timer kann, je nach Ausstattung und Konfiguration, u.A. einen Interrupt geben wenn er einen bestimmten Wert erreicht hat oder überläuft. Wenn der Timer einfach nur läuft, kann die CPU während dessen irgendwas anderes machen. Und damit kannst du sehr wohl einen Taster 20ms sperren, ohne den Controller 20ms zu blockieren.

    Das hat übrigens nichts mit Threads oder so zu tun. Sondern einfach nur damit, wie so ein Mikrocontroller funktioniert. Ich weiß natürlich nicht, wie speziell dein Code genau funktioniert und welchen der vielen Wege nach Rom dein Programm letztendlich geht. Es sind schließlich recht viele Wege...

  10. #40
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    4.024
    mit UART lese ich laufend eingehende Bytes ein und kopiere sie in verschiedene Zwischenpuffer zur Weiterverarbeitung (strtok etc.), über I2C werden laufend verschiedenste Sensoren nacheinander ausgelesen und die Werte dann verrechnet, dann werden neue Werte gesammelt und über UART arrays wieder zurückgeschickt, über SPI wird das 480x320 TFT angesteuert, was schon recht lang dauert, dann seine touchscreen und touchbutton events erfasst und Hardwarepuffer beschrieben/gelöscht.
    Das alles dauert schon seine Zeit.
    Damit dann das Bild nicht ruckelt, weil zwischendurch ein paarmal auf ein ButtonUp oder ein Debounce gewartetet werden muss, muss man zumindest hier auf delays verzichten.
    Außerdem sind nicht alle Pins, an denen ein Button angeschlossen sein kann, Interrupt-fähig, dann beträfen Interrupts ja auch nur einzelne Instanzen, solange sie aktuell existieren, und sie müssten auf nur 1 Zustand der Statemachine begrenzt werden (z.B. Level 3) und bei anderen Zuständen (1,2,4,5,6,...) zwingend inaktiv bleiben - aus meiner Sicht also nicht machbar.

    Mit pthread auf dem Pi mache ich das anders:
    1 langsamer low priority Thread für HDMI TFT Ausgabe, die nach und nach mit 20Hz alles ausgibt, bis es vollständig ist, dann auf 50ms (nonblocking) delay, und dann sofort wieder von vorn aktualisiert,
    1 superschneller super-high-priority-Thread für Encoderpins alle 100µs auslesen,
    1 schneller high-proiority für 115200 baud UART für Dashboard und remote control im handshake ohne delay,
    1 mittelschneller medium priority für 400kHz I2C mit ein paar delays zwischen einzelnen Device r/w
    1 sehr langsamer low priority zum Keyboard auslesen
    1 medium priority für SD r/w
    usw.
    Delays in irgend einem Thread werden dabei automatisch als Rechenzeit den anderen Threads zur Verfügung gestellt.
    Die Zeitscheiben verwaltet pthread optimal, und das klappt wunderbar, kein Thread behindert einen anderen oder bremst irgend etwas aus, auch nicht auf einem Single-Core Zero: GPIO-toggle ist fast genau so schnell wie wenn es ganz alleine läuft.

    Hier beim Arduino aber muss ich alles in 1 Thread-Loop reinpressen, und viele langsame Vorgänge bremsen die schnellen unerträglich herunter.

    Dennoch, ich bin schon weitergekommen mit meiner statemachine, auch wenn es langsam unübersichtlich wird

    PS,
    Allerdings wäre auch für künftige andere Entprell-Probleme ein simpler Kondensator am Button einfacher gewesen - wenn es funktioniert hätte...
    Geändert von HaWe (16.05.2019 um 09:34 Uhr) Grund: PS
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

Seite 4 von 4 ErsteErste ... 234

Ähnliche Themen

  1. Taster entprellen?
    Von Ferdinand im Forum C - Programmierung (GCC u.a.)
    Antworten: 12
    Letzter Beitrag: 18.08.2011, 22:27
  2. Probleme mit Taster entprellen
    Von Mr Bean im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 08.05.2007, 17:12
  3. Entprellen von Taster
    Von Exodus im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 10.07.2006, 10:15
  4. Taster Entprellen mit Bascom
    Von hardstyleroxx im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 31.01.2005, 16:41
  5. Taster entprellen
    Von RCO im Forum Elektronik
    Antworten: 19
    Letzter Beitrag: 14.10.2004, 12:59

Berechtigungen

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