Autor Tema: Problema con delay en el compilador CCS  (Leído 14001 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con delay en el compilador CCS
« Respuesta #15 en: 04 de Noviembre de 2014, 15:15:42 »
En caso de querer emplear el timer0 que deberìa cambiar? Estoy empleando el pickit3 programmer para quemar el pic. Nose si deba emplear otro o si esta bien ese. Muchas gracias KILLERJC muy explicativa tu respuesta que es lo que uno prefiere cunado no tiene mucha experiencia. Saludos.-

Primero que nada: Modifique el anterior post.

Ahi tendrias el mismo problema, primero verificar lo que te comente. En especial la frecuencia de salida, para comprobar que la entrada del oscilador sea 20Mhz, Asi de esa forma los calculos dan bien.

El timer pensalo en un contador de ciclos de reloj, la entrada generalmente es FOSC/4 = 20Mhz/4 = 5Mhz = 0.2uS cada ciclo o cada ves que suma 1.
Luego explico unas cosas mas del timer

La idea general es la siguiente:
Vos cargas un valor en el Timer0, y habilitas las interrupciones.
Cuando el Registro del timer pasa de 0xFF ( 1111 1111 ) a 0x00 , es decir se rebalsa , un overflow, activa la interrupcion.
El micro entonces va al vector de interrupcion donde llamas a tu funcion en cuestion, ahi limpias el flag de interrupcion, desactivas interrupciones, cargas de nuevo el registro de TMR0, haces lo que tenes que hacer ( prender un led ) activas de nuevo las interrupciones y salis.
Entonces tu procesador lo unico que hace es esperar la interrupcion, o puede estar haciendo otra cosa totalmente distinta, mientras que con el delay lo tenes ocupado haciendo NADA ( ejecutando saltos, NOP, etc ).

Esa seria la aplicacion ideal.
La otra es desactivar las interrupciones (para no meterte todavia con eso) cargar el valor del timer y vos esperar hasta que el flag (cuando ocurre el overflow) se ponga en 1 (con un while), cuando ocurre esto, modificas tus salidas y cargas nuevamente el valor del TMR0.

Como decia del timer, a 20Mhz tenes que cuenta 1 cada 0.2uS, pero el TMR0 permite dividir esta frecuencia aun mas, desde 2 a 256 ( en potencia de 2 ), es decir lo maximo serian 51.2uS (A esa frecuencia de cristal). y teniendo 8 bits como maximo, estarias en 13.1072mS
Para obtener mas tiempo usas un contador de las veces que entra, para tus 250mS, contarias 19 veces ( 250 / 13.1072 ) y recien ahi activarias la salida. Este caso es cargandolo con 0x00.
En caso de que quieras cargar un valor 0x10, por ejemplo, deberias hacer el complemento a 2 del mismo, y cargarlo en el registro del timer, ya que es un contador ascendente.

Si queres tiempos mas largos o es seguir la misma logica o es utilizar un cristal de menos Mhz ( o usar el oscilador interno y te ahorras de: poner un cristal con sus condesadores, y usas los pines para salida )
« Última modificación: 04 de Noviembre de 2014, 15:44:31 por KILLERJC »


 

anything