Freut mich, daß es für Dich paßt. Im Programm kann man aber noch viele Verbesserungen und Optimierungen vornehmen.
- Man könnte zB versuchen den Takt für den Stepper HW-mäßig auszugeben.
Dazu den zB den OC0A Pin als Ausgang zum Stepper nutzen. Da ließe sich die Isr_Timer0 sparen- Mit erstem kurzen Tastendruck den Motor einschalten, wie jetzt und mit anderem kurzem Druck den Laufrichtungswechselmodus wieder ausschalten, wenn dieser eingeschaltet ist. Motor läuft weiter nur in eine Richtung.
- Programmlesbarkeit/-übersichtlichkeit verbessern
- usw.
- aber siehe auch meine Signatur
![]()
Theorie zur verloren gegangenen Geschwindigkeitsregelung in den alten Versionen:
Debounce und Encoder werden pro Hauptschleifendurchlauf einmal aufgerufen.
Gerade wenn der Laufrichtungswechselmodus läuft, hat der Hauptschleifendurchlauf eine sehr lange Verzögerung in dem entsprechenden Case.
Der Alps liefert an seinen beiden Ausgängen vier verschiedene Zustände.
Die Encoder Funktion vergleicht den Zustand in einem Durchlauf mit dem folgenden Zustand im nächsten Durchlauf.
Vergeht dazwischen viel Zeit, kriegt die Encoder Funktion Zustandswechsel nicht mit, weil von einem Aufruf zum anderen 4 Wechsel stattgefunden haben und könnte dann keine Betätigung erkennen.
Es könnte auch zu falschen Auswertungen kommen; Rechtsdrehung statt Linksdrehung, wenn die Zustände zu weiteren ungünstigen Zeitpunkten erfaßt werden.
Ich bin doch auch nur ein Hobbyprogrammierer und fand in Deinem Problem eine dankbare Aufgabe. Also eigentlich müßte ich Dir danken
PS. Noch eine vermutliche Macke entdeckt und Änderung im letzten Code rot markiert.
Grund: Gedrueckt speichert immer den letzten Zustand und ändert sich erst, wenn
Taste neu betätigt wird. Ohne Änderung wird immer ein neuer Richtungswechselmodus eingeschaltet.
Gutes Gelingen bei Deinem Projekt und
Gruß
Searcher
Lesezeichen