- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 40

Thema: Taster mit Kondensator entprellen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Zitat Zitat von HaWe Beitrag anzeigen
    Ich will auf jeden Fall irgendwelche, auch minimalste delays vermeiden, und ich will es für eine Statemachine verwenden, die auch Doppelklicks etc. erkennt.
    Mal was anderes: Delays wirst du nicht völlig ausmerzen können. Wenn die Delays aber so wichtig sind, warum dann nicht mit immerhin definierten Delays? Außerdem: mit Softwareentprellung hast du die Taster im Prinzip delayfrei, denn das Signal kann ja sofort verarbeitet werden. In der Regel sperrst du den Taster nur für eine kurze Zeit, d.h. der nachfolgende Tastendruck kann z.B. erst wieder in 50ms erfolgen. Oder früher, wenn sich eine Zeit lang nichts mehr am Pin getan hat, da gibt es unterschiedliche Strategien. Aber der erste Puls wird auf jeden Fall mitgenommen.

    Wenn du jedoch deine Taster so schnell betätigst daß du keine 50ms zwischendurch warten kannst, dann wäre es vielleicht besser etwas anderes als Taster zu verwenden. Denn die werden das mechanisch nur kurz mitmachen.

    Kannst du die Taster über das Arduinoframework überhaupt so schnell abfragen? Ich habe mir die Sprache nur sehr kurz angesehen, außerdem ging es um AD-Wandlung. Ich fand das allerdings sehr limitierend, da (in meinem Falle AD-Wandlung) lediglich der gewandelte Wert genutzt werden konnte. Informationen, die darüber hinausgingen (z.B. Samplerate) konnten weder bestimmt noch irgendwie ermittelt werden. Damit war das praktisch nicht nutzbar, weil vernünftige Signalverarbeitung schlicht unmöglich war.
    Wenn ich Microcontroller programmiert habe, dann entweder in ADM oder C, und da gibt es nun viele Strategien, Tasterabfragen in das Programm einzubauen. Über Hardwareinterrupts bis Abfragen in verschiedenen Zeitintervallen ist da vieles machbar. Hast du eine Abschätzung, wie groß das Delay dazwischen ist und wie die Abfragen genau erfolgen, oder kannst du das tatsächlich selber definieren?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.667
    Klar kann man die Taster so schnell abfragen.

    Sprache ist wohl C++.

    Ich hatte für die Rollosteuerung auch schon diese Microtaster softwaremäßig entprellt. Man kann das einstellen, wenn man will. Über die Zeit eben. Ich habe da nicht so viel Augenmerk drauf gelegt, Hauptsache, die Tasten waren irgendwie entprellt. Deshalb sind meine eingesetzten Zeiten nur geschätzt. Aber der Code ist bei mir im Blog, kann jeder anschauen.



    MfG

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    908
    Zitat Zitat von White_Fox Beitrag anzeigen
    … dann entweder in ADM oder C,...
    Der war jetzt intellektuell anspruchsvoll. Hat ne Minute gedauert, zu merken, dass das "s" neben dem "d" liegt.

  4. #4
    HaWe
    Gast
    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.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    908
    Ich hab's jetzt nachgeschlagen, wie ich das mal gelöst habe.
    Code:
    //Timer keys polling
    ISR(TIMER0_COMPA_vect)
    {
        static uint8_t keyPrescaler = 0;
        static uint8_t oldKeys = 0;
        keyPrescaler++;
        if (keyPrescaler >= 20)
        {
            keyPrescaler = 0;
            uint8_t newKeys = (PINC & 0xF0); //Keys port
        
            uint8_t keysChanged = newKeys ^ oldKeys;
            uint8_t newKeysSet = keysChanged & newKeys;
            keysSet |= newKeysSet;
            oldKeys = newKeys;
        }
    }
    Ich polle da wohl alle 20ms im 1ms-Timer-Interrupt die entsprechenden vier Port-Pins in die "keysSet"-Variable...



    Code:
    // called from Main loop
    void MaskProcessFromForeground()
    {
        //SET KEYPRESSED, MASKTIMER ELAPSED AND CHECK READ BUFFER CALLS FROM MAIN ROUTINE
    
        CheckReadBufferTelegrams((FIFO_t*) ReadBuffer, Admin.TelegramReceived);
    
    
        if(TimerPrescalerCounter == 0)
        {
            TimerPrescalerCounter = Admin.TimerPrescaler;
            if (Admin.TimerElapsed != 0)
                Admin.TimerElapsed();
        }
    
        if (Admin.KeyPressed != 0)
        {
            uint8_t keysSetCopy = keysSet;
            for (int i = 0; i < 4; i++)
            {
                if (keysSetCopy & (0x80 >> i))
                    Admin.KeyPressed(i);
            } 
            cli();
            keysSet &= ~keysSetCopy; // reset handled keys
            sei();
        }
    }
    ...und spreche die keyPressed-callbacks (können dann schon mal etwas länger dauern) aus der main-loop an.

    Nicht verwirren lassen: "Admin" ist eine Struktur mit Funktionszeigern, die auf die Funktionen der aktuell geladenen Bildschirmmaske zeigen (die werden beim Umladen der Maske in die Admin-Struktur geschrieben).
    Geändert von Holomino (15.05.2019 um 15:29 Uhr)

  6. #6
    HaWe
    Gast
    Interrupts kann ich leider nicht verwenden, ich verwende digitalRead für beliebig viele Buttons in Instanzen eines Button-Objekts:
    https://github.com/dsyleixa/Arduino/...er/ButtonClass

    Abgefragt werden alle Button-Zustände mindestens 1x pro loop(), und wie lange eine Loop dauert, lässt sich nicht allgemein vorhersagen (u.U. nur 1ms oder sogar weniger, evtl aber auch länger).
    In der Button Class sind derzeit auch noch delay(1) drin, aber auch die sollen noch raus.
    10 oder 20ms warten bis entprellt ist, ist absolut nicht möglich.

    Leider gibt es auch kein preemptives Multithreading für die ARMs (POSIX pthread oder std::thread), sonst könnte ich das in einen eigenen langsameren Thread "outsourcen".

    Daher suchte ich eine simple Entprellung per Kondensator.
    Geändert von HaWe (15.05.2019 um 15:45 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.667
    Naja, man kann auch Schleifen ohne delay()-Funktion bauen, einfach mit Zählern.

    Der Taster wird gegen Masse geschaltet. Ein Kondensator kann keine 0V ausgeben. Er kann nur positive Ladung abgeben.
    Musst Du die Logik der Taster umkehren, dann kannst Du Kondensatoren in der Größe 4700µF oder mehr nehmen, evtl etwas weniger, musst Du dann ausprobieren.



    MfG

  8. #8
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Naja, man kann auch Schleifen ohne delay()-Funktion bauen, einfach mit Zählern.

    Der Taster wird gegen Masse geschaltet. Ein Kondensator kann keine 0V ausgeben. Er kann nur positive Ladung abgeben.
    Musst Du die Logik der Taster umkehren, dann kannst Du Kondensatoren in der Größe 4700µF oder mehr nehmen, evtl etwas weniger, musst Du dann ausprobieren.
    MfG

    4700µF Elkos würden aber bei weitem den verfügbaren Platz überschreiten
    die Kerkos sollten dicht neben die Tasterbuttons gesteckt werden, quasi daneben "verschwinden".

    Schleifen ohne delay nutze ich ja bereits, denn es sollen ja auch Doppelklicks und lange Drücke erfasst werden.
    Guck dir mal dazu bitte den ButtonClass-Code genau an.

    Trotzdem kommt es zum unerwünschten Erfassen von Prellen im Bereich z.B. von 1ms bis (geschätzt) 10ms, die dann unerwünschterweise wie Doppelclicks wirken.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    908
    Wenn Du kein delay() verwendet wissen möchtest, warum verwendest Du dann den oben angegebenen Code?

    https://github.com/dsyleixa/Arduino/.../ButtonClass.h
    Zeile 146
    Zeile 175

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    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...

Seite 1 von 2 12 LetzteLetzte

Ä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
  •  

Solar Speicher und Akkus Tests