Hola amigos, estamos realizando un programa en ASM para el pic16f84a, el cual sirve para hacer caminar un pequeño robot casero que utiliza un par de servomotores, cada uno de ellos tiene 3 cables, uno de VCC, otro de VDD y el tercero es para recibir la señal de entrada o encendido.
Basicamente tiene que caminar una pequeña trayectoria en zig-zag esto es utilizando las siguientes subrutina
Adelante, Derecha, Izquierda.
Practicamente no es muy complicado el programa, se realizan unos retardos mediante el uso de esta pagina
http://www.piclist.com/techref/piclist/codegen/delay.htmBueno se ha simulado el programa con MPLAB y Proteus y en teoria hace lo que debe hacer, pero al grabarlo al pic y montarlo al robot, parace que solo hace caso a la primera rutina de llama en este caso Adelante y se cicla adentro e ignora las demas (Derecha, Izquierda)
Agrego el codigo
programa principal
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
cblock 0x20
Tmp1
Tmp2
Tmp3
endc
org 0x00
goto principal
principal
bsf STATUS,RP0 ; Hacemos uso del banco 1 para configuraciones
CLRF TRISA ;configura el puertoA como salidas; es decir coloca a 0 todos los bits
bcf STATUS,RP0 ; Hacemos uso del banco 0 para trabajar
CLRF PORTA ; Limpiamos el puertoA
call Adelante
call Derecha
call Adelante
call Izquierda
goto $
include <RUTINAS.INC>
include <RETARDOS.INC>
END
RETARDOS.INC
; Delay = 1 seconds
; Clock frequency = 4 MHz
; Actual delay = 1 seconds = 1000000 cycles
; Error = 0 %
Retardo1s
;999990 cycles
movlw 0x07
movwf Tmp1
movlw 0x2F
movwf Tmp2
movlw 0x03
movwf Tmp3
Retardo
decfsz Tmp1, f
goto RA
decfsz Tmp2, f
RA goto RB
decfsz Tmp3, f
RB goto Retardo
;6 cycles
goto RC
RC goto RDD
RDD goto RE
;4 cycles (including call)
RE
return
Retardo5s
;4999993 cycles
movlw 0x2C
movwf Tmp1
movlw 0xE7
movwf Tmp2
movlw 0x0B
movwf Tmp3
Retardo5s_0
decfsz Tmp1, f
goto RA5
decfsz Tmp2, f
RA5 goto RBB
decfsz Tmp3, f
RBB goto Retardo5s_0
;3 cycles
goto RC5
RC5 nop
;4 cycles (including call)
return
RUTINAS.INC
;Movimientos del robot:
; 1.- Avanzar hacia adelante
; 2.- Girar hacia la derecha
; 3.- Girar hacia la izquierda
; 1.- Rutina que avanza hacia adelante.
Adelante
MOVLW .3
MOVWF PORTA
call Retardo5s
CLRF PORTA
return
; 2.- Rutina que gira hacia la derecha
Derecha
MOVLW .1
MOVWF PORTA
call Retardo5s
CLRF PORTA
return
Izquierda
MOVLW .2
MOVWF PORTA
call Retardo5s
CLRF PORTA
return