.equ dgp=pinb ;Eingangsport Drehgeber b3,b4 .equ dgmsk= 0b00011000 ;Maske auf benutzte Bits von 'dgp' .equ dgprell=0b00010101 ;Maske auf Togglebits in 'drg' ;*************************************************************** .def drg=r5 ;Drehgeber-Entprellvariable .def eepw=r17 ;Eprom-Speicher_nummer per Drehgeber .def wl=r24 ;Working L drehgeber: ;Drehgeber-Entprellung und -Abfrage (alle 1ms) ;diese Routine wird von der Mainloop aufgerufen, wenn mindestens eine ;Millisekunde seit des letzten Aufrufs vergangen ist. Der Aufruf erfolgt ;mit 'rjmp', damit auch andere Mainloop-Jobs zum Zuge kommen, ehe der ;Controller am Ende der Mainloop in den Sleep fällt. Das zugehörige ;Jobflag (Synchronisation mittels Timer) wird in der Routine 'lcd_update' ;gelöscht. 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 übernehmen mov wl,drg ;Bitmuster merken (neu, alt, älter, uralt) lsr drg ;Bitmuster nach unten schieben lsr drg ;(leer, neu, alt, älter) eor wl,drg ;Änderungen erfassen andi wl,dgprell ;nur Änderungsbits stehen lassen cpi wl,1 ;nur ältestes Änderungsbit gesetzt? brne drehgeber3 ;nein, kein neuer stabiler (entprellter) Zustand... sbrs drg,0 ;steigende Flanke? - ja... rjmp drehgeber1 ;nein... sbrs drg,1 ;Richtung 1? nein... subi eepw,-1 ;ja, adieren sbrc drg,1 ;Richtung 2? nein... subi eepw,1 ;ja, subtrahieren drehgeber1: sts enc,eepw ;encoderwert speichern