Autor Thema: Drehencoder zum 1000. mal  (Gelesen 246 mal)

Offline LutzG

  • Newbie
  • *
  • Beiträge: 1
    • Profil anzeigen
Drehencoder zum 1000. mal
« am: Februar 24, 2017, 20:46:42 Nachmittag »
Hallo,

obwohl im Netz viele Beiträge zum Thema Drehencoder zu finden sind, mache ich mir damit gerade das Leben schwer.
Ursprünglich wollte den Sprut Code übernehmen, doch der hat recht wilde Ergebnisse geliefert.

Dann habe ich folgendes Verfahren gewählt:
Es wird das Pin A des Encoders auf eine steigende Flanke überwacht (momentan über einen Interrupt an Port B0).
Danach wird der Pegel des Pin B zur Ermittlung der Drehrichtung geprüft und entsprechend gezählt.
Das Ergebnis - es wird in beide Drehrichtungen immer nur nach oben gezählt. So als ob Pin B des Encoders immer high Pegel hätte.
Wenn ich mittels einer Drahtbrücke einen Masseschluss des Pin B mache, dann geht mein Zähler runter.
Also scheint der Code in Ordnung zu sein?
Ich habe Encoder von Conrad mit der Bestellnummer 700708 und 453429 sowie einen aus einer alten Maus.
Alle zeigen das gleiche Verhalten. Laut Datenblatt von Conrad müsste ich diesen Algorithmus jedoch so anwenden können.
Hat jemand Erfahrung mit diesen Encodern?
Ich habe mit PICs auch noch nicht viel gemacht. Deshalb hier der relevante Code:
list p=16f628A
;**************************************************************
;* PORTA/PIN:
;* 0/17 > LED 6
;*   1/18 > LED 7
;* 2/ 1 > Relais
;* 3/ 2 < rotary encoder - B
;* 4/ 3 < LED 3
;* 5/ 4 - MCLR
;* 6/15 > LED 4
;* 7/16 > LED 5
;* PORTB/PIN:
;* 0/ 6 > rotary encoder - A
;* 1/ 7 > LED 4
;* 2/ 8 < Kontakt Enc
;* 3/ 9 > PWM
;* 4/10 > LED rtgn
;* 5/11 > LED 1
;* 6/12 < Eingang Res.
;* 7/13 < Eingang Halt
;**************************************************************

#include <P16f628A.INC>
ERRORLEVEL      -302    ; SUPPRESS BANK SELECTION MESSAGES
; Power on Timer, kein Watchdog, interner 4-MHz-Oscillator, kein Brown out, kein LV-programming
__CONFIG _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _LVP_OFF

; Constanten festlegen
#define PortA PORTA
#define PortB PORTB
#define LED1 PortB,5
#define LED2 PortB,1
#define LED3 PortA,4
#define LED4 PortA,6
#define LED5 PortA,7
#define LED6 PortA,0
#define LED7 PortA,1
#define LEDrtgn PortB,4
#define EncA PortB,0
#define EncB PortA,3
#define KeyEnc PortB,2
#define EncKeyFlag  flags,0
#define EncImp_2 flags,1
#define LEDRefresh flags,2
#define IntEncA flags,3
#define EncBOld flags,4

; Variable festlegen
temp equ 0x20 ; Arbeitsregister
counter equ 0x21 ; Zaehlstand
cntTmp EQU 0x22 ; Temp. Counter für Anzeige
alt equ 0x23 ; alte Rotor-Position
neu equ 0x24 ; aktuelle Rotorposition
puffer equ 0x25 ; Arbeitsregister
loops2  EQU 0x26            ; fuer waitms
loop5 EQU 0x27 ; fuer 5mS Loop
flags EQU 0x28 ; ein Byte fuer Flags
W_Tmp EQU 0x29 ; W fuer ISR retten
S_Tmp EQU 0x2A ; STATUS fuer ISR retten
;**************************************************************
;*** Programmanfang
org 0
goto init
;**************************************************************
;*** die Interruptserviceroutine
        org  4
intvec
        movwf  W_Tmp            ; w retten
        swapf STATUS, w        ; STATUS retten
BCF STATUS, RP0
        movwf  S_Tmp

        BSF IntEncA          ; Interrupt Flag setzen
Int_end
        bcf    INTCON, INTF      ; RB0-Interrupt-Flag loeschen
        swapf  S_Tmp, w          ; STATUS zurück
        movwf  STATUS
        swapf  W_Tmp, f          ; w zurueck mit flags
        swapf  W_Tmp, w
        retfie
;**************************************************************
;*** Tabelle zur Wandlung der Speedwerte ins LED-Bitmuster
LEDTab
  addwf PCL, f
  retlw B'00000000' ;  0
  retlw B'00000001' ;  1
  retlw B'00000011' ;  2
  retlw B'00000111' ;  3
  retlw B'00001111' ;  4
  retlw B'00011111' ;  5
  retlw B'00111111' ;  6
  retlw B'01111111' ;  7
;**************************************************************
;*** Initialisierung
init
bsf     STATUS, RP0 ; Bank 1
clrf OPTION_REG
movlw B'00101000' ; PortA 
movwf TRISA
movlw B'11000101' ; PortB 
movwf TRISB
bcf     STATUS, RP0 ; Bank 0
clrf INTCON        ; Interupt disable
; 16F628 alle Comparatoreingänge auf Digital umschalten
BSF CMCON, CM0
BSF CMCON, CM1
BSF CMCON, CM2
; erstmal 'ne Grundordnung machen
CLRF counter ; wir fangen mit 0 an
BTFSC EncB ; ist B-Seite offen?
BSF EncBOld ; dann merken
CALL LEDAnz ; LEDs loeschen
; RB0-Interrupt einstellen
    bsf    STATUS, RP0        ; auf Bank 1 umschalten
    bsf    OPTION_REG, INTEDG ; 0-1-Flanke an RB0
    bcf    STATUS, RP0        ; auf Bank 0 zurueckschalten
    bsf    INTCON, INTE       ; RB0-interrupt erlauben
    bsf    INTCON, GIE        ; Interrupt generell erlauben
;*******************************************************
;*** Hauptprogrammschleife
loop
BTFSC IntEncA ; pruefen, ob Interrupt anlag
CALL EncRead ; dann EncBehandlung
CALL EncKeyTest ; Enc Taste gedrueckt?
BTFSC LEDRefresh ; pruefen, ob Ausgabe notwendig ist
CALL LEDAnz ; Zählerstand anzeigen
goto loop ; und von Neuem

;**************************************************************
;*** Encoder-Verdrehung
EncRead
CALL wait5ms ; erstmal entprellen
BCF IntEncA ; Flag einholen
BTFSS EncA ; immer noch offen?
RETURN ; war FehlAlarm
BTFSS EncB ; ist B-Seite offen => erkennen der Richtung
GOTO links
rechts
INCF counter,f ; rechts: hochZaehlen
GOTO weiter
links
DECF counter,f ; links: runterZaehlen
weiter
BSF LEDRefresh
; pruefen ob counter zwischen 0 und 14 liegt
Limits
BTFSC counter, 7 ; negativ?
CLRF counter ; dc = 0
MOVF    counter,W  ; counter -> w
CLRC ; CarryFlag loeschen
SUBLW   d'14'        ; 14-w -> w
    BTFSC   STATUS, C
    RETURN ; da geht noch was!
    MOVLW   d'14' ; Counter war ueber 14
MOVWF counter
RETURN
;** LED Ausgabe und DelayRoutine folgen ****************
Besten Dank im Voraus für eure Hilfe.

Lutz

 


* Recent Topics

topic Drehencoder zum 1000. mal
[Programmiersprache Assembler]
LutzG
Februar 24, 2017, 20:46:42 Nachmittag
topic Tasterabfrage mit PIC 16F84
[Programmiersprache Assembler]
Darkside
Februar 11, 2017, 09:57:15 Vormittag
topic PIC12F629 Wake up von Sleep
[PIC Mikrocontroller Allgemein]
delucks
Dezember 17, 2016, 00:19:20 Vormittag
topic Einstieg in C
[Programmiersprache C]
global93
Dezember 14, 2016, 02:53:32 Vormittag
topic Entwicklungsumgebung
[Sonstiges]
global93
Dezember 11, 2016, 09:43:59 Vormittag