Hallo noch mal,
ich habe deine Software gerade getestet und bin sehr zufrieden. Ich würde sagen nun funktioniert die Auswertung zu ca. 95%. Hier mal mein angepasster Code für meinen Anwendungsfall:
Erstaunlicherweise funktioniert das ganze besser, wenn ich die Fuse aktiviere, die den internen Clock durch 8 teilt, also wenn der AVR langsamer läuft.Code:#define AVRGCC #include <avr/io.h> /** PD2 Eingang Spur A PD3 Eingang Spur B PB0 Ausgang links PB1 Ausgang rechts **/ #define Links1 PORTB = (PORTB | (1<<PB0)) #define Links0 PORTB = ~(~PORTB | (1<<PB0)) #define Rechts1 PORTB = (PORTB | (1<<PB1)) #define Rechts0 PORTB = ~(~PORTB | (1<<PB1)) #define SpurA ((PIND & 0b00000100) == 0) #define SpurB ((PIND & 0b00001000) == 0) char SpurA_akt, SpurA_old, SpurB_akt, SpurB_old, count = 0, dir = 0; int main(void) { DDRB = 0b00000011; PORTB = 0b00000011; DDRD = 0b00000000; PORTD = 0b00001100; Rechts0; Links0; SpurA_akt = SpurA_old = SpurA; SpurB_akt = SpurB_old = SpurB; while (1) { do // warten bis Bitwechsel erkannt wird { SpurA_akt = SpurA; SpurB_akt = SpurB; if (count > 0) { count--; if (count == 0) { Rechts0; Links0; } } } while ((SpurA_akt == SpurA_old) && (SpurB_akt == SpurB_old)); if (SpurA_akt == SpurA_old) // Bitwechsel war bei Spur B { if (SpurA_akt) { if (SpurB_akt) Links1; else Rechts1; } else { if (SpurB_akt) Rechts1; else Links1; } } else // Bitwechsel war bei Spur A { if (SpurB_akt) { if (SpurA_akt) Rechts1; else Links1; } else { if (SpurA_akt) Links1; else Rechts1; } } SpurA_old = SpurA_akt; SpurB_old = SpurB_akt; count = 4; } return(0); }
Wie könnte man das ganze jetzt noch verbessern, damit aus den 95% vielleicht 100% werden? In professionellen Geräten bekommen die das ja auch irgendwie hin.
Viele Grüße
Andreas







Zitieren
Lesezeichen