Control de 3 Servomotores usando pic 16f84A

Hola amigos!
Estoy preparando un mini proyecto en MPLAB y lo simulo en proteus para el pic16f84A.
La duda esta en el ASM que estoy armando ya que de principio estaba para el PIC16F628 pero funciona perfectamente en el 16f84a. Son 3 servos, cada uno controlado por 3 interruptores;primero uno que lo deja en posición inicial, el otro que lo hace girar a la derecha y el otro a la izquierda(los servos que estoy utilizando en la realidad los tengo modificados para 360°), en total 6 interruptores, de los cuales del RA1, RA2 y RA3(Servo1 RA0), RB1, RB2, RB3(Servo2 RB0), RB5, RB6, RB7(Servo3 RB4). La idea es que puedan ser controlados libremente cada uno para lo que sea y solo puedo controlar uno, necesito enlazar el otro servo y no pude:/
De todos modos dejo los docs en asm, hex y cto. de proteus ya que necesito una mano(el cto solo tiene 2 servos pero agregando el segundo, ya el tercero sera facil) :apreton:
Sin mas que agregar me despido!;)
 

Adjuntos

  • ARCHIVOS HEX, ASM Y PROTEUS.rar
    28.7 KB · Visitas: 60
Última edición:
veo que no usas la interrupción, inicias tu programa en 0x000, normalmente conviene iniciar en 0x070 para brincarse la dirección de interrupciónes 0x040,
lo que yo haria es algo asi:
org 0x040
goto interrupcion
org 0x070
inicio:
trises, etc
ciclo:
btfsc switch 1
goto unoinicio
lee switch 2
goto unoizq
lee switch 3
goto unoder
unoinicio:
movlw (valor de centro)
movwf motor1
goto servo2
unoizq:
movlw (valor izquierda)
movwf motor1
goto servo2
unoder:
movlw (valor derecha)
movwf motor1
servo2:
btfsc switch 4
goto dosini
btfsc switch 5
goto dosizq
btfsc switch 6
goto dosder
dosini:
movlw (valor centro)
movwf motor2
goto servo3
dosizq:
movlw (valor izq)
movwf motor2
goto servo3
dosder:
movlw (valor der)
movwf motor2
servo3:
(lo mismo que antes)
goto ciclo

y en la interrupcion
interrupcion:
decfsz tiempo
goto servos
goto reset
check1:
decfsz conta1
goto check2
bcf (servo1)
check2:
decfsz conta2
goto check3
bcf (servo2)
check3:
decfsz conta3
goto salida
bcf (servo3)
salida:
bcf interrupcion
return
reset:
movf servo1,0
movwf conta1
bsf (servo1)
movf servo2,0
movwf conta2
bsf (servo2)
movf servo3,0
movwf conta3
bsf (servo3)
goto check1
end

los letreros en parentesis son o numeros que hay que recalcular o los puertos de salida de los servos.
 
gracias 300 KVA lo probare ya que encontre el problema, y esta solucionado. Solo use preguntas btfsc y btfss y listo pero tu acotaciòn parece mas practica ;)
saludos!
 
Atrás
Arriba