//************************************************************************* Title: Drehgeberverarbeitung (Headerfile) Author: Volker Endres File: $Id: drehgeber.h ,v 30.10.2005 13:33$ Software: AVR-GCC 3.4.3 Hardware: STK500 Function: Drehgeber verarbeiten mit einem Interrupt und Tiefpass **************************************************************************/ #ifndef DREHGEBER_H #define DREHGEBER_H #include #include /*********** Anschluss konfiguration ************/ // Interrupt Konfiguration // A-Anschluss des Drehgeber #define DREH_A_PORT PORTD #define DREH_A_PIN PD0 #define INT_EINGANG INT0 #define IMSK EIMSK #define SIG_INTERRUPT SIG_INTERRUPT0 #define ISCX0 ISC00 #define ISCX1 ISC01 #define FLANKE EICRA // B-Anschluss des Drehgeber #define DREH_B_PORT PORTD #define DREH_B_PIN PD1 // Taster-Anschluss #define TAST_PORT PORTA #define TAST_PIN PA3 /*********** Anschluss konfiguration ************/ /******************************************************* Funktion zur Initialisierung des Drehgeber und den integrierten Taster ********************************************************/ void drehgeber_init(void); /******************************************************* Funktion um den Drehgeber auszuwerten input: 1 um den Drehgeber wieder zurückzusetzen output: gibt den Gesamtzustand von Drehgeber und Taster wie folgt zurück: 0 Drehgeber und Taster unverändert 1 Vorwärts Taster nicht gedrückt 2 Vorwärts Taster gedrückt 3 Rückwärts Taster nicht gedrückt 4 Rückwärts Taster gedrückt ********************************************************/ uint8_t get_drehgeber(uint8_t ausgabe); // PORT Umrechnung #define DDR(x) (*(&x - 1)) /* address of data direction register of port x */ #if defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) /* on ATmega64/128 PINF is on port 0x00 and not 0x60 */ #define PIN(x) ( &PORTF==&(x) ? _SFR_IO8(0x00) : (*(&x - 2)) ) #else #define PIN(x) (*(&x - 2)) /* address of input register of port x */ #endif #endif /* DREHGEBER_H */ /************************************************************************* Title: Drehgeberverarbeitung Author: Volker Endres File: $Id: drehgeber.c,v 1.0 05.11.2005 23:53$ Software: AVR-GCC 3.4.3 Hardware: ATmega32 auf STK500 Function: Drehgeber verarbeiten mit einem Interrupt und Tiefpass **************************************************************************/ #include #include #include #include "drehgeber.h" volatile uint8_t zustand; // Funktion zur Initialisierung des // Drehgeber und den integrierten Taster void drehgeber_init(void) { uint8_t state; // Initialisierung Geber DDR(DREH_A_PORT) &= (1 << DREH_A_PIN); // PORT als Eingang def. DREH_A_PORT |= (1 << DREH_A_PIN); // PULLUP deaktivieren state = PIN(DREH_A_PORT) & (1 << DREH_A_PIN); // Anfangszustand des Gebers ausmaskieren if (state) // Ausgangszustand für die Flankenart auswerten { FLANKE &= (1 << ISCX0); // fallende Flanke... } else { FLANKE |= (1 << ISCX0); // steigende Flanke... } FLANKE |= (1 << ISCX1); // ... an INTX setzen IMSK |= (1 << INT_EINGANG); // Interrupt INTX aktivieren // Initialisierung Taster DDR(TAST_PORT) &= (1 << TAST_PIN); // PORT als Eingang def. TAST_PORT |= (1 << TAST_PIN); // PULLUP aktivieren } // Interruptservice SIGNAL(SIG_INTERRUPT) { uint8_t a,b; a = FLANKE & (1 << ISCX0); // Flankenzustand ausmaskieren b = (PIN(DREH_B_PORT) & (1 << DREH_B_PIN)) >> DREH_B_PIN; // Zustand von B ermitteln und nach rechts schieben if (a == b) { zustand = 1; } else { zustand = 3; } zustand += (~PIN(TAST_PORT) & (1 << TAST_PIN)) >> TAST_PIN; // Taster einlesen und Zustandsvari. verändern IMSK &= (1 << INT_EINGANG); FLANKE ^= (1 << ISCX0); // Flankenerkennung toggeln für INT0 EIFR |= (1 << INTF2); IMSK |= (1 << INT_EINGANG); } // Funktion um den Drehgeber auszuwerten uint8_t get_drehgeber(uint8_t input) { if (input == 1) zustand = 0; return(zustand); }