Hi, ichhab noch eine kleinigkeit hinzuzufügen:

Bei meinem Programmvorschlag muss noch folgende Zeile angehängt werden:

if( DREH_A_NEU != DREH_B_NEU ){ DREH_WAY = 0; }

Zu dem Zeitpunkt zu dem ein Imopuls registriert ist, müssen A und B gleich sein. Sie sind immer entweder beide HIGH oder beide LOW.

Anders kann es passieren dass der Drehgeber mal in die falsche richtung dreht!

das Ganze sieht dann so aus:


Code:
#define DREH_DDR		DDRC
#define DREH_PIN		PINC
#define DREH_PORT		PORTC
#define DREH_A			0
#define DREH_B			1
#define DREH_P			2

uint8_t DREH_A_NEU;
uint8_t DREH_B_NEU;
uint8_t DREH_A_ALT;
uint8_t DREH_B_ALT;
uint8_t DREH_A_FLAG;
uint8_t DREH_B_FLAG;


uint8_t DREH_FLAGS = 0;
uint8_t DREH_WAY = 0;

void DREHGEBER( void ){
	
	// PINS als Eingang schalten, Pullups einschalten
	DREH_DDR &=~ (1<<DREH_A)|(1<<DREH_B)|(1<<DREH_P);
	DREH_PORT |= (1<<DREH_A)|(1<<DREH_B)|(1<<DREH_P);
	
	// Eingänge abfragen
	if( DREH_PIN & (1<<DREH_A) ){ DREH_A_NEU = 0; }else{ DREH_A_NEU = 1; }
	if( DREH_PIN & (1<<DREH_B) ){ DREH_B_NEU = 0; }else{ DREH_B_NEU = 1; }
	//if( DREH_PIN & (1<<DREH_P) ){ DREH_P_NEU = 0; }else{ DREH_P_NEU = 1; }
	
	if( DREH_A_NEU != DREH_A_ALT ){
		if(DREH_B_FLAG){ DREH_WAY = 1; }else{ DREH_A_FLAG = 1; }
		DREH_A_ALT = DREH_A_NEU;
	}
	
	if( DREH_B_NEU != DREH_B_ALT ){
		if(DREH_A_FLAG){ DREH_WAY = 2; }else{ DREH_B_FLAG = 1; }
		DREH_B_ALT = DREH_B_NEU;
	}	
	
	if( DREH_A_NEU != DREH_B_NEU ){ DREH_WAY = 0; }
	
}

auswertung ( im hauptprogramm ):


Code:
while(1){

	DREHGEBER();
	
	if( DREH_WAY == 1 ){ DREH_WAY=0; DREH_B_FLAG = 0; x--; }
	if( DREH_WAY == 2 ){ DREH_WAY=0; DREH_A_FLAG = 0; x++; }
	
	if( x < 1 ){ x = 1;  }
	if( x > 11){ x = 11; }
	
	if( x != y ){
		switch( x ){
			case 1  : LCD_WRITE_TEXT( 1, "        Menue      >" ); break;
			case 2  : LCD_WRITE_TEXT( 1, "<   Konfiguration  >" ); break;
			case 3  : LCD_WRITE_TEXT( 1, "<  Displayoptionen >" ); break;
			case 4  : LCD_WRITE_TEXT( 1, "<  Referenzfahren  >" ); break;
			case 5  : LCD_WRITE_TEXT( 1, "<       Eins       >" ); break;
			case 6  : LCD_WRITE_TEXT( 1, "<       Zwei       >" ); break;
			case 7  : LCD_WRITE_TEXT( 1, "<       Drei       >" ); break;
			case 8  : LCD_WRITE_TEXT( 1, "<       Vier       >" ); break;
			case 9  : LCD_WRITE_TEXT( 1, "<       Fünf       >" ); break;
			case 10 : LCD_WRITE_TEXT( 1, "<       Sechs      >" ); break;
			case 11 : LCD_WRITE_TEXT( 1, "<       Exit        " ); break;
		}
		LCD_Write_ZAHL( 40, x );
		y = x;
	}
	
	


}