;************************************************************************
; Procesador:	PIC16F876 con Xtal 4 MHz
; Función:	Manejo del robot Vamos Vamos
; Hardware:	Protoboard
; Archivo:		vamos001_clase
; Autor:		Eduardo J. Carletti 
; Fecha:		21 septiembre 2014
;
; Historia: Motores giran 1 segundo para cada lado   
;    
;*************************************************************************

	list P = 16F876a
	include "P16f876a.inc"

	ERRORLEVEL 1;-302	; para evitar los mensajes de cambio de
				; banco en el resultado del compilador

	__config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF

	CBLOCK 0x20	; Declarar las variables
	  d1 ; usada en Retardo1seg
	  d2 ; usada en Retardo1seg
	  d3 ; usada en Retardo1seg
	ENDC
;
; -----------
; INICIALIZAR
; -----------
;
	org 0x0000		; Indica la dirección de origen del programa
	clrf STATUS		; limpia el registro de estado
	movlw 0x00		; valor cero 00
	movwf PCLATH		; al contador de programa = comienzo 
	goto Comienzo		; Salto a comienzo
	org 0x0004		
;
Comienzo
; BANCO
	bcf STATUS,RP0
	bcf STATUS,RP1	  	; RAM Página 0
; ------------------------------------
	movlw 0x00      
	movwf PORTA		; Inicializar PORT A
	movlw 0x00
	movwf PORTB		; Inicializar PORT B
	movlw 0x80
	movwf PORTC		; Inicializar PORT C 
;
; ------------------------------------
; BANCO
	bsf STATUS,RP0		; RAM Page 1
; ---------------------------------------------------------------
; FUNCION DE LAS PATAS DE LOS PORTS
; ---------------------------------------------------------------
;
	movlw 0x00
	movwf TRISA		; Todas las patas port A salida
	movlw 0x00
	movwf TRISB		; Todas las patas port B salida
	movlw b'10000000'
	movwf TRISC		; Todas las patas port C salida excepto RC7/RX

	movlw 0x06		; Todas las patas entrada/salida digital
	movwf ADCON1
;
; -----------------------------------------------------------
; BANCO
	bcf STATUS,RP0	; Página RAM 0
; -----------------------------------------------------------
; -----------------------------------------------------------
; PRINCIPAL
; -----------------------------------------------------------

Principal
	call DerechoAdelante
	call IzquierdoAdelante
;
	call Retardo1seg
;
	call DerechoAdelante
	call IzquierdoDetenido
;
	call Retardo1seg
;
	call DerechoAdelante
	call IzquierdoAdelante
;
	call Retardo1seg
;
	call DerechoDetenido
	call IzquierdoDetenido
;
	call Retardo1seg
	call Retardo1seg
	call Retardo1seg
	call Retardo1seg
	call Retardo1seg
	call Retardo1seg
	call Retardo1seg
	call Retardo1seg
	call Retardo1seg
	call Retardo1seg
;
	goto Principal
;
;-------------------------------------
; SUBRUTINAS
;-------------------------------------

DerechoAdelante
	bsf PORTA,0	; PORTA 0 = 1 - Motor derecho ad.
	bcf PORTA,1	; PORTA 1 = 0 - Motor derecho ad.
return
;-------------------------------------

DerechoAtras
	bcf PORTA,0	; PORTA 0 = 0 = Motor derecho atr.
	bsf PORTA,1	; PORTA 1 = 1 = Motor derecho atr. 
return
;-------------------------------------

DerechoDetenido
	bcf PORTA,0	; PORTA 0 = 0 = Motor derecho det.
	bcf PORTA,1	; PORTA 1 = 0 = Motor derecho det.
return
;-------------------------------------

IzquierdoAdelante
	bcf PORTA,2	; PORTA 2 = 0 = Motor izquierdo ad.
	bsf PORTA,3	; PORTA 3 = 1 = Motor izquierdo ad.
return
;-------------------------------------

IzquierdoAtras
	bsf PORTA,2	; PORTA 2 = 1 = Motor izquierdo atr.
	bcf PORTA,3	; PORTA 3 = 0 = Motor izquierdo atr.
return
;-------------------------------------

IzquierdoDetenido
	bcf PORTA,2	; PORTA 2 = 0 = Motor izquierdo det.
	bcf PORTA,3	; PORTA 3 = 0 = Motor izquierdo det.
return
;-------------------------------------

Retardo1seg
	movlw d'0'
; Frecuencia de reloj = 4 MHz
; Retardo real = 1 seconds = 1000000 cycles
; Error = 0 %
		;999997 cycles
	movlw	d'8'	; 0x08
	movwf	d1
	movlw	d'47'	; 0x2F
	movwf	d2
	movlw	d'3'	; 0x03
	movwf	d3
Retardo_01
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	Retardo_01
		; 3 ciclos más
	goto	$+1
	nop
	return

; ----------------------------

	END