Define CONF_WORD = 0x23e4
Define CONF_WORD_2 = 0x3eff
Define CLOCK_FREQUENCY = 8 'Frecuencia del reloj en Mhz
'********************************************************************************************
'* *
'* NOMBRE PROGRAMA: Control de compresor rotativo *
'* *
'* AUTOR: Fermín C. Ruiz Martín VERSIÓN: 0.01 *
'* *
'* MICRO: 16F887 FECHA: 28.12.2010 *
'* *
'* DESCRIPCIÓN: Versión inicial *
'* *
'********************************************************************************************
'******************************** SECCIÓN DE DEFINES ****************************************
'***************************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1 'Ignora los valores de Waitms. Solo habilitado para simulador
'***************************************************************************************************
'******************************** SECCIÓN DE ETIQUETAS *************************************
'*
'******************************** SECCIÓN DE VARIABLES***************************************
'*
'* En esta zona del programa se colacan las variables que puedan cambiar su valor durante
'*el discurrir de nuestro programa. Se realizan anteponiendo la palabra: DIM
'---------------------- Asignación de valores a las variables ------------------------------
'------------------ Reasignación de nombres a los pines del micro --------------------------
'Symbol entrada1 = RD1 'entrada digital 1
Symbol sobretemperatura = RD0 'entrada digital 2.
'Symbol entrada3 = RE2 'entrada digital 3
'Symbol entrada4 = RE1 'entrada digital 4
'Symbol entrada5 = RE0 'entrada digital 5
'Symbol entrada6 = RA5 'entrada digital 6
Symbol ac_ok = RA4 'entrada digital 7. Entrada de señal de 400v.
'Symbol entrada8 = RA3 'entrada digital 8
'Symbol entrada9 = RA2 'entrada digital 9
Symbol equipo_ok = RD2 'salida digita 1.Salida de estado del equipo.
Symbol fallo_st = RD3 'salida digita 2
'Symbol salida3 = RD4 'salida digita 3
'Symbol salida4 = RD5 'salida digita 4
'Symbol salida5 = RD6 'salida digita 5
Symbol contactor = RD7 'salida digita 6.
Symbol fallo_ac = RB0 'salida digita 7
Symbol fallo_secado = RB1 'salida digita 8
Symbol valvula_1 = RB2 'salida digita 9. Electroválvula de secado 1.
Symbol valvula_2 = RB3 'salida digita 10. Electroválvula de secado 2
'Symbol salida11 = RB4 'salida digita 11
'Symbol salida12 = RB5 'salida digita 12
'------------------------------ Definición de puertos -------------------------------------
ANSEL = 0x00 'Los pin I/O digitales
OSCCON = 0x7e 'Set intrc To 8mhz, se usara reloj interno a 8Mh
TRISA = %11111111 'Puerto A los configurado como entradas digitales.
TRISB = %00000000 'Puerto B configurado como salidas digitales.
TRISD = %00000011 'Puerto D bits 0 y 1 entradas el resto salidas, todo digitales.
TRISE = %11111111 'Puerto E como entradas digitales.
'-------------------- Inicializacion de timers e interrupciones ---------------------------
'T1CON.TMR1CS = 0 'Bit de seleccion de reloj para el timer1, interno Fosc/4
'T1CON.T1CKPS0 = 0 'Bit de seleccion del prescaler para el reloj del timer1
'T1CON.T1CKPS1 = 1 'Bit de seleccion del prescaler para el reloj del timer1
'TMR1H = 0xf8 'carga el registro del contador para que desborde cada 1mSeg, byte alto
'TMR1L = 0x30 'carga el registro del contador para que desborde cada 1mSeg, byte bajo
'INTCON.PEIE = 1 'Habilitacion de interrupciones de perifericos
'T1CON.TMR1ON = 1 'Activa el contador del TMR1
'PIE1.TMR1IE = 1 'Activa las interrupciones del timer1
'Enable 'INTCON.GIE habilita todas las interrupciones globales
main:
equipo_ok = 1
inicio:
contactor = 1 'solo para prueba
fallo_secado = 0 'solo para prueba
valvula_1 = 1 'solo para prueba
valvula_2 = 1 'solo para prueba
prueba_ac:
If ac_ok = 0 Then
fallo_ac = 1
contactor = 0
valvula_1 = 0
valvula_2 = 0
fallo_secado = 1
equipo_ok = 0
Goto prueba_ac
Else
fallo_ac = 0
equipo_ok = 1
Endif
prueba_st:
If sobretemperatura = 0 Then
fallo_st = 1
contactor = 0
valvula_1 = 0
'valvula_2 = 0
fallo_secado = 1
equipo_ok = 0
Goto prueba_st
Else
fallo_st = 0
equipo_ok = 1
Endif
Goto inicio
'*********************************** FIN DEL PROGRAMA ***************************************
End 'Fin del programa
main:
equipo_ok = 1
inicio:
contactor = 1 'solo para prueba
fallo_secado = 0 'solo para prueba
valvula_1 = 1 'solo para prueba
valvula_2 = 1 'solo para prueba
prueba_ac:
While ac_ok = 0
fallo_ac = 1
contactor = 0
valvula_1 = 0
valvula_2 = 0
fallo_secado = 1 'solo para prueba
equipo_ok = 0
Wend
fallo_ac = 0
equipo_ok = 1
prueba_st:
While sobretemperatura = 0
fallo_st = 1
contactor = 0
valvula_1 = 0
valvula_2 = 0
fallo_secado = 1 'solo para prueba
equipo_ok = 0
Wend
fallo_st = 0
equipo_ok = 1
Goto inicio
'*********************************** FIN DEL PROGRAMA ***************************************
End 'Fin del pro
'prueba de sobretemperatura del motor y compresor:
While sobretemperatura = 0
Gosub compresor_off
fallo_st = 1
estado_fallo = 1
equipo_ok = 0
Wend
While estado_fallo = 1 And pmm = 1 And rearme = 0
fallo_st = 1
Wend
While estado_fallo = 1 And pmm = 1 And rearme = 1
fallo_st = 1
Wend
While estado_fallo = 1 And pmm = 0 And rearme = 0
fallo_st = 1
Wend
If estado_fallo = 1 And pmm = 0 And rearme = 1 Then
fallo_st = 0
equipo_ok = 1
estado_fallo = 0
Endif
Define CONF_WORD = 0x23e4
Define CONF_WORD_2 = 0x3eff
Define CLOCK_FREQUENCY = 8 'Frecuencia del reloj en Mhz
'********************************************************************************************
'* *
'* NOMBRE PROGRAMA: Control de compresor rotativo *
'* *
'* AUTOR: Fermín C. Ruiz Martín VERSIÓN: 0.01 *
'* *
'* MICRO: 16F887 FECHA: 28.12.2010 *
'* *
'* DESCRIPCIÓN: Versión inicial *
'* *
'********************************************************************************************
'******************************** SECCIÓN DE DEFINES ****************************************
'********************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1 'Ignora los valores de Waitms. Solo para simulador
'********************************************************************************************
'******************************** SECCIÓN DE ETIQUETAS **************************************
'*
'******************************** SECCIÓN DE VARIABLES***************************************
'*
'* En esta zona del programa se colacan las variables que puedan cambiar su valor durante
'*el discurrir de nuestro programa. Se realizan anteponiendo la palabra: DIM
Dim x As Byte 'variable de contador de parpadeo.
Dim estado_fallo As Bit
'---------------------- Asignación de valores a las variables ------------------------------
'------------------ Reasignación de nombres a los pines del micro --------------------------
Symbol pmm = RD1 'entrada digital 1. Petición de arranque.
Symbol sobretemperatura = RD0 'entrada digital 2.
Symbol p_min = RE2 'entrada digital 3. Presión mínima.
'Symbol entrada4 = RE1 'entrada digital 4
Symbol pe = RE0 'entrada digital 5. Protección eléctrica.
'Symbol entrada6 = RA5 'entrada digital 6
Symbol ac_ok = RA4 'entrada digital 7. Entrada de señal de 400v.
'Symbol entrada8 = RA3 'entrada digital 8
Symbol rearme = RA2 'entrada digital 9. Rearme de averías.
Symbol equipo_ok = RD2 'salida digita 1.Salida de estado del equipo.
Symbol fallo_st = RD3 'salida digita 2
Symbol fallo_p_min = RD4 'salida digita 3. Fallo de la presión mínima
'Symbol salida4 = RD5 'salida digita 4
Symbol fallo_pe = RD6 'salida digita 5. Fallo protección eléctrica.
Symbol contactor = RD7 'salida digita 6.
Symbol fallo_ac = RB0 'salida digita 7
Symbol fallo_secado = RB1 'salida digita 8
Symbol valvula_1 = RB2 'salida digita 9. Electroválvula de secado 1.
Symbol valvula_2 = RB3 'salida digita 10. Electroválvula de secado 2
'Symbol salida11 = RB4 'salida digita 11
'Symbol salida12 = RB5 'salida digita 12
Symbol control = RB7 'salida de control del estado del equipo.
'------------------------------ Definición de puertos -------------------------------------
AllDigital
OSCCON = 0x7e 'Set intrc To 8mhz, se usara reloj interno a 8Mh
TRISA = %11111111 'Puerto A los configurado como entradas digitales.
TRISB = %00000000 'Puerto B configurado como salidas digitales.
TRISD = %00000011 'Puerto D bits 0 y 1 entradas el resto salidas, todo digitales.
TRISE = %11111111 'Puerto E como entradas digitales.
'-------------------- Inicializacion de timers e interrupciones ---------------------------
'T1CON.TMR1CS = 0 'Bit de seleccion de reloj para el timer1, interno Fosc/4
'T1CON.T1CKPS0 = 0 'Bit de seleccion del prescaler para el reloj del timer1
'T1CON.T1CKPS1 = 1 'Bit de seleccion del prescaler para el reloj del timer1
'TMR1H = 0xf8 'carga el registro del contador para que desborde cada 1mSeg, byte alto
'TMR1L = 0x30 'carga el registro del contador para que desborde cada 1mSeg, byte bajo
'INTCON.PEIE = 1 'Habilitacion de interrupciones de perifericos
'T1CON.TMR1ON = 1 'Activa el contador del TMR1
'PIE1.TMR1IE = 1 'Activa las interrupciones del timer1
'Enable 'INTCON.GIE habilita todas las interrupciones globales
'-------------------------- Inicializacion del modulo A/C ---------------------------------
'Configuración para el conversor A/D. La resolución será de x.5/255=19,53mV por bit si el
'conversor es de 8 bits y de x.5/1024=4,88mV por bit si el conversor es de 10 bits.
'Define ADC_BITS = 8 'Convertidor de 8 bits
'Define ADC_SAMPLEUS = 50 'tiempo de espera entre conversiones del ADC
'Define ADC_CLOCK = 5 '16Tad a 8Mhz = 2uSeg, mínimo permitido por el micro 1.6uSeg, configuracion ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
'ADCON0 = %01100000 'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.6uSeg), channel RA4
'ADCON1 = %01000000 'voltage reference (AVdd/AVss) y seleccion de escala division clock/2 ADCON1.ADCS2=1
'y justificación a la izquierda.
'--------------------------------- PROGRAMA PRINCIPAL ---------------------------------------
main:
'establecimiento de las condiciones iniciales de compresor parado y sin averias.
Gosub compresor_off 'Se establecen condicones para dejar el compresor parado.
Gosub sin_averias 'Estado del equipo sin averías.
inicio:
contactor = 1 'solo para prueba
valvula_1 = 1 'solo para prueba
valvula_2 = 1 'solo para prueba
'--------------------------------------------------------------------------------------------
'prueba de presencia de la tensión alterna de 400Va.c.:
While ac_ok = 0
Gosub compresor_off
fallo_ac = 1
estado_fallo = 1
equipo_ok = 0
Wend
If estado_fallo = 1 Then
Gosub parpadear
estado_fallo = 0
fallo_ac = 0
equipo_ok = 1
Endif
'--------------------------------------------------------------------------------------------
'prueba de sobretemperatura del motor y compresor:
While sobretemperatura = 0
Gosub compresor_off
fallo_st = 1
estado_fallo = 1
equipo_ok = 0
Wend
While estado_fallo = 1 And pmm = 1 And rearme = 0
fallo_st = 1
Wend
While estado_fallo = 1 And pmm = 1 And rearme = 1
fallo_st = 1
Wend
While estado_fallo = 1 And pmm = 0 And rearme = 0
fallo_st = 1
Wend
If estado_fallo = 1 And pmm = 0 And rearme = 1 Then
fallo_st = 0
equipo_ok = 1
estado_fallo = 0
Endif
'--------------------------------------------------------------------------------------------
'prueba de las protecciones eléctricas del motor:
While pe = 1
Gosub compresor_off
fallo_pe = 1
estado_fallo = 1
equipo_ok = 0
Wend
If estado_fallo = 1 Then
Gosub parpadear
estado_fallo = 0
fallo_pe = 0
equipo_ok = 1
Endif
'--------------------------------------------------------------------------------------------
'prueba de la presión mínina:
While p_min = 1
Gosub compresor_off
fallo_p_min = 1
estado_fallo = 1
equipo_ok = 0
Wend
If estado_fallo = 1 Then
Gosub parpadear
estado_fallo = 0
fallo_p_min = 0
equipo_ok = 1
Endif
Goto inicio
'*********************************** FIN DEL PROGRAMA ***************************************
End 'Fin del programa
'------------------------------------ INTERRUPCIONES ----------------------------------------
'On Interrupt 'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
'Save System 'Guarda los valores del sistema para poder reemprender el curso normal del programa
'Resume 'activa las interrupciones y retorna al curso normal del programa antes del salto
'************************************ SUBRUTINAS ********************************************
parpadear:
For x = 1 To 10
control = 1
WaitMs 500
control = 0
WaitMs 500
Next x
Return
compresor_off:
contactor = 0 'Se desactiva el contactor y por tanto el compresor está parado.
valvula_1 = 0 'Se desactiva la electroválvula de secado1.
valvula_2 = 0 'Se desactiva la electroválvula de secado2.
control = 0 'Se desactiva la salida del estado de control del equipo.
Return
sin_averias:
equipo_ok = 1 'estado de equipo ok.
fallo_secado = 0 'Se borra el fallo de las torres de secado.
fallo_ac = 0 'Se borra la avería de fallo de tension alterna de 400V.
fallo_st = 0 'Se borra el fallo de sobre temperatura.
fallo_pe = 0 'Se borra el fallo de las protecciones eléctricas.
estado_fallo = 0 'Se borra el flag de estado de contol del equipo.
Return
'prueba de sobretemperatura del motor y compresor:
While sobretemperatura = 0
Gosub compresor_off
fallo_st = 1
estado_fallo = 1
equipo_ok = 0
Wend
While estado_fallo = 1
If pmm = 1 And rearme = 1 Then
fallo_st = 1
Endif
If pmm = 0 And rearme = 0 Then
fallo_st = 1
Endif
If pmm = 1 And rearme = 0 Then
fallo_st = 1
Endif
If pmm = 0 And rearme = 1 Then
fallo_st = 0
equipo_ok = 1
estado_fallo = 0
Endif
Wend
equipo_ok = 1
contactor_ex = 1
estado_compresor = 0
If contactor_ex = 1 Then
If estado_compresor = 0 Then
WaitMs 5000
equipo_ok = 0
Endif
Endif
Tan sencillo como establecer unos valores equipo_ok, contactor_ex y estado_contactor. De forma que me compruebe que si: contactor_ex=1 y si ademas el estado_compresor=0 entonces se espere 5sg y a continuacion ponga equipo_oK=0.If contactor_ex = 1 Then
If estado_compresor = 1 Then
Goto salto_1
Else
WaitMs 5000
salto_1:
Lo que necesito es que si se cumplen los IF se salte el retraso de 5segundos. Por mi parte voy a seguir investigando