Autor Tema: Porque esta funcion???  (Leído 2776 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Porque esta funcion???
« 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);
   }
}

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Porque esta funcion???
« Respuesta #1 en: 31 de Julio de 2012, 09:31:05 »
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.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Porque esta funcion???
« Respuesta #2 en: 31 de Julio de 2012, 11:12:53 »
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???

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Porque esta funcion???
« Respuesta #3 en: 31 de Julio de 2012, 12:57:45 »
Claro! 1000us es igual a 1ms. Si necesita 998ms, entonces tiene que esperar que transcurran 998 veces 1ms  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Porque esta funcion???
« Respuesta #4 en: 31 de Julio de 2012, 16:36:39 »
Mientras t sea mayos de 0
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Porque esta funcion???
« Respuesta #5 en: 01 de Agosto de 2012, 03:52:32 »
Gracias compañeros, muchas gracias.
Me gusta cuando reviso un programa de otro llegar a comprenderlo 100%.


De nuevo gracias a todos.

Desconectado nZeta

  • PIC16
  • ***
  • Mensajes: 130
Re: Porque esta funcion???
« Respuesta #6 en: 01 de Agosto de 2012, 11:48:51 »
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.

Desconectado Lucho08

  • PIC10
  • *
  • Mensajes: 24
Re: Porque esta funcion???
« Respuesta #7 en: 11 de Agosto de 2012, 14:22:45 »
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