Datum:
uint8_t encoder = 0; //... while (1){ cli(); encoder += enc_delta; enc_delta = 0; sei(); uint8_t s[3]; sprintf (s, "encoder: %3d", encoder); vfd_cstring(2,s); } |
Hi! Ich benutze auch den Drehgeber-Code von Peter Dannegger ( Code ganz oben, die zweite!) wie in dem letzten Beispiel wird auch die enc_delta benutzt um den zähler [c]uint8_t encoder = 0;[/] hoch bzw. runter zu zählen. leider springt der wert aber nur zw. 0 und 255 bei linksdrehung und zwischen 0 und 1 bei rechtsdrehung. ich habe mir nun schon einige beispiele hier angesehen und beiträge gelesen, stehe aber leider auf dem schlauch. kann mir jemand helfen bzw. einen tip geben?? (ps. ich benutze einen drehgeber OHNE rastung) Danke, Christoph
Datum:
Christoph Weidenhaupt wrote: > leider springt der wert aber nur zw. 0 und 255 bei linksdrehung und > zwischen 0 und 1 bei rechtsdrehung. - falsch angeschlossen - Pullups fehlen - Drehgeber kaputt (mal beide Inputs auf LEDs ausgeben). Peter
Datum:
Wie hast du denn dein Encoder angeschlossen und welchen µC verwendest du? Am besten noch den Link zum Programm. MfG Steven Edit: Odda so (Peda).
Datum:
Angehängte Dateien:#include <io.h> #include <interrupt.h> #include <signal.h> #define PHASE_A (PINC & 1<<PINC0) // PINC.0 #define PHASE_B (PINC & 1<<PINC1) // PINC.1 volatile char enc_delta; // -128 ... 127 int main( void ) { TCCR0 = 1<<CS01; //divide by 8 * 256 TIMSK = 1<<TOIE0; //enable timer interrupt DDRB = 0xFF; sei(); // hier eben mein code !!! (s.o.) } SIGNAL (SIG_OVERFLOW0) { static char enc_last = 0x01; char i = 0; if( PHASE_A ) i = 1; if( PHASE_B ) i ^= 3; // convert gray to binary i -= enc_last; // difference new - last if( i & 1 ){ // bit 0 = value (1) enc_last += i; // store new as next last enc_delta += (i & 2) - 1; // bit 1 = direction (+/-) } } |
hoffe das reicht... >Peter: >... Drehgeber kaputt Würde sagen das Oszi bild sieht ok aus, leider habe ich nur nen Analog oszi ohne speicher, kann das also nicht sooo gut beurteilen...
Datum:
@Christoph Weidenhaupt (squid1356) >Dateianhang: dreh.png (1,5 KB, 1 Downloads) Sieht OK aus, aber >#define PHASE_A (PINC & 1<<PINC0) // PINC.0 >#define PHASE_B (PINC & 1<<PINC1) // PINC.1 Hier steht PINC, in deinem Schaltplan PINB?!? >Würde sagen das Oszi bild sieht ok aus, leider habe ich nur nen Analog >oszi ohne speicher, kann das also nicht sooo gut beurteilen... Ein Multimeter oder zwei LEDs reichen. Klemm die mit Vorwiderstand parallel zu den 10K. UNd dreh mal langsam mit festgehaltenem Drehgeber. MFG Falk
Datum:
Falk Brunner wrote: >... >>#define PHASE_A (PINC & 1<<PINC0) // PINC.0 >>#define PHASE_B (PINC & 1<<PINC1) // PINC.1 > Hier steht PINC, in deinem Schaltplan PINB?!? ach, verdammt, der schaltplan ist falsch PINC ist natürlich richtig. wie oben beschrieben: der drehgeber arbeitet auch.
enc_delta |
auf meinem display ausgegeben gibt mir ja ein "+1" bei rechts- und ein "-1" bei linksdrehung. das scheint mir doch ok zu sein?? wenn ich da nicht verkehrt liege müßte doch dann mit folgenden Zeilen:
cli();
encoder += enc_delta;
enc_delta = 0;
sei();
|
...die Variable
encoder |
ihren Wert entsprechend dem Drehgeber ändern ??!
Datum:
Angehängte Dateien:....hier jetzt also noch der korrigierte Plan. Hängt übrigens am STK500 Entwicklerboard.

