; CONTROL DE ARRANQUE Y FUNCIONAMIENTO DE GENERADOR HOGAR OBRERO
;08/09/2022 CAMBIO EN LA INT CONTROL DE ACEITE POR CONTROL DE CONTACTO funciono bien el timer1
;pongo la cantidad de horas calculadas
;cambio el config con _XT_OSC
;10/09/2022 Prueba Conta2 = 1=1.4 min ; 10=16.40 min; 36=1 hora
;Dias 10=
;
List p=16F877A ;Tipo de procesador
include "P16F877A.INC" ;Definiciones de registros internos
__CONFIG _CP_OFF & _PWRTE_ON & _XT_OSC & _WDT_ON & _LVP_OFF & _BODEN_ON
cblock 0x20
Delay ;Variable de temporización
Conta1 ;Para usar en TIMER1
Conta2 ;Para usar en TIMER1
Conta3 ;Para usar en temporizadores largos TIMER0
Dias ;Para usar en TIMER1
Reintentos ;
Vigilia ;
MarchaMin ;
endc
org 0x00 ;Vector de Reset
goto Inicio
org 0x04
goto Int_TMR1
Inicio
;Esta configuracion me setea PORTD 0-1-2-3 como entradas digitales
;PORTD 4-5-6-7 mas PORTC 3-4-5-6-7 como salidas.
;Tambien prepara el prescaler para TIMER0
;Prepara los ADCs que se usaran en AN0, AN1 , AN2 , AN4 , AN5 , AN6 , AN7
;COMANDOS DEL LCD por puerto C
bsf STATUS,RP0 ;Selecciona banco 1
bcf STATUS,RP1 ;
;Configuracion de puertos
movlw 0xFF ;Puerto A y E se deben tomar como entradas setear en 1
movwf TRISA ;
movlw 0x07 ;
movwf TRISE ;
movlw b'00001111' ;Puerto D la parte baja va como entrada seteado en 1 y
movwf TRISD ;la parte alta como salida seteada en 0
movlw 0x00 ;
movwf TRISB ;
movwf TRISC ;
;Configuracion del ADC
movlw b'10000001' ;Justificación dcha 1,Seleccion de Clock 0,No usados 00
movwf ADCON1 ;(Todas Analogicas RA3/AN3/Vref+/Pin5) 0001
;Si voy a usar RA o RE como Digital debo configurarlo en
;el momento con "b'00000110' en ADCON1" y dps volver aqui
bsf PIE1,ADIE ;Activa interrupción del convertidor ADC
;Configuracion del TIMER
movlw b'10000111' ;
movwf OPTION_REG ;Preescaler de 256 asociado al TMR0
;Configuracion del TIMER1 con interrupcion
bsf PIE1,0 ;Habilita el TIMER1
bcf STATUS,RP0 ;Selecciona banco 0
clrf PORTB ;Limpia las salidas
clrf PORTC ;
clrf PORTD ;
;Completo configuracion del TIMER1 con interrupcion
bsf T1CON,5 ;
bsf T1CON,4 ;Elijo Prescaler de 8 (maximo)
bcf T1CON,1 ;TIMER1 como temporizador con reloj interno (Fosc/4)
bsf T1CON,0 ;Baja la bandera de desborede del TIMER1
bsf INTCON,7 ;Habilita interrupciones globales
bsf INTCON,6 ;Habilita interrupciones perifericas
bcf PIR1,0 ;pone a cero la bandera de desborde del TIMER1
;Calculo de tiempo de interrupcion del TIMER1
;TMR1 = 65535-((Tiempo deseado (mS) * Fosc (KHz))/(Prescaler * 4))- 1
;53034 = 65535-((100*4000)/(8*4))-1 =0xCF24 Son 100mS
movlw 0x0B
movwf TMR1H ;Cargo parte alta del TIMER1
movlw 0xDA
movwf TMR1L ;Cargo parte baja del TIMER1
movlw .200 ;Los valores utilizados en este programa estan mal
movwf Conta1 ;calculados por eso hubo que ajustar algunas repeticiones
movlw .1 ;Se deberia de haber usado 0xCF24
movwf Conta2 ; = 1 hora
movlw .1 ;Cargo la cantidad de hora del intervalo
movwf Dias ;120hs / 24hs = 5 dias
;----------------------------------------------------------------------------------
Control
clrwdt ;Restaura/Limpia el WDT
bcf PORTD,4 ;Aseguro contacto desconectado
bsf PORTC,3 ;Conecto rele entrada se enclava con el de salida
btfss PORTD,1 ;Abrio detector de entrada?
goto Control ;No, vuelvo a controlar
call Retardo1s ;Si, hago un retardo de 1 segundo
btfss PORTD,1 ;Vuelvo a preguntar para confirmar
goto Control ;No, Falsa alarma, vuelvo a controlar
movlw .3 ;Si, cargo Reintentos de arranque
movwf Reintentos ;
Encendido
movlw .3 ;Cargo Vigilia que repite la espera a que se estabilice
movwf Vigilia ;
decfsz Reintentos ;decremento Reintentos y pregunto si llego a 0
goto Arranque ;No, voy a Arranque
goto Alarma ;Si voy a Alarma
Arranque
bsf PORTD,4 ;Conecto contacto
call Retardo1s ;Espera 1 segundo antes de iniciar el arranque
bsf PORTC,4 ;Acciono burro
bsf PORTC,5 ;Acciono cebador
bcf PORTC,3 ;Desconecto rele entrada se enclava con el de salida
call Retardo3s ;Funciona burro y cebador 3 segundos
bcf PORTC,4 ;Apago burro
bcf PORTC,5 ;Apago cebador
Estabilizacion
call Retardo3s ;Espera 3 segundos a que se estabilice
btfss PORTD,0 ;Controlo si tengo salida
goto Espera ;No, no tengo salida, voy a Espera
btfss PORTD,0 ;Si, tengo salida, Controlo de nuevo
goto Alarma ;No, voy a alarma
goto Marcha ;Si, tengo salida voy a la rutina de marcha
Espera
decfsz Vigilia ;Decrementos Vigilia
goto Estabilizacion ;No llego a Cero, Vuelvo a Estabilizacion
goto Encendido ;Si, llego a Cero y no levanto presion de aceite
Marcha
bsf PORTC,6 ;Conecto rele salida que esta enclavado con el rele
;de entrada e inicio bucle de marcha
Bucle10m
movlw .10 ;recargo marcha minima
movwf MarchaMin ;
Marcha_Min
call Retardo1m ;hago un retardo de 1 minuto que repetire 10 veces
btfss PORTD,0 ;Controlo si tengo salida
goto Alarma ;No tengo salida
decfsz MarchaMin ;Si, hay salida, decremento marcha minima
goto Marcha_Min ;aun no agoto marcha minima
btfsc PORTD,1 ;Agoto bucle de marcha. Cerro detector de entrada?
goto Bucle10m ;No, recargo marcha minima y le doy otros 10 minutos
goto Detener ;Si, voy a detener el generador y restaurar el sistema
Detener
bcf PORTD,4 ;Apago generador Desconecto contacto
call Retardo1s ;Espera 1 segundo antes de iniciar transferencia
bcf PORTC,6 ;desconecto rele salida me habilita rele de entrada
bcf PORTC,4 ;aseguro burro apagado
bcf PORTC,5 ;aseguro cebador apagado
bsf PORTC,3 ;reconecto rele entrada me inhabilita rele de salida
goto Control ;reinicio control de estado
;;---------------------------------------------------------------------------------
Alarma
bcf PORTD,4 ;Apago generador Desconecto contacto
call Retardo1s ;Espera 1 segundo antes de iniciar transferencia
bsf PORTC,3 ;reconecto rele entrada
bcf PORTD,7 ;Apago aviso de prueba
bcf PORTC,6 ;desconecto rele salida
bcf PORTC,4 ;aseguro burro apagado
bcf PORTC,5 ;aseguro cebador apagado
bsf PORTC,7 ;conecto alarma audible
call Retardo1m ;hago un retardo de 1 minuto
bcf PORTC,7 ;desconecto alarma audible
goto Control ;
;----------------------------------------------------------------------------------
;Temporizar 1/2 segundo mediante el TMR0. Este, con un preescaler de 256, evoluciona cada
;256uS. Se carga con 158 para realizar una temporización de 25mS. Los 50 mS se repiten 40
;veces para conseguir un segundo aproximadamente.
Retardo1s ; 1 segundo
movlw .40
movwf Delay
Delay_1 movlw .158
movwf TMR0 ;Inicia el TMR0
bcf INTCON,T0IF ;Restaura el flag del TMR0
Delay_2 clrwdt ;Restaura/Limpia el WDT
btfss INTCON,T0IF ;Han pasado 50 mS ??
goto Delay_2 ;Todavía no
decfsz Delay,F ;Se ha repetido 10 veces ??
goto Delay_1 ;No
return ;Si, vuelve
;------------------------------------------------------------------------------
Retardo3s ; 3 segundos
movlw .255 ;SI BAJA BAJA EL TIEMPO
movwf Delay
Delay_12 movlw .210 ;Con 194 da 4 segundos. Con 210 da 3 segundos
movwf TMR0 ;Inicia el TMR0
bcf INTCON,T0IF ;Restaura el flag del TMR0
Delay_22 clrwdt ;Restaura/Limpia el WDT
btfss INTCON,T0IF ;Han pasado 50 mS ??
goto Delay_22 ;Todavía no
decfsz Delay,F ;Se ha repetido 100 veces ??
goto Delay_12 ;No
return ;Si, vuelve
;;--------------------------------------------------------------------
Retardo1m ; 1 minuto
movlw .15 ;SI BAJA BAJA EL TIEMPO
movwf Conta3 ;Con .255 aca aprox 70.75 min
Retardo3_1
movlw .255 ;SI BAJA BAJA EL TIEMPO
movwf Delay ;
Delay_123 movlw .195 ;Con .1 aca aprox 4 min. SI BAJA SUBE EL TIEMPO
movwf TMR0 ;Inicia el TMR0
bcf INTCON,T0IF ;Restaura el flag del TMR0
Delay_223 clrwdt ;Restaura/Limpia el WDT
btfss INTCON,T0IF ;Cambio el Flag?
goto Delay_223 ;Todavía no
decfsz Delay,F ;Se agoto el Delay ??
goto Delay_123 ;No
decfsz Conta3 ;Si,
goto Retardo3_1 ;
RETURN
;----------------------------------------------------------------------
Int_TMR1
clrwdt ;Restaura/Limpia el WDT
Conta_1
decf Conta1,f ;Decremento segundo contador y controlo
btfsc STATUS,Z ;si desbordo mediante el Bit Z
goto Conta_2 ;Si voy a controlar el proximo contador,
goto Salgo1 ;No salgo recargando los valores para el TIMER
;y los decrementados
Conta_2
decf Conta2,f ;Decremento segundo contador y controlo
btfsc STATUS,Z ;si desbordo mediante el Bit Z
goto Conta_3 ;Si voy a controlar el proximo contador, ya pasaron
;Conta2 * Conta1 * interrupciones
goto Salgo2 ;No salgo recargando los valores para el TIMER
;y los decrementados
Conta_3
decf Dias,f ;Decremento segundo contador y controlo
btfsc STATUS,Z ;si desbordo mediante el Bit Z
goto Fin ;Si voy a controlar el proximo contador, ya pasaron
;Dias * Conta2 * Conta1 * interrupciones
goto Salgo3 ;No salgo recargando los valores para el TIMER
;y los decrementados
Salgo1
bcf PIR1,0 ;pone a cero la bandera de desborde del TIMER1
;Recargo los valores del TIMER1
movlw 0x0B
movwf TMR1H ;Cargo parte alta del TIMER1
movlw 0xDA
movwf TMR1L ;Cargo parte baja del TIMER1
Ret_int
RETFIE
Salgo2
movlw .200 ;
movwf Conta1 ;Recargo el Conta1
goto Salgo1 ;
Salgo3
movlw .1 ;
movwf Conta2 ;Recargo el Conta2
goto Salgo2 ;
Fin
movlw .1 ;
movwf Dias ;Recargo Dias
Pru_Func
btfsc PORTD,0 ;Mira si esta activo el PORTD,0 Hay señal de salida?
goto Ret_int ;Si esta conectado esta en marcha NO HACE FALTA PRUEBA
;Retorno de la Interrupcion sin hacer nada
bsf PORTD,7 ;No continuo en la interrupcion Aviso de Prueba
movlw .3 ;Cargo Reintentos de arranque
movwf Reintentos ;
Arranque_2
bsf PORTD,4 ;Conecto contacto
bsf PORTC,4 ;Acciono burro
bsf PORTC,5 ;Acciono cebador
call Retardo3s ;Funciona burro y cebador 3 segundos
bcf PORTC,4 ;Apago burro
bcf PORTC,5 ;Apago cebador
call Retardo3s ;Espera 3 segundos a que se estabilice
btfss PORTD,0 ;Controlo si tengo salida
goto Espera_2 ;No, no tengo salida, voy a Espera_2
call Retardo1m ;Si, tengo salida, fubciona 1 minuto
bcf PORTD,4 ;Apago generador Desconecto contacto
bcf PORTD,7 ;Desconecto aviso de prueba
goto Salgo3 ;Prueba terminada, salgo de la interrupcion
Espera_2
decfsz Reintentos ;Decrementos Reintentos
goto Arranque_2 ;No llego a Cero, Vuelvo a Arranque_2
goto Alarma ;Si, llego a Cero y no levanto presion de aceite
;-------------------------------------------------------------------------
end