Interrupt Tasten entprellen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Interrupt Tasten entprellen

      Hallo,

      ich möchte gern (für eine Kühlschrankregelung, nicht zeitkritisch) per Interrupt eine Unterfunktion aufrufen.

      Leider prellt natürlich der Taster. Auch mit einem 100nF-Kondensator scheinbar noch. Jedenfalls wird mein Interrupt immer 2 x aufgerufen.
      Dagegen sollte es doch die Möglichkeit geben, in der Interrupt-Service-Routine zuerst mal alle Interrupts abzuschalten.
      Das habe ich gemacht. In der ISR heißt es als erstes: disable interrupts.

      Trotzdem: Der Interrupt wird immer 2 x aufgerufen.

      Hat jemand eine Idee ?

      Gruß Tilmann
    • Tilmann schrieb:

      Dagegen sollte es doch die Möglichkeit geben, in der Interrupt-Service-Routine zuerst mal alle Interrupts abzuschalten.
      Da ist es schon zu spät dazu.
      Es gibt ein flag, in dem ein interrupt gespeichert wird, das müsstest du löschen. Oder du versuchst es mal mit debounce. Da hast du auch noch Einstellmöglichkeiten um auf deinen lommeligen Schalter besser einzugehen
      Jetzt wird's wieder spannend, werden wir weiße Weihnachten haben?
    • Hallo,

      danke für die Hinweise, aber diese passen nicht für den Fall, das ich Interrupts verwenden will.

      Interrupts will ich verwenden, weil ich Temperaturen messe (DS18B20) und dabei 800 ms warten muß. In der Zwischenzeit soll die Schaltung aber per Taster erreichbar sein.

      Deswegen will ich das Interrupt-Flag, in dem gespeichert ist, das während der Interrupt-Ausführung weitere Interruptanforderungen eingingen (durch Tastenprellen), abschalten. Dazu gehört dort eine 1 reingeschrieben. Hierzu habe ich schon verschiedenen Code gefunden, der jedoch von meinem Compiler bemängelt wird:

      'sbi Gifr, 6 'geht nicht
      'Gifr.int1 = 1 'geht nicht
      'Gifr.intf1 = 1 'geht nicht

      Wie kriege ich dieses Flag abgeschaltet ?

      Gruß Tilmann
    • Hi Leute,

      danke, Ihr habt schlaue Alternativ-Ideen, habe ich noch nicht drüber nachgedacht.

      Aber mit meiner Idee, das Flag auf 1 zu setzen, funktioniert das nicht ?

      Dann könnte ich den Atmega644P während der 800ms ja schlafen legen um Strom zu sparen.
      Bisher mache ich es mit wait, gebe ich zu.

      Gruß Tilmann
    • Tilmann schrieb:

      In der Zwischenzeit soll die Schaltung aber per Taster erreichbar sein.
      das ist aber der falsche Ansatz.
      Du bastelst dir einen Interrupt von 800ms Dauer und setzt dort ein Flag.
      Das Flag fragst du dauernd in der Hauptschleife ab.
      Ist es gesetzt, liest du den Sensor aus und startest gleich eine neue Messung.
      Der Rest des Hauptprogrammes fragt den Taster ab. Debounce ist schon genannt worden.
      Clevere Programmierer machen den 800ms Interrupt 1000ms lang und haben nebenbei gleich noch eine Uhr.
    • Hallo Michael,

      > Du bastelst dir einen Interrupt von 800ms Dauer und setzt dort ein Flag.

      nein, so krass bin ich nicht. Es geht um eine Kühlschrankregelung, die ist also nicht zeitkritisch. Es werden drei Temperaturen und eine Spannung per LCD angezeigt. Während da gemessen und geregelt wird, mit 800ms Wartezeit zwischendurch, würde ich gern die Möglichkeit haben, mal die Displaybeleuchtung zu schalten, oder die Einschalttemperatur bzw. die Hysterese nachzuregeln. Und wenn ich dazu einen Taster drücke, möchte ich nicht die - im ungünstigsten Fall - 800 ms warten müssen, bis die Schaltung drauf regiert.

      Ihr drückt Euch alle darum, mir zu verraten wie folgendes geht:

      Wie tschoeatsch schon schrieb:
      "Es gibt ein flag, in dem ein interrupt gespeichert wird, das müsstest du löschen."



      Oder geht das nicht mit Bascom ?

      Gruß Tilmann
    • Hallo tschoeatsch,

      das war es, super, Du bist der Held, danke !

      Gruß Tilmann

      P.S.: Bei der Gelegenheit habe ich gleich ausprobiert, wie lange sich das Tastenprellen auswirkt.
      Trotz 100nF-Kondensator scheint es meistens noch 150 ms anzuhalten, denn mit 100 ms ging es garnicht,
      mit 150 ms manchmal und mit 200 ms zuverlässig.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tilmann () aus folgendem Grund: Ergänzung

    • Tilmann schrieb:

      nein, so krass bin ich nicht. Es geht um eine Kühlschrankregelung, die ist also nicht zeitkritisch. Es werden drei Temperaturen und eine Spannung per LCD angezeigt. Während da gemessen und geregelt wird, mit 800ms Wartezeit zwischendurch, würde ich gern die Möglichkeit haben, mal die Displaybeleuchtung zu schalten, oder die Einschalttemperatur bzw. die Hysterese nachzuregeln. Und wenn ich dazu einen Taster drücke, möchte ich nicht die - im ungünstigsten Fall - 800 ms warten müssen, bis die Schaltung drauf regiert.
      Du hast echt eine Wartezeit von 800ms in dein Programm eingebaut und willst die mit einem Interrupt für einen Tastendruck unterbrechen?

      Tilmann schrieb:

      Ihr drückt Euch alle darum, mir zu verraten wie folgendes geht:
      Ich vermute, du stehst noch sehr am Anfang deiner Programmierkarriere.
      Ich habe dir bereits verraten, wie es geht.
      Versuche, Wartezeiten zu vermeiden, Tastendrücke holt man sich nicht durch Interrupts (außer zum Aufwecken)
      Dazu sind Tastendrücke viel zu langsam.
      Und ja, auch für eine simple Kühlschrankregelung darf man ordentlich programmieren.
    • Nur mal so .

      EIFR.1=1 würde ich mit [Gifr. Intf1 = 1 ] in ISR ersetzen.

      Bedenke in einem Code mit ISR ist dies ein Maste Register für Systemtakt.

      Nur ein oder zwei Nop können dein Ablauf instabil machen.

      Ja da liegt immer wieder die begründete„Abwertung „ der C., C... Programmierer, mit Recht,
      BASCOM zu belächeln.

      Die umwegendlichen Registereinstellungen der (Controller) um, bis vielleicht zu ein Ergebnis zu kommt, sind schon seht vielfältig. Aber immer noch kreativer.

      Ein AVR hat nur ein „Task“ wer dies beachtet, hat Vorteile in der Programmierung.

      Gruß
    • @ Fredred:
      > EIFR.1=1 würde ich mit [Gifr. Intf1 = 1 ] in ISR ersetzen.
      genau das (u.a.) hatte ich probiert, aber der Kompiler hatte es nicht zugelassen.
      Keine Ahnung, warum.

      @Michael:
      > Dazu sind Tastendrücke viel zu langsam.



      Langsam ist doch relativ, wenn ich nach 30 Sekunden in meinem Untermenü noch nicht fertig bin (um die Schaltpunkte zu verändern) schlägt mein Watchdog zu und macht Reset. Dem Kühlschrank machen die 30 Sekunden garnichts. Und wenn ich die Wartezeit mit irgendeinem Energiesparmodus verbringe, aus den ihn nur der Timer wieder aufweckt, ist es doch optimal oder nicht ?

      Was soll schlecht sein an meinem Konzept ?

      Gruß Tilmann
    • Ich finde, ein Programm ist gut, wenn es wie gewünscht funktioniert. Da das allerdings subjektiv ist, lässt sich prima drüber streiten, bringt aber nix. Du musst zufrieden sein, andere müssen dein Programm nicht bedienen, fertig. Ob dein Programm in dem wait umeinander zählt oder zigmal ein flag kontrolliert ist doch wurscht. Mit den Herausforderungen wächst deine Programmierkunst. Man muss am Anfang nicht alle Tricks beherrschen, die man bei komplizierteren Programmen braucht. Meine Meinung.
      Jetzt wird's wieder spannend, werden wir weiße Weihnachten haben?
    • Ich fand Michaels Hinweise sinnvoll. Sicher ist es schön, wenn es funktioniert, aber im BASCOM- Forum sollte man schon darauf hinweisen dürfen, das es nicht die optimale Lösung ist.

      Michael schrieb:

      Versuche, Wartezeiten zu vermeiden, Tastendrücke holt man sich nicht durch Interrupts (außer zum Aufwecken)
      Dazu sind Tastendrücke viel zu langsam.
      Mit diesen Hinweisen ist man eigentlich gut beraten. Hier gibt es die Hilfe halt gratis, da ist nicht das Schlechteste, seinen Code zu posten, damit gezielt Verbesserungsvorschläge gemacht werden können, die im Allgemeinen ja auch erklärt werden.

      Gruß Christian
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.