Autor Tema: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?  (Leído 4842 veces)

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

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
 :o Saludos Nuevamente a TODA la Familia del Foro TODOPIC, esperando que se encuentren Muy Bien!

Nuevamente desearía solicitar la Colaboración del Compañero RALF2 , quien en una ocasión logró Solucionarme Eficientemente un inconveniente que se me presentó con una Programación. De no ser posible, desearía que algún Compañero (a) del Foro me ayudara a resolver la situación que se me está presentando.
Una vez más utilizo Compilador CCS Vers. 5.007. Estoy tratando de realizar una sencilla Transferencia Automática para Grupo Electrógeno, mejor conocidos como "Plantas Eléctricas de Emergencia". Parte de la Programación es la siguiente:

==========================================================================
//                                                                                                                               
//                                             Variables:                                                                     
//                                                                                                                               
//           V_CALLE = Tensión Suministrada por la Compañía Eléctrica.                                     
//           V_GEN = Tensión Suministrada por el Generador.                                                   
//           CADAFE = Relé que controla el Accionamiento del Contactor en modo "NORMAL"           
//           PLANTA = Relé que controla el Accionamiento del Contactor en modo "EMERGENCIA" 
//           MOTOR = Relé que controla el Encendido del Motor Diesel en el Grupo Electrógeno.     
//                                                                                                                               
==========================================================================
While(true)               
{
   if(V_CALLE==1 && V_GEN==0 && PLANTA==0) // Si la tensión de la Calle está OK,
      {
      CADAFE=1;               // Activa el Relé para Contactor de CADAFE (Modo Normal)
      PLANTA=0;               // Desactiva el Relé para Contactor del GENERADOR (Modo Emergencia)
      }
   
   if(V_CALLE==0 && MOTOR==0 && PLANTA==0) // Si la tensión de Calle no está presente
      {
      CADAFE=0;               // Desactiva el Relé para Contactor de CADAFE (Modo Normal) 
      Delay_ms(30000);     // Espera 30 Segundos
      MOTOR=1;               // y Enciende el Motor de la Planta Eléctrica
     
      if(V_CALLE==1 && Delay_ms (30000) <30000 && MOTOR==0 && PLANTA==0)
         {
         CADAFE=1;
         MOTOR=0;
         }
      }
}

Bien Amigos, el asunto es el siguiente:

Con el primer "if" estoy diciendo que si la Tensión de la Calle se mantiene presente y estable, entonces que me mantenga activado el Relé de CADAFE (Modo "NORMAL") y simultáneamente, que me mantenga Desactivado el de PLANTA (Modo "EMERGENCIA"). Eso lo está haciendo Bien. 

Con el segundo "if" estoy diciendo que cuando la Tensión de la Calle no esté presente, espere 30 Seg. y si transcurrido ese tiempo, dicha Tensión sigue ausente, entonces proceda a encender el Motor de la Planta Eléctrica. Eso lo está haciendo Bien.

Con el tercer "if" trato de decirle que si la Tensión de la Calle no está presente, el temporizador inicia su ciclo de 30 Seg., y la Tensión de la Calle regresa nuevamente; entonces que NO se siga ejecutando el ciclo del Temporizador, y en su defecto, que me Active Inmediatamente el Contactor de CADAFE y me mantenga Apagado el Motor del Generador. Obviamente, eso NO lo está haciendo y es precisamente la parte que les pido que Por Favor me ayuden a Resolver.
  Gracias a TODOS por su Valiosa Colaboración... Un Abrazo Fraternal. :laugh:

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Los delay no se deben utilizar en una ejecucion cíclica, se usa mucho por su facilidad de uso pero no es nada recomendable, mientras estas en un delay, el microcontrolador esta parado, y no hace nada, esto es totalmente contrario a la filosofia de un microcontrolador, tu programación debe estar estructurada de manera que si no tiene que hacer algo pase a otra cosa, y hay es donde te esta fallando, cuando llega al delay el microcontrolador se detiene 30000 ms, 30000 ms que estas dejando de monitorizar nada, y 30000ms donde el micro no hace nada que no sea contar, imagina que en esos 30000ms te llega un mensaje por la UART y no te vas a enterar por ejemplo, o alguien pulsa un pulsador, tampoco te vas a dar cuenta.

para arreglar esto debes cambiar tu temporizacion de los delay a los timer, de esta manera tu microcontrolador estara contando pero no dejara de hacer otras cosas.

con los timer, tu 3º if pasaria a revisar una bandera que la puedes poner a 1 cuando tu timer cuente 30000ms y de esta forma tu micro atendera todas las tareas

un saludo.

por cierto piensa en pasarte a XC y dejar CCS tiene muchos bugg y yo no lo recomiendo para diseños profesionales
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Los delay no se deben utilizar en una ejecucion cíclica, se usa mucho por su facilidad de uso pero no es nada recomendable, mientras estas en un delay, el microcontrolador esta parado, y no hace nada, esto es totalmente contrario a la filosofia de un microcontrolador, tu programación debe estar estructurada de manera que si no tiene que hacer algo pase a otra cosa, y hay es donde te esta fallando, cuando llega al delay el microcontrolador se detiene 30000 ms, 30000 ms que estas dejando de monitorizar nada, y 30000ms donde el micro no hace nada que no sea contar, imagina que en esos 30000ms te llega un mensaje por la UART y no te vas a enterar por ejemplo, o alguien pulsa un pulsador, tampoco te vas a dar cuenta.

para arreglar esto debes cambiar tu temporizacion de los delay a los timer, de esta manera tu microcontrolador estara contando pero no dejara de hacer otras cosas.

con los timer, tu 3º if pasaria a revisar una bandera que la puedes poner a 1 cuando tu timer cuente 30000ms y de esta forma tu micro atendera todas las tareas

un saludo.

por cierto piensa en pasarte a XC y dejar CCS tiene muchos bugg y yo no lo recomiendo para diseños profesionales



Resp.- Buenas Tardes. Agradezco el Comentario, pero no hallo ninguna Solución en él.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
la solucion es no usar delay y usar timer.

el delay no se puede suspender ni cancelar, el timer si, y hace lo mismo, el timer puedes encenderlo apagarlo, consuntarlo hacer una interrupcion etc. lo que quieras y ademas se ejecutar "en segundo plano"(no exactamente pero lo puedes tomar asi)
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
la solucion es no usar delay y usar timer.

el delay no se puede suspender ni cancelar, el timer si, y hace lo mismo, el timer puedes encenderlo apagarlo, consuntarlo hacer una interrupcion etc. lo que quieras y ademas se ejecutar "en segundo plano"(no exactamente pero lo puedes tomar asi)

Resp.- Ok Amigo, el problema es que no tengo mucha experiencia programando y no sé como usar ese Timer. ¿Alguna recomendación para obtener una solución lo antes posible?... Gracias.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
sinceramente sin usar TIMER no creo que puedas hacerlo.

quiza pueda ayudarte este post es de un compañero que en su dia quiso aprender a usar el timer en ccs

http://www.todopic.com.ar/foros/index.php?topic=26771.0

tambien puedes ver muchos tutoriales en youtube y por google, en CCS es sencillo lo aprenderas rapido y no te costara mucho trabajo, es que para lo que quieres hacer debes de  usar TIMER no te queda otra.

no te preocupes no es dificil, muy por encima este es el funcionamiento:
El timer te cuenta pasos, esos pasos se cuenta en un tiempo que tu determinas, y cuenta de 0 a 255 o de 0 a 65535 dependiendo de si es de 8 bit o de 16 etc
cuando llega a su limite pone en alto una bandera
con esa bandera tu puedes saber el tiempo que ha pasado o ejecutar una interrupcion.
Una interrupcion, interrumpe tu codigo para ejecutar una funcion. en esa funcion tu puedes poner en alto otras banderas ejecutar otras funciones etc.

esto es un resumen muy basico, y del funcionamiento mas típico de un timer.

Siento no poder darte una solucion rapida pero en esta aplicacion debes usar timer, te vendrá bien por que los timer es de lo mas util que puede tener un microcontrolador, es esencial para todo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
sinceramente sin usar TIMER no creo que puedas hacerlo.

quiza pueda ayudarte este post es de un compañero que en su dia quiso aprender a usar el timer en ccs

http://www.todopic.com.ar/foros/index.php?topic=26771.0

tambien puedes ver muchos tutoriales en youtube y por google, en CCS es sencillo lo aprenderas rapido y no te costara mucho trabajo, es que para lo que quieres hacer debes de  usar TIMER no te queda otra.

no te preocupes no es dificil, muy por encima este es el funcionamiento:
El timer te cuenta pasos, esos pasos se cuenta en un tiempo que tu determinas, y cuenta de 0 a 255 o de 0 a 65535 dependiendo de si es de 8 bit o de 16 etc
cuando llega a su limite pone en alto una bandera
con esa bandera tu puedes saber el tiempo que ha pasado o ejecutar una interrupcion.
Una interrupcion, interrumpe tu codigo para ejecutar una funcion. en esa funcion tu puedes poner en alto otras banderas ejecutar otras funciones etc.

esto es un resumen muy basico, y del funcionamiento mas típico de un timer.

Siento no poder darte una solucion rapida pero en esta aplicacion debes usar timer, te vendrá bien por que los timer es de lo mas util que puede tener un microcontrolador, es esencial para todo.


Resp.- Muy Bien. Muchas Gracias al Amigo juaperser1 por su Respuesta. ((:-))

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
aquí un tema que podría servir de ayuda para lo que planteas

http://www.todopic.com.ar/foros/index.php?topic=16982.0

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
aquí un tema que podría servir de ayuda para lo que planteas

http://www.todopic.com.ar/foros/index.php?topic=16982.0


Resp.- Saludos al Amigo PalitroqueZ, Muchas Gracias por su Colaboración!  :mrgreen:

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
¿has pensado en utilizar una interrupción externa para eso?.

a parte de lo que te indican los compañeros, los timer es lo mejor, te pasaría un código realizado por microchip pero aunque es gratis creo que tiene copie copyright, de todas maneras lo tienes en las librerías TCP/IP de microchip para su compilador C18 y te las puedes descargar gratuitamente desde su web.

A parte de eso lo mejor para atender un evento es utilizar las interrupciones
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
El tema thulsa es que usa CCS y no XC, si no conoce como hacer interrupciones en CCS, va a tener problemas al portarlo :/

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
.
« Última modificación: 29 de Marzo de 2015, 18:08:50 por Carabobo1 »

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
.
« Última modificación: 29 de Marzo de 2015, 18:09:08 por Carabobo1 »

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
pues ahí lo tienes todo, y paciencia
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...


 

anything