PIC-Lernbeispiel: Rotary-Encoder auswerten


zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage

Ein Rotary-Encoder kann oft eine Tastatur ersetzen. 
Er gibt beim Drehen Impulse ab, die sich nach Drehrichtung unterscheiden, außerdem ist auch noch eine Druck-Taster-Funktion enthalten. Bisher hatte mich der hohe Preis von Rotary-Encodern abgeschreckt, doch nun gibt es bei Pollin nebenstehenden Encoder für unter 2€. (inzwischen leider ausverkauft)

Funktion eines Rotary-Encoders
Der Rotary Encoder enthält 2 Lichtschranken, die beim Drehen abwechseln unterbrochen oder frei gegeben werden. Die Ausgänge der Lichtschranken sind herausgeführt. Der Drehknopf hat pro Umdrehung 32 leichte Rastpositionen, um ein päzises Drehgefühl zu vermitteln. Pro Umdrehung liefern beide Ausgänge je 8 symmetrische Rechteck-Pulse. Die Pulse beider Ausgänge sind um 1/4 Rechteckpuls verschoben. Dadurch lässt sich die Drehrichtung feststellen.

Einige Encoder rasten nur in jeder zweiten Position. Sie machen also immer zwei Schritte auf ein Mal. Wer einen solchen Encoder einsetzt, muss das in der Software berücksichtigen. Mein Encoder rastet aber in jeder Position.
Eine abgewandelte Schaltung, die auch mit solchen "doppelschrittigen" Encoder zurecht kommt findet man hier.


Schaltung
Der Rotary Encoder hat zwei digitale Impulsausgänge (Pin5 & 4), für die Drehfunktion. Diese beiden Pins müssen mit 2,2kOhm Widerständen nach Vdd verbunden werden, um TTL-gerechte Pegel zu garantieren. Beide Pins werden dann an je ein Pin des PIC geführt.

Der Rotary-Encoder benötigt eine 5V-Betriebsspannung, deshalb wird ihm Vss und Vdd (Pin 1 & 6) zugeführt.

Außerdem hat der Encoder einen mechanischen Drucktaster, für dessen Nutzung ein PIC-Pin und ein weiterer Hochziehwiderstan nötig sind. Da ich in diesem Beispel diesen Kontakt (Pin 2 & 3) nicht benutze, fehlt die entsprechende Beschaltung im nebenstehenden Stromlaufplan.

Für den Aufbau eignet sich eine 16F84/62x-Testplatine oder eine 16F84/62x-Minitestplatine mit angesteckter LED-Platine.

clicken zum Vergrößern


Programmablauf


Programmlisting

        list p=16f628
;**************************************************************
;*      Pinbelegung
;*      ---------------------------------- 
;*      PORTA:  0 < rotary encoder - B Pin4
;*              1 < rotary encoder - A Pin5
;*              2 -
;*              3 -
;*              4 -
;*              5 -
;*              6 -
;*              7 -
;*
;*      PORTB:  0 > LED
;*              1 > LED
;*              2 > LED
;*              3 > LED
;*              4 > LED
;*              5 > LED
;*              6 > LED
;*              7 > LED
;* 
;**************************************************************
;
;sprut (zero) Bredendiek 01/2003
;
; Rotary-Encoder mit LED Zeile
;
; Prozessor 16F628 
;
; Prozessor-Takt 10 MHz
;
; Rotary Encoder am PortA 0 & 1
; LED-Zeile am PortB
;
;**************************************************************
; Includedatei für den 16F628 einbinden

        #include <P16f628.INC>

        ERRORLEVEL      -302            ; SUPPRESS BANK SELECTION MESSAGES
 

; Configuration festlegen:
; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
        __CONFIG        _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF

; Constanten festlegen
#define encoder PORTA
#define LED     PORTB

; Variable festlegen
temp    equ     0x20                    ; Arbeitsregister 
counter equ     0x21                    ; Zählstand
alt     equ     0x22                    ; alte Rotor-Position
neu     equ     0x23                    ; aktuelle Rotorposition

;**************************************************************
; Programmanfang

        org     0

;**************************************************************
; Initialisierung *********************************************

init
        bsf     STATUS, RP0             ; Bank 1
        clrf    OPTION_REG 
        movlw   B'00000000'             ; PortB alle outputs 
        movwf   TRISB
        bcf     STATUS, RP0             ; Bank 0
        clrf    PORTB                   ; LEDs aus
        clrf    INTCON                  ; Interrupt disable

; 16F628 alle Comparatoreingänge auf Digital umschalten
        BSF     CMCON, CM0
        BSF     CMCON, CM1
        BSF     CMCON, CM2

        clrf    counter
        movfw   encoder
        movwf   alt                     ; aktuelle encoder-Stellung lesen
        movlw   B'00000011'
        andwf   alt, f                  ; nur 2 LSB stehen lassen

;Hauptprogrammschleife
loop
        call    read_encoder            ; Rotary Encoder abfragen
        movfw   counter
        movwf   LED                     ; Zählerstand anzeigen
        goto    loop
 

;**************************************************************
; Test des Encoders auf Verdrehung ****************************

read_encoder
        movfw   encoder
        movwf   neu                     ; aktuelle encoder-Stellung nach new
        movlw   B'00000011' 
        andwf   neu, f                  ; nur 2 LSB stehen lassen
        movfw   neu                     ; wurde der encoder bewegt?
        movwf   temp
        movfw   alt
        xorwf   temp, w                 ; ist neu = alt?
        bz      ende                    ; ja: nicht verdreht, also nichts tun
                                        ; nein: encoder verdreht, aber in welche Richtung?
                                        ; drehen wir mal Bit0 des alten werts zum Vergleich 
                                        ;  nach links
        bcf     alt, 1
        clrc                            ; Carry-Flag löschen
        rlf     alt, f                  ; alten Encoder-Stand um 1 Stelle nach links drehen
        movfw   neu
        xorwf   alt, f                  ; falls xorf >1 ergibt, dann war es eine Rechtsdrehung
        bz      links                   ; links:  decrement counter
        decf    alt, f
        bz      links                   ; links:  decrement counter
rechts
        incf    counter, f              ; rechts:  increment counter
        goto    weiter
links
        decf    counter, f              ; links:  decrement counter
weiter
        movfw   neu
        movwf   alt                     ; neu für nächsten Vergleich als alt speichern
ende
        return

        end


zurück zu Lernbeispiele , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 08.01.2003
letzte Änderung: 05.11.2008