Autor Tema: Errores de novato  (Leído 4292 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Errores de novato
« en: 28 de Diciembre de 2010, 19:00:15 »
Me permito abrir otro tema y si ya hay alguno abierto al respecto pues el moderador puede borrarlo.
Le abro para no tener que estar abriendo distintos temas con todos los errores que voy comentiendo o no encunetro a la hora de trabajar con PSI. El siguiente error es el siguiente:
Tengo un programa que es muy basico, con un monton de lineas comentadas. El programa lee el estado de 2 entradas RD0 y RA4 y dependiendo del estado pone una serie de salidas a 1 hasta que se detecta que se han vuelto a poner a 1. El caso es que si lo realiza pero las salidas no se mantinen de manera fija activadas y no encuentro razon para ello. Abajo inserto el codigo.
Por ejempo en la rutina prueba_ac, compruebo si RA4 esta 0 si no es asi entonces deberia de poner de manera fija los siguientes valores:fallo_ac = 1(RB0);contactor = 0(RD7); valvula_1 = 0(RB2); valvula_2 = 0(RB3); fallo_secado = 1(RB1); equipo_ok = 0(RD2) y mantenerse cada una de ellas en ese estado hasta que RA=1. pero como digo se ponen las salida a  1 y 0 segun discurre el programa
Lo mismo pasa en la rutina de prueba_st.
¿Alguna ocurrencia?
Gracias
El codigo:
Código: [Seleccionar]
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         

Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Errores de novato
« Respuesta #1 en: 28 de Diciembre de 2010, 20:10:33 »
Este micro no lo conozco pero:
Al parecer tienes mal configurado el registro "ANSEL".
Y también tienes activa la entrada master reset.

Código: vb.net
  1. Define CONF_WORD = 0x23c4
  2. Define CONF_WORD_2 = 0x3eff
  3. 'Define CONF_WORD = 0x23e4
  4. 'Define CONF_WORD_2 = 0x3eff
  5. Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
  6. '********************************************************************************************
  7. '* NOMBRE PROGRAMA: Control de compresor rotativo                                           *
  8. '* AUTOR: Fermín C. Ruiz Martín                                    VERSIÓN: 0.01            *
  9. '* MICRO:  16F887                                                  FECHA:  28.12.2010       *
  10. '* DESCRIPCIÓN: Versión inicial                                                             *
  11. '********************************************************************************************
  12. '******************************** SECCIÓN DE DEFINES ****************************************
  13. '***************************************************************************************************
  14. Define SIMULATION_WAITMS_VALUE = 1  'Ignora los valores de Waitms. Solo habilitado para simulador
  15. '***************************************************************************************************
  16. '******************************** SECCIÓN DE ETIQUETAS *************************************
  17. '******************************** SECCIÓN DE VARIABLES***************************************
  18. '* En esta zona del programa se colacan las variables que puedan cambiar su valor durante
  19. '*el discurrir de nuestro programa. Se realizan anteponiendo la palabra: DIM
  20. '---------------------- Asignación de valores a las variables ------------------------------
  21. '------------------ Reasignación de nombres a los pines del micro --------------------------
  22. Symbol sobretemperatura = RD0  'entrada digital 2.
  23. Symbol ac_ok = RA4  'entrada digital 7. Entrada de señal de 400v.
  24. Symbol equipo_ok = RD2  'salida digita 1.Salida de estado del equipo.
  25. Symbol fallo_st = RD3  'salida digita 2
  26. Symbol contactor = RD7  'salida digita 6.
  27. Symbol fallo_ac = RB0  'salida digita 7
  28. Symbol fallo_secado = RB1  'salida digita 8
  29. Symbol valvula_1 = RB2  'salida digita 9. Electroválvula de secado 1.
  30. Symbol valvula_2 = RB3  'salida digita 10. Electroválvula de secado 2
  31. '------------------------------ Definición de puertos -------------------------------------
  32. AllDigital
  33. 'ANSEL = 0x00  'Los pin I/O digitales
  34. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mh
  35. TRISA = %11111111  'Puerto A los configurado como entradas digitales.
  36. TRISB = %00000000  'Puerto B configurado como salidas digitales.
  37. TRISD = %00000011  'Puerto D bits 0 y 1 entradas el resto salidas, todo digitales.
  38. TRISE = %11111111  'Puerto E como entradas digitales.
  39. '-------------------- Inicializacion de timers e interrupciones ---------------------------
  40. main:
  41.         equipo_ok = 1
  42.         inicio:
  43.                 contactor = 1  'solo para prueba
  44.                 fallo_secado = 0  'solo para prueba
  45.                 valvula_1 = 1  'solo para prueba
  46.                 valvula_2 = 1  'solo para prueba
  47.         prueba_ac:
  48.                 If ac_ok = 0 Then
  49.                         fallo_ac = 1
  50.                         contactor = 0
  51.                         valvula_1 = 0
  52.                         valvula_2 = 0
  53.                         fallo_secado = 1
  54.                         equipo_ok = 0
  55.                         Goto prueba_ac
  56.                 Else
  57.                         fallo_ac = 0
  58.                         equipo_ok = 1
  59.                 Endif
  60.         prueba_st:
  61.                 If sobretemperatura = 0 Then
  62.                         fallo_st = 1
  63.                         contactor = 0
  64.                         valvula_1 = 0
  65.                         fallo_secado = 1
  66.                         equipo_ok = 0
  67.                         Goto prueba_st
  68.                 Else
  69.                         fallo_st = 0
  70.                         equipo_ok = 1
  71.                 Endif
  72. Goto inicio
  73. '*********************************** FIN DEL PROGRAMA ***************************************
  74. End  'Fin del programa

Pd. Imagino que tanta etiqueta y goto en la rutina principal seran para depuración, y que una vez que funcione el programa se eliminaran.  ;-)
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: Errores de novato
« Respuesta #2 en: 29 de Diciembre de 2010, 08:56:49 »
Gracias Carlos ,por la ayudita.

-Respecto al master reset está configurada asi pues en el montaje final va a ir utilizada como tal.
- Lo del registro Ansel, tienes razon y es por ser un poco tonto y haber copiado parte del codigo(cabezera y configuraciones iniciales de otro programa con otro micro)
- Con respecto a las etiquetas: de momento lo he ido haciendo asi  ya que al ser el programa grande, por saber que parte era la que estaba realizando, ya se depurará y eliminaré las etiquetas que no sean necesarias.
- Y para finalizar los gotos:¡ay los gotos! ya se que se debe de intentar utilizar los menores posibles(mejor ninguno) pero ya comento que quiero ir aprendiendo a trabajar en basic. Ahora mismo ya he cambiado esa parte de comprobacion por While...Wend con lo que los gotos han desaparecido.
Tambien me quedaran un monton de instrucciones que se repetirian despues de cada bucle While..Wend y que al final las llamare con un "gosub" .
Voy a seguir añadiendo variables de entrada y de salida pero de momento el codigo del programa queda asi:

Código: [Seleccionar]
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
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: Errores de novato
« Respuesta #3 en: 29 de Diciembre de 2010, 16:31:13 »
Bueno pues durante el dia de hoy he ido agrandando el programa. Pero aunque voy simulandolo por partes y funciona hay una pequeña parte que nola veo que esté muy correctamente escrita (aunque funciona) y no encunetro la forma de mejorarla.
Se trata de que una vez que ha saltado una alarma para resetearla se deben de cumplir: que el estado de fallo esté presente, que la entrada pmm sea =0 y que rearme sea=1. En el resto de los casos se debe de quedar dando averia.
Adjunto la parte del codigo relacionado con la explicacion anterior, por si hay alguna mano ;-) y al final el programa entero.
Gracias de antemano
El primer While es el que detecta la alarma y el resto de los While son los que no encuentro como reducirlos. :oops: :oops: :x
Código: [Seleccionar]
'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


Codigo completo
Código: [Seleccionar]
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                                            
« Última modificación: 29 de Diciembre de 2010, 16:34:03 por Fer_TACA »
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: Errores de novato
« Respuesta #4 en: 29 de Diciembre de 2010, 17:54:07 »
He encontrado otra forma de realizarlo que logicamnete me gusta mas que tambien funciona, pero de toda forma sigo pensando que debe de haber alguna otra forma mas simple.
¿Haber que les parece? ¿Alguna otra forma mas simplificada?
Código: [Seleccionar]
'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

Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Errores de novato
« Respuesta #5 en: 01 de Enero de 2011, 18:51:34 »
'Si no hay falta de memoria o velocidad la simplificación en un principio no es un problema, se puede dejar para el final:
Código: vb.net
  1. While estado_fallo = 1
  2.         If pmm = 0 And rearme = 1 Then
  3.                 fallo_st = 0
  4.                 equipo_ok = 1
  5.                 estado_fallo = 0
  6.         Else
  7.                 fallo_st = 1
  8.         Endif
  9. Wend
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: Errores de novato
« Respuesta #6 en: 02 de Enero de 2011, 18:44:30 »
Gracias por la ayuda maestro, solo pensaba en la forma directa para ver la forma de borrar la alarma y no inversa (al menos como veo yo la forma de plantear la solucción) como me has colocado.

 Casi tengo casi, casi todo el proyecto terminado salvo un par de rutinas que voy a ver cuando tengo un poco de tiempo.
Ahora toca currar y espero que para el puente de Reyes pueda continuar.
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: Errores de novato
« Respuesta #7 en: 03 de Enero de 2011, 17:27:43 »
Una mas:

Como el programa va siendo un poquin largo, para poder realizar la simulacion de una rutina, se puede comentar de una vez(seleccionado un bloque, por ejemplo)el resto de las rutinas que no estan involucradas y de esta manera poder realizar la simulacion mas simple y rapida. Todo ello desde PSI.

Se que en C se puede realizar y pero aqui estoy venga a buscarlo y na..............
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Errores de novato
« Respuesta #8 en: 03 de Enero de 2011, 18:48:26 »
Esa opción por el momento no existe, yo tambien la echo de menos.
Lo que se hace es usar etiquetas inversas. Al principio de la rutina se coloca el "Goto fin_1" y al final de la rutina se coloca la etiqueta "fin_1".
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: Errores de novato
« Respuesta #9 en: 04 de Enero de 2011, 09:05:07 »
Pues nada nos tocara currarlo.
Esperemos que el amigo Wladimir lo incluya en próximas actualizaciones.
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Errores de novato
« Respuesta #10 en: 04 de Enero de 2011, 09:24:04 »
Tiene sus ventajas, y es que siempre sabes la memoria que vas consumiendo.

E inconveniente, el volcado del programa al micro consume más tiempo.
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: Errores de novato
« Respuesta #11 en: 06 de Enero de 2011, 16:09:06 »
Siguiendo con las instrucciones de dogflu66 he estado revisando el programa y probandolo de manera parcial. Va funcionando, pero hay una parte del codigo que no me funciona y solo estoy simulanddo esa parte del codigo, el resto esta anulado con las instrucciones goto_fin y fin. De echo en el simulador solo se ejecyta esa parte del codigo, exceptuando los datos de configuracion que solo se ejecutan, evidentemente la 1ª vez. Les adjunto el codigo que es muy simple y me comentan. Les explico lo que quiero realizar.
Código
Código: [Seleccionar]
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.
Bien pues al simular al llegar al primer IF(comprobacion de que contactor_ex=0) se sale de la rutina y vuelve a empezar y no pasa a comprobar el 2º IF que entiendo que es lo que deberia de realizarse.
¿alguna idea?
Gracias
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: Errores de novato
« Respuesta #12 en: 06 de Enero de 2011, 17:53:27 »
Me respondo a mi mismo:
En el programa y rutina a simular tenia definido contactor_ex como variable y la colocaba a 1 cuando en realidad es una entrada digital, por eso el programa respondía.
Pero para mejorar el programa me podian decir como eliminar el goto del codigo de mas abajo y que la rutina haga lo mismo.
Código: [Seleccionar]
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
Gracias de nuevo
Todos los días se aprende algo nuevo.