'*********************************************************************************************
'NOMBRE: Temporizador_WC_13
'MICRO: PIC12F675
'DESCRIPCION: Automatismo para el control de un ventilador de WC, deteccion por entrada digital
'FECHA/AUTOR: By COS, 09/06, 10/06
'Version 1.0
'oscilador interno
'versión 1.1 soft, versión 1.1 hard, compatible versión 1.0 de soft con versión 1.1 de hard
'Cambio del soft para emplear una entrada que detecta perdida de alimentación en la lámpara
'simplificación del disparo del rele
'modificación del sistema de control de las salidas
'Versión 1.3
'se activa el WDT
'se cambia la rutina del control de flash de los led para hacerlos independientes uno del otro
'**********************************************************************************************
' ************************ Declaración de variables ******************
Dim timer_base As Word 'base patrón 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 temporizaciones
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
'se encarga del parpadeo del led verde
Dim led_flash_rojo As Byte 'permite que se ejecute la rutina que se
'sencarga del parpadeo del led rojo
Dim flash_verde As Byte 'indica dentro de la rutina si el próximo
'estado del led apagado o encendido, verde
Dim flash_rojo As Byte 'indica dentro de la rutina si el próximo
'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
' ************************* Asignación 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 inicial del flash del led verde
flash_rojo = 0 'estado inicial del flash del led rojo
rele = 0 'estado inicial del rele, off
ledverde = 1 'estado inicial del led verde, on
ledrojo = 0 'estado inicial del led rojo, off
' ************************ Inicialización 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
WaitMs 10 'pausa de 10mSeg.
' *********** habilitación de interrupciones y programación del timer1 ****
INTCON.PEIE = 1 'bit de habilitación de interrupciones de periféricos
T1CON.TMR1ON = 1 'bit de habilitación del temporizador timer1
T1CON.TMR1CS = 0 'bit de selección de reloj para el timer1, interno Fosc/4
INTCON.T1IE = 1 'bit de habilitación de interrupción de TMR1 por rebose
T1CON.T1CKPS0 = 0 'bit de selección del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 0 'bit de selección 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 interrupción 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 selección del factor de división para el WDT
OPTION_REG.PS1 = 1 ' bit de la selección del factor de división para el WDT
OPTION_REG.PS2 = 1 ' bit de la selección del factor de división para el WDT
INTCON.T0IE = 0 ' deshabilito interrupción por el trm0
Enable 'INTCON.GIE habilita las interrupciones generales
' ************* Rutina del programa ***************************************
main:
ASM: clrwdt 'reinicializa el WDT antes que se desborde
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 'configura 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
'según el ultimo valor del timer1
If GPIO.2 = 0 Then 'comprueba que hay alimentación 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 destello 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
End
On Interrupt 'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System 'Guarda los valores del sistema
'-------------------------------------- control salidas -----------------------------------------
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
'-------------------------------------- bases de tiempos y flash diodos-----------------------------------------
If PIR1.TMR1IF = 1 Then 'comprueba que es esta la interrupción 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 'según 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 reinicialaza el valor de la base de tiempos patrón
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