Индивидуальное сервоуправление с микроконтроллером 8051 - PullRequest
0 голосов
/ 23 сентября 2019

Я приобрел управление двумя отдельными сервоприводами, используя 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, но он всегда заканчивал тем, что прерывал другой сервопривод.

...