Seite 1 von 1

Interrupts in Micropython

Verfasst: Donnerstag 3. Dezember 2020, 14:33
von luemar
Hallo Experten,
mit dem folgenden Script schalte ich beim Drücken eines Tasters über einen Interrupt eine LED ein
und beim loslassen wieder aus. Pin 5 ist initial auf HIGH (1) und geht beim Drücken des Tasters auf
LOW (0) und dementsprechend ist der irq Parameter trigger = Pin.IRQ_FALLING gesetzt:
(ich habe die while Schleife limitiert um bei einem Fehler im Code nicht in eine endlos Schleife zu kommen)

Code: Alles auswählen

from machine import Pin
from time import sleep

def handle_interrupt(pin):
  global key_pressed
  key_pressed = True

led=Pin(2,Pin.OUT)
button1=Pin(5, Pin.IN)
button1.irq(trigger=Pin.IRQ_FALLING, handler = handle_interrupt)

n = 0
while n < 10:
  print('initial value:', button1.value())
  sleep(2)
  if key_pressed:
    print('Interrupt detected')
    led.value(0)
    key_pressed = False
  if button1.value() == 0:
    led.value(1)
  n += 1
1. Was ich nicht verstehe ist, dass der Interrupt auch beim Loslassen anspricht, wenn Pin 5 von 0 wieder
auf 1 geht, wie das print statement anzeigt. Sollte m.e. nicht sein.

2. Es ist mir auch nicht klar warum ich im Haupt Code den led.value zuerst auf 0 und für das Loslassen
auf 1setzten muss, damit es funktioniert.

Re: Interrupts in Micropython

Verfasst: Donnerstag 3. Dezember 2020, 17:33
von __blackjack__
@luemar: Der Beitragstext passt nicht zum Code. Im Code wird die LED weder über einen Interrupt eingeschaltet noch *beim* loslassen wieder ausgeschaltet. Beim Interrupt wird bloss ein Flag gesetzt. Und das wird alle zwei Sekunden geprüft um dann etwas mit der LED zu machen. Was genau, dafür müsste man anscheinend erst einmal klären ob die LED und/oder der Button „low active“ sind, also 1 und 0 vertauscht sind.

Re: Interrupts in Micropython

Verfasst: Freitag 4. Dezember 2020, 17:39
von luemar
vielen Dank, komme nicht weiter:
habe meinen Code oben deshalb mit weiteren print statements versehen:

Code: Alles auswählen

from machine import Pin
from time import sleep

timeOn = 3
key_pressed = False

def handle_interrupt(pin):
  global key_pressed
  key_pressed = True

led=Pin(2,Pin.OUT)
button1=Pin(5, Pin.IN)
button1.irq(trigger=Pin.IRQ_FALLING, handler = handle_interrupt)

n = 0
while n < 10:
  print('initial button value:', button1.value())
  sleep(timeOn)
  if key_pressed:
    print('Interrupt detected')
    led.value(0)
    print('led 0: ',led.value())
    key_pressed = False
  if button1.value() == 0:
    led.value(1)
    print('led 1: ',led.value())
  n += 1
  
Demzufolge ist nach <download and run> der button1 Pin Wert gemäss der Schaltung
richtigerweise 1, bzw. 3.3V (nachgemessen)
Dann fängt die while Schlaufe an zu laufen und der button(1) Pin Wert ist immer noch 1.
Dann beim Drücken des Tasters erfolgt der Interrupt, welcher im print statement als
'Interrupt detected' angezeigt wird.
Und nun wird's ganz wild:
Im Anschluss wird led.value(0) im folgenden print statement als 0 ausgegeben und dann
sofort als 1 und die LED leuchtet, während der immer noch gedrückte Taster im Rhythmus der while Schalufe richtigerweise mit Wert 0 ausgeben wird gefolgt vom led Wert 1.
Dann beim Loslassen erfolgt wieder ein Interrupt mit entsprechender Ausgabe gefolgt von
der Anzeige des Wechseld des led.value() auf 0 und Löschen der LED und
Anstiegs des button Pin Wertes auf 1 mit entsprechender Ausgabe.
wird. Eine etwas komplizieret Beschreibung aber die Schaltung funktioniert für mich.
Hier nochmals das was im Konsolenfenster erscheint:

.......
download ok
exec(open'./LED_interrupt2.py').read(), globals())
initial button value: 1
initial button value: 1
drücken Taster
Interrupt detected
led0: 0
led1: 0
initial button value: 0
led1: 1
initial button value: 0
led1: 1
initial button value: 0
led1: 1
loslassen Taster
Interrupt detected
led0: 0
initial button value: 1
initial button value: 1
.....
>>>

Re: Interrupts in Micropython

Verfasst: Freitag 4. Dezember 2020, 18:45
von pillmuncher
@luemar: Irgendwie jann ih dir nicht recht folgen. Ist das, was passiert, das was du willst, oder willst du, dass etwas anderes passiert? Wenn letzteres, ist dein Problem, dass der Interrupt auch beim Loslassen des Tasters getriggert wird? Oder etwas anderes?

Re: Interrupts in Micropython

Verfasst: Freitag 4. Dezember 2020, 20:51
von luemar
nun, eigentlich bin ich mit dem Resultat - fast - zufrieden.
Nur fast weil ich verstehen möchte aber , warum das Loslassen des Tasters einen Interrupt auslöst,
der gemäss den einschlägigen docs nicht programmiert ist bzw. nicht stattfinden sollte und
der zu einer kurzen, für mein definitives Projekt (Steuerung eines Relais anstelle einer LED) etwas
ungünstigen Verzögerung führt.

Re: Interrupts in Micropython

Verfasst: Freitag 4. Dezember 2020, 20:58
von __deets__
Taster koennen prellen. Hier ist eine Diskussion zu dem Thema im micropython-Forum, mit ein paar Loesungsvorschlaegen: https://forum.micropython.org/viewtopic ... 938#p23453

Re: Interrupts in Micropython

Verfasst: Samstag 5. Dezember 2020, 12:31
von luemar
danke, der Taster ist über einen 100nF Kondensator entprellt.
Nun habe ich noch festgestellt, dass der trigger Wert in irq - ob IRQ_RISING oder IRQ_FALLING - befremdlicherweise
auf das Resultat bzw. den Ablauf des Sripts keinen Einfluss hat ??