Hiho,
ich hab seit längerem den Encoder von Pollin (Best.Nr. 240 313) hier rumliegen. Vorgestern hab ich den dann an meinen RP6 angeschlossen.
Gestern hab ich dann das Programm zum Auswerten der Drehrichtung fertig bekommen. Aber es ist ungenau.
Hier mal ein Ausschnitt aus dem Log:
Rechtsdrehung mit ca. 1 Raster / 500ms
Sieht soweit ja ganz gut aus. Das eine ma falsch nehm ich in kauf.Code:Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Linksrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum Rechtsrum
Jetzt Linksrum:
Das wiederrum find ich net so gut.Code:Linksrum Linksrum Rechtsrum Linksrum Linksrum Rechtsrum Linksrum Linksrum Rechtsrum Linksrum Linksrum Rechtsrum Linksrum Linksrum Linksrum Linksrum Linksrum Linksrum Rechtsrum Linksrum Linksrum Linksrum Linksrum
Hier mein Code
Der Encoder gibt bei einer Rastung zwei Zustände von sich.Code:#include "RP6ControlLib.h" int main(void) { initRP6Control(); writeString_P("\n\nEncoder Testing\n"); // Play two sounds: sound(180,80,25); sound(220,80,25); setLEDs(0b1111); // Turn all LEDs on! initLCD(); showScreenLCD("################", "################"); mSleep(500); showScreenLCD("Encoder Testing", ""); mSleep(1000); DDRD &= ~IO_PD6; //PD6 als Eingang DDRC &= ~IO_PC2; //PC2 als Eingang setLEDs(0b0000); // All LEDs off! uint8_t laststate = 0b111; while(true) { // Encoder auswerten if(((PIND & IO_PD6) == 0b0) & ((PINC & IO_PC2) == 0b100) & (laststate != 0b01)) { laststate = 0b01; } if(((PIND & IO_PD6) == 0b1000000) & ((PINC & IO_PC2) == 0b100) & (laststate != 0b11)) { if(laststate == 0b01) { writeString_P("Rechtsrum\n"); laststate = 0b111; } else if(laststate == 0b10) { writeString_P("Linksrum\n"); laststate = 0b111; } else { laststate = 0b11; } } if(((PIND & IO_PD6) == 0b1000000) & ((PINC & IO_PC2) == 0b0) & (laststate != 0b10)) { laststate = 0b10; } if(((PIND & IO_PD6) == 0b0) & ((PINC & IO_PC2) == 0b0) & (laststate != 0b00)) { if(laststate == 0b10) { writeString_P("Rechtsrum\n"); laststate = 0b111; } else if(laststate == 0b01) { writeString_P("Linksrum\n"); laststate = 0b111; } else { laststate = 0b00; } } } return 0; }
Und jeweils zwei verschiedene Zustände für jede Richtung.
Das lässt sich mit zwei Bit am besten Darstellen. Bit1 = PD6 | Bit2 = PC2
Zustand1 - Zustand2 bei einer Rastung.
1-Rechts: 01 - 11
2-Rechts: 10 - 00
1-Links: 10 - 11
2-Links: 01 - 00
Soviel zur Funktion des Encoders.
Ich bin mir nicht sicher ob das an meinem Programm oder am Encoder liegt.
Vielleicht kann man noch etwas verbessern / verändern. Bin für alles offen.
Gruß
Spanky







Zitieren

Lesezeichen