Softwaremässig könnte es so ähnlich aussehen:
Code:
#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];
}
Das ist so simpel, daß ich mit den Kommentar spare 
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?
Lesezeichen