Go Down

Topic: Ejecutar un proceso siempre (Read 2474 times) previous topic - next topic

llOzll

hola!

como sabemos tenemos el void setup() el void loop() y podemos crear nuestras propias funciones (void xxx())
una duda que tengo es si quiero controlar por ejemplo la lectura de un sensor en todo momento,¿ como lo haría? porque como sabemos el void loop tiene un delay, las funciones que nosotros crearíamos también tendrían su propio delay. si la lectura del sensor esta dentro del void loop y fuera de las demás funciones, entonces no se podría controlar la lectura del sensor a cada momento.

saludos

RIG

no entiendo bien, a que te refieres con los delay? ¿te refieres al tiempo que tarda en repetir el bucle? que tipo de sensor quieres monitorear? porque dependiendo del tipo de sensor puedes usar interrupciones

surbyte

#2
Dec 01, 2017, 12:40 am Last Edit: Dec 01, 2017, 12:41 am by surbyte
si solo fuera
Code: [Select]
void loop() {}
no hay ninguna demora en su ejecución, asi que es tu problema lo que ahi dentro metes!!

por otro lado

Quote
si quiero controlar por ejemplo la lectura de un sensor en todo momento
Ningun sensor demora 0 mseg en devolver su dato.
Si es analógico el adc tarda 100useg, si es digital tarda mucho mas.

Asi que intenta clarificar la idea porque es muy ambigua.

steel_series

Si creas una función para leer un sensor y esa función la llamas dentro del loop, estas leyendo ese sensor todo el tiempo, mas rápido que eso no creo que se pueda?  : :smiley-yell:

Lucario448

Ya que la idea no está clara, también intentaré adivinar: seguro quiere que lo ejecute en una interrupción, para que así lo haga "siempre", independientemente de dónde se encuentre en el programa principal

llOzll

Creo que no me deje entender, no quiero que la lectura del sensor sea el menor tiempo posible, quiero saber si supongamos tenemos void loop y alguna funcion que creé void abc(), la lectura del sensor lo coloco en void loop() cuando suba el archivo a arduino este leerá el void loop() luego cuando pase a void abc() ¿dejara de hacer la lectura del sensor?, es por eso que pregunto si puedo hacer que la lectura del sensor nunca deje de ocurrir. el sensor es solo un ejemplo.

Saludos

Lucario448

Estructurado de la forma:
Code: [Select]
void loop() {
  // Lectura
  abc();
}

La lectura ocurría siempre, pero la repite hasta salir de abc().

llOzll

cuando entra abc() no deja de leer lectura? ya que en abc() tendrías otras cosas y arduino creo que va con un orden especificado dentro de las lineas y los bucles, o no es asi ? si es así como podría solucionarlo ?

steel_series

cuando entra abc() no deja de leer lectura? ya que en abc() tendrías otras cosas y arduino creo que va con un orden especificado dentro de las lineas y los bucles, o no es asi ? si es así como podría solucionarlo ?
Entiendo (o creo entender) lo que planteas, el bucle sigue un orden... si tenes 3 funciones dentro del loop, por ejemplo,

Code: [Select]
void loop()
      {
       funcion1();
       funcion2();
       funcion3();
      }


Se va a llamar a funcion1(), termina la función, pasa a la siguiente, funcion2(), etc. Cuando esta leyendo una función, no esta leyendo otra. Entra en una, hasta que termina y sigue con la siguiente, como explico Lucario.


Si queres que una función se lea constantemente tendrías que llamarla dentro de while, así el bucle se reduciría solo y exclusivamente a esa función, pero no podrías hacer otras cosas.

No estoy seguro de lo que queres hacer, por ahí podrías utilizar la función millis() para leer distintas funciones al mismo tiempo, pero no estoy seguro si realmente se puede hacer eso, pero si se usa para hacer determinadas cosas, mientras se lee el estado de un botón por ejemplo. Seria como un multithreading.






rodripelto

Hola,

Efectivamente, si tu función abc() tardara en ejecutarse una hora, las medidas del sensor serian cada hora.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

llOzll

vaya! alguna posible solucion para esto? yo pienso que si coloco los codigos para hacer la lectura dentro de cada funcion() se podria solucionar esto? uds que dicen ?

PeterKantTropus

vaya! alguna posible solucion para esto? yo pienso que si coloco los codigos para hacer la lectura dentro de cada funcion() se podria solucionar esto? uds que dicen ?
Si puedes hacer eso (colocar el código de medición dentro de cada función) significa que probablemente tengas un mal diseño de funciones. Si tienes un solo delay() dentro de tu funciones, ahí tienes el problema. Debes lograr que tus funciones no tengan delays ni loops. En caso contrario puedes utilizar la interrupciones de Hardware con  un timer, como el 555, para que haga mediciones cada cierto tiempo.

saludos
"Si no entra como tornillo, entra como clavo"

rodripelto

#12
Dec 01, 2017, 08:24 pm Last Edit: Dec 01, 2017, 08:25 pm by rodripelto
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

llOzll

Gracias por sus respuestas!
He leído la pagina que enviaste, estoy leyendo una y otra ves para comprendedlo bien, creo que es lo que buscaba, si tengo alguna duda volveré al foro!

Saludos!

Lucario448

En caso contrario puedes utilizar la interrupciones de Hardware con  un timer, como el 555
Te lo puedes ahorrar; el microcontrolador tiene los suyos; incluso hasta tres.

De hecho, es un timer y una interrupción los que hacen posible a millis().

Go Up