Я приобрел управление двумя отдельными сервоприводами, используя AT89S51 с языком ассемблера.Сервоприводы должны менять свое положение каждый раз, когда достигают максимальной точки (180-0-180-0 и т. Д.), Но они должны настраиваться самостоятельно, что означает, что они не могут полагаться друг на друга, чтобы запустить свой протокол.Вот код, который я получаю до сих пор:
org 0000h
jmp Start
org 01BH
jmp tim1
org 0BH
jmp tim0
org 0100h
Start:
mov IE, #10001010B
mov TMOD, #00010001B
mov TL1, #019H
MOV TH1, #0FCH
mov TH0, #0FAH
mov TL0, #019H
setb TR0
setb TR1
mov r0, TL0
mov r1, TH0
mov r2, TL1
mov r3, TH1
Loop:
call delay
cpl p1.2
dec r0
dec r2
cjne R0, #00H, loop1
dec r1
jmp loop
loop1:
cjne R2, #00H, loop
dec r3
jmp Loop
tim1:
clr TF1
mov TL1, r2
MOV TH1, r3
cpl p1.0
setb TR1
reti
tim0:
clr TF0
mov TL0, r0
MOV TH0, r1
cpl p1.1
setb TR0
reti
delay: mov r7, #00H
ulang2: mov r6, #00h
ulang1: mov r5, #00h
ulang:
inc r5
cjne r5, #10H, ulang
inc r6
cjne r6, #10H, ulang1
inc r7
cjne r7, #10H, ulang2
ret
END
, пока этот код может настраиваться для перемещения на +90 градусов, где бы ни находилась его позиция, потому что он уменьшает значение таймера до нуля.Проблема в том, чтобы перевернуть код до -90 градусов, и это та часть, где я нахожусь в тупике.Мне нужно, чтобы оно автоматически увеличивало каждое значение на единицу каждый раз, когда оно достигает нуля, не прерывая другой процесс.Есть идеи?Я попытался сравнить его, используя метод cjne, но он всегда заканчивал тем, что прерывал другой сервопривод.