mikrocontroller.net

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


Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas B. (detritus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst dir auch mal das hier anschauen:

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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas,
danke, schaue ich gleich mal rein.

Autor: R. W. (quakeman)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan (Gast)
Datum:

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

Autor: Manfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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:
.equ dgp=pinb               ;Eingangsport Drehgeber
    .equ dgmsk=0b00001100       ;Maske auf benutzte Bits
    .equ dgprell=0b00101010     ;Maske auf Togglebits

.def drg=r5                 ;Drehgeber-Entprellvariable
.def tas=r13                ;Tastenstatus (gueltig)
.def haschunu=r17           ;Handschussnummer per Drehgeber


drehgeber:              ;Drehgeber-Entprellung und -Abfrage
 rcall lcd_update           ;Zeichen ausgeben u. Jobflag loeschen...
 in wl,dgp                  ;Drehgeber einlesen
 andi wl,dgmsk              ;nur Drehgeber-Bits (Bit 3:2)
 swap wl                    ;nach oben (Bit 7:6)
 or drg,wl                  ;neuen Zustand uebernehmen
 mov wl,drg                 ;Bitmuster merken (neu, alt, aelter, uralt)
 lsr drg                    ;Bitmuster nach unten schieben
 lsr drg                    ;(leer, neu, alt, aelter)
 eor wl,drg                 ;Aenderungen erfassen
 andi wl,dgprell            ;nur Aenderungsbits stehen lassen
 cpi wl,2                   ;nur aeltestes Aenderungsbit gesetzt?
 brne drehgeber3            ;nein...

 ldi wl,1                   ;ja, erstmal normale Schrittweite
 sbrc tas,tdg               ;Shift-Taste (Drehgeber-Taste) betaetigt? - nein...
 ldi wl,32                  ;ja, Geraete-Schrittweite
 sbrs drg,1                 ;steigende Flanke? - ja...
 rjmp drehgeber1            ;nein...
 sbrs drg,0                 ;Richtung 1? nein...
 add haschunu,wl            ;ja, addieren
 sbrc drg,0                 ;Richtung 2? nein...
 sub haschunu,wl            ;ja, subtrahieren
drehgeber1:
 sbrc drg,1                 ;fallende Flanke? - ja...
 rjmp drehgeber2            ;nein...
 sbrs drg,0                 ;Richtung 1? nein...
 sub haschunu,wl            ;ja, subtrahieren
 sbrc drg,0                 ;Richtung 2? nein...
 add haschunu,wl            ;ja, addieren
drehgeber2:
drehgeber3:
 pop xl                     ;XL wiederherstellen
 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.

...

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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).

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.