Hallo,
Drehencoder sind hier ja ein beliebtes Thema. FAQ habe ich gelesen, der Ansatz mit den Automaten/state-machines ist mir bekannt.
Ich wollte das Ganze nun mal auf andere Art und Weise probieren: Die Phase die sich zuerst ändert gibt ja schon die Drehrichtung an (oder liegt hier schon mein Fehler?). Also habe ich schnell und schmutzig einen C-Code für einen PIC zusammengetippert. Der läuft auch, aber die Abfrage ist unzuverlässig, die Drehrichtung wird nicht immer richtig erkannt.
Ich vermute, dass mein PIC zu langsam (mit RC-Oszillator, ca. 240 nops/ms) bzw. mein Code zu gross (der CC5xfree macht aus den if-Anweisungen ca. 20 Instruktionen) ist. Dem LCD lasse für jedes print_zeichen 4ms (2ms pro 4-bit Nibble) Zeit, ist das der Fehler?
Es besteht natürlich auch die Möglichkeit, dass ich hier grundsätzlich auf dem Holzweg bin, deshalb bitte die uC-Meister hiermit um ihre Meinung.
Hier kommt jetzt ein Stück vom C-Source, die Idee dahinter ist das ständige Abfragen der Pegel enc1 und enc2, zwischenspeichern und wieder vergleichen:
------------------------ . . . enc1alt=enc1; // var vom Typ bit für alte werte enc2alt=enc2; // der phasen initialisieren encwert='A'; // encwert ist char while (1) // Hauptschleife { // ab hier encoder demo steuermodus(); // für das LCD print_zeichen(0); // Cursor an Stelle 0=Anfang 1. Zeile, // Verzögerung 4ms if (enc1!=enc1alt) encwert++; // Bei Änderung den encwert // erhöhen/erniedrigen if (enc2!=enc2alt) encwert--; // Wenn zu schnell gedreht wird // keine Änderung, da +1-1=0 schreibmodus(); // auch LCD print_zeichen(encwert); // der Wert wird als ASCII aufs LCD // gegeben, Verzögerung 4ms enc1alt=enc1; enc2alt=enc2; }
--------------------------
mfg, Bernd