Define CONF_WORD = 0x318c
Define CLOCK_FREQUENCY = 4
'*********************************************************************************************
'NOMBRE: Temporizador_WC_11
'MICRO: PIC12F675
'DESCRIPCION: Automatismo para el control de un ventilador de WC, deteccion por entrada digital
'FECHA/AUTOR: By COS, 09/06, 10/06, 05/08
'version 1.2, Se añade el calibrado del clock mediante el registro osccal
'version 1.1 soft, version 1.1 hard, compatible version 1.0 de soft con version 1.1 de hard
'Cambio del soft para emplear una entrada que detecta perdida de alimentacion en la lampara
'simplificacion del disparo del rele
'modificacion del sistema de control de las salidas
'se activa el WDT
'Version 1.0
'oscilador interno
'**********************************************************************************************
'************************ Declaracion de variables ******************
DIM timer_base
AS Word
'base patron para los timer DIM timer_base_aux
AS Word
'establece el tiempo en mSeg, en el que se basaran los timer DIM contador
AS Byte
'variable que controla la fase en la que se encuentran las temporizacines DIM timer1_sg
AS Word
'primera base de tiempos, para el control de rutinas DIM timer1
AS Word
'indica el tiempo para la base timer_sg DIM led_flash_verde
AS Byte
'permite que se ejecute la rutina que se 'encarga del parpadeo del led verde
DIM led_flash_rojo
AS Byte
'permite que se ejecute la rutina que se 'encarga del parpadeo del led rojo
DIM flash_verde
AS Byte
'indica dentro de la rutina si el proximo 'estado del led apagado o encendido, verde
DIM flash_rojo
AS Byte
'indica dentro de la rutina si el proximo 'estado del led apagado o encendido, rojo
DIM rele
AS Bit
'controla el estado del rele DIM ledverde
AS Bit
'controla el estado del led verde DIM ledrojo
AS Bit
'controla el estado del led rojo '************************* Asignacion de valores de las variables *******
timer_base = 0 'inicializa el timer_base
timer_base_aux = 1000 'establece el desbordamiento de timer_base, 1Seg
contador = 0 'establece la fase cero del programa main
timer1_sg = 0 'inicializa el timer1_sg
timer1 = 30 'establece el desbordamiento de timer1_sg, 30Seg
led_flash_verde = 1 'flash del led verde habilitado
led_flash_rojo = 0 'flash del led rojo deshabilitado
flash_verde = 0 'estado incial del flash del led verde
flash_rojo = 0 'estado incial del flash del led rojo
rele = 0 'estado inicial del rele, off
ledverde = 1 'estado inicial del led verde, on
ledrojo = 0 'estado incila del led rojo, off
'************************ Inicializacion de registros generales y de E/S *********
vrcon = 0x00 'vref off(power off the comparator voltage)
ANSEL = 0x00 'off ADC
trisio = 0x00 'tri-state pins, are outputs
gpio = 0x00 'clear port
gpio.5 = 1 'pin a 1, maniobra invertida, activa a cero
gpio.4 = 1 'pin a 1, maniobra invertida, activa a cero
gpio.1 = 1 'para mantener la compatibilidad con la ver. 1.0 de hard
trisio.2 = 1 'GP2 pin, is input
CMCON = 0x07 'comparator off
GOSUB microchip_osccal
WaitMs 10 'pausa de 10mSeg.
'*********** habilitacion de interrupciones y programacion del timer1 ****
INTCON.PEIE = 1 'bit de habilitacion de interrupciones de perifericos
T1CON.TMR1ON = 1 'bit de habilitacion del temporizador timer1
T1CON.TMR1CS = 0 'bit de seleccion de reloj para el timer1, interno Fosc/4
PIE1.TMR1IE = 1 'bit de habilitacion de interrupcion de TMR1 por rebose
T1CON.T1CKPS0 = 0 'bit de seleccion del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 0 'bit de seleccion del prescaler para el reloj del timer1
TMR1H = 0xfc 'carga el byte alto del registro del tiemr1 (1mSeg)
TMR1L = 0x18 'carga el byte bajo del registro del timer1 (1mSeg)
PIE1.TMR1IE = 1 'activa la interrupcion del timer1
OPTION_REG.T0CS = 0 'selecciona reloj interno para el WDT
OPTION_REG.PSA = 1 'asigna el prescales al WDT
OPTION_REG.PS0 = 1 'bit de la seleccion del factor de division para el WDT
OPTION_REG.PS1 = 1 'bit de la seleccion del factor de division para el WDT
OPTION_REG.PS2 = 1 'bit de la seleccion del factor de division para el WDT
INTCON.t0ie = 0 'deshabilito interrupcion por el trm0
Enable 'INTCON.GIE habilita las interrupciones generales
'************* Rutina del programa ***************************************
main:
ASM: clrwdt 'reinicializa el WDT
IF contador = 0 THEN 'primera fase del control de tiempos y maniobras
IF timer1_sg >= timer1 THEN 'si pasan los primeros 30Seg.
contador = 1 'permite la siguiente fase
timer1 = 0 'configuara la base de tiempos con un nuevo valor 0Seg
timer1_sg = 0 'activa la base de tiempos
led_flash_verde = 0 'desconecta el parpadeo del led verde
led_flash_rojo = 1 'conecta el parpadeo del led rojo
ledverde = 0 'apaga el led verde
ledrojo = 1 'prende el led rojo
rele = 0 'desconecta el rele
Endif
Endif
IF contador = 1 THEN 'segunda fase del control de tiempos y maniobras
IF timer1_sg >= timer1 THEN 'cuando termina la base de tiempos
'segun el ultimo valor del timer1
IF gpio.2 = 0 THEN 'comprueba que hay alimentacion en la fuente
contador = 2 'permite la siguiente fase
timer1 = 120 'carga la base de tiempos para que cuente 2minutos
timer1_sg = 0 'activa la base de tiempos
flash_verde = 1 'sincroniza el destello con el led rojo
flash_rojo = 1 'sincroniza el edestello con el led verde
led_flash_verde = 1 'permite el parpadeo del led verde
led_flash_rojo = 1 'permite el parpadeo del led rojo
ledverde = 1 'prende el led verde
ledrojo = 1 'prende el led rojo
rele = 1 'energiza la bobina del rele
Endif
Endif
Endif
IF contador = 2 THEN 'tercera fase del control de tiempos y maniobras
IF timer1_sg >= timer1 THEN 'cuando pasan los 120seg.
contador = 1 'se cambia de fase
timer1 = 1 'se prepara la base de tiempos timer1_sg, para que cuente 1Seg.
timer1_sg = 0 'activa el contaje de la base de tiempos timer1_sg
rele = 0 'desconecta el rele
flash_verde = 1 'encendido alternativo del led verde con respecto al rojo
flash_rojo = 0 'encendido alternativo del led rojo con respecto al verde
led_flash_verde = 1 'permite el parpadeo del led verde
led_flash_rojo = 1 'permite el parpadeo del led rojo
ledverde = 1 'activa el led verde
ledrojo = 1 'activa el led rojo
Endif
Endif
GOTO main
microchip_osccal: 'Carga OSCCAL con el valor de microchip, microchip lo graba en la ultima posicion flash
ASM: bsf status,rp0
ASM: CALL 3ffh
ASM: movwf osccal
ASM: bcf status,rp0
RETURN 'Acota la rutina y retorna despues del salto
ON Interrupt
'Comienzan las rutinas de las interrupciones, desactiva las interrupciones Save
SYSTEM 'Guarda los valores del sistema'--------------------------------------RUTINA TIMER_1-----------------------------------------
IF ledverde = 1 THEN 'controla el estado de la salida del led verde
gpio.5 = 0 'prende led verde
ELSE
gpio.5 = 1 'apaga led verde
Endif
IF ledrojo = 1 THEN 'controla la salida del led rojo
gpio.4 = 0 'prende led rojo
ELSE
gpio.4 = 1 'apaga led rojo
Endif
IF rele = 1 THEN 'controla la salida del rele
gpio.0 = 1 'energiza rele
gpio.1 = 0 'energiza rele, compatibilidad con la ver. 1.0 de hard
ELSE
gpio.0 = 0 'desconecta el rele
gpio.1 = 1 'desconecta el rele, compatibilidad con la ver. 1.0 de hard
Endif
IF PIR1.TMR1IF = 1 THEN 'comprueba que es esta la interrupcion activa
'(por costumbre, en este caso solo hay una)
timer_base = timer_base + 1 'se incrementa con cada desbordamiento del timer1
IF timer_base >= timer_base_aux THEN 'control del numero de desbordamientos
'segun el valor de timer_base_aux
IF timer1_sg < timer1 THEN timer1_sg = timer1_sg + 1 'base de tiempos timer1
IF led_flash_verde > 0 THEN 'se encarga de hacer el led verde intermitente
IF flash_verde = 0 THEN 'controla el parpadeo del led verde
ledverde = 0 'conecta el verde
flash_verde = 1 'variable de control, permite que se conecte el verde
ELSE
ledverde = 1 'desconecta el verde
flash_verde = 0 'variable de control, controla el parpadeo
Endif
Endif
IF led_flash_rojo > 0 THEN 'se encarga de hacer el led rojo intermitente
IF flash_rojo = 0 THEN 'controla el parpadeo del rojo
ledrojo = 0 'conecta el led rojo
flash_rojo = 1 'variable de control, permite que se conecten los led
ELSE
ledrojo = 1 'desconecta el led rojo
flash_rojo = 0 'variable de control, controla el parpadeo
Endif
Endif
timer_base = 0 'se reinicializa el valor de la base de tiempos patron
Endif
Endif
TMR1H = 0xfc 'carga el registro del timer1, para que desborde cada 1mSeg.
TMR1L = 0x18
PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
RESUME 'activa las interrupciones y retorna al programa