list      P=16F84A	; definir procesador

#include <P16F84A.INC>		; definiciones de variables específicas del procesador

	ERRORLEVEL 1;-302	; para evitar los mensajes de cambio de
				; banco en el resultado del compilador

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC 

; DEFINICIÓN DEL NOMBRE DE ENTRADAS Y SALIDAS

#define SERVO1	 	PORTA,0		; puerto de salida de servo 1
#define PULSADOR1 	PORTA,1		; puerto de entrada de pulsador 1
#define PULSADOR2 	PORTA,2		; puerto de entrada de pulsador 2
#define PULSADOR3 	PORTA,3		; puerto de entrada de pulsador 3
#define SERVO2	 	PORTB,0		; puerto de salida de servo 1
#define PULSADOR4 	PORTB,1		; puerto de entrada de pulsador 1
#define PULSADOR5 	PORTB,2		; puerto de entrada de pulsador 2
#define PULSADOR6 	PORTB,3		; puerto de entrada de pulsador 3
; VARIABLES

	CBLOCK	0x20
	acum_A		; variable momentánea
	Posic		; posición servo1
	acum_AA		; variable momentánea
	Posic2		; posición servo2
	ENDC

;

	org	0x000
	goto	principal

;
; Principal
;

principal


		clrf PORTA		; inicia ports
		clrf PORTB		; inicia ports

		bsf STATUS,RP0		; Apunta a banco 1

		movlw b'00001110' 	; PORTA 
		movwf	TRISA		; salidas menos 1, 2 y 3, entradas

		MOVLW b'00001110' 	; PORTB 
		movwf	TRISB		; salidas

		movlw	b'00000010'	; Configuración para TMR0
		movwf	OPTION_REG	; preescaler 2, 1:8 con CLK interno (que es
					; de 1 MHz si el oscilador es de 4 MHz).
					; El contador cuenta cada 8 useg

	        bcf STATUS,RP0          ; Apunta a banco 0

		clrf TMR0		; inicia registro de timer en 0

		movlw d'133'		; inicia valor de posición de servo (centro)
		movwf Posic
        movlw d'133'
        movwf Posic2

;
; Lazo principal
;

lazo


		bsf	SERVO1		; pone la señal de servo en 1
		bcf	INTCON,T0IF	; borra el flag de timer
		movlw	d'192'		; (256-192 = 64) 64 * 8 us = 0,512 ms
		movwf	TMR0		; valor al registro de timer
		btfss	INTCON,T0IF	; espera por timer = ff -> 00
		goto	$-1
		bcf	INTCON,T0IF	; borra el flag de timer
		movf	Posic,0		; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
		movwf	TMR0		; valor al registro de timer
		btfss	INTCON,T0IF	; espera por timer = ff -> 00
		goto	$-1
		bcf	SERVO1		; pone la señal de servo en 0
		bcf	INTCON,T0IF	; borra el flag de timer
		movlw	d'9'		; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
		movwf	acum_A
retardo		bcf	INTCON,T0IF	; borra el flag de timer
		movlw	d'6'		; (256-6 = 250) 250 * 8 us = 2 ms
		movwf	TMR0		; valor al registro de timer
		btfss	INTCON,T0IF	; espera por timer = ff -> 00
		goto	$-1
		decfsz	acum_A		; decrementa cantidad de veces
		goto	retardo

lazo2


        bsf	SERVO2		; pone la señal de servo en 2
		bcf	INTCON,T0IF	; borra el flag de timer
		movlw	d'192'		; (256-192 = 64) 64 * 8 us = 0,512 ms
		movwf	TMR0		; valor al registro de timer
		btfss	INTCON,T0IF	; espera por timer = ff -> 00
		goto	$-1
		bcf	INTCON,T0IF	; borra el flag de timer

        movf	Posic2,0
		movwf	TMR0		; valor al registro de timer
		btfss	INTCON,T0IF	; espera por timer = ff -> 00
		goto	$-1
        bcf	SERVO2
		bcf	INTCON,T0IF	; borra el flag de timer

		movlw	d'9'		; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
        movwf	acum_AA

retardo2		bcf	INTCON,T0IF	; borra el flag de timer
		movlw	d'6'		; (256-6 = 250) 250 * 8 us = 2 ms
		movwf	TMR0		; valor al registro de timer
		btfss	INTCON,T0IF	; espera por timer = ff -> 00
		goto	$-1
        decfsz	acum_AA
		goto	retardo2


pulsadores				; lee órdenes a través de pulsadores
		btfss	PULSADOR1
        goto iniciaPos
        btfss	PULSADOR2
        goto incPos
        btfss	PULSADOR3
        goto decPos
        btfss	PULSADOR4
		goto iniciaPos2		
        btfss	PULSADOR5
		goto incPos2		
        btfss	PULSADOR6
		goto decPos2
        goto lazo
        goto lazo2


iniciaPos	movlw d'133'		; 256-133 = 123, 123 * 8 us = 984 us + 512 us
		movwf Posic		; posición central en esta disposición        
		goto lazo		; y sale
iniciaPos2    movlw d'133'
              movwf Posic2
              goto lazo2
					
decPos		movf Posic,f		; se fija si Posic ya es cero
		bz sale1		; si es cero no decrementa
		decf Posic,f		; si no es cero, decrementa

decPos2    
        movf Posic2,f
		bz sale3		; si es cero no decrementa
        decf Posic2,f 
sale1		goto lazo		; y sale

sale3		goto lazo2		; y sale

incPos		movlw 0xFF		; se fija si Posic no es 0xFF
		xorwf Posic,w		; que es el valor máximo
		bz sale2		; si es el valor máximo, no incrementa
		incf Posic,f		; si no es el valor máx, incrementa
incPos2    movlw 0xFF		; se fija si Posic no es 0xFF
        xorwf Posic2,w
		bz sale4		; si es el valor máximo, no incrementa
        incf Posic2,f
sale2		goto lazo		; y sale

sale4		goto lazo2


        	END








