Hallo zusammen,
habe einen Drehgeber mit A und B Signal (2 Bit) an PD2 und PD3
angeschlossen und möchte einen counter rauf oder runterzählen.
Dafür wird die erste Stellung einmal eingelesen und der Gray-Code in
Binär-Code umgewandelt, danach wird erneut die Position eingelesen und
dann mit der alten verglichen.
Bei der Gray/Binär-Umwandlung wird das MSB (Bit 1)so wie es ist
übernommen und das LSB(Bit 0) durch XOR-Verknüpfung des LSB mit dem MSB
bestimmt. Der Vergleich soll dann mit CP erfolgen.

Der Code funktioniert aber nicht so, wie ich es möchte.
Muss man einen Interrupt dafür starten ??
Wenn ja, warum ?
Kann man die Sprünge zu den "Unterprogrammen" so durchführen, oder
muss das mir RCALL und RET erfolgen ??
Bin davon ausgegangen, das bei einer Abfrage
CP pos_klein,temp
BRNE weiter
...
bei Gleichheit der Code bei den drei Punkten weitergeht.
Vielleicht kann mir jemand Verbesserungen vorschlagen
oder die Fehler nennen.
Danke schonmal

code:

.include "m8def.inc"

.def temp = r16
.def temp2= r17
.def pos_klein = r18
.def klein_alt = r19
.def klein_neu = r20

;Stackpointer initialisieren

ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
out SPH, temp

;Aus/Eingänge festlegen

ldi temp, 0b11000000 ;PD7,PD6 -Ausgang, Rest als Eingang
out DDRD, temp

ldi pos_klein,0b00000000 ;Positionscounter "leer" laden


;Stellung zum ersten mal einlesen
;und Signale A und B(PD2,PD3)
;ans Ende kopieren

in temp, PIND ;an PIN D anliegende Werte einlesen
BST temp,2 ;Bit 2 von temp in das T-Flag schreiben (Bit Store)
BLD klein_alt,0 ;T-Flag in Bit 0 von klein_alt laden (Bit Load)
BST temp,3
BLD klein_alt,1

ldi temp,0b00000000

;Conversion Gray--->Binary

BST klein_alt,1
BLD temp,1
BST klein_alt,0
BLD temp2,1

EOR temp2,temp
BST temp2,1
BLD temp,0
MOV klein_alt,temp

nochange:

;counter pos_klein überprüfen

ldi temp,0b00000100
CP pos_klein,temp
BRNE weiter
ldi temp,0b10000000
out PORTD,temp ;wenn zähler 4,dann soll LED 7 leuchten

weiter:

in temp, PIND ;an PIN D anliegende Werte einlesen
BST temp,2 ;Bit 2 von temp in das T-Flag schreiben (Bit Store)
BLD klein_neu,0 ;T-Flag in Bit 0 von klein_alt laden (Bit Load)
BST temp,3
BLD klein_neu,1

ldi temp,0b00000000
;Conversion Gray--->Binary
BST klein_neu,1
BLD temp,1
BST klein_neu,0
BLD temp2,1

EOR temp2,temp
BST temp2,1
BLD temp,0

MOV klein_neu,temp

CP klein_alt,klein_neu ;Vergleich von alter und neuer Position
BRNE direction ;wenn ungleich, dann Richtung bestimmen -->direction
RJMP nochange ;ansonsten neu überprüfen --->nochange

direction:

CP klein_alt, klein_neu
BRLO right ;wenn kleiner dann ---->right
RJMP left ;ansonsten ---->left

right:
INC pos_klein
MOV klein_alt, klein_neu
RJMP nochange

left:
DEC pos_klein
MOV klein_alt, klein_neu
RJMP nochange