;------------------------------------------------------------
; Código assembler generado por Niple V5.4.4
; Proyecto: Compresor_Soller
; Autor: FERMIN CARMELO RUIZ MARTIN
; Fecha: 06/06/2009
; PIC: 16F876
; Velocidad de reloj: 4 Mhz
; Descripcion: Control de funcionamiento de un compresor con una tarjeta de I/O
;------------------------------------------------------------


 LIST    P=PIC16F876


_HS_OSC               equ  0x3FFE
_DEBUG_OFF            equ  0x3FFF
_WDT_OFF              equ  0x3FFB
_PWRTE_ON             equ  0x3FF7
_BODEN_OFF            equ  0x3FBF
_LVP_OFF              equ  0x3F7F
_CPD_OFF              equ  0x3FFF
_CP_OFF               equ  0x3FFF
_WRT_ENABLE_OFF       equ  0x3DFF

 __config _HS_OSC & _DEBUG_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_ENABLE_OFF & _CP_OFF


;------------------------------------------------------------
;                  Declaración de Registros
;------------------------------------------------------------
w                     equ  0x0000
status                equ  0x0003
porta                 equ  0x0005
portb                 equ  0x0006
portc                 equ  0x0007
pclath                equ  0x000a
intcon                equ  0x000b
pir1                  equ  0x000c
tmr1l                 equ  0x000e
tmr1h                 equ  0x000f
t1con                 equ  0x0010
tmr2                  equ  0x0011
t2con                 equ  0x0012
_np_w                 equ  0x0020
cuenta1m              equ  0x0022
cuenta1mtotal         equ  0x0023
cuenta1h              equ  0x0024
cuenta1htotal         equ  0x0025
cuentaparada          equ  0x002c
t_parada              equ  0x002e
t_pr2                 equ  0x002f
t_parada_h            equ  0x0030
_np_tiempo            equ  0x0031
_np_tiempo1           equ  0x0033
_np_tiempo2           equ  0x0034
cuentaparada_h        equ  0x0036
_np_banderas          equ  0x0037
_np_temp              equ  0x0038
_np_temp1             equ  0x0039
_np_temp2             equ  0x003a
_np_temp3             equ  0x003b
_np_temp4             equ  0x003c
_np_tiempo3           equ  0x003d
_np_status            equ  0x003e
estado_equipo         equ  0x0040
_np_banderas2         equ  0x0041
t_parada_total        equ  0x0043
cuenta_parpadeo       equ  0x0044
cuenta_arranque       equ  0x0045
opcion                equ  0x0081
trisa                 equ  0x0085
trisb                 equ  0x0086
trisc                 equ  0x0087
pie1                  equ  0x008c
pr2                   equ  0x0092
adcon1                equ  0x009f


;------------------------------------------------------------
;                  Declaración de Bits
;------------------------------------------------------------
c                     equ  0   ;carry / borrow bit
gie                   equ  7   ;habilitador general de interrupciones
peie                  equ  6   ;ee write complete interrupt enable bit
rp0                   equ  5   ;registrer bank select bit
rp1                   equ  6   ;registrer bank select bit
t1ckps0               equ  4   ;timer 1 input clock prescaler select bit
t1ckps1               equ  5   ;timer 1 input clock prescaler slect bit
t2ckps0               equ  0   ;timer 2 clock prescaler select bit
t2ckps1               equ  1   ;timer 2 clock prescaler select bit
tmr1cs                equ  1   ;timer 1 clock source select bit
tmr1ie                equ  0   ;
tmr1if                equ  0   ;bandera de interrupcion por tmr1.
tmr1on                equ  0   ;timer 1 on bit
tmr2ie                equ  1   ;
tmr2if                equ  1   ;bandera de interrupcion por tmr2.
tmr2on                equ  2   ;timer 2 on bit 
toutps0               equ  3   ;timer 2 output postscale select bit
toutps1               equ  4   ;timer 2 output postscale select bit
toutps2               equ  5   ;timer 2 output postscale select bit
toutps3               equ  6   ;timer 2 output postscale select bit
z                     equ  2   ;bit cero
activa_contactor      equ  0   ;salida para excitar el contactor.
contactor_activado   equ  2   ;lectura de comprobacion de cuando el contactor se encuentra excitado.
e_arranqueinicial     equ  2   ;estado de situacion de arranque inicial o no
e_compresor           equ  0   ;estado del compresor o=parado, 1= arrancado
e_fallosecado         equ  6   ;estado del fallo del secado
e_parada              equ  1   ;estado de la orden de parada
e_presostato          equ  7   ;estado del presostato
e_valoresajustados   equ  3   ;estado de comprobacion si los tiempos para la parada estan ajustados.
e_valvulasecado       equ  5   ;
f_electrico           equ  2   ;salida de fallo por un fallo eléctrico.
f_p_maxima            equ  3   ;salida de fallo del presostato de presión >2,5bares.
f_p_minima            equ  4   ;salida de fallo del presostato de presión <0,5bares.
f_secado              equ  4   ;salida de indicación de fallo del secador.
f_temperatura         equ  5   ;salida de indicacion de averia por sobretemperatura.
f_tension_ac          equ  1   ;salida de indicación de falta de tensión alterna.
p_electrica           equ  4   ;lectura de la señal de las protecciones eléctricas ok.
p_maxima              equ  3   ;lectura del presostato de presión > 2,5bar.
p_minima              equ  2   ;lectura del presostato de <0,5bar.
presostato_secado     equ  1   ;lectura del estado del presostato del secador.
prueba_fabrica        equ  7   ;lectura de comprobación si es funcionamiento normal o de prueba en fabrica.
puesta_marcha         equ  0   ;lectura de la existencia de petición de puesta en marcha del compresor.
rearme                equ  3   ;lectura del pulsador de peticion de rearmar averias.
reg_a                 equ  6   ;bandera de comparacion de registros a 16 bits
reg_b                 equ  7   ;bandera de comparacion de registros a 16 bits
salida_control        equ  6   ;salida de control de funcionamiento del equipo.
sonda_temperatura     equ  0   ;lectura del estado de la sonda de temperatura del motor eléctrico. 
sub_inte              equ  0   ;bandera de subrrutina cancelada por interrupcion.
temperatura_aceite   equ  1   ;lectura de la temperatura del aceite del compresor.
tension_ac            equ  5   ;lectura de la existencia de tensión alterna.
valvula_secado        equ  5   ;salida para excitar la electroválvula del secador. 


;------------------------------------------------------------
;               Declaración de Registros EEPROM
;------------------------------------------------------------


;------------------------------------------------------------
;                        Inicio
;------------------------------------------------------------

   org 0
   goto paso2
   org 4
   movwf _np_w
   swapf _np_w,1
   movf status,w
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movwf _np_status
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfsc pir1,tmr1if
   goto inte_t1
   btfsc pir1,tmr2if
   goto inte_t2
salir_interrupcion
   bsf _np_banderas2,sub_inte       ;activar la bandera de rutina cancelada por interrupcion
   movf _np_status,w 
   movwf status
   swapf _np_w,w 
   retfie


   ;------------------------------------------------------------
   ;                      inicio de la interrupción por tmr2
   ;------------------------------------------------------------
inte_t2_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf pir1,tmr2if
   goto salir_interrupcion
inte_t2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf t2con,tmr2on                 ;desactivar el tmr2
inte_t23_inte
   bcf _np_banderas2,sub_inte
   incf cuentaparada,1
   btfsc status,z
   incf cuentaparada_h,1
   btfsc _np_banderas2,sub_inte     ;si la subrutina fue cancelada por una interrupcion
   goto inte_t23_inte               ;ejecutar el calculo
   bsf t2con,tmr2on                 ;activar el tmr2
inte_t25
   goto inte_t2_salir

   ;------------------------------------------------------------
   ;                      inicio de la interrupción por tmr1
   ;------------------------------------------------------------
inte_t1_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf pir1,tmr1if
   goto salir_interrupcion
inte_t1
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf t1con,tmr1on                 ;desactivar el tmr1
   btfss estado_equipo,e_fallosecado;si el bit e_fallosecado = 1
   goto inte_t110
inte_t14
   bsf portc,f_secado               ;se activa la señal de fallo del secador
   bsf estado_equipo,e_fallosecado  ;se activa la confirmacion de fallo del secador
   bcf portc,valvula_secado         ;como esta activada la desactivamos
   bcf estado_equipo,e_valvulasecado;como esta activada, desactivamos el estado de la valvula del secador
   bcf t1con,tmr1on                 ;desactivar el tmr1
inte_t19
   goto inte_t1_salir
inte_t110
   incf cuenta1m,1                  ;se incrementa 1 el contador de tiempo del secado
   movf cuenta1m,w                  ;si el reg cuenta1m = cuenta1mtotal
   xorwf cuenta1mtotal,w            ;si el reg cuenta1m = cuenta1mtotal
   btfss status,z
   goto inte_t118
   btfss estado_equipo,e_valvulasecado;si el bit e_valvulasecado = 1
   goto inte_t119
   bcf portc,valvula_secado         ;como esta activada la desactivamos
   bcf estado_equipo,e_valvulasecado;como esta activada, desactivamos el estado de la valvula del secador
inte_t115
   clrf cuenta1m                    ;se resetea el valor dl contador del oscilador del secador
   incf cuenta1h,1                  ;se incrementa en 1 el contador de fallo del secado
   movf cuenta1h,w                  ;si el reg cuenta1h = cuenta1htotal
   xorwf cuenta1htotal,w            ;si el reg cuenta1h = cuenta1htotal
   btfsc status,z
   goto inte_t14                    ;cierra el ciclo
   goto inte_t118
inte_t118
   bsf t1con,tmr1on                 ;activar el tmr1
   goto inte_t1_salir
inte_t119
   bsf portc,valvula_secado         ;como esta desactivada la activamos
   bsf estado_equipo,e_valvulasecado;como esta desactivada, activamos el estado de la valvula del secador
   goto inte_t115                   ;cierra el ciclo
   goto inte_t118                   ;cierra el ciclo

;------------------------------------------------------------
;                      programa principal
;------------------------------------------------------------
paso2
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf _np_w
   clrf cuenta1m
   clrf cuenta1mtotal
   clrf cuenta1h
   clrf cuenta1htotal
   clrf cuentaparada
   clrf t_parada
   clrf t_pr2
   clrf t_parada_h
   clrf _np_tiempo
   clrf _np_tiempo1
   clrf _np_tiempo2
   clrf cuentaparada_h
   clrf _np_banderas
   clrf _np_temp
   clrf _np_temp1
   clrf _np_temp2
   clrf _np_temp3
   clrf _np_temp4
   clrf _np_tiempo3
   clrf _np_status
   clrf estado_equipo
   clrf _np_banderas2
   clrf t_parada_total
   clrf cuenta_parpadeo
   clrf cuenta_arranque
   clrf _np_w
   clrf _np_w
   clrf _np_w
   clrf porta
   movlw b'00111111'                ;configurar el puerto a como xxeeeeee
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisa
   movlw b'00000111'                ;puerto a = e/s digital
   movwf adcon1
   bcf status,rp0                   ;cambiar a banco 0
   clrf portb
   movlw b'10000000'                ;configurar el puerto b como esssssss
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisb
   bcf status,rp0                   ;cambiar a banco 0
   clrf portc
   movlw b'10001111'                ;configurar el puerto c como essseeee
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisc
   bcf status,rp0                   ;cambiar a banco 0
   movlw .6                         ;temporizador 6 seg
   call tmp_1_mgc
   bcf t2con,t2ckps0                ;tmr2 - configurar preescalado a 16
   bsf t2con,t2ckps1
   bsf t2con,toutps0                ;tmr2 - configurar postdivisor a 16
   bsf t2con,toutps1
   bsf t2con,toutps2
   bsf t2con,toutps3
   bsf t1con,t1ckps0                ;tmr1 - configurar preescalado a 8
   bsf t1con,t1ckps1
   bcf t1con,tmr1cs                 ;origen de la señal de reloj de tmr1 = reloj interno
   movlw b'00001011'                ;valor para contar 0,5sg (0bdc mas exacto)
   movwf tmr1h
   movlw b'11100000'
   movwf tmr1l
   movlw b'01110101'                ;tiempo parcial para la parada
   movwf t_parada_h
   movlw b'00110000'
   movwf t_parada
   clrf t_parada_total              ;tiempo total de parada
   movlw d'7'                       ;valor de cuenta de retraso de la parada.
   movwf t_pr2
   bsf estado_equipo,e_arranqueinicial;se establece la condicion de primer arranque para el secador
   bcf estado_equipo,e_presostato   ;se inicializa el estado del presostato del secador
   bcf estado_equipo,e_fallosecado  ;se inicializa el estado del fallo del presostato del secador
   bcf estado_equipo,e_valvulasecado;se inicializa el estado dela valvula del secador
   clrf cuenta1m                    ;estado inicial.
   clrf cuenta1h                    ;estado inicial.
   clrf cuenta1htotal               ;estado inicial.
   clrf cuenta1mtotal               ;estado inicial.
   bcf estado_equipo,e_compresor    ;se inicializa el estado del compresor
   movf t_pr2,w                     ;estado inicial.
   bsf status,rp0                   ;cambiar a banco 1
   movwf pr2
   bsf intcon,gie                   ;activar habilitador general de interrupciones.
   bsf pie1,tmr1ie                  ;activar interrupción por tmr1.
   bsf pie1,tmr2ie                  ;activar interrupción por tmr2.
   bsf intcon,peie                  ;activar habilitador general de interrupciones por perifericos.
   bcf status,rp0                   ;cambiar a banco 0
   btfss portb,prueba_fabrica       ;si el bit prueba_fabrica = 1
   goto paso37
   movlw d'5'                       ;t= 5 x 0,5sg(tmr1)=2,5sg oscilacion secado
   movwf cuenta1mtotal
   movlw d'10'                      ;t= 10x 5 x 0,5sg(tmr1)=25sg para el fallo del secado
   movwf cuenta1htotal
paso26
   movlw .10                        ;temporizador 100 mse
   call tmp_100_mc
   call usr_compresor_parado
   call usr_sin_averias
paso29
   call usr_prueba_ac
   call usr_sonda_temperatura
   call usr_sobretemp_compresor
   call usr_prueba_pe
   call usr_prueba_p_minima
   call usr_arrancar
   call usr_prueba_p_maxima
   call usr_presostato
   goto paso29                      ;cierra el ciclo
paso37
   movlw d'140'                     ;t= 140 x 0,6sg(tmr1)=,51 minutos oscilación secado
   movwf cuenta1mtotal
   movlw d'7'                       ;t= 6x 140 x 0,65sg(tmr1)=600sg para el fallo del secado
   movwf cuenta1htotal
   goto paso26                      ;cierra el ciclo


;------------------------------------------------------------
;                  Declaración de Subrutinas
;------------------------------------------------------------

usr_compresor_parado
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf t1con,tmr1on                 ;desactivar el tmr1
   bcf t2con,tmr2on                 ;desactivar el tmr2
   bcf portb,activa_contactor       ;se desexcita el contactor
   bcf portc,valvula_secado         ;se desactiva la valvula del secador
   bcf estado_equipo,e_compresor    ;se resetea la variable del estado del compresor
   bcf estado_equipo,e_parada       ;se resetea la variable del estado de la parada
   bcf estado_equipo,e_valoresajustados;se resetea la variable del ajuste de los valores de actuacion
   clrf cuentaparada_h              ;se resetea ella cuenta del tiempo de parada
   clrf cuentaparada

   clrf t_parada_total              ;se resetea el contador total de la parada
   btfsc estado_equipo,e_valvulasecado;si el bit e_valvulasecado = 0
   goto usr_compresor_parado14
usr_compresor_parado12
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   movlw .25                        ;temporizador 25 mse
   call tmp_1_mc
usr_compresor_parado13
   goto usr_compresor_parado_salir
usr_compresor_parado14
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf estado_equipo,e_valvulasecado;como estaba en marcha, se deja en marcha para ei proximo arranque del compresor
   goto usr_compresor_parado12      ;cierra el ciclo
usr_compresor_parado_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_sin_averias
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf portb
   movlw b'00000000'                ;configurar el puerto b como ssssssss
   bsf status,rp0                   ;cambiar a banco 1
   movwf trisb
   ;escribir en el puerto b
   movlw b'10000000'
   bcf status,rp0                   ;cambiar a banco 0
   movwf portb
   bcf portc,f_secado               ;se elimina el fallo del secador
usr_sin_averias5
   goto usr_sin_averias_salir
usr_sin_averias_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_presostato
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bcf t1con,tmr1on                 ;desactivar el tmr1
   btfsc estado_equipo,e_compresor  ;si el bit e_compresor = 0
   goto usr_presostato5
   goto usr_presostato_salir
usr_presostato5
   btfsc estado_equipo,e_fallosecado;si el bit e_fallosecado = 0
   goto usr_presostato_salir
   goto usr_presostato6
usr_presostato6
   btfss estado_equipo,e_arranqueinicial;si el bit e_arranqueinicial = 1
   goto usr_presostato12
   bsf portc,valvula_secado         ;se activa la valvula del secador
   bsf estado_equipo,e_valvulasecado;se guarda el estado de la valvula del secador
   bcf estado_equipo,e_arranqueinicial;se guarda el estado de compresor arrancado
usr_presostato10
   movlw b'00001011'                ;valor de cuenta de 0,5seg del temporizador del secador
   movwf tmr1h
   movlw b'11100000'
   movwf tmr1l
usr_presostato11
   bsf t1con,tmr1on                 ;activar el tmr1
   goto usr_presostato_salir
usr_presostato12
   btfsc estado_equipo,e_valvulasecado;si el bit e_valvulasecado = 0
   goto usr_presostato18
   bcf portc,valvula_secado         ;se desactiva la valvula del secador
   bcf estado_equipo,e_valvulasecado;se guarda el estado de la valvula del secador
usr_presostato15
   clrw                             ;si el bit e_presostato = presostato_secado
   btfsc estado_equipo,e_presostato
   movlw b'00000001'
   btfsc portc,presostato_secado
   xorlw b'00000001'
   btfss portc,presostato_secado
   xorlw b'00000000'
   btfsc status,z
   goto usr_presostato11            ;cierra el ciclo
   goto usr_presostato16
usr_presostato16
   btfsc portc,presostato_secado    ;se guarda el nuevo valor del presostato
   bsf estado_equipo,e_presostato
   btfss portc,presostato_secado
   bcf estado_equipo,e_presostato
   clrf cuenta1h                    ;se resetea el contador de averia del secador
   goto usr_presostato10            ;cierra el ciclo
usr_presostato18
   bsf portc,valvula_secado         ;se activa la valvula del secador
   bsf estado_equipo,e_valvulasecado;se guarda el estado de la valvula del secador
   goto usr_presostato15            ;cierra el ciclo
usr_presostato_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_prueba_ac
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfsc porta,tension_ac           ;si el bit tension_ac = 0
   goto usr_prueba_ac_salir
   movlw .1                         ;temporizador 1 seg
   call tmp_1_mgc
   btfsc porta,tension_ac           ;si el bit tension_ac = 0
   goto usr_prueba_ac_salir
   btfss estado_equipo,e_compresor  ;si el bit e_compresor = 1
   goto usr_prueba_ac12
   call usr_compresor_parado
usr_prueba_ac7
   bsf portb,f_tension_ac           ;se activa la orden de fallo de tension alterna
   btfss porta,tension_ac           ;si el bit tension_ac = 1
   goto usr_prueba_ac7              ;cierra el ciclo
   call usr_retraso1m_parpadeo
usr_prueba_ac10
   bcf portb,f_tension_ac           ;se elimina la orden de fallo de tension alterna
   goto usr_prueba_ac_salir
usr_prueba_ac12
   bsf portb,f_tension_ac           ;se activa la orden de fallo de tension alterna
   btfss porta,tension_ac           ;si el bit tension_ac = 1
   goto usr_prueba_ac12             ;cierra el ciclo
   call usr_retraso10_parpadeo
   goto usr_prueba_ac10             ;cierra el ciclo
usr_prueba_ac_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_sonda_temperatura
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfsc porta,sonda_temperatura    ;si el bit sonda_temperatura = 0
   goto usr_sonda_temperatura7
   call usr_compresor_parado
usr_sonda_temperatura4
   bsf portb,f_temperatura          ;se activa la orden de fallo de sobretemperatura
   btfss porta,sonda_temperatura    ;si el bit sonda_temperatura = 1
   goto usr_sonda_temperatura4      ;cierra el ciclo
   btfss portc,rearme               ;si el bit rearme = 1
   goto usr_sonda_temperatura4      ;cierra el ciclo
usr_sonda_temperatura7
   bcf portb,f_temperatura          ;se elimina la orden de fallo de temperatura
usr_sonda_temperatura8
   goto usr_sonda_temperatura_salir
   goto usr_sonda_temperatura7      ;cierra el ciclo
usr_sonda_temperatura_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_sobretemp_compresor
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfsc porta,temperatura_aceite   ;si el bit temperatura_aceite = 0
   goto usr_sobretemp_compresor7
   call usr_compresor_parado
usr_sobretemp_compresor4
   bsf portb,f_temperatura          ;se activa la orden de fallo de sobretemperatura
   btfss porta,temperatura_aceite   ;si el bit temperatura_aceite = 1
   goto usr_sobretemp_compresor4    ;cierra el ciclo
   btfss portc,rearme               ;si el bit rearme = 1
   goto usr_sobretemp_compresor4    ;cierra el ciclo
usr_sobretemp_compresor7
   bcf portb,f_temperatura          ;se elimina la orden de fallo de temperatura
usr_sobretemp_compresor8
   goto usr_sobretemp_compresor_salir
   goto usr_sobretemp_compresor7    ;cierra el ciclo
usr_sobretemp_compresor_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_prueba_pe
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss porta,p_electrica          ;si el bit p_electrica = 1
   goto usr_prueba_pe7
   call usr_compresor_parado
usr_prueba_pe4
   bsf portb,f_electrico            ;se activa la orden de fallo electrico
   btfsc porta,p_electrica          ;si el bit p_electrica = 0
   goto usr_prueba_pe4              ;cierra el ciclo
   call usr_parpadear
usr_prueba_pe7
   bcf portb,f_electrico            ;se elimina la orden de fallo electrico
usr_prueba_pe8
   goto usr_prueba_pe_salir
   goto usr_prueba_pe7              ;cierra el ciclo
usr_prueba_pe_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_prueba_p_minima
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfsc porta,p_minima             ;si el bit p_minima = 0
   goto usr_prueba_p_minima7
   call usr_compresor_parado
usr_prueba_p_minima4
   bsf portb,f_p_minima             ;se activa la orden de fallo de p<0,5bares
   btfss porta,p_minima             ;si el bit p_minima = 1
   goto usr_prueba_p_minima4        ;cierra el ciclo
   call usr_parpadear
usr_prueba_p_minima7
   bcf portb,f_p_minima             ;se elimina la orden de fallo presion <0,5bares
usr_prueba_p_minima8
   goto usr_prueba_p_minima_salir
   goto usr_prueba_p_minima7        ;cierra el ciclo
usr_prueba_p_minima_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_arrancar
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss portc,puesta_marcha        ;si el bit puesta_marcha = 1
   goto usr_arrancar13
   btfsc estado_equipo,e_compresor  ;si el bit e_compresor = 0
   goto usr_arrancar8
   bsf portb,activa_contactor       ;se excita el contactor
   movlw .50                        ;temporizador 500 mse
   call tmp_100_mc
   call usr_contactor_excitado
   bsf estado_equipo,e_parada       ;se activa el permiso de parada
usr_arrancar8
   bcf estado_equipo,e_valoresajustados;se inicializa el estado de los valores ajustados para la parada
   clrf cuentaparada_h              ;se resetea el contador del tiempo de parada
   clrf cuentaparada

   clrf t_parada_total              ;se resetea el numero de veces de cuenta para la parada
usr_arrancar11
   bcf t2con,tmr2on                 ;desactivar el tmr2
usr_arrancar12
   goto usr_arrancar_salir
   goto usr_arrancar8               ;cierra el ciclo
usr_arrancar13
   btfss estado_equipo,e_parada     ;si el bit e_parada = 1
   goto usr_arrancar11              ;cierra el ciclo
   goto usr_arrancar14
usr_arrancar14
   btfss estado_equipo,e_valoresajustados;si el bit e_valoresajustados = 1
   goto usr_arrancar21
   bsf status,c                     ;si el reg cuentaparada_h,cuentaparada = t_parada_h,t_parada
   movf cuentaparada_h,w
   xorwf t_parada_h,w
   btfss status,z
   bcf status,c
   btfsc status,c
   movf cuentaparada,w
   btfsc status,c
   xorwf t_parada,w
   btfss status,z
   goto usr_arrancar_salir
   incf t_parada_total,1            ;se incrementa el tiempo total en 1
   movf t_parada_total,w            ;si el reg t_parada_total = d'10'
   xorlw d'10'
   btfss status,z
   goto usr_arrancar20
   call usr_compresor_parado
   movlw .60                        ;temporizador 60 seg
   call tmp_1_mgc
   goto usr_arrancar_salir
usr_arrancar20
   clrf cuentaparada_h              ;se resetea el contador del tiempo de parada
   clrf cuentaparada

   goto usr_arrancar_salir
usr_arrancar21
   movf t_pr2,w                     ;se recarga el tiempo para la parada
   movwf tmr2
   clrf cuentaparada_h              ;se resetea el contador del tiempo de parada
   clrf cuentaparada

   bsf estado_equipo,e_valoresajustados;se inicializa el estado de los valores ajustados para la parada
   bsf t2con,tmr2on                 ;activar el tmr2
   goto usr_arrancar_salir
usr_arrancar_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_prueba_p_maxima
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfss portc,contactor_activado   ;si el bit contactor_activado = 1
   goto usr_prueba_p_maxima_salir
   btfsc estado_equipo,e_compresor  ;si el bit e_compresor = 0
   goto usr_prueba_p_maxima5
   movlw .5                         ;temporizador 5 seg
   call tmp_1_mgc
usr_prueba_p_maxima5
   btfsc porta,p_maxima             ;si el bit p_maxima = 0
   goto usr_prueba_p_maxima13
   call usr_compresor_parado
usr_prueba_p_maxima7
   bsf portb,f_p_maxima             ;se activa la orden de fallo de p>2,5bares
   btfsc porta,p_maxima             ;si el bit p_maxima = 0
   goto usr_prueba_p_maxima7        ;cierra el ciclo
   btfsc portc,puesta_marcha        ;si el bit puesta_marcha = 0
   goto usr_prueba_p_maxima7        ;cierra el ciclo
   btfss portc,rearme               ;si el bit rearme = 1
   goto usr_prueba_p_maxima7        ;cierra el ciclo
   bcf portb,f_p_maxima             ;se elimina la orden de fallo presion >2,5bares
   goto usr_prueba_p_maxima_salir
usr_prueba_p_maxima13
   bsf estado_equipo,e_compresor    ;se guarda el estado de compresor arrancado
   btfss estado_equipo,e_fallosecado;si el bit e_fallosecado = 1
   goto usr_prueba_p_maxima16
   bcf t1con,tmr1on                 ;desactivar el tmr1
   goto usr_prueba_p_maxima_salir
usr_prueba_p_maxima16
   bsf t1con,tmr1on                 ;activar el tmr1
   goto usr_prueba_p_maxima_salir
   goto usr_prueba_p_maxima5        ;cierra el ciclo
usr_prueba_p_maxima_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_retraso1m_parpadeo
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf cuenta_arranque             ;valor de espera para un nuevo arranque
usr_retraso1m_parpadeo3
   bsf portb,salida_control         ;led de control encendido
   movlw .1                         ;temporizador 1 seg
   call tmp_1_mgc
   bcf portb,salida_control         ;led de control apagado
   movlw .1                         ;temporizador 1 seg
   call tmp_1_mgc
   incf cuenta_arranque,1           ;se incrementa el contador de retardo nuevo arranque
   movf cuenta_arranque,w           ;si el reg cuenta_arranque = d'30'
   xorlw d'30'
   btfss status,z
   goto usr_retraso1m_parpadeo3     ;cierra el ciclo
   bcf portb,salida_control         ;led de control apagado
usr_retraso1m_parpadeo10
   goto usr_retraso1m_parpadeo_salir
usr_retraso1m_parpadeo_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_retraso10_parpadeo
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   clrf cuenta_parpadeo             ;se inicializa el contador de parpadeo de 10sg.
usr_retraso10_parpadeo3
   bsf portb,salida_control         ;se enciende el led
   movlw .50                        ;temporizador 500 mse
   call tmp_100_mc
   bcf portb,salida_control         ;se apaga el led
   movlw .50                        ;temporizador 500 mse
   call tmp_100_mc
   incf cuenta_parpadeo,1           ;se incrementa el contador de 10sg.
   movf cuenta_parpadeo,w           ;si el reg cuenta_parpadeo = d'10'
   xorlw d'10'
   btfss status,z
   goto usr_retraso10_parpadeo3     ;cierra el ciclo
   goto usr_retraso10_parpadeo_salir
usr_retraso10_parpadeo_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_parpadear
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   bsf portb,salida_control         ;activa el pin rb6 configurado como control
   movlw .20                        ;temporizador 200 mse
   call tmp_100_mc
   bcf portb,salida_control         ;desactiva el pin rb6 configurado como control
   movlw .20                        ;temporizador 200 mse
   call tmp_100_mc
   bsf portb,salida_control         ;activa el pin rb6 configurado como control
   movlw .20                        ;temporizador 200 mse
   call tmp_100_mc
   bcf portb,salida_control         ;desactiva el pin rb6 configurado como control
   movlw .20                        ;temporizador 200 mse
   call tmp_100_mc
   bsf portb,salida_control         ;activa el pin rb6 configurado como control
   movlw .20                        ;temporizador 200 mse
   call tmp_100_mc
   bcf portb,salida_control         ;desactiva el pin rb6 configurado como control
   movlw .20                        ;temporizador 200 mse
   call tmp_100_mc
usr_parpadear14
   goto usr_parpadear_salir
usr_parpadear_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


usr_contactor_excitado
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   btfsc portc,contactor_activado   ;si el bit contactor_activado = 0
   goto usr_contactor_excitado_salir
   call usr_compresor_parado
usr_contactor_excitado4
   bsf portb,f_electrico            ;se activa la orden de fallo electrico
   btfsc portc,puesta_marcha        ;si el bit puesta_marcha = 0
   goto usr_contactor_excitado4     ;cierra el ciclo
   call usr_parpadear
   bcf portb,f_electrico            ;se elimina la orden de fallo electrico
   goto usr_contactor_excitado_salir
usr_contactor_excitado_salir
   bcf status,rp0                   ;cambiar a banco 0
   bcf status,rp1
   return


tmp_1_mgc
   movwf _np_tiempo
   goto tmp_1_mgc_1
tmp_1_mgc_bucle2
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tmp_1_mgc_1
   movlw .10
   movwf _np_tiempo1
tmp_1_mgc_bucle1
   nop
   nop
   movlw .99
   movwf _np_tiempo2
tmp_1_mgc_bucle0
   nop
   nop
   nop
   movlw .200
   movwf _np_tiempo3
tmp_1_mgc_bucle
   nop
   nop
   decfsz _np_tiempo3,1
   goto tmp_1_mgc_bucle
   nop
   nop
   nop
   decfsz _np_tiempo2,1
   goto tmp_1_mgc_bucle0
   nop
   nop
   nop
   decfsz _np_tiempo1,1
   goto tmp_1_mgc_bucle1
   decfsz _np_tiempo,1
   goto tmp_1_mgc_bucle2
   return


tmp_100_mc
   movwf _np_tiempo
   goto tmp_100_mc_1
tmp_100_mc_bucle2
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tmp_100_mc_1
   movlw .22
   movwf _np_tiempo1
tmp_100_mc_bucle1
   movlw .150
   movwf _np_tiempo2
tmp_100_mc_bucle
   decfsz _np_tiempo2,1
   goto tmp_100_mc_bucle
   decfsz _np_tiempo1,1
   goto tmp_100_mc_bucle1
   nop
   decfsz _np_tiempo,1
   goto tmp_100_mc_bucle2
   return


tmp_1_mc
   movwf _np_tiempo
   goto tmp_1_mc_1
tmp_1_mc_bucle1
   nop
   nop
   nop
   nop
   nop
   nop
   nop
tmp_1_mc_1
   movlw .246
   movwf _np_tiempo1
tmp_1_mc_bucle2
   nop
   decfsz _np_tiempo1,1
   goto tmp_1_mc_bucle2
   nop
   nop
   nop
   nop
   nop
   decfsz _np_tiempo,1
   goto tmp_1_mc_bucle1
   return



;------------------------------------------------------------
;                  DATOS EN MEMORIA EEPROM
;------------------------------------------------------------
   org  0x2100
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff
   data   0xff

 End