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
Kannst dir auch mal das hier anschauen: Beitrag "Drehgeber-Auswertung in Assembler für 8051"
@Thomas, danke, schaue ich gleich mal rein.
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
Gast
#877881
Danke Fox, aber "C" nutzt mir nichts. Ich kann leider nur raten was da passiert, keine Ahnung von "C" !!
Gast
#884199
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
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
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. ...
@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
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
Bitte melde dich an, um einen Beitrag zu schreiben.