Bei mehr Interrupts gibts Programmfehler

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hi,

    hab mir einen Schalter an meinen Pi gehängt der per Interrupt eingelesen wird und mir auf der Konsole etwas ausgibt. Wenn ich nur einen Interrupt programmiere funktioniert alles perfekt. So wie hier.

    Code
    GPIO.setup(11, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)		# E1
    
    
    def Interrupt1(channel):
    	schalter1()
    
    
    GPIO.add_event_detect(11, GPIO.RISING, callback = Interrupt1, bouncetime = 200)

    nun zum Problem, wenn ich mehrere Interrupts programmiere fängt das Programm an zu spinnen. Ich betätige einmal einen Taster dann sollte ich auf der Konsole eigentlich nur einmal eine Ausgabe erhalten. Leider kommt die Ausgabe aber mehrmals und völlig wilkürlich in der Anzahl, von einer bis sechs widerholungen alles dabei, dachte zuerst das liegt am Prellen, hab aber eine Wartezeit drin. Es liegt also am Code, bin aber zu blöd um es zu sehen.

    wenn mir jemand auf die Sprünge helen könnte wär das klasse.
    mfg

  • Hi die Version ist 0.5.4
    Die schalterfunktion ist in einer anderen Datei schalter.py und sieht so aus
    EDIT:ich sollte noch die Funktion beschreiben. es geht um einen Lichttaster wenn erbetätigt wird geht das Licht an, nochmal betätigen Licht aus. Wenn der Taster innerhalb von 4sek 3mal gedrükt wird blinkt das Licht SOS (Die SOS Funktion ist in einer anderen Datei).

    bei der bouncetime bin ich auch schon auf 2000 gegangen das sollte funktionieren. Komisch ist wenn ich so wie oben den anderen code Auskommentiere funktionierts.

    Code
    GPIO.add_event_detect(11, GPIO.RISING, callback = Interrupt1, bouncetime = 200)
    # GPIO.add_event_detect(13, GPIO.RISING, callback = Interrupt2, bouncetime = 200)
    # GPIO.add_event_detect(15, GPIO.RISING, callback = Interrupt3, bouncetime = 200)
    # GPIO.add_event_detect(19, GPIO.RISING, callback = Interrupt4, bouncetime = 200)
    # GPIO.add_event_detect(21, GPIO.RISING, callback = Interrupt5, bouncetime = 200)
    # GPIO.add_event_detect(23, GPIO.RISING, callback = Interrupt6, bouncetime = 200)

    Einmal editiert, zuletzt von icefoto (12. Mai 2014 um 20:37)

    • Offizieller Beitrag

    Hmm, ist es schlimm wenn ich dieser Funktion keine Lichttasterbetätigung finde? Bei deinen globals krempeln sich mir die Fußnägel hoch (wie man so schön bei uns sagt). ;)

    Zuerst einmal sollte man globals vermeiden und mir ist auch noch kein Fall untergekommen wo man sie nicht hätte umgehen können. Wenn man sie dann doch benutzt, dann wenigstens richtig. Global pin1 (1. Zeile) definiert nicht, wie man vielleicht denken mag eine globale variable, sondern versucht eine existierende variable namens pin1 global zugänglich zu machen. Ich vermute das in diesem Wust an globalen Hinundhergeschiebe der Hund begraben liegt.

  • Erstmal danke hatte wirklich einen Fehler in der Deklaration, aber an den Globals hat es nicht gelegen. Ich habe jetzt den Code soweit heruntergebrochen wie es nur geht. Es scheint irgent einen Fehler im Interrupt zu geben. In meiner main.py steht nur noch

    und in der schalter.py steht

    es wird aber nur immer "eeeeeeeeeeeeeeeeee" mehrmals ausgegeben also scheinen die anderen Funktionen nicht beeinträchtigt zu sein, aber der Fehler wird durch sie ausgelöst. wie gesagt wenn ich den Code auskommentiere passt alles.

    Code
    GPIO.add_event_detect(11, GPIO.RISING, callback = Interrupt1, bouncetime = 200)
    # GPIO.add_event_detect(13, GPIO.RISING, callback = Interrupt2, bouncetime = 200)
    # GPIO.add_event_detect(15, GPIO.RISING, callback = Interrupt3, bouncetime = 200)
    # GPIO.add_event_detect(19, GPIO.RISING, callback = Interrupt4, bouncetime = 200)
    # GPIO.add_event_detect(21, GPIO.RISING, callback = Interrupt5, bouncetime = 200)
    # GPIO.add_event_detect(23, GPIO.RISING, callback = Interrupt6, bouncetime = 200)
  • Die Wiederstände sind natürlich drin. Hab mir schon fast gedacht das du das meinst war mir aber nicht sicher. Den Fehler hab ich vor Jahren gemacht als ich das erste mal mit mikrocontrollern anfing:D. Das der Fehler bei der Elektrik hab ich auch mal vermutet. Dagegen spricht das:
    - Bei einem Interrupt alles funktioniert
    - Die mehrfachausgabe gleichzeitig geschieht ohne die bouncetime zu berücksichtigen.
    manchmal wird es sogar in der selben Zeile in der Konsole ausgegeben.z.B

    eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    eeeeeeeeeeeeeeeeee
    eeeeeeeeeeeeeeeeee
    leerzeicheneeeeeeeeeeeeeeeeee
    leerzeicheneeeeeeeeeeeeeeeeee
    eeeeeeeeeeeeeeeeee
    eeeeeeeeeeeeeeeeee
    eeeeeeeeeeeeeeeeee
    leerzeicheneeeeeeeeeeeeeeeeee

    Einmal editiert, zuletzt von icefoto (13. Mai 2014 um 02:47)

  • hi und Dank euch beiden,
    habs jetzt so gelöst das ich jeden Interrupt in eine separate Datei gepackt habe und die Programme gleichzeitig ablaufen lasse. Kommt meiner Objektorientierten Programmierung eftl sogar zu gute, mal schaun. Bis jetzt läufts zumindest einwandfrei.

    mfg:shy:

Jetzt mitmachen!

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