Autor Tema: Retardos EXACTOS entre 2 y 1023 µs (Bajo ciertas condiciones)  (Leído 1599 veces)

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

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Retardos EXACTOS entre 2 y 1023 µs (Bajo ciertas condiciones)
« en: 08 de Marzo de 2021, 07:42:48 »
¡Saludos al foro!

Como comenté en este mismo foro en el hilo http://www.todopic.com.ar/foros/index.php?topic=50591.msg417282#msg417282 por razones profesionales me he visto necesitado de utilizar retardos del orden de los microsegundos.

En el hilo anteriormente citado verifiqué que la función delay_us no era lo suficientemente "exacta" para garantizar una precisión de 1 us.

Así que me he visto forzado a desarrollar mis propias funciones que son "exactas" bajo ciertas condiciones:

1: La frecuencia de reloj DEBE SER de 32 MHz.
2: La familia del micro DEBE SER la PIC18.
3: La versión del compilador que he utilizado es la PICC 5.083. (No he probado con otras versiones).
4: Las funciones tienen un rango "exacto" entre 2-255 us y 6-1023 us respectivamente.

El método de verificación que he utilizado es probar las funciones con distintos valores, y mediante breakpoints combinados con el Stopwatch del simulador del MPLAB, cronometrar el retardo obtenido.

Hasta que alguien me demuestre lo contrario (y me gustaría que no fuera así por las horas que le he metido), las funciones son exactas entre 2-255 microsegundos para la función Retardo_us_A y entre 6-1023 microsegundos para la función Retardo_us_B.

Es IMPRESCINDIBLE controlar el tipo de los valores que mandamos a las funciones:

unsigned int para la función Retardo_us_A (2-255)
unsigned long para la función Retardo_us_B (6-1023)

En las funciones no hay ningún tipo de control de la validez de los datos de entrada. Por lo tanto si queremos utilizarlas habrá que considerar en el código previo las restricciones adecuadas.

La función Retardo_us_A(unsigned int Param) se puede utilizar de modo independiente. No ocurre lo mismo con la función Retardo_us_B(unsigned long Param) que necesita a la función Retardo_us_A para funcionar.

Si alguien se pregunta por qué no utilizo la función delay_us como función de apoyo para Retardo_us_B le remito al post anteriormente mencionado: http://www.todopic.com.ar/foros/index.php?topic=50591.msg417282#msg417282

Reconozco que no son unas funciones demasiado "elegantes" pero por lo menos funcionan.

Si alguien detecta algún valor que no sea exacto por favor publíquelo en este mismo hilo.

¡Un saludo al foro!



// -----------------------------------------------------------------------------------------------------------
// Retardo EXACTO en microsegundos entre 2 y 255
// -----------------------------------------------------------------------------------------------------------
void Retardo_us_A(unsigned int Valor_Ret) {
   if (Valor_Ret==1) {                                    // Valores mínimos erróneos
   } else if(Valor_Ret==2) {                              // Caso particular   
      delay_cycles(2);
   } else if(Valor_Ret==3) {                              // Caso particular
      delay_cycles(6);
   } else if(Valor_Ret==4) {                              // Caso particular
      delay_cycles(10);
   } else if(Valor_Ret==5) {                              // Caso particular
      delay_cycles(14);   
   } else if(Valor_Ret==6) {                              // Caso particular
      delay_cycles(18);   
   } else if(Valor_Ret==7) {                              // Caso particular
      delay_cycles(22);   
   } else if(Valor_Ret==8) {                              // Caso particular
      delay_cycles(26);   
   } else if(Valor_Ret==9) {                              // Caso particular
      delay_cycles(30);   
   } else {
      delay_us(Valor_Ret-5);                              // Resto de valores (Caso general)
      delay_cycles(2);   
   }
}

// -----------------------------------------------------------------------------------------------------------
// Retardo EXACTO en microsegundos entre 6 y 1023
// -----------------------------------------------------------------------------------------------------------
void  Retardo_us_B(unsigned long Valor_Micros) {               
   unsigned long Val_Micros;
   unsigned int k=0;

   Val_Micros=Valor_Micros;
   
   if (Valor_Micros<128) {                                 // Mínimos (Correctos a partir de 6)
      k=4;
      delay_cycles(6);
   } else if (Valor_Micros<256) {                           // Primer bloque de ajuste
      k=4;
      delay_cycles(2);
   } else if (Valor_Micros<384) {                           // Segundo bloque de ajuste
      Val_Micros=Valor_Micros-133;
      Retardo_us_A(128);
      k=0;
   } else if (Valor_Micros<512) {                           // Tercer bloque de ajuste
      Val_Micros=Valor_Micros-262;
      Retardo_us_A(128);
      Retardo_us_A(128);
      delay_cycles(4);
      k=0;
   } else if (Valor_Micros<640) {                           // Cuarto bloque de ajuste
      Val_Micros=Valor_Micros-390;
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      k=0;
   } else if (Valor_Micros<768) {                           // Quinto bloque de ajuste
      Val_Micros=Valor_Micros-519;
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      delay_cycles(4);
      k=0;
   } else if (Valor_Micros<896) {                           // Sexto bloque de ajuste
      Val_Micros=Valor_Micros-647;
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      k=0;
   } else if (Valor_Micros<1024) {                           // Séptimo bloque de ajuste
      Val_Micros=Valor_Micros-776;
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      Retardo_us_A(128);
      delay_cycles(6);
      k=0;
   }
   
   Val_Micros=Val_Micros-k;                              // Ajuste común
   Retardo_us_A((unsigned int)Val_Micros);                     // Completa los retardos
}


« Última modificación: 08 de Marzo de 2021, 07:58:41 por PicMinor »