Autor Tema: Macro para retardos optimizados.  (Leído 2007 veces)

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

Desconectado isfan

  • PIC16
  • ***
  • Mensajes: 145
Macro para retardos optimizados.
« en: 30 de Noviembre de 2014, 08:12:42 »
Hola haber, trabajo con el compilador XC8.
 Con la instrucción __delay_ms(x) o __delay_us(x) llama a la macro y hace un retardo según x periodos.

La cuestion para trabajar con periodos cortos va muy bien, cuando a x le da un numero elevado suele provocar un error y dice que el argumento es demasiado largo.

error: (1355) inline delay argument too large

Los retardos se pueden ajustar con bucles anidados y otras taquiñuelas, tampoco me ayudo mucho la libreria de delays.h que trae microchip por defecto.

Me gustaria saber si trabajais con una opcion mas elegante que estos bucles o llamadas de variables muy personalizadas,

 y  como podria hacer una función que se ajuste simplemente con inserta  __delay_ms(8000) -> tiempo retardo 8 segundo poir ejemplo.

He visto algo como declarar por ejemplo:

#define _XTAL_FREQ 8000000
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))

Pero no me vale

Alguna idea?

un saludo.




Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Macro para retardos optimizados.
« Respuesta #1 en: 30 de Noviembre de 2014, 12:03:56 »
Citar
Me gustaria saber si trabajais con una opcion mas elegante que estos bucles o llamadas de variables muy personalizadas,

Interrupciones... Los retardos lo unico para que los veo necesario es cuadno tengo algo secuencial por ejemplo un LCD y tengo que cumplir los tiempos del LCD. Y donde el uso de un timer termina siendo un poco absurdo o irrealizable.

Un delay de 8 segundos te dejaria haciendo al micro 8 segundos de nada. no tiene sentido para nada. O usas un timer interno o usas un circuito externo con algun valor para que luego te de 8 segundos el contar varias veces.

Citar
Alguna idea?

Si queres usar ese mismo codigo definido en xc.h, lo que se me ocurriria es preguntar si se supero el limite de tiempo. Tenes que hacerte una nueva funcion.

Código: [Seleccionar]
void DelayMs( unsigned long x) {
 while ( x > 150 ) {
 x -= 150;
 __delay_ms(150);
}
__delay_ms(x);
}

Se me ocurre algo asi... basicamente limitar a 150 el __delay_ms y repetirlo las veces que sean necesarias. Lo escribi ahora seguro que tiene un error. El error que me imagino es el de cuando la frecuencia aumenta, los ciclos tambien, por lo tanto ese 150 tendria que ser mucho mas chico, de todas formas si le pones 10 y no 150 va a andar igual.
« Última modificación: 30 de Noviembre de 2014, 12:10:41 por KILLERJC »