;**********************************************************************
;
;  *****     *****  *****     *****  ***************  ***************
;  *****     *****  *****     *****  ***************  ***************
;  *****     *****  *****     *****  ***************  ***************
;  *****     *****  *****     *****  ***************  ***************
;  ***************  *****     *****  *****            *****     *****
;  ***************  *****     *****  *****            *****     *****
;  ***************  *****     *****  *****     *****  *****     *****
;  ***************  *****     *****  *****     *****  *****     *****
;  *****     *****  ***************  ***************  ***************
;  *****     *****  ***************  ***************  ***************
;  *****     *****  ***************  ***************  ***************
;  *****     *****  ***************  ***************  ***************
;
;**********************************************************************
;                                                                     *
;    Nombre del archivo: TIMBRE MUSICAL PROGRAMABLE - ACCIONADOR.asm  *
;    Fecha: 01 de enero de 2012                                       *
;    Autor: Victor Hugo Pachon                                        *
;    Compaņia: HUGO                                                   *
;    Microcontrolador: PIC12F675                                      *
;                                                                     * 
;                                                                     *
;**********************************************************************
;                                                                     *
;  Programa para el accionador del timbre musical programable, que se *
;  accionara con un sensor tactil y transmitira la activacion de      *
;  manera inalambrica por medio de un transmisor de RF.               *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************


	list      p=12f675            ; Procesador
	#include <p12f675.inc>

__CONFIG _INTRC_OSC_NOCLKOUT & _PWRTE_OFF & _BODEN_OFF & _CP_ON & _WDT_OFF & _MCLRE_OFF

	errorlevel  -302



;**************************VARIABLES************************************
INT_VAR		UDATA_SHR	0x20   
ESCAPE       RES     1       ; Para la cuenta de las veces en el que reinicio el timer 0
PDel0        RES     1       ; Para el retardo de 25mS
PDel1        RES     1
CUENTA       RES     1

;**********************************************************************
RESET_VECTOR	CODE	0x000		; Vector de reset
		goto    main

;*************************INTERRUPCION*********************************

INT_VECTOR	CODE	0x004		  ; Vector de interrupcion, no hay interrupciones

;**********************************************************************
main
        bsf     STATUS,RP0        ; Calibracion del oscilador interno      
        call    3FFh
        movwf   OSCCAL
        bcf     STATUS,RP0

;**************************CONFIGURACION*******************************

start
        bsf     STATUS,RP0        ; Paso al banco 1
        bcf     STATUS,RP1
        clrf    VRCON             ; Deshabilito VREF
        movlw   h'01'             ; Configuro el puerto GP0 para la entrada de activacion, GP3 para la salida de transmision, GP1 para el LED y GP4 para la activacion del
;modulo transmisor de RF
        movwf   TRISIO
        movlw   h'86'
        movwf   OPTION_REG        ; OPTION, configuro el timer 0 para el antirrebote inicial de la entrada
        clrf    ANSEL             ; salidas I/O digitales
        movlw   h'01'             ; Activo la interrupcion por cambio de estado en el pin GP0, que es la entrada de activacion
        movwf   IOC
        movlw   h'00'             ; Deshabilito las demas interrupciones
        movwf   PIE1
        bcf     STATUS,RP0        ; Paso al banco 0
        bcf     STATUS,RP1
        movlw   h'30'             ; Deshabilito el timer1
        movwf   T1CON
        movlw   h'07'             ; Deshabilito comparador
        movwf   CMCON
        clrf    ADCON0            ; Deshabilito el conversor A/D
        movlw   h'08'             ; Habilito la interrupcion por cambio de estado para la entrada que detectara la activacion pero sin habilitar
;la interrupcion general, ya que solo la vamos a utilizar para sacar el micro del modo de bajo consumo.
        movwf   INTCON
        clrf    PIR1              ; Deshabilito las demas interrupciones

;**************************PROGRAMA PRINCIPAL**************************
        
        movlw   h'10'             ; Deshabilito los puertos antes de pasar al modo de bajo consumo
        movwf   GPIO
        sleep                     ; Modo de bajo consumo
        nop
        movlw   h'64'             ; Cuando despierte, inicio el timer 0 para el antirebote inicial
        movwf   TMR0
        bcf     INTCON,T0IF       ; Pongo en cero el indicador de desbordamiento del timer 0
        movlw   h'64'             ; Cargo el valor inicial de ESCAPE
        movwf   ESCAPE
LOOP
        btfss   GPIO,0            ; Verifico la entrada de activacion
        goto    ENT_0
        movlw   h'64'             ; Si es uno, reinicio el timer 0
        movwf   TMR0
        decfsz  ESCAPE            ; Decremento el valor de ESCAPE
        goto    LOOP              ; Si ESCAPE aun no ha llegado a cero, sigo verificando la entrada de activacion
        goto    REINICIO          ; Si ESCAPE es cero, quiere decir que hubo 100 reinicios del timer 0 y por lo tanto la entrada se activo indebidamente, por lo que hay
;que sacar al sistema de este bucle para que no quede despierto el micro
REINICIO
        call    RETARDO           ; Espero 25ms
        btfss   GPIO,0            ; Verifico la entrada de activacion
        goto    LOOP              ; Si es cero, me devuelvo ya que es posible que la entrada se activo debidamente
        goto    start             ; Si es uno, valido que la entrada se activo indebidamente y reinicio el sistema
ENT_0
        btfss   INTCON,T0IF       ; Si es cero, verifico el indicador de desbordamiento del timer 0
        goto    LOOP              ; Si es cero me devuelvo para verificar el final del rebote y hasta que termine el periodo del timer 0
LOOP2
        btfss   GPIO,0            ; Si es uno ya termine de filtrar el rebote inicial y espero a que se desactive la entrada de activacion
        goto    LOOP2
        movlw   h'64'             ; Si ya es cero, inicio el timer 0 para el antirebote final
        movwf   TMR0
        bcf     INTCON,T0IF       ; Pongo en cero el indicador de desbordamiento del timer 0
LOOP3
        btfsc   GPIO,0            ; Verifico la entrada de activacion
        goto    ENT_1
        movlw   h'64'             ; Si es cero, reinicio el timer 0
        movwf   TMR0
        goto    LOOP3
ENT_1
        btfss   INTCON,T0IF       ; Si es uno, verifico el indicador de desbordamiento del timer 0
        goto    LOOP3             ; Si es cero me devuelvo para verificar el final del rebote y hasta que termine el periodo del timer 0
;Si es uno, ya finalizo el rebote final y la lectura de la entrada, e inicio la secuencia del programa
        bsf     GPIO,1
        movlw   h'08'
        movwf   CUENTA
LOOP4
        call    RETARDO
        decfsz  CUENTA
        goto    LOOP4
        bcf     GPIO,1
        goto    start

;*************************SUBRUTINA RETARDO (25mS)**********************

RETARDO
        movlw     .73             ; 1 set numero de repeticion  (B)
        movwf     PDel0           ; 1 |
PLoop1  movlw     .106            ; 1 set numero de repeticion  (A)
        movwf     PDel1           ; 1 |
PLoop2  clrwdt                    ; 1 clear watchdog
        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
        clrwdt                    ; 1 ciclo delay
        return                    ; 2+2 Fin.

;************************************************************************

EE		CODE	0x2100
		DE	0x00, 0x01, 0x02, 0x03

        END                       ; FIN

