TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 06 de Abril de 2012, 10:39:29
-
Hola a todos
Antes de nada quiero decir que llevo tiempo con esto de la programación de microcontroladores pero me considero un novato ya que nunca he tomado clases y solo he aprendido a base de libros y foros como este, con lo cual puede que lo que diga ya esté hecho y de una manera mucho más fácil y cómoda
tengo una pregunta que hace tiempo me ronda la cabeza, es en referente a los timer, ¿se puede utilizar un time para causar retardos y distribuir el tiempo de las tareas entre las funciones?
Me explico.
Resulta que haciendo proyectos, e ir añadiendo periféricos al microcontrolador, normalmente tengo que ajustar los tiempos para que las lecturas de los periféricos sean en el tiempo que el fabricante recomienda y evitar colisiones y saturaciones.
Pues me di cuenta de que si en el driver del periférico por ejemplo un MAX6675, las lecturas de este dispositivo no puede ser inferior a 200mls, entonces yo hacía un
delay_ms(200); y el micro no me ejecutaba ningún código más hasta que éste no terminara y se hacía mucho más difícil ajustar un cronómetro y se desperdicia tiempo en hacer estas rutinas.
Un día me dio por implementar un timer y ajustarlo a más o menos un tiempo real y por medio de banderas hacía que las funciones del programa entraran en ejecución más o menos en su momento.
Ejemplo de timer1:
void cronometro(){ //implemetamos un cronómetro en el timer1
set_timer1(64500);
if(++milisegundos > 999){ //Decrementamos milisegundos hasta que sea mayor que 999
milisegundos = 0; //cargamos milisegundos con el valor 0 para un proximo conteo
flag_cronometro=1;
}
if((milisegundos==200)||(milisegundos==400)||(milisegundos==600)||(milisegundos==800)||(segundos == 999)){
flag_max6675=1;
}
if(milisegundos==500){
flag_limpiarlcd=1;
}
}
y funciono, no era 100% preciso pero el funcionaba y mejor que como lo hacía antes .
Se supone que mientras el timer no llegue al tiempo seleccionado en la bandera, no ejecutará el código de esa función y mientras tanto el código general se seguirá ejecutando y solo gastando el tiempo preciso en cada función y en las interrupciones por desbordamiento del timer, ¿estoy en lo cierto?,
¿Esto es una buena idea ?.
Seguramente hay una manera de hacer esto y está estandarizada y mas eficiente.
¿Qué opinión me dais?
-
Hola.
Creo que hay algo llamado RTOS y se programa de la forma en que quieres, es decir por eventos en tiempo (si no me equivoco).
Saludos
-
Aaaaa gracias, pues lo investigaré
-
....Se supone que mientras el timer no llegue al tiempo seleccionado en la bandera, no ejecutará el código de esa función y mientras tanto el código general se seguirá ejecutando y solo gastando el tiempo preciso en cada función y en las interrupciones por desbordamiento del timer, ¿estoy en lo cierto?,
¿Esto es una buena idea ?.
...
claro que es buena idea, de hecho es la forma mas eficiente de hacer retardos con pics
-
Pues gracias por el comentario y seguiré en esta misma línea