Softwaremässig könnte es so ähnlich aussehen:
Das ist so simpel, daß ich mit den Kommentar spareCode:#define DREH_INVALID -128 char drehgeber_step (unsigned char a0, unsigned char a1) { static const char drehgeber_trainsitions[] = { 0, 1, -1, DREH_INVALID, -1, 0, DREH_INVALID, 1, 1, DREH_INVALID, 0, -1, DREH_INVALID, -1, 1, 0 }; static unsigned char a_alt; unsigned char a = a_alt; if (a0) a |= (1 << 2); if (a1) a |= (1 << 3); a_alt = a >> 2; return drehgeber_trainsitions[a]; }
In die Funktion kommt man rein mit den beiden Werten für A (zB a0) und B (zB a1). Wenn du A und B andersrum zuordnest, bekommst du die Drehrichtung genau andersrum.
Zu Anfang des Programms musst du die Routine einmal mit den Portwerten aufrufen, um a_alt richtig zu initialisieren (den return-Wert wirfst du weg).
Entweder du machst das in einer ISR oder per Poll.
Die Code ist Standard-C und nicht speziell für C16x.
Der C16x hat doch nen Quadratur-Decoder...oder war das TriCore?![]()







Zitieren

Lesezeichen