;Diese Routine muß entprechend dem Syntax des jeweiligen Assemblers ;mit seinen Direktiven angepasst werden ;Diese Routine ist zum einbinden in eine Timer Interruptroutine gedacht ;Timerlaufzeit 2KhZ für einen Inkrementalgeber mit 100 Inkremeten / 360° ;Die Inkrementaleingänge werden gezielt abgescannt und nicht über Interruptflanken ;gesteuert. ;Bei Inkrementalgebern mit weiniger Inkrementen / 360° kann die Timer Zyklus Zeit ;entsprechend verlängert werden ;Berechnungsbasis ist hierfür: Maximale Inkremetzahl (Drehgeschwindigkeit) / sec x 4(Oversampling) ; Beispiel: max. Inkrementzahl pro sec = 100 x 4 = Timerroutine auf 400Hz (sonst werden Inkremente verschluckt. ; So jetzt zur eigentlichen Routine ;SIG_A hier INC_A genannt liegt auf P3.3 ;SIG_B hier INC_B genannt liegt auf P3.2 ;CODEZ1 und CODEZ sind 2 frei verfügbare Bit, die Du dir im Bitadressierbaren Bereich definierst und nach dem Reset beide auf 0 setzt ;Bei INC_A und INC_B mußt du die korrespondierenden Bits im Accu definieren ;Also so INC_A .equ ACC.3 INC_B .equ ACC.2 ;Auch daran denken, beim Einsprung in die Routine ACC,PSW zu retten ;Inkrementalgeber Handrad Auswertung mov A,P3 ;Port A komplett Zeitsynchron einlesen, beide Signale müssen zum gleichen Zeitpunkt erfasst und zwischengespeichert ;werden! Ist ganz wichtig sonst funktioniert das ganz nicht jnb CODEZ1,mark_01 mov C,INC_A orl C,INC_B jc ende clr CODEZ clr CODEZ1 sjmp ende mark_01 mov C,INC_A anl C,INC_B jnc mark_02 setb CODEZ mark_02 jnb CODEZ,ende jb INC_A,mark_03 setb CODEZ1 ;an dieser Stelle kannst du etwas einfügen um den Inkrementalwert zu erhöhen sjmp ende mark_03 jb INC_B,ende setb CODEZ1 ;an dieser Stelle kannst du etwas einfügen um den Inkrementalwert zu verringern ende ;Auswertung Ende ;Mehr ist es nicht, hab es mit Absicht nicht dokumentiert, versuche die Funktionsweise herauszufinden