; PWM.ASM Programa que se encarga de testear por el pin GP0 la señal de un canal X
; del Receptor de nuestro modelo, para saber si la posicion del pulso esta por
; sobre los 1.5 msg. o 90º, si es asi, saca por el pin GP2 una Oscilacion de
; 4.2 Khz a intervalos de 0.5 seg. y que cumple la funcion  de emitir un sonido
; al momento de entrar en Fail Safe, permitiendo atravez de un microfono
; conectado al TX de Video escuchar en que momento nos quedamos sin alcance
; en nuestra Radio TX

; PIC=12F509 o 12C509
; Frec. 4Mhz - Ciclo= 1 useg.
; Autor: Jorge O. Lezana S. Email: chile_irc@hotmail.com
; Valdivia - Chile 

	LIST p=12c509

#include <p12c509.inc>

	__CONFIG 1AH        ; MCLR ON, CP OFF, WDT OFF, OSC INTERNO

PULSO 	EQU 11H		    ; Variable PULSO en la Posicion 11 de ram
PDel0	EQU 12H		    ; Variable PDel0 en la Posicion 12 de ram
PDel1	EQU 13H 	    ; Variable PDel1 en la Posicion 13 de ram
BUZZ	EQU 14H		    ; Variable BUZZ  en la Posicion 14 de ram
BTMP1	EQU 15H		    ; Variable BTMP1 en la Posicion 15 de ram


	ORG     000H        ; El programa empieza en 000H
	
	MOVLW   09H         ; Cargar el Valor Binario (b'00001001') a W
	TRIS    GPIO        ; Pasa W al GPIO, Entrada GP3,GP0
        movlw   .128        ; (b 10000000) bit 6 = 0 Habilitar weak pullups GP0,1,3
        option              ; Cargando el .128 a option		
	CLRF	GPIO	    ; Limpia el Puerto GPIO a Nivel Bajo

On	BTFSS   GPIO, 0	    ; Testea el Bit GP0 si hay un 1 Salta 
	Goto    Off	    ; Si no hay un 1 Salta a Off
	Call	PWM         ; Salta PWM Rutina de Deteccion de 1.5ms o 90º del TX
	BTFSS	GPIO, 0	    ; Testea el Bit GP0 si hay 1 Salta
	Goto    Off	    ; Salta a Off
	Goto    DLTMP1	    ; Salta a DLMTP1
	Goto 	On	    ; Salta a On
	
Off	BTFSC   GPIO, 0	    ; Testea el Bit GP0 si hay un 0 Salta 
	Goto    Off	    ; Si no hayn un 0 Salta a Off
	BCF     GPIO, 2     ; Pine en 0 el Bit GP2
	Goto	On	    ; Salta a On

;**********  Rutina para Detectar el pulso bajo del RX en 1.5msg 90º *****                           

PWM     movlw   .249        ; 
        movwf   PULSO       ; 
DYP0    clrwdt              ; 
DYP1    goto    DYP2        ; 
DYP2    decfsz  PULSO, 1    ; 
        goto    DYP0        ; 
        clrwdt              ; 
        RETLW 0             ; 

;********** Rutina de Buzzer 3khz BTMP1= .239 ****************************

DLTMP1	movlw   .239	    ;Carga el Valor .239 a W y luego a BTMP1
	movwf   BTMP1	    ;

KHZ	BSF	GPIO, 2     ; GP0 Nivel Alto para Generar 3Khz 
	Call	DLBUZZ	    ; Ir a rutina para 0.166ms Pulso Alto 
	BCF	GPIO, 2     ; GP0 Nivel Bajo para Generar 3Khz 
	Call    DLBUZZ	    ; Ir a rutina para 0.166ms Pulso Bajo 
	decfsz  BTMP1, 1     
	Goto    KHZ
	Goto    PDelay

;** BUZZ= 123=1KHZ 82=1.5kHZ 61=2kHZ 40=3KHZ,30=4KHZ, 28= 4.2KHZ, 23=5KHZ **

DLBUZZ  movlw   .28         ; setea el numero de repeticiones a decrementar
	movwf   BUZZ        ; Carga el Valor a 3khz
PBUZZ   clrwdt              ; Borra el Perro Guardian "watchdog"
        decfsz  BUZZ, 1     ; Decremento en 1 el Registro 3KHZ
        goto    PBUZZ       ; Vuelve a Ploop0 para volver a decrementar
	NOP                 ; No opera
	NOP                 ; No opera
	clrwdt              ; Borra el Perro Guardian "watchdog"
        RETLW   0           ; Retorna

;**********  0.5 SEg de Retardo  PDel0=.239  PDel1=.232 *******************

PDelay  movlw   .239        ; 
        movwf   PDel0       ; 
PLoop1  movlw   .232        ;
        movwf   PDel1       ; 
PLoop2  clrwdt              ; 
PDelL1  goto    PDelL2      ; 
PDelL2  goto    PDelL3      ; 
PDelL3  clrwdt              ; 
        decfsz  PDel1, 1    ; 
        goto    PLoop2      ; 
        decfsz  PDel0,  1   ; 
        goto    PLoop1      ; 
PDelL4  goto    PDelL5      ; 
PDelL5  goto    PDelL6      ; 
PDelL6  goto    PDelL7      ; 
PDelL7  clrwdt              ; 
        goto    On          ;
	        
	END

