GPIO aus lesen mit Polling, Interrupt

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo,

    ich habe bisher über 2 GPIOs die S0-Schnittstelle von zwei Elektrozählern über Python3 per Polling ausgelesen. Klappt ganz gut, Fehler etwa 0,5%. Jetzt habe ich das gleiche "professioneller" über Interrupt versucht. Die Werte liegen vollständig daneben. Sie "schwanken" zwar im richtigen Rythmus, liegen aber um den Faktor 100 zu hoch.

    Ich habe in beiden Fällen einen 1K Pull_Up-Widerstand, eine 3m bzw. 10m Leitung. Beim Interrupt habe ich wahlweise per Software zusätzlich den Pull_Up eingeschaltet oder nicht - das ändert nichts.

    Code
    def PVAuslesen(PVKanal):
        global ZaehlerstandINTPV
        ZaehlerstandINTPV = ZaehlerstandINTPV + 1
    .
    .
    .
        GPIO.setup(PVEingang, GPIO.IN)
        GPIO.add_event_detect(PVEingang, GPIO.RISING, callback=PVAuslesen)
    .
    .

    Entsprechendes für 2. Zähler.

    Woran kann das liegen (Elektronik-dummy)?

    Gruss, wonk :danke_ATDE:

  • Mit Globalen Variablen zu arbeiten ist nicht so optimal. Zumal du wahrscheinlich dann schon 2 davon hast.

    Besser ist es, sich da ne Klasse zu basteln. Ich benutze hier aber GpioZero.
    Hier findest du etwas zum DigitalInputDevice.

  • Ein 10k PullUp wäre besser. Probier mal den, bevor du irgendeine andere Änderung machst.


    Bezüglich Counter kann man das mit Vererbung recht einfach gestalten:

    DigitalInputDevice ist auch eine Klasse und ruft die Methode when_activated auf, wenn sich der Zustand True wird (invertierte Logik).

    Die Klasse CounterPin erbt die Klasse DigitalInputDevice und daher alle ihre Methoden.

    Um die Eltern-Klasse richtig zu initialisieren, muss mit super() die __init__ Methode der Eltern-Klasse aufgerufen werden.

    Die Methode when_activated wird durch CounterPin.when_activated überlagert.

  • Hallo!

    (Komme mit dem Zitieren nicht zurecht)...

    Zu hyle: Ich habe den Interrupt auf GPIO.RISING gesetzt. Natürlich würde die S0 zunächst ein "falling" und dann ein "rising" bewirken. Ist es dann nicht egal, worauf man den Interrupt setzt? - Wie auch immer, ich habe es auch mit Interrupt auf GPIO.FALLING probiert. Das Ergebnis ist genauso unbefriedigend.

    Zu meiner Umsetzung des Polling:

    Zu Euren Programmierhinweisen: Ist wahrscheinlich nicht sehr elegant, wie ich es mache (Python-Anfänger), aber das kann doch nicht den Fehler verursachen!???

    Für 10K Pull-Up muss ich erst Löten. Aber wieso klappt das Pollimg dann mit dem 1K - der interne Pull_up wird hier softwaremäßig nicht beeinflusst?

    Gruss, wonk :danke_ATDE:

  • Ist es dann nicht egal, worauf man den Interrupt setzt?

    Diese Diskussion hatte ich schon ein paar mal und keine Lust auf eine weitere. Der GPIO ist gegen GND geschaltet? Dann Pullup verwenden und auf fallende Flanke reagieren. (empfohlen da stabilere Ergebnisse) Ist der GPIO gegen 3V3 geschaltet? Dann Pulldown verwenden und auf steigende Flanke reagieren.


    Wann das gemacht wird und was da zuerst an Signalen anliegt, kommt auf den konkreten Fall und die Dauer an.