TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Carabobo1 en 24 de Marzo de 2015, 14:33:33

Título: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 24 de Marzo de 2015, 14:33:33
 :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:
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: juaperser1 en 24 de Marzo de 2015, 16:30:58
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
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 24 de Marzo de 2015, 16:36:36
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.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: juaperser1 en 24 de Marzo de 2015, 16:44:41
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)
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 24 de Marzo de 2015, 16:58:23
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.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: juaperser1 en 24 de Marzo de 2015, 17:29:38
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.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 24 de Marzo de 2015, 17:34:27
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. ((:-))
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: PalitroqueZ en 24 de Marzo de 2015, 18:13:41
aquí un tema que podría servir de ayuda para lo que planteas

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

Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 24 de Marzo de 2015, 18:36:20
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:
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Thulsa Doom en 24 de Marzo de 2015, 20:09:32
¿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
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: KILLERJC en 24 de Marzo de 2015, 20:11:54
El tema thulsa es que usa CCS y no XC, si no conoce como hacer interrupciones en CCS, va a tener problemas al portarlo :/
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 24 de Marzo de 2015, 20:13:34
.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Thulsa Doom en 24 de Marzo de 2015, 20:34:10
Pues te recomiendo esto

http://www.marcombo.com/Compilador-c-ccs-y-simulador-proteus-para-microcontroladores-pic_isbn9788426714954.html

lo tienes en san google
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 24 de Marzo de 2015, 20:36:34
.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Thulsa Doom en 24 de Marzo de 2015, 20:37:15
pues ahí lo tienes todo, y paciencia
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 24 de Marzo de 2015, 20:38:37
.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: KILLERJC en 25 de Marzo de 2015, 19:13:45
bueno como dijeron se arregla con interrupciones, no con externas, ya que no veo que venga una señal externa, a no ser que tengas otro circuito que ingrese un 1 a un pin cuando exista tension, y tal ves lo que buscas es un timer.

Y luego me encuentro con esto:

     if(V_CALLE==1 && Delay_ms (30000) <30000 && MOTOR==0 && PLANTA==0)

El Delay se va a ejecutar, por como es C, pero no creo que devuelva ningun valor ...

Otra de las cosas es esto:

  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

Segun tengo entendido estas cortando la luz, esperando 30 segundos y luego dando del generador.

Usualmente funcionan distintos estos sistemas. Al cortarse la luz se activa un temporizador.. Si esta no vuelve en XX tiempo enciende el motor, vuelve a esperar un tiempito mas y procede al cambio ( usualmente es una llave con un motor el encargado de hacer esto o en el peor caso 2 contactores enclavados )

De detectarse la luz nuevamente, el motor sigue encendido por unos minutos mas, una ves que la tension de la red se encuentra "estable" no se corta mas vuelve a hacer el cambio.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 25 de Marzo de 2015, 19:20:15
bueno como dijeron se arregla con interrupciones, no con externas, ya que no veo que venga una señal externa, a no ser que tengas otro circuito que ingrese un 1 a un pin cuando exista tension, y tal ves lo que buscas es un timer.

Y luego me encuentro con esto:

     if(V_CALLE==1 && Delay_ms (30000) <30000 && MOTOR==0 && PLANTA==0)

El Delay se va a ejecutar, por como es C, pero no creo que devuelva ningun valor ...

Resp.- Buenas Tardes, Gracias al Compañero KILLERJC por el Comentario. La Variable "V_CALLE", es una señal de Voltaje que ingresa al PIC. La expresión:
if(V_CALLE==1 && Delay_ms (30000) <30000 && MOTOR==0 && PLANTA==0)
La coloqué en el Programa tratando de aclarar que cuando el Voltaje de la Calle esté Ausente, y luego vuelva a venir antes de que el temporizador termine su Conteo, entonces que me ponga nuevamente a CADAFE en "1" y deje de Contar, pero obviamente no funciona. Ese es el problema que tengo.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: KILLERJC en 25 de Marzo de 2015, 19:29:16
Entonces interrupciones por flanco o nivel y interrupcion de un timer, todo eso haria que lo anduviera.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 29 de Marzo de 2015, 14:57:30
SOLUCIONADO

Afortunadamente logré Solucionar el Problema que se me estaba presentando con esta Programación. Ciertamente, Agradezco las diferentes sugerencias que me ofrecieron algunos Participantes del Foro. Sin embrago, voy hacer una Recomendación: En lo posible, es mejor NO sugerir cosas de las que Realmente NO estemos seguros que van a dar Resultados Satisfactorios, o simplemente, NO estamos del todo Claro en cómo Funcionan. Como por Ejemplo, recomendar el uso de Timers, Interrupciones o cualquier otra Función que NO ofrezca una Solución Eficiente del Problema que se está Planteando.   
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: juaperser1 en 29 de Marzo de 2015, 15:47:24
Citar
 En lo posible, es mejor NO sugerir cosas de las que Realmente NO estemos seguros que van a dar Resultados Satisfactorios, o simplemente, NO estamos del todo Claro en cómo Funcionan. Como por Ejemplo, recomendar el uso de Timers,

El uso de timer no era una sugerencia k no fuera clara, ERA LA SOLUCION, Te lo dijeron varias personas entre las k me incluyo, además los problemas a menudo suelen tener muchas soluciones y las personas k tratan de ayudarte seguro k podrían resolverlo a su manera con el consejo k te han dado, que no logres hacerlo como te indican no kiere decir que este mal el consejo.

Yo también te quiero hacer una sugerencia, en los foros se entra para encontrar ayuda no para k te resuelvan el problema, k si te lo resuelven pues muy bien, pero la gente intenta ayudar en la medida de lo posible y en lo k cree k es correcto, si no kieres escuchar ayuda y resolverlo por ti mismo, es mejor k le pagues a alguien, te lo resolverá antes y de manera correcta y evitaras calentarte la cabeza.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: planeta9999 en 29 de Marzo de 2015, 16:13:26
SOLUCIONADO

Afortunadamente logré Solucionar el Problema que se me estaba presentando con esta Programación. Ciertamente, Agradezco las diferentes sugerencias que me ofrecieron algunos Participantes del Foro. Sin embrago, voy hacer una Recomendación: En lo posible, es mejor NO sugerir cosas de las que Realmente NO estemos seguros que van a dar Resultados Satisfactorios, o simplemente, NO estamos del todo Claro en cómo Funcionan. Como por Ejemplo, recomendar el uso de Timers, Interrupciones o cualquier otra Función que NO ofrezca una Solución Eficiente del Problema que se está Planteando.  


"Consejos vendo, que para mi no tengo", yo alucino con el PERSONAJE este.

Eres un MALEDUCADO de tres pares de cojones, aparte de que no tienes razón. Encima ni siquiera expones tu "solución", que a buen seguro debe de ser tan absurda como el problema que planteaste, lo que no entiendo es como hay gente que ha perdido su tiempo tratando de ayudarte.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 29 de Marzo de 2015, 18:10:02
 :D
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 29 de Marzo de 2015, 18:10:28
 :D
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 29 de Marzo de 2015, 18:10:50
 :D
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 29 de Marzo de 2015, 18:11:14
 :D
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: Carabobo1 en 29 de Marzo de 2015, 18:12:15
.
Título: Re: ¿Cómo Suspender la Ejecución de un Delay para Retornar a un Punto del Programa?
Publicado por: KILLERJC en 29 de Marzo de 2015, 21:02:29
Bueno o todos respondieron o no vi las respuestas rapidamente.
Espero que finalize la agresion de ambas partes.

Como te dijeron Carabobo1, el uso de interrupciones mejora completamente tu programa, hace que sea inmediata su respuesta, en resumen mas eficiente si esta bien programado ademas.

El uso de delays es una mala practica y deberia de erradicarse, aunque a veces es necesario usarlos por que no hay otra solucion o se vuelve ineficiente/sin importancia el uso de otra cosa. Pero se prefieren en casos que el programador no tenga mucha experiencia en el uso de microcontroladores.
Por que es mas facil poner una linea que diga delay y no 15 lineas e intentar explicarle como funciona una interrupcion y un modulo completo.

Si realmente deseas hacer proyectos que respondan como deseas, usa las interrupciones.
En fin, sobre el problema que se plantea yo te dije como funcionan los dispositivos comerciales, no creo estar tan fuera del tema.

Y finalmente las sugerencias es solamente eso, una sugerencia, y no una obligacion.
Me encontre con gente que le ofreces una sugerencia y no la termina haciendo/usando a pesar que resuelva sus problemas solo por que ellos no pudieron hacerlo andar ( ya que no se les dio el codigo completo). Y descartan la posiblidad inmeediatamente. Y terminan haciendo un codigo el doble o triple de extenso para lo mismo ( pero como anda lo demas esta mal? ).

No tomes una actitud demasiado infantil editando tus post (borrando lo que habias escrito + haciendo multipes respuestas), cualquiera se puede equivocar. Hacer eso no te va a hacer mas o menos inteligente, ni tampoco va a ayudar a los demas cuando tengan un problema parecido al tuyo. En fin la idea es ayudar.