TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: diegostreetbob en 31 de Julio de 2012, 08:56:01
-
Hola a todos,
le llevo dando vueltas a este programa y no veo porque utiliza la funcion delay_ms, el programa funciona en protoboard pero me gustaria saber porque usa esta funcion ya que en varios programas de cursomicros tambien aparecen funciones parecidas,
agradezco vuestras aportaciones, gracias
#include "avr_compiler.h"
#include "lcd.h"
void delay_ms(unsigned int t)
{
while(t--)
delay_us(1000);
}
int main(void)
{
char buff[17]; // Array de 17 elementos tipo char
unsigned seg, min, hor;
seg = min = 0;
hor = 12;
lcd_init(); // Inicializar LCD
lcd_gotorc(1,4); // Cursor a fila 1 posición 4
lcd_puts("easy clock");
for(;;)
{
sprintf(buff, "%2d:%02d:%02d ", hor, min, seg); // Formatear
lcd_gotorc(2,5); // Cursor a fila 2 posición 5
lcd_puts(buff); // Enviar buffer a LCD
if(++seg > 59)
{
seg = 0;
if(++min > 59)
{
min = 0;
if(++hor > 12)
hor = 1;
}
}
delay_ms(998);
}
}
-
El uso de delay_ms con llamadas a delay_us adentro es para usarlo dentro de un programa que necesita realizar interrupciones en otras tareas, sin que amenace demasiado la ejecucion de temporizaciones precisas.
-
Hola,
gracias por tu respuesta, muchas gracias.
Entiendo tu concepto, pero no porque se usa en este programa ni como funciona, exactamente como funciona, es asi??
void delay_ms(unsigned int t) //t recibe le valor 998 de cuando se llama la funcion
{
while(t--)// espera a llegar a 0, 998,997,996,....0
delay_us(1000);// espera 1000us
}
Estoy en lo cierto???
-
Claro! 1000us es igual a 1ms. Si necesita 998ms, entonces tiene que esperar que transcurran 998 veces 1ms ;-)
-
Mientras t sea mayos de 0
-
Gracias compañeros, muchas gracias.
Me gusta cuando reviso un programa de otro llegar a comprenderlo 100%.
De nuevo gracias a todos.
-
los delay_x(x); se usan generalmente cuando no hay que hacer o hay que esperar a que pase algo. personalmente prefiero mandar el micro a dormir, pues los delay son desperdicio de ciclos.
En el caso particular que muestras, seguramente se calcula que el loop "for" tarde 2ms por eso hacen un delay de 998ms para poder actualizar el LCD cada segundo. Sería mas conveniente y apropiado (ademas de mas exacto) mandar el micro a dormir y usar un timer o modulo RTC para desperdalo cada segundo, actualizar el lcd y volver a dormir.
-
En este caso particular de tu programa, revisandolo, veo que es un reloj, que te indica hora, minutos y segundos.
La funcion delay() es un retardo, en tu caso tenemos dos anidadas, la de mas adentro es una de: delay_us(1000); que significa que hace un retardo
de 1000 microsegundos o un milisegundo y la funcion delay_ms(998); que significa que hara un retardo de 998 milisegundos, osea le faltan 2 milisegundos
para que sea 1 segundo.
Como veras, todo reloj necesita un oscilador, en el caso de este programa y de tu hardware su oscilador es el cristal externo o si es configurado
con un cristal interno del micro, que corre a una frecuencia mayor, que podria ser ejm: 16MHz
Gracias a esta funcion delay_ms() se convierte esa frecuencia alta del cristal a una mas baja conocida y util para nuestro proyecto,
en el caso de nuestro reloj 1Hz o periodo de 1 segundo.
Al analizar el programa veras que hay un bucle infinito for(;;){ ...} en el cual dentro esta la funcion delay_ms(998) y la parte que actualiza el display
con el nuevo valor de segundo, minuto y hora.
Osea cada segundo o cada 1 Hz se actualizan los segundos (aumenta en uno), y en caso que llegue a 59, pasa a cero y aumenta automaticamente
a un minuto++ y si este llega a 59 min pasa a cero y tambien aumenta a hora++.
¿Porque no pone delay_ms(1000) para que sea exactamente un retardo de 1 segundo?
El programador considera que las instrucciones antes del delay_ms(998) y que estan dentro del for(;;){ ...} toman un tiempo de ejecucion calculado de
2 milisegundos.
¿Que ocurriria si no hay el delay_ms(998)?
El reloj se actualizaria o aumentaria en uno cada "segundo" muy rapido; cada ( 30/Frecuencia del Cristal ) y se veria en el display que aumentan
muy rapido los segundos, minutos y horas. Para el ejemplo de cristal de 16MHz seria : ( 30/16000000 ) segundos......... Esto seria muy rapido
Cordiales Saludos