Und täglich grüßt das Murmeltier. Nein, die Routine ist wirklich anders.
Ich habe mir den Beitrag über Drehgeber genau durchgelesen. Und auch
andere Beiträge wie:
http://www.technoblogy.com/show?1YHJ
oder
http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29
sind interessant.
Hier ist meine Idee. Primär ist es für Handdrehgeber gemacht, da das
Prellen hier sehr störend ist. Der entscheidende Unterschied ist das
Speichern der letzten beiden Positionen anstatt nur der Letzten. Damit
ist auch ein Richtungswechsel erkennbar. Und genau das passiert beim
Prellen bzw. Flattern am Schaltpunkt. Die Routine filtert den
Richtungswechsel, und damit auch das Prellen, heraus. Das Ganze
funktioniert auch mit der hohen 1:4 Abtastung. Das Programm ist sehr
einfach an eine 1:1, 1:2 oder 1:4 Abtastung anzupassen, indem man die
Lookup Tabelle ändert.
Als Eingabeparameter gibt es A und B. Eine 0 ist ein Low-Pegel und alles
was größer als 0 ist, ist ein High-Pegel. Damit kann man den
entsprechenden Pin eines Ports übergeben, ohne das Bit verschieben zu
müssen.
Zurück kommt entweder 0 (nichts passiert), 1 (ein Schritt nach vorne)
und -1 (ein Schritt zurück). Damit kann man das Ergebnis direkt auf
einen Zähler addieren. Natürlich kann man es auch individuell auswerten.
Das Beispiel ist auf einem ATtiny13A im Einsatz. Es kann aber, durch
seinen sehr einfachen Aufbau, leicht an andere Controller oder sogar
Sprachen angepasst werden.
Ob man diese Routine mit Polling oder Interrupt aufruft, soll hier nicht
das Thema sein. Der Routine ist das egal.
FAQ:
Ist es eine Sparvariante?
Nein, beide Signale werden ausgewertet.
Muss ich die Signale entprellen?
Nein. Die Routine entprellt automatisch.
Was mache ich bei wackeligen Rastpunkten?
Nix. Wird gefiltert.
Kann ich bei "wackeligen" Drehgebern Spur A und B beliebig vertauschen?
Ja. Ist egal.
Gibt es ein böses Prellen bei der Abtastung?
Nein, was auch immer das ist.
Ist die Routine Positions-Stabil?
Ja, die Position der Drehgeber stimmt immer mit der gesendeten Position
überein. Ein Hoch- oder Runterzählen bei kurzen Hin- und Her- Bewegungen
findet nicht statt. Das ist bei der Routine von technoblogy.com nicht
der Fall.
Gibt es sonst was zu beachten?
Bei der 1:4 Abtastung fehlt beim rückwärts drehen ein Signal. Beim
vorwärts drehen passt es aber wieder. Wenn man will, kann man das bei
der Ausgabe des Zählers kompensieren. Es darf aber nicht auf den
eigentlichen Zahler addiert werden, sondern nur bei der Ausgabe.
Normalerweise sollte das Verhalten nicht stören. Bei der 1:1 oder 1:2
Abtastung gibt es das Problem nicht.
Sollte bei der 1:1 Abtastung die Signale A und B auf Low liegen, sind
die beiden IF abfragen zu invertieren. Bei der 1:2 oder 1:4 Abtastung
ist das nicht notwendig.
1 | if (dgA != 0) dgVal |= 0b01;
|
2 | if (dgB != 0) dgVal |= 0b10;
|
Was haltet ihr von der Idee? Eine alternative zur PeDa Lösung?