;******************************************************************************************************
;	Proyecto:		PEH0655-SIR Sensor Infra-Rojo con PIC.
;	Descripción:	Programa  para generar el tren de pulsos de 38KHz durante 33 ms cada 333ms.
;	Programa: 		 ||||________||||________||||________   +++ FUNCIONA CORRECTAMENTE +++
;	PIC:			16F628A a 4 MHz
; 	Revisión:		0.3
;	Fecha:			Junio 15, 2011
;*****************************************************************************************************
	list p=16F628A
	#include P16F628A.inc
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _LVP_OFF & _MCLRE_OFF
;*****************************************************************************************************
;   Definicion de variables ****
;******************************************************************************************************
	CBLOCK		H'20'		; Seleccionamos en la memoria RAM (GPR)			
PDel0					
PDel1
CONT1						; Contadores 
CONT2					
;W_Temp						; Registro para guardar temporalmente W.
;STATUS_Temp				; Registro para guardar temporalmete STATUS
	ENDC
#define LED PORTA,0			; Definimos LED como bit 0 para el PORTA, implica usarlo: bsf LED o bcf LED.
#define LEDD PORTA,1		; Definimos LEDD como bit 1 para el PORTA.
;******************************************************************************************************
;   Inicio del Micro 
;******************************************************************************************************
Reset	org	0x00			; Aquí comienza el micro.
	goto	Inicio			; Salto a inicio del programa.
;******************************************************************************************************
; 	Vector de Interrupcion 
;******************************************************************************************************
;	org	0x04				; Atiende Interrupcion.
;	goto	Inicio_ISR
;******************************************************************************************************
;  	Programa Principal 
;	Configuración de puertos 
;******************************************************************************************************
	org	0x05				; Origen del código de programa.
Inicio		
	errorlevel      -302    ; Elimina "bank warning".
	bsf	STATUS,RP0 			; Pasamos de Banco 0 a Banco 1.
	movlw	b'11111100'		; RA0 como salida para LED y RA1 para LEDD, las demás las dejamos como entradas.
	movwf	TRISA
	movlw	b'11111111'		; Puerto B todas entradas.
	movwf	TRISB
	bcf	STATUS,RP0			; Paso del Banco 1 al Banco 0
	movlw	0x07			; Deshabilitamos los comparadores analógicos
	movwf	CMCON			; para poder usar los pines RA0 - RA3 como E/S digitales.
	bcf		LED				; El LED comienza apagado.
	clrf	CONT1			; CONT1 = 0.
	movlw	.120			; 
	movwf	CONT2			; CONT2 = 120.

;******************************************************************************************************
;	Generación del tren de pulsos de 38KHz.
;******************************************************************************************************		
	bsf		LEDD			; Enciendo LEDD.
	call 	t300ms			; Se mantiene encendido 300ms
	bcf		LEDD			; Apago LEDD
Ondas
	movlw	.10				; Consultamos si CONT1 ha llegado a 10. 
	subwf	CONT1,0			;
	btfss	STATUS,Z		;
	goto	LED_Encendido	; No es CONT1 = 10.
	bcf		LED				; Si, apago LED porque CONT1 llegó a 10.
	call	t300ms			; Se mantiene apagado durante 300ms.
	clrf	CONT1			; Si, Iniciamos contadores.
	movlw	.120			; 
	movwf	CONT2			; CONT2 = 120.
	goto	Ondas
LED_Encendido
	bsf		LED
	nop						; Podemos ajustar el número de nops a fin de obtener 13 us.
	nop						; de acuerdo a pruebas, corresponde a 12 nops.
	nop				
	nop
	nop						; Aqui pondré la condición de detección.
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	bcf		LED				; Apago LED
	nop						; Podemos ajustar el número de nops a fin de obtener 13 us.
	nop						; pero debemos calcular y equilibrar con los ciclos de máquina
	nop						; usados en las instrucciones, para empezar, ponemos 5 nops.
	nop						
	nop
	decfsz	CONT2,1			; Decremento CONT2 y preguntamos si es 0?
	goto	Balancear		; No es 0, 
	incf	CONT1,1			; Incremento Contador
	movlw	.120			; Restablezco CONT2
	movwf	CONT2			; CONT2 = 120.
	goto 	Ondas
Balancear
	nop
	nop
	goto LED_Encendido

;******************************************************************************************************
; 	Descripcion: Delay 300000 ciclos
;******************************************************************************************************
t300ms  movlw     .154      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .243      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;******************************************************************************************************
	end
