atmel - JNZ
Napsal: 16 pro 2007, 10:01
zdravím, mcu(89c2051) má za úkol zastavit motor po načítání 200 pulsů z inkrementálního snímače. V reálném programu bude těch pulsů mnohem více, proto jsou tu použity dva uměle vytvořené 16b registry, a to R6, R7 - žádaný počet pulsů, a R4,R7 - aktuální počet pulsů. Program nezastaví motor po načtení 200 pulsů, ale zjistil jsem když odstraním instrukci JNZ označenou v programu, pak po 200 pulsech zastaví motor. Zajímavé je, že podle simulace v AS51 by to mělo fungovat správně.
[/b]
Kód: Vybrat vše
org 0
jmp main
org 03h
jnb p3.0,plus
cjne r4,#0,sem
dec r4
dec r5
jmp test
sem: dec r4
jmp test
plus: cjne r4,#0ffh,sem2
inc r4
inc r5
jmp test
sem2: inc r4
test: MOV A,r7 ;porovnani horního bajtu 16b registru
SUBB A,r5
JNZ endNor ;[b]problémová instrukce[/b]
MOV A,r6 ;porovnani dolniho bajtu 16b registru
SUBB A,r4
JNZ endNor
SETB P3.4 ;vypnutí motoru
endNor: reti
main: mov r4,#0
mov r5,#0
mov r6,#200
mov r7,#0
setb ex0
setb it0
setb ea
clr P3.5 ;směr otáčení motoru
clr p3.4 ;zapnuti motoru
sem3: jb p3.1,sem4 ;zbytek programu, informativní zobrazování
;registru R4,R5
mov a,r5
cpl a
mov p1,a
jmp sem3
sem4: mov a,r4
cpl a
mov p1,a
jmp sem3
end