Autor Tema: delay en C  (Leído 11816 veces)

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

Desconectado perikote

  • PIC10
  • *
  • Mensajes: 17
delay en C
« en: 27 de Abril de 2009, 20:39:30 »
Hola les comento que estaba programando con el code warrior en C un jl3 pero tengo una duda a la hora de generar delays.
habia visto en otro post que tenia un par de ejemplos de programacion y para generar delays daba algo asy

void retardo( unsigned int ciclos ) {
   unsigned int cuenta;

   for ( cuenta = 0; cuenta < ciclos; cuenta++ );
}

lo saque de aca http://www.todopic.com.ar/foros/index.php?topic=15400.0 es el primer ejemplo

Segun entiendo en el programa principal si pongo retardo( 30000 ) va a llamar a esta funcion y  voy a tener un retardo igual a 30000 ciclos, si uso un cristal de 4mhz serian 30mseg, pero me fije en el winide y trate de controlar solo la parte del delay poniendo ciclos en 0 al arrancar el for y cuando sale de este me da muchisimos mas ciclos que lo que indica la variable ciclos, por ejemplo poniendo 100ciclos me daba algo de 2900 ciclos.Hay algo que estoy haciendo mal o es asy?
Alguien sabe si hay alguna manera de usar el delay como en el ccs que pone delay_ms(100) por ejemplo. y no tengo que estar yo generando el delay como en el code warrior?

Desconectado GRUNFELD69

  • PIC10
  • *
  • Mensajes: 37
Re: delay en C
« Respuesta #1 en: 28 de Abril de 2009, 11:40:24 »
buen dia: Creo que debes seguir el siguiente codigo y la rutina te va a funcionar

void retardo( int ciclos ) {
int cuenta;

   for ( cuenta = 0; cuenta < ciclos; cuenta++ ;)
{}
}

en este esquema el programa se quedara en espera mientras el ciclo se cumple. es mas para evitar problemas puedes declarar cuenta solamente int.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: delay en C
« Respuesta #2 en: 28 de Abril de 2009, 18:28:43 »
Hola, te conteste ayer pero se trabo la pagina y mi post no salio. En C no se pueden hacer delay de esa manera, porque el tiempo total depende del compilador, en como traduce las lineas "C" en su respectivo assembler. Si estas usando CodeWarrior para programar podes usar el ProccessExpert que a partir de la frecuencia de Cristal que estes usando te genera una funcuón llamada Cpu_Delay100US que genera un de delay de 100 us deoendiente del la frecuencia de clock y te la escribe en assembler, otra cosa que podes usar es hacer uso de algunos de los timers.

Saludos !

Desconectado perikote

  • PIC10
  • *
  • Mensajes: 17
Re: delay en C
« Respuesta #3 en: 29 de Abril de 2009, 01:40:07 »
Ahh entonces al usar  void retardo no significa que demorara la cantidad de ciclos asignados no? entonces estaba en lo cierto cuando en el winide me dio muchos mas ciclos.
Supongamos que tengo un solo timer como el jl3 y lo estoy usando para generar una interrupcion por timer y necesito hacer otra demora no tan precisa entonces lo mas conveniente me parece que es  usar una rutina de assembler no? , Ya que estube viendo que  la funcion  Cpu_Delay100US es un delay de assembler.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: delay en C
« Respuesta #4 en: 29 de Abril de 2009, 10:14:05 »
Hola,
Citar
Ahh entonces al usar  void retardo no significa que demorara la cantidad de ciclos asignados no? entonces estaba en lo cierto cuando en el winide me dio muchos mas ciclos.
Exacto.

La función Cpu_Delay100US justamente genera la una demora de 100 us en base a la frecuencia de clock, el ProccessExpert ajusta este valor, metiendo o sacando instrucciones y esta enteramente hecha en assembler. La diferencia de usar este tipo de delays es que tu programa no continua hasta que finalice la función, en cambio usando un timer, podes aprovechar ese tiempo muerto para hacer otras tareas. Normalmente se utilizan las dos todo depende en que parte de tu programa.

Salduos !


Desconectado perikote

  • PIC10
  • *
  • Mensajes: 17
Re: delay en C
« Respuesta #5 en: 29 de Abril de 2009, 19:37:11 »
Ok Muchas gracias por sus respuestas, estaria bueno que en ese sentido sea como el ccs que simplemente con poner delay_ms(x) ya genera el delay. Voy a usar el timer y si llego a necesitar otro   delay inserto uno en assembler y listo.