-
Hallo sast,
Das was Du in deinem Post beschreibst, ist doch nur der Greycode. Das werte ich ja genau in meinem Code aus.
Deinen Edit-Absatz verstehe ich ehrlich gesagt nicht ganz. Heißt das, dass ich für Phase B einen zweiten externen Interrupt bräuchte, damit ich bei jeder "Raste" ein Ergebnis erhalte?
@Izaseba: Kein Thema. Du hast mir so gut es ging geholfen! Und mit mikrokontroller.net habe ich eine gigantische Quelle für diese Menü-Programmiererei. Auch wenn ich bei dem wenigsten sofort durchsteige :-k.
MfG, Manni
-
Wenn ich deine Aussagen richtig verstehe, hattest du geschrieben, dass du den einen Ausgang über die fallende oder steigende Flanke auswertest. Dadurch ergibt sich natürlich der Sachverhalt, dass du nur jeden vierten Impuls misst.
Ob du das nun Greycode nennst oder nicht ändert nichts daran, dass du alle 4 Zustände verarbeiten musst um die komplette Auflösung zu nutzen.
sast
-
Ok, verstanden. Ein Lösungsansatz dafür wäre also, den Pinchange-Interrupt auf steigende und fallende Flanke zu stellen und in der ISR beide Pins auf ihren Zustand abzufragen? Somit müsste man doch schonmal die doppelte Auflösung erlangen, oder?
Wenn ich dann noch die volle Auflösung nutzen möchte, dann müsste ich das ganze Verfahren noch auf einen zweiten ext. Interrupt ausweiten, richtig?
Übrigens: "Greycode" nenne nicht ICH das, sondern so heißt dieses Signal, wo sich immer nur ein Bit ändert.
Gruß, Manni
-
Ja, genau das wollte ich damit zum Ausdruck bringen. Eigentlich wollte ich dir nur erklären, warum gerade jeder 4. Impuls etwas gemacht hat.
sast
-
So, nach einigem Ausprobieren und rumgetüftle, sieht meine ISR jetzt so aus:
Code:
_delay_ms( 1 );
if( ( PIND & ( 1 << PIND2 ) ) && ( PIND & ( 1 << PIND3 ) ) ) zaehler--;
if( ( !( PIND & ( 1 << PIND2 ) ) ) && ( !( PIND & ( 1 << PIND3 ) ) ) ) zaehler--;
if( ( !( PIND & ( 1 << PIND2 ) ) ) && ( PIND & ( 1 << PIND3 ) ) ) zaehler++;
if( ( PIND & ( 1 << PIND2 ) ) && ( !( PIND & ( 1 << PIND3 ) ) ) ) zaehler++;
Der Interrupt wird bei jeder Zustandsänderung ausgelöst. Somit wird jetzt jeder zweite Tick erkannt.
Ausweiten könnte man das ganze jetzt noch, indem man wie oben schon gesagt, einen zweiten ext. Interrupt-Pin auf die zweite Phase ansetzt. Die Auflösung von 50% reicht mir, weil ich keinen weiteren externen Interrupt opfern möchte. Das Drehgefühl ist jetzt auch ganz angenehm.
Entprellt habe ich das ganze noch weiter mit dieser Mini-Pause. Die Pause habe ich schon runteroptimiert soweit es ging. Da geht nicht viel Rechenzeit drauf und es ist sowohl einfach als auch funktionell, weil jetzt gar nix mehr prellt.
Dann muss ich mich jetzt wirklich nur noch um das Coden des Menüs kümmern.
Gute Nacht, (euer für heute sehr zufriedener O:) ) Manni