GPIO.add_event_detect - Callbackfuntion wird zweinmal ausgeführt

L I V E Stammtisch ab 20:30 Uhr im Chat

  • Habe das Problem wenn ich das Script starte, dann bekomme ich immer 2 mal die Interrupt Funktion pro Buttondruck.

    Selbst wenn ich die bouncetime erhöhe oder verringere.

    Nehme ich das time.sleep(1) herraus ist alles normal. Problem ist aber das ich gerne per buttondruck eine mp3 abspielen lassen würde und die natürlich länger läuft.

    Raspberry Pi B + raspbian (Linux raspberrypi 4.1.15+)

  • GPIO.add_event_detect - Callbackfuntion wird zweinmal ausgeführt? Schau mal ob du hier fündig wirst!

  • Hallo newan,

    in einer ISR sollte der Interrupt ausgeschaltet werden, damit ein Ereignis nicht mehrfach einen Interrupt ausgelöst wird, nur weil der Status, der zum Interrupt führte, noch besteht.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Aha das ist ein interessanter Ansatz, würde dann so aussehen...für die Nachwelt:

    Danke :danke_ATDE:


    Edit: War wohl noch nicht die ganze lösung, wenn ich nun drücke habe ich 80% das nur einmal gerufen wird, ab und ann überschlägt der sich aber immer noch :(

    Einmal editiert, zuletzt von newan (27. Dezember 2015 um 21:51)

  • Sowas muss man eigentlich auch nicht machen... kA wo Andreas das nu wieder her hat :fies:
    Tritt ein mal ein RISING Event auf wird die Callback auch nur ein mal ausgeführt. Es sei denn der Auslöser prellt. Erhöhe einfach die Bouncetime um den Taster zu entprellen. Oder schalte einen Kondensator direkt am Taster parallel, zur Entprellung.
    bounce -> prallen,hüpfen,federn,sprunghaft,wackeln


    Nehme ich das time.sleep(1) herraus ist alles normal. Problem ist aber das ich gerne per buttondruck eine mp3 abspielen lassen würde und die natürlich länger läuft.

    Ein time.sleep hat in der Callback aber auch nichts zu suchen. Die ISR Funktion sollte nicht aufgehalten/ausgebremst werden. Nutze stattdessen Queue: FAQ --> Nützliche Links / Linksammlung --> Interrupt --> #6 (hier)

  • Das sleep war ja auch nur ein Beispiel um das Problem darzustellen das nicht Produktiv drin.

    Das mit der Queue hilft mir glaub ich aber.

    im Beispielscript ist aber ein kleiner Flüchtigkeitsfehler:

    print cputemp() -> print(cputemp())


    :danke_ATDE:

    Einmal editiert, zuletzt von newan (27. Dezember 2015 um 23:13)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!