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;
}
}
Lesezeichen