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?