Spanky
03.09.2009, 22:10
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
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Linksrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Sieht soweit ja ganz gut aus. Das eine ma falsch nehm ich in kauf.
Jetzt Linksrum:
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Linksrum
Linksrum
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Linksrum
Linksrum
Das wiederrum find ich net so gut.
Hier mein 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;
}
Der Encoder gibt bei einer Rastung zwei Zustände von sich.
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
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
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Linksrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Rechtsrum
Sieht soweit ja ganz gut aus. Das eine ma falsch nehm ich in kauf.
Jetzt Linksrum:
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Linksrum
Linksrum
Linksrum
Linksrum
Rechtsrum
Linksrum
Linksrum
Linksrum
Linksrum
Das wiederrum find ich net so gut.
Hier mein 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;
}
Der Encoder gibt bei einer Rastung zwei Zustände von sich.
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