ich vermute mal du möchtest den Drucktaster entprellen.
Ich hab die Lib Bounce2 benutzt. Hat prima geklappt. Falls du es selber programmieren möchtest, kannst du da mal nachsehen.
Wahrscheinlich kannst du die Lib direkt über die Arduino-IDE einbinden.
Es macht keinen Sinn, einen mechanischen Schalter über einen Interrupt einzulesen.
Lies den Schalter im loop ein, und sorge per millis() ( oder zur Not auch über delay() ) dafür, dass Du ihn nur etwa alle 20-30ms einliest. Damit hast Du ihn entprellt. Die minimal notwendige Zeit ist vom Prellverhalten des Tasters abhängig.
Mein Einwand bezog sich auf das vom TO verwendete Verfahren, dass der Schalter direkt einen Interrupt auslöst.
Das habe ich auch so verstanden.
(glaube ich)
Ich befürchte, dass es sich hier nicht um den Taster im Encoder dreht, sondern um den Encoder selber.
Und da sind Entprellzeiten eher kontraproduktiv, da sie bei der Bedienung im Weg stehen.
Der Mensch erwartet bei sowas intuitiv einen hohen Dynamikbereich.
Also langsame exakte Bewegungen, so wie auch recht hohe Drehgeschwindigkeiten.
Gerne auch mit "Beschleunigungsfunktion".
Wenn es irgend geht sollte man einem (größeren als 1 bis 2 ms) Zeitfenster aus dem Wege gehen.
z.B. über einen Teiler verhindern, dass ein Wert pendelt.
Eine langsamere Zählrate ist meist angenehmer, als ein hakelige Bedienung.
Wenn's ein 'normaler' Dreh-Encoder ist, kann ich die Werte doch pollen - Der liefert doch graycode, selbst wenn Da Was prellt, macht Das Nichts.
Die Übernahme des neuen Wert sollte allerdings in dem Wechsel stattfinden, Der der Ruhelage um 180° versetzt ist - sonst hüpft der Wert beim bloßen Angucken des Encoder.
Das mit dem Taster ha ich wohl fälschlich (um 2:00 Uhr morgens) ins Spiel gebracht.
Ich ging davon aus, dass man beide Pins über Interrupt einlesen müsse.
Hab aber combie's Lesestoff reingezogen und bin nun schlauer.
In der Lib wird aber der sogenannte externe Zähler erst hochgetählt wenn eine Raste (4 Flanken) erreicht sind. Wenn ich das richtig sehe halbiert sich die Auflösung.
Es wird übrigens ein Interrupt bei steigender und fallender Flanke ausgelöst. An der Auslastung habe ich aber nichts negativ bemerkt.
Auf der Seite wird auch die Möglichkeit über einen Kondensator (100nF) das Prellen zu mindern. Ist das eine Option?
Wenn man das über Timerinterrupt lösen wollte, wäre das folgende Vorgehen sinnvoll?
Messen der Flanken bei max. Drehgeschw. mit dem Oszi.
Annahme: 5 Rasten pro s -> 20 Flanken pro s -> Zeit zwischen den Flanken 50 ms
Wäre dann ein Timerinterrupt alle 25 ms sinnvoll?
Was "ich" für sinnvoll halte habe ich schon gesagt!
Wenn es irgend geht sollte man einem (größeren als 1 bis 2 ms) Zeitfenster aus dem Wege gehen.
Wenn man das über Timerinterrupt lösen wollte, wäre das folgende Vorgehen sinnvoll?
Timer0 wird in der Regel schon von Arduino genutzt.
Allerdings nur der Timer Overflow
Die zwei Compare Interrupts sind noch frei.
Damit bekommt man bei 16MHz AVRs ca alle 1ms einen Interrupt. Und bei 8MHz alle 2ms
Ist also perfekt geeignet.
Da kann man sich einhängen.
In der Lib wird aber der sogenannte externe Zähler erst hochgetählt wenn eine Raste (4 Flanken) erreicht sind.
Es ist richtig, zu teilen!
Denn sonst gibt es zwischen den Raststufen Werte, welche man nicht erreichen kann.
Und das kann so nicht gewollt sein.
Die noch bessere Variante kann man bauen, wenn man einen ARM verwendet.
Denn dessen Timer Hardware (leider nicht jeder Timer) kann direkt den Encoder lesen und auswerten.
Incl. entprellen und teilen.
Dann ist im User Code kein Klimmzug mehr nötig und auch keine ISR.
Außer Timer einrichten und Zählerstand abfragen muss nix gemacht werden.
Das geht dann auch für sehr schnelle Encoder, z.B. die auf einer Motorwelle
Ja das entprellen mit einem Kondensator wäre prinzipiell eine Option, allerdings gerade aktell nicht da es sich nur um eine Bastelei handelt und ich gerade auf Montage im Ausland bin.
Der Encoder ist nur ein Teil eines größeren Projektes, um sicherzugehen dass der Encoder immer gelesen wird deshalb der Interrupt.
der Typ des Encoders ist KY040. Manchmal geht ja auch eine raste. Ich brauche Später eine feine Auflösung von nur 1 pro raste.
eigentlich wollte ich nicht noch eine lib einbinden. aber werde es mal versuchen.