Forum: Mikrocontroller und Digitale Elektronik Drehegeber und 8051, ich bekomme es nicht hin!


von Stephan H. (stephan-)


Lesenswert?

Hallo Leute,
irgendwie stehe ich auf dem Schlauch.
Der Geber sitzt mit A an P3.4 und B an P3.5.
Die ISR läuft alle 7ms.
Ich bilde aus dem Wert "alt" und dem Wert "neu" ein Byte.
Anhand des Bytes und der Tabelle ermittle ich mit 1 oder 2 ob ich
vor oder zurüch muss. Bei 0 mache ich nichts.
Wo ist der BUG ?????

Danke


; am Programmanfang 1 Mal

      orl  p3,#0F0h
      mov  a,p3
      swap  a
      anl  a,#03h
      clr  c
      rlc  a
      rlc  a
      mov  58h,a

; im Interrupt
         orl  p3,#0f0h
         mov  a,p3
         swap  a
         anl  a,#03h
         mov  59h,a
         orl  a,58h
         push  dptr  ; den brauch ich noch anderswo
         mov  dptr,#tabelle_geber
         movc  a,@a+dptr
         pop  dptr
         jb  A.0,pplus
         jb  A.1,pminus
         jmp  raus_ISR

pplus:   setb  plus
         jmp  raus_ISR

pminus:  setb  minus

raus_ISR:   clr  c
            mov  a,59h
            rlc  a
            rlc  a
            anl  a,#0fh
            mov  58h,a


tabelle_geber:  DB  0,1,2,0,2,0,0,1,1,0,0,2,0,2,1,0

von Thomas B. (detritus)


Lesenswert?

Kannst dir auch mal das hier anschauen:

Beitrag "Drehgeber-Auswertung in Assembler für 8051"

von Stephan H. (stephan-)


Lesenswert?

@Thomas,
danke, schaue ich gleich mal rein.

von R. W. (quakeman)


Angehängte Dateien:

Lesenswert?

Ich habe in einem Buch auch noch eine Variante gefunden, welche das 
ganze in C realisiert. Das Beispiel macht nichts anderes als den 
Drehencoder abzufragen und eine Variable, je nach Drehrichtung, zu 
inkrementieren oder dekrementieren. Das Beispiel ist zwar nicht als ISR 
ausgeführt, aber lässt sich sehr einfach in eine ISR einbauen.

Ciao,
     Rainer

von Stephan (Gast)


Lesenswert?

Danke Fox,
aber "C" nutzt mir nichts.
Ich kann leider nur raten was da passiert, keine Ahnung von "C" !!

von Manfred (Gast)


Lesenswert?

Hallo Stephan,

ist dies Dein komplettes Programm ?
- Wenn ja, dann fehlt vor der ISR eine Endlosschleife (Du läufts hier 
direkt   in die ISR
- Am Ende der ISR fehlt ein ret
- Wird Deine ISR von der korrekten Stelle der Interruptvektoren 
aufgerufen ?

Handelt es sich bei dem Drehgeber auch tatsächlich um einen TTL-Typ oder 
einen analogen - dann passen die Pegel nicht.

Gruß

Manfred

von Hannes L. (hannes)


Lesenswert?

Zwar nicht '8051 sondern AVR, aber ASM und im regelmäßigen Takt von 1 ms 
per Timer synchronisiert, allerdings nicht in der ISR, sondern als Job 
der Mainloop:
1
.equ dgp=pinb               ;Eingangsport Drehgeber
2
    .equ dgmsk=0b00001100       ;Maske auf benutzte Bits
3
    .equ dgprell=0b00101010     ;Maske auf Togglebits
4
5
.def drg=r5                 ;Drehgeber-Entprellvariable
6
.def tas=r13                ;Tastenstatus (gueltig)
7
.def haschunu=r17           ;Handschussnummer per Drehgeber
8
9
10
drehgeber:              ;Drehgeber-Entprellung und -Abfrage
11
 rcall lcd_update           ;Zeichen ausgeben u. Jobflag loeschen...
12
 in wl,dgp                  ;Drehgeber einlesen
13
 andi wl,dgmsk              ;nur Drehgeber-Bits (Bit 3:2)
14
 swap wl                    ;nach oben (Bit 7:6)
15
 or drg,wl                  ;neuen Zustand uebernehmen
16
 mov wl,drg                 ;Bitmuster merken (neu, alt, aelter, uralt)
17
 lsr drg                    ;Bitmuster nach unten schieben
18
 lsr drg                    ;(leer, neu, alt, aelter)
19
 eor wl,drg                 ;Aenderungen erfassen
20
 andi wl,dgprell            ;nur Aenderungsbits stehen lassen
21
 cpi wl,2                   ;nur aeltestes Aenderungsbit gesetzt?
22
 brne drehgeber3            ;nein...
23
24
 ldi wl,1                   ;ja, erstmal normale Schrittweite
25
 sbrc tas,tdg               ;Shift-Taste (Drehgeber-Taste) betaetigt? - nein...
26
 ldi wl,32                  ;ja, Geraete-Schrittweite
27
 sbrs drg,1                 ;steigende Flanke? - ja...
28
 rjmp drehgeber1            ;nein...
29
 sbrs drg,0                 ;Richtung 1? nein...
30
 add haschunu,wl            ;ja, addieren
31
 sbrc drg,0                 ;Richtung 2? nein...
32
 sub haschunu,wl            ;ja, subtrahieren
33
drehgeber1:
34
 sbrc drg,1                 ;fallende Flanke? - ja...
35
 rjmp drehgeber2            ;nein...
36
 sbrs drg,0                 ;Richtung 1? nein...
37
 sub haschunu,wl            ;ja, subtrahieren
38
 sbrc drg,0                 ;Richtung 2? nein...
39
 add haschunu,wl            ;ja, addieren
40
drehgeber2:
41
drehgeber3:
42
 pop xl                     ;XL wiederherstellen
43
 rjmp mainloop              ;fertig...

Es wurde ein labriger Pollin-Drehgeber verwendet, dessen Taster von der 
Entprellroutine für die übrigen Taster mit entprellt wird. Die 
Zählschrittweite beträgt normal +/-1 und bei betätigtem Taster +/-32.

...

von Stephan H. (stephan-)


Lesenswert?

@Manfred,
nein es sind nur Teile davon. Das RETI der ISR ist auch da. Ja die ISR 
wird korrekt aufgerufen. Und der Geber ist ein normaler mech. Typ. Die 
von Pollin machen so einige Probleme. Allerdings habe ich auch welche 
von CSD, die sind nicht ganz so schlimm. Ich habe die Werte der Tabelle 
bis auf eine 1 und eine 2 zusammengestrichen. ( Auflösung verringert) 
damit habe ich pro Rastung einen Schritt. Das geht zufriedenstellend. 
Allerdings zappelt der Wert oft an der Raststellung. Sind halt billige 
Geber.


@Hannes,
wie hattest Du das in Deinem Beitrag zu Pollingeber mit dem "stabilen" 
Pin gemeint??


Gruss

von Hannes L. (hannes)


Lesenswert?

Stephan Henning wrote:

> @Hannes,
> wie hattest Du das in Deinem Beitrag zu Pollingeber mit dem "stabilen"
> Pin gemeint??

Die Pollin-Drehgeber (die mit dem dicken Alu-Knopf) sind eigentlich 
Ausschuss. Nicht nur, weil da eine Gehäuseklammer nicht zugebogen ist, 
sondern auch, weil eine der beiden Spuren nicht sehr sauber schaltet, 
also eine Art Wackelkontakt hat. Die andere Spur ist allerdings recht 
präzise.

Wertet man nun die Flanke der "Wackelkontakt-Spur" aus, so bekommt man 
bedeutend mehr Flanken, als eigentlich vorhanden sind und liest 
entsprechend Müll ein.

Wertet man jede Zustandsänderung aus (Vergleich beider Bits mit 
Vorgängerbits oder Bildung eines Tab-Index aus neuen und alten Bits für 
LUT), dann gibt es auch bedeutend mehr Zählungen als erforderlich, es 
dürfte aber keine Probleme bereiten, da sich die Zählungen korregieren.

Wertet man nur die Flanke der Spur aus, deren Kontakt sauber schaltet 
und keine Wackler verursacht, dann arbeitet die Auswertung recht 
zuverlässig. Ich frage deshalb bei einer Flanke an der soliden Spur den 
Pegel an der laberigen Spur ab, aber nur, wenn dieser Zustand zweimal 
hintereinander stabil eingelresen wurde (Entprellung).

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.