TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: manuel_j555 en 15 de Septiembre de 2009, 00:20:03

Título: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 15 de Septiembre de 2009, 00:20:03
Bueno esta es la primera ves que escribo en este fabuloso foro, que me ha ayudado mucho aun sin haber realizado la primera pregunta todavia  :lol:... Bueno por aca traigo un proyecto que e estado haciendo para mi acuario, para llevar el control del encendido y apagado de las luces y alimentacion automatica de los peces.

No voy a escribir mucho sobre el tema aun pero luego luego comento el funcionamiento y posibles mejoras que le podria hacer, y posibles mejoras que ustedes me puedan aportar.

La programacion es en CCS y utilizo el RTOS del CCS, al principio lo hice sin el RTOS pero lo quise implementar para practicar y porq con el me libere de algunos recursos externos que debia utilizar para despertar al pic de un sleep  :mrgreen:

Bueno espero sus comentarios y posibles sugerencial al respecto, luego sigo explicando el proyecto y aca les dejo el codigo y el archivo del proteus para que lo simulen (la clave que pide el circuito es 0 si mas no recuerdo)  
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: jhozate en 15 de Septiembre de 2009, 00:28:54
posteate unas foticos,...se ve interesante yo tambien quiero incursionar en mi acuario..
saludos
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 15 de Septiembre de 2009, 00:35:57
Bueno en realidad no lo tengo implementado todavia  :(,  es un proyecto que comence hace menos de 2 meses y no e tenido el dinero todavia para comprar los componentes.

Esto viendo si consigo una pantalla de Nokia por hay a ver si me ahorro el comprar una pantalla LCD 16x2 que es la que uso en el proyecto y asi le añado mas funciones como mostrar la fecha y le coloco una alarma que me indique mas o menos cuando me tocan los cambios de agua, o quien quita le coloque procesos de cambios de aguas automaticos cada cierto tiempo...

Por el momento solo lo tengo plasmado en la PC
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: anfegori91 en 15 de Septiembre de 2009, 00:36:18
Qué gran aporte¡¡
gracias por compartir el proyecto.. me despeja algunas dudas acerca del ccsrtos.
Como idea opcional, tal vez se podría añadir un sensor en donde pones el alimento para avisar si hay que llenar de nuevo el recipiente.
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 15 de Septiembre de 2009, 00:52:27
Bueno la verdad todavia no tengo bien definido como voy hacer el montaje del alimentador, pero estuve practicando con un envase con agujeros a los lados, en la parte mas baja posible, pegado al envase le coloque un motor que funciona como un vibrador como los de celular. Y al vibrar el motor va cayendo un poco de comida al acuario, le coloque que el motor durara encendido solo medio segundo y ajusto la cantidad de comida escogiendo el numero de veces que voy activar el motor por alimentacion...

Pero la verdad no tengo idea de como medir la cantidad de comida que va quedando en el recipiente, e visto por hay unas imagenes en internet de alimentadores automaticos, voy a ver si coloco las fotos aqui pero la verdad es q no me e puesto a ver como colocarlas ya que es la primera ves que escribo en este foro. :?

http://alimentadorautomaticoparapeces.files.wordpress.com/2008/08/1.jpg
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Suky en 15 de Septiembre de 2009, 01:05:16
Muy buen proyecto! Lo único que veo y no me convence son las demoras tan grandes (delay_ms) dentro de las tareas  :? revisa el siguiente link (http://www.todopic.com.ar/foros/index.php?topic=15876.msg104036#msg104036)


Saludos!
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 15 de Septiembre de 2009, 01:15:49
A eso si tuve que dejarlas asi porque no entendi bien eso de la funcion "rtos_yield()" ya que supongo que uno no puede ajustar la demora al tiempo que uno necesite, sino que, esta se ajusta al tiempo que hallamos colocado en el "rate", pero si hay manera de rediseñar esa parte del codigo bueno se agradece.

Bueno tambien lo que pasa es que no he practicado lo del RTOS, si no que de una ves lo implemente en el proyecto, y deje las demoras porque no hay ninguna tarea que necesite estar ejecutandose todo el tiempo solo la que activa alimentación y luces pero las demoras no la afectan mucho.
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Suky en 15 de Septiembre de 2009, 01:20:35
En el mensaje anterior modificado enlace una explicación de rtos_yield. Cada tarea se ejecuta una sola vez y se deshabilita sola?
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 15 de Septiembre de 2009, 01:35:14
Exacto  :lol: gracias al tutorial del amigo reiniertl fue que me anime a usar el RTOS del CCS y como dice en sus explicaciones

"Sin embargo yield() no es una función realmente poderosa, al menos en este RTOS, porque pone a dormir a la tarea durante un período completo del valor rate, que especificamos al declarar la función como una tarea del RTOS, y eso en ocasiones no es lo que deseamos. Aún así es mejor que el procesador de nuestro PIC esté haciendo algo útil y no perdiendo el tiempo."

Ok, en mi caso el valor del rate es 50ms y es un periodo demasiado corto para mostrar un msj en pantalla y como la verdad no se otra manera de parar la ejecucion de esa tarea por tiempos largos, le coloque las demoras.

Aunque se podria utilizar la funcion rtos_await de alguna manera para que se quede esperando a que se cumpla alguna condicion que seria algun contador de otra tarea, aunque no se si es una manera eficiente de realizar esa especia de pausa.

       Cada tarea se ejecuta una sola vez y se deshabilita sola?

Supongo que hablas de las tareas de configuracion, si son esas si, se ejecutan una ves y al terminar de ejecurase de desabilitan, la unica tarea que siempre esta habilitada es la que se encarga de las luces y la aliemntacion de los peces.
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 15 de Septiembre de 2009, 02:07:32
Bueno intentare reemplazar los delay por rtos_yield utilizando codigo parecido al del amigo reiniertl colocando dicha funcion dentro de un clico repetitivo:

Código: [Seleccionar]
for (variable = 0 ; variable <= 20 ; variable++)
{
    rtos_yield();//suponiendo que el rate de dicha tarea es 50ms, para tener un tiempo aproximado de 1 segundo
                      //si es que la funcion trabaja como pienso, esperando 50ms para volver a ejecutarse...
}
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Suky en 15 de Septiembre de 2009, 09:37:50
Si quieres una demora de 2.5 segundos por ejemplo para una tarea que se ejecuta cada 50ms, tenes lo siguiente:

Código: C
  1. for(i=0;i<50;i++){
  2.     rtos_yield();
  3. }

Si las demás tareas están bien diseñadas, osea ninguna ocupa más del rate, entonces tendrás una demora mas o menos precisa.


Saludos!
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: gera en 15 de Septiembre de 2009, 10:12:23
Y no se podria usar alguna interrupcion de timer?? Por ej, ponemos a dormir una tarea hasta q el timer interrumpa, y mientras tanto se ejecutan las demas.
Saludos!!
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Suky en 15 de Septiembre de 2009, 10:23:13
Y no se podria usar alguna interrupcion de timer?? Por ej, ponemos a dormir una tarea hasta q el timer interrumpa, y mientras tanto se ejecutan las demas.
Saludos!!
No se como se podría aplicar eso  :? Porque lo que hace rtos_yield es cederle el control a otra tarea y espera hasta el próximo ciclo
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 15 de Septiembre de 2009, 16:14:06
Bueno la verdad no se si alguna tarea utiliza mas tiempe que el de su rate no e calculado eso, pero bueno para este caso no me preocupa mucho ya que no es necesario una demora exacta para mostrar los mensajes en el LCD.

Y no se podria usar alguna interrupcion de timer?? Por ej, ponemos a dormir una tarea hasta q el timer interrumpa, y mientras tanto se ejecutan las demas.
Saludos!!

Podria ser usando la funcion rtos_await(condicion) y hacemos la condicion verdadera dentro de la atencion a la interrupcion por el timer, es lo que se me ocurre por ahora...
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 15 de Septiembre de 2009, 17:49:53
Bueno aca subo de nuevo el proyecto con las algunas modificaciones,reemplaze los delay por rtos_yield. Aparte elimine una funcion "Alimentando" y meti dicho codigo dentro de la tarea "leer_configuraciones", esto para reemplazar los delay por rtos_yield.

Pero ahora resulta que el modulo de cambiar la clave me da errores, deberia mostrar un mensaje en pantalla y lo que en realidad hace es mostrar caracteres a lo loco, y la verdad no se a que se deba  :?
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: gera en 15 de Septiembre de 2009, 18:06:38
Y no se podria usar alguna interrupcion de timer?? Por ej, ponemos a dormir una tarea hasta q el timer interrumpa, y mientras tanto se ejecutan las demas.
Saludos!!
No se como se podría aplicar eso  :? Porque lo que hace rtos_yield es cederle el control a otra tarea y espera hasta el próximo ciclo

Por ejemplo, supongamos q una tarea necesita esperar 50ms. Entonces se va a dormir, y una interrupcion de timer la despierta luego de transcurrido ese tiempo. Entonces la tarea no tiene q despertar a cada rato a ver si se cumplio. El tiempo seria bastante preciso.
saludos!
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Suky en 15 de Septiembre de 2009, 18:10:57
En palabras se entiende, pero no veo como hacerlo con las funciones del RTOS de CCS.  ;-)
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 16 de Septiembre de 2009, 00:00:40
Ahora si, sustituidos todos los delay por rtos_yield y solucionado el problema del modulo de cambiar la clave.

Bueno menos el delay del main y el delay de la funcion que lee la tecla presionada, los deje asi para no complicarme  :D.

Es interesante ver como trabaja el motor de la aliemntacion mientras realizamos alguna configuracion, todo gracias a las ventajas de los RTOS...

Luego Publico un proyecto que hice en el que dos pics se mandan mensajes entre si.
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: gera en 16 de Septiembre de 2009, 00:54:38
En palabras se entiende, pero no veo como hacerlo con las funciones del RTOS de CCS.  ;-)

Perdon, pense q no se habia entendido mi idea jeje. Bueno, en rtos estan las funciones rtos_enable() y rtos_disable() para activar y desactivar tareas. No se si una tarea se puede desactivar a si misma, supongo q si. Entonces en la interrupcion de timer, la volvemos a activar.

Tambien hay una funcion interesante q es rtos_await(), q deja a la tarea dormida hasta q se cumpla una condicion. Entonces en el timer (o en alguna otra tarea), podemos ir incrementando una variable y q cuando llegue a tal valor, la otra tarea se activa.
Por ej, podemos setear el timer para q interrumpa cada 1ms e incremente count. entonces hacemos un rtos_await(count==50); y ahi tenemos nuestros 50ms de demora.

La verdad q no se si esto es lo mas eficaz... la verdad q yield ya presenta una solucion mucho mejor q usar delays. Pero se me ocurren estas cosas, habria q probar.

saludos!!!
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 16 de Septiembre de 2009, 01:06:18
Bueno la opcion que propone el amigo gera tambien fue una de las posibilidades en las que pense, pero no la implemente porque a la hora de que varias tareas esten "durmiendo" o en espera, supongo que cada una deberia tener un contador independiente, ya que puede que una tarea necesite un tiempo de espera distinto del de otra.
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Suky en 16 de Septiembre de 2009, 01:50:36
Una cosa es "dormir" una tarea y otra cosa es deshabilitarla  ;-) Por ejemplo en el caso que se le plantea a manuel, la tarea escribe en lcd, espera 2.5 seg y luego ejecuta otras instrucciones. Si usamos enable/disable, al escribir en el lcd, habilitaríamos el timers y deshabilitariamos la tarea. Y al ocurrir la interrupción por el timer de espera de los 2.5 seg volveríamos a habilitar la tarea, pero esta se ejecuta desde el principio y no donde pretendemos.


Saludos!
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: gera en 16 de Septiembre de 2009, 13:29:31
Bueno la opcion que propone el amigo gera tambien fue una de las posibilidades en las que pense, pero no la implemente porque a la hora de que varias tareas esten "durmiendo" o en espera, supongo que cada una deberia tener un contador independiente, ya que puede que una tarea necesite un tiempo de espera distinto del de otra.

Lo q podes hacer es q cuando el timer interrumpa se incremente una variable, y segun el valor de esta, rehabilitas la tarea q corresponda. Ahi podes obtener retardos diferentes.

Suky, veo la diferencia. Pero por costumbre siempre digo "dormir" porq asi lo estudie en sistemas operativos jeje. La proxima voy a tener cuidado con los terminos q uso. Gracias por la aclaracion :wink:
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: manuel_j555 en 16 de Septiembre de 2009, 14:11:12
La verdad que este programa de este proyecto tiene los 1000 y un errores, aqui esta una version sin ningun semaforo ya que ni son necesarios ni me ayudan mucho en el programa...
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Ave_Rapina en 29 de Septiembre de 2009, 23:06:35
Hola,

El codigo nao es igual en el source e en hex.

El codigo quando lo compilo me da um comportmiento diferente en mostrar la hora e el temp

Cumps
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Ave_Rapina en 29 de Septiembre de 2009, 23:18:30
Prontos.

Resolvido

Gracias por tu Projecto.

Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: Ave_Rapina en 29 de Septiembre de 2009, 23:29:55
Hola manuel_j555

Te dou una sugestion, todas la comunicaciones e alteraciones de las variables devem ser protegidas, evitando as comutaciones.
Los semaforos no bloquean las comutaciones, solo permiten que protejas tus variables, No lo se sy ccs rtos petmite que uses mutex de forma a bvoquear tu escalonador. Pero hay mirado rapido sobre el codigo e tienes el rtos yeld que te permite parar el escalonador.

Para imprimir en lcd deverias usar una fila de mensagem i una tarefa para te imprimir los dados enviados que produzes en otras tarefas.

you por norma uso micros de ARM e uso siempre el freertos que es posix standard

Regards

Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: legm en 13 de Septiembre de 2011, 14:29:51
quien sabe la clave ??????.................
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: markitosb en 02 de Febrero de 2012, 10:27:56
ok  esta buenisimo  tu proyecto  mas  que  todo  lo que  interesa  es darle una idea  alos principiantes como  yo  :lol:  algunas personas   nomas  ayudadan poniendo  sus proyectos  realisados  a si como ud  grasias     auna  cosita me puedes proporsionar   la contraseña del proyecto porque probe con  todos  y nada grasias
Título: Re: Mi Proyecto Para Mi Acuario
Publicado por: vicbush en 31 de Marzo de 2012, 16:52:37
hola quiero compliarlo y me da el siguiente error podrias ayudarme??


>>> Warning 216 "proyecto acuario RTOS.c" Line 884(0,1): Interrupts disabled during call to prevent re-entrancy:  (@delay_ms1)
      Memory usage:   ROM=34%      RAM=8% - 22%
      0 Errors,  1 Warnings.

Arazo, Vic