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
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
Danke Fox, aber "C" nutzt mir nichts. Ich kann leider nur raten was da passiert, keine Ahnung von "C" !!
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 | .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. ...
@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). ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.