Hola amigos:
Adjunto un programita para ver sime echais un capote.
Resulta que me pongo a simularlo con PSI y todo parece ir bien hasta que entra en la interrupcion. Hecho lo cual no sale de alli nunca, al menos simulandolo nunca la veo salir de alli. Espero vuestras gentiles ayudas.
El codigo:
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 4 'Frecuencia del reloj en Mhz
'-------------------------------- 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********************************************
Dim e_inicial As Bit 'Variable del estado inicial del equipo al arranque
Dim e_presostato As Bit 'variable del estado del presostato.
Dim e_valvula As Bit 'Variable del estado de la electroválvula.
Dim t_averia As Word 'Contador del tiempo para indicar avería.
Dim t_valvula As Word 'Contador del tiempo de actuación de la electroválvula.
Dim t_aver_work As Word 'Variable con valor del contador de avería.
Dim t_valv_work As Word 'Variable con valor del contador de actuación válvula.
Dim prueba_averia As Word 'Variable con tiempo de prueva de avería.
Dim prueba_valvula As Word 'Variable on tiempo de prueba de válvula.
Dim work_averia As Word 'Variable con tiempo de trabajo de avería.
Dim work_valvula As Word 'Variable con tiempo de trabajo válvula.
'---------------------- Asignación de valores a las variables ------------------------------
t_averia = 0 'Se resetea el contador auxiliar de la avería.
t_valvula = 0 'Se resetea el contador auxiliar delcontrol de la válvula.
e_inicial = 1 'Se inicializa el estado después de dar tensión al equipo.
e_valvula = 0 'Se Inicializa el estado de la válvula.
e_presostato = 0 'Se inicializa el estado del presostato.
prueba_averia = 20 'Tiempo de avería en modo trabajo. 20x0,5sg=10sg.
prueba_valvula = 4 'Tiempo actuación válvula en modo trabajo. 4x0,5sg=2sg.
work_averia = 1200 'Tiempo de avería en modo trabajo. 1200x0,5sg=600sg.=10minutos.
work_valvula = 120 'Tiempo actuación válvula en modo trabajo. 1200x0,5sg=600sg.=10minutos.
'------------------ Reasignación de nombres a los pines del micro --------------------------
Symbol averia = RA0 'Salida digital activación de señal de avería.
Symbol valvula = RA1 'Salida digital activación de electroválvula.
Symbol compresor = RB0 'Entrada digital del estado del compresor.
Symbol presostato = RB1 'Entrada digital del estado del presostato.
Symbol prueba = RB7 'Entrada digital para establecer el modo prueba del equipo.
'------------------------------ Definición de puertos -------------------------------------
AllDigital
OSCCON = 0x7e 'Set intrc To 8mhz, se usara reloj interno a 8Mh
TRISA = %00000000 'Puerto A los configurado como salidas digitales.
TRISB = %11111111 'Puerto B configurado como entradas digitales.
'-------------------- Inicializacion de timers e interrupciones ---------------------------
T1CON.TMR1CS = 0 'Bit de seleccion de reloj para el timer1, interno Fosc/4
T1CON.T1CKPS0 = 1 'Bit de seleccion del prescaler para el reloj del timer1.Divisor por 8.
T1CON.T1CKPS1 = 1 'Bit de seleccion del prescaler para el reloj del timer1.Divisor por 8.
TMR1H = 0xff 'carga el registro del contador para que desborde cada 500mSeg, byte alto
TMR1L = 0xfd 'carga el registro del contador para que desborde cada 5000mSeg, byte bajo
'TMR1H = 0x0b 'carga el registro del contador para que desborde cada 500mSeg, byte alto
'TMR1L = 0xdc 'carga el registro del contador para que desborde cada 5000mSeg, byte bajo
'*************************************************************************************************
'-------------------------------- PROGRAMA PRINCIPAL -------------------------------------
'*************************************************************************************************
main:
'establecimiento de las condiciones iniciales.
averia = 0 'Al inicio, se deja la indicación de avería desactivada.
valvula = 0 'Al inicio, se deja la válvula desactivada.
e_inicial = 0 'Al inicio, se resetea el estado inicial.
e_valvula = 0 'Al inicio se resetea el estado de la válvula
e_presostato = 0 'Al inicio, se resetea el estado del presostato.
'Comienzo del programa principal
If prueba = 1 Then
t_aver_work = prueba_averia 'Tiempo para avería en modo prueba. 20x0,5sg=10sg.
t_valv_work = prueba_valvula 'Tiempo actuación válvula en modo prueba.4x0,5sg=2sg.
Else
t_aver_work = work_averia 'Tiempo avería en modo trabajo. 1200x0,5sg=600sg.=10minutos.
t_valv_work = work_valvula 'Tiempo actuación válvula en modo trabajo.120x0,25sg=60sg.
Endif
INTCON.PEIE = 1 'Habilitacion de interrupciones de perifericos
T1CON.TMR1ON = 1 'Desaciva el contador del TMR1
PIE1.TMR1IE = 1 'Activa las interrupciones del timer1
Enable 'INTCON.GIE habilita todas las interrupciones globales
inicio:
While compresor = 0 'Siempre que el compresor esté parado
valvula = 0 'se desactiva la válvula,
T1CON.TMR1ON = 0 'paramos el contador del TMR1
Goto inicio 'y seguimos con la secuencia general.
Wend
'-------------------------------------------------------------------------------------------
If e_inicial = 0 Then 'Si es la 1º puesta en marcha del equipo
valvula = 1 'se activa la válvula,
e_valvula = valvula 'se guarda su estado,
e_inicial = 1 'se cambia el estado inicial
e_presostato = presostato 'se guarda el estado del presostato,
Else
If e_valvula = 0 Then 'Si la valvula estaba desactivada, => si compresor=1
valvula = 0 'seguimos con la válvula desactivada o
Else
valvula = 1 'en caso contario la desactivamos.
Endif
If e_presostato <> presostato Then 'Si el presostato está como su estado guarado
e_presostato = presostato 'Al haber cambiado el presostato, guardamos su estado,
t_averia = 0 ''reseteamos el contador para la avería,
Endif
Endif
T1CON.TMR1ON = 1 'activamos el contador del TMR1
Goto inicio
'************************************ FIN DEL PROGRAMA ***************************************
End 'Fin del programa
'**********************************************************************************************
'**********************************************************************************************
'**********************************************************************************************
'------------------------------------ INTERRUPCIONES ----------------------------------------
On Interrupt 'Inicio de las interrupciones, desactivamos las interrupciones.
Save System 'Guarda los valores del sistema.
T1CON.TMR1ON = 0 'Se para el contador del TMR1.
If compresor = 0 Then 'Si el compresor está parado,
valvula = 0 'se desactiva la válvula.
Else
t_valvula = t_valvula + 1 'Incrementamos el tiempo de actuación de la válvula.
If t_valvula = t_valv_work Then 'Se compruba si válvula ha completado su ciclo de 1'.
If e_valvula = 1 Then 'si estaba activada
valvula = 0 'la desactivamos y
e_valvula = 0 'guardamos su estado. En caso contrario
Else
valvula = 1 'Como estada desactivada, la activamos
e_valvula = 1 'y guardamos su estado.
Endif
Endif
t_averia = t_averia + 1 'incrementamos el contdaor del tiempo de la avería.
If t_averia = t_aver_work Then 'Se compruba si avería ha completado su ciclo de 10'.
bloqueo:
averia = 1 'se da señal de avería
valvula = 0 'se desactiva la válvula
Goto bloqueo 'y permanecemos en este estado hasta quitar alimentación.
Else 'sino hay avería recargamos los contadores
TMR1H = 0xff 'carga el registro del contador para que desborde cada 500mSeg, byte alto
TMR1L = 0xfd 'carga el registro del contador para que desborde cada 5000mSeg, byte bajo
'TMR1H = 0x0b 'carga del contador, desborde cada 500mSeg, byte alto.
'TMR1L = 0xdc 'carga del contador desborde cada 500mSeg, byte bajo.
T1CON.TMR1ON = 1 'Se activa el contador del TMR1.
Endif
Endif
Resume 'activamos de nuevo las interrupciones y retornamos al programa antes del salto.
Gracias de nuevo
F.