Code:
;Zweiter Versuch mit dem Drehimpulsencoder
include REG8252.INC
;Zuweisungen
SIG_A EQU P3.3 ;0
SIG_B EQU P3.2 ;1
LAST_STATE EQU R6
TEMP EQU R2
;Resets
MOV P2, #0
MOV LAST_STATE, #0
;***************************************************************************************************
;Die Hauptschleife
LOOP: ACALL CHECK_DIG_STATE
SJMP LOOP
;***************************************************************************************************
CHECK_DIG_STATE: ACALL READOUT_DIG ;Zustand auslesen und
MOV A, LAST_STATE ;im Accu an der Stelle
MOV B, #04h ;X X X X - - X X platzieren
MUL AB
ACALL READOUT_DIG ;Zustand auslesen, an der
ORL A, LAST_STATE ;Stelle X X X X X X - - platzieren
ANL A, #0Fh
MOV P2, A
MOV DPTR, #TABLE
JMP @A+DPTR
;***************************************************************************************************
;Liest den Drehimpulsgeber aus und speichert den Zustand im Register LAST_STATE
READOUT_DIG: JB SIG_A, A_TRUE
SJMP A_FALSE
A_TRUE: JB SIG_B, STATE_2
SJMP STATE_1
A_FALSE: JB SIG_B, STATE_3
SJMP STATE_0
STATE_0: MOV LAST_STATE, #0 ;SIG_A=0 and SIG_B=0
RET
STATE_1: MOV LAST_STATE, #1 ;SIG_A=1 and SIG_B=0
RET
STATE_2: MOV LAST_STATE, #2 ;SIG_A=1 and SIG_B=1
RET
STATE_3: MOV LAST_STATE, #3 ;SIG_A=0 and SIG_B=1
RET
;***************************************************************************************************
TABLE: SJMP NOA
SJMP CW
SJMP ERR
SJMP CCW
SJMP CCW
SJMP NOA
SJMP CW
SJMP ERR
SJMP ERR
SJMP CCW
SJMP NOA
SJMP CW
SJMP CW
SJMP ERR
SJMP CCW
SJMP NOA
;***************************************************************************************************
NOA: NOP
RET
ERR: NOP
RET
CW: SETB P2.7
RET
CCW: CLR P2.7
RET
END
Der uC hängt sich auf, wenn SIG_A=0 und SIG_B=1 ist. Sobald der Debugger an die Zeile JMP @A+DPTR kommt, gibt er "Out of Code" aus. Ich kann mir das aber nicht erklären. Der ACCU enthält zu diesem Zeitpunkt 00001010 und springt sogar zu der Adresse in der Tabelle unten. Dann führt der NOP aus und gibt eben den Fehler aus.
Vielleicht überschreibe ich versehentliche wichtige Register?
Lesezeichen