Hola a todos:
De nuevo me estoy pegando con este entorno y tengo un problema que no se exactamente si es problema mio (lo mas probable) o es un bug del programa. Explico:
Tengo la version 6.91 perfectamente rregistrada y he realizado un pequeño programa en basic, nada del otro mund, un temporizador que dependiendo de unas entradas cambia los tiempos y un par de salidas. El problema que veo (adjunto una imagen del mismo) es que si bien en el modulo de leds veo que estan activas las entradas RB0, RB1 y RB7, activadas con la opcion "Toogle" de la vista del micro, cosa que aparecen como en ON; sin embargo en la zona de la ventana del WATCH las mismas llamadas como: compresor, presostato y prueba se encuentran a 0. Tambien en la ventana de los registros se ven como que estan a 0, es decir sin marcar en rosita como la salida de RA1 que tngo activada por programa.
Quiero entender que en esta pantalla si la entrada esta a 1 deberian estar marcadas en rosita ¿me equivoco?
Creo los pines los tengo bien configurados como salidas= puerto A y entradas=puerto . Esto se ve en una zona de la imagen.
Adjunto la imagen y el programa.
Me podeis indicar en que me he equivocado?
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3fcc
Define CLOCK_FREQUENCY = 4 'Frecuencia del reloj en Mhz
'*************************************************************************************************
'* *
'* NOMBRE PROGRAMA: Temporización de secados *
'* *
'* AUTOR: Fermín C. Ruiz Martín VERSIÓN: 1.00 *
'* *
'* MICRO: 16F88 FECHA: 30.06.2011 *
'* *
'* DESCRIPCIÓN: Versión inicial *
'* *
'*************************************************************************************************
'Equipo de control de tiempo de actuación de torres de secado. Tiempo de actuación de electro-
'válvula de 1 minuto y tiempo de avería por falta de cambio del estado del presostato asociado a
'los 10 minutos. Con avería se deja la electroválvula desexcitada.
'*************************************************************************************************
'*************************************************************************************************
'-------------------------------- 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 = 0x6e 'Set intrc To 4mhz, se usara reloj interno a 4Mh
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 = 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
'-------------------------- 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.
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.
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
'Comienzo del programa principal
inicio:
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
While compresor = 0 'Siempre que el compresor esté parado
valvula = 0 'se desactiva la válvula,
e_valvula = valvula 'se guarda su estado,
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,
T1CON.TMR1ON = 1 'activamos el contador del TMR1
Goto inicio 'y seguimos con la secuencia general.
Endif
'--------------------------------------------------------------------------------------------
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 guardado
T1CON.TMR1ON = 1 'activamos contador del TMR1, podría estar en OFF al ser compresor=0
'goto inicio ' y seguimos con la secuencia general.
Else
e_presostato = presostato 'Al haber cambiado el presostato, guardamos su estado,
t_averia = 0 ''reseteamos el contador para la avería,
T1CON.TMR1ON = 1 'activamos contador del TMR1, podría estar en OFF al ser compresor=0
'goto inicio ' y seguimos con la secuencia general.
Endif
'---------------------------------------------------------------------------------------------
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.
t_valvula = t_valvula + 1 'Incrementamos el tiempo de actuación de la válvula.
If compresor = 0 Then 'Si el compresor está parado,
valvula = 0 'se desactiva la válvula.
Else
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
t_valvula = 0 'Reseteamos el tiempo de la válvula y volvemos a repetir el ciclo.
Else
Goto contador
Endif
contador:
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 = 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 .
'**********************************************************************************************
'************************************* SUBRUTINAS *********************************************
'**********************************************************************************************