B
Bernd Maier
Guest
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
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