Autor Tema: Timer 0 ¿Como se utiliza?  (Leído 4162 veces)

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

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
Timer 0 ¿Como se utiliza?
« en: 08 de Abril de 2005, 06:30:00 »
Hola a todos, necesito sacar por una de las salidas una señal cuadrada con un TON distinto a TOFF configurable mediante pulsadores.

Como soy novatillo he empezado ha ver como funciona el Timer 0 pero no hay manera.

Si alguien puede guiarme en cualquiera de las dos situaciones se lo agradecere.

Un saludo

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Timer 0 ¿Como se utiliza?
« Respuesta #1 en: 08 de Abril de 2005, 14:42:00 »
Que onda Usuario_registrado,
Aqui te pongo un ejemplo muy sencillo y basico, PARA NADA es preciso, para precision tendrias que usar otro cristal y NO inicializar el tmr en valores, es decir nunca hacerle recargas como sucede en este ejemplo y la recarga esta en el MAIN y en la rutina de interrupcion.

Codigo:

#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#BIT LED=6.0

#int_TIMER0
void ISR() {               /*ISR CADA 1.7 ms*/
   led=!led;
   SET_TIMER0(40);
}
void main() {
   SET_TRIS_B(6);
   output_bit(pin_b0,0);
   SETUP_counters( RTCC_INTERNAL, RTCC_DIV_4 | RTCC_8_BIT);
   //RTCC_INTERNAL:indica sin salida por los pines,es decir, usado como temporizador
   //RTCC_DIV_4:Indica un preescaler de 4(dividio por 4 el tiempo)
   //RTCC_8_BIT:Es una redundancia indicativa que es de 8 bits(256) es el tmr0,
   //ya que el tmr1 es de 16 bits........
   //;;;;;;;;;;;;;;;;;;;;;;;;;;;CALCULO:::::::::::::::::::::::::::::::::
   // Para producir una interrupción por desbordamiento del tmr0  cada 1.7ms aprox
   //Tenemos una Fosc fijada por el oscilador del micro= 4Mhz.... se sabe que cada
   //instruccion ocupa 4 ciclos de reloj... esto es: 4mhz/4=1mhz.. realmente al micro
   //le llegan 1Mhz....(esto depende de el Cristal que usemos, y su estabilidad dependera
   //de si es cristal externo o el interno de algunos micros) AHORA!! queremos
   //calcular el valor de carga(con que se inicie el tmr0) para que se desborde
   //cada 1.7ms aprox,Como usamos preescaler , este no es mas que un DIVISOR de
   //frecuencia,por tanto 1mhz/4=250khz esto es 4us cada incremento del tmr0 pero como
   //el tmr es de 8 bits(256 PASOS por asi decrilo) entonces 4us*256= 1024us
   //esto nos define que el desborde del tmr0 sera cada 1.024ms(1ms aprox...) teniendo
   //en cuenta que estamos contando los 256 pasos..es decir, inicializamos el tmr0 desde
   //0 hasta 255(256 pasos) esto nos define una formula GRAL:
   //Fdesborde=Fosc/(4*preescaler*VAL)] , donde val nos ayudara a
   //determinar el valor de iniciacion del tmr0 y esto se definide como :
   //inicializacion=256-VAL.
   //Ya aclarada la formula, calculemos lo que necesitamos 1.72ms=:aprox 581 hz
   //VAL=Fosc/(4*preescaler*Fdesborde)=430.29 este valor supera nuestro TMR(solo llega a
   //256, entonces aumentamos el divisor a 8(preescaler)
   //ahora VAL= 215.14 este si nos sirve, inicializacion=256-215=41 aprox
   //este es el valor con el que debemos cargar nuestro TMR0
   ENABLE_INTERRUPTS(INT_RTCC);
   SET_TIMER0(40);
   //seteamos el timer0 a 6
   ENABLE_INTERRUPTS(GLOBAL);
   WHILE (TRUE){
   }
}



Hay mas y mejores ejemplos en la web del pana Modulay http://personal.auna.com/asencio5/Ejemplos%20C/

Para aprender mas, sobre CCs esta el Microcursillo C Aqui
http://miarroba.com/foros/ver.php?foroid=46840&temaid=2307248

Salu2 pana!

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: Timer 0 ¿Como se utiliza?
« Respuesta #2 en: 09 de Abril de 2005, 08:13:00 »
Magnifica explicacion larger. Felicitaciones!



gfp Sonrisa

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
RE: Timer 0 ¿Como se utiliza?
« Respuesta #3 en: 11 de Abril de 2005, 09:55:00 »
MUXAS GRACIAS POR VUESTRA AYUDA!!!! SOIS GENIALES.

MUY BUENA RESPUESTA

UN SALUDO

.Poe

  • Visitante
RE: Timer 0 ¿Como se utiliza?
« Respuesta #4 en: 24 de Abril de 2005, 09:21:00 »

#int_TIMER0

void ISR() {               /*ISR CADA 1.7 ms*/

   led=!led;

   SET_TIMER0(40);

}



Mmmmm, duda existencial: ¿por qué recargar el rtcc dentro de la rsi? Es decir, tengo programas hechos que usan el rtcc y sólo cargo el registro del rtcc cuando lo inicializo, en el main, tal y como se hace en este programa. Después él solito funciona solo. ¿Hay veces que es necesario recargar el registro en la rtcc y otras que no? Lo digo por la frase de Lager: "para precision tendrias que usar otro cristal y NO inicializar el tmr en valores, es decir nunca hacerle recargas como sucede en este ejemplo y la recarga esta en el MAIN y en la rutina de interrupcion", que ha sido la que me ha hecho pensar en esto.

Saludos Giño

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Timer 0 ¿Como se utiliza?
« Respuesta #5 en: 24 de Abril de 2005, 14:38:00 »
Que onda .poe,
El comentario es basicamente, el  retraso sumatorio constante durante el seteo del tmr,(no e smucho pero suficiente para darle un porcentaje de error a tu temporizacion..) ademas esta el tema de la rutina de interrupcion misma, acuerdate que cada ves que entra  ala rutina de interrupcion se pierde determiando tiempo para guardar los registros y demas.. y luego antes de salir de ella, volver a setearlos..... si a esto le sumas ese pequeño porcentaje de error.. y lo multiplicas por el tiempo de operacion de tu remporizador... creeme que te espantaria el resultado.
El pana pocher a despejado muchas dudas al respecto, y de la CORRECTA utilizacion del timer al usar compiladores(en este caso CCS).. ya que en asm es mas sencillo llevar el control de tiempo en cada funcion.
Si tu EMPIEZAS el tmr en cero,  la temporizacin esta basada en 256 pasos,  si usas por ejejmplo 40 realmente esto te indica que (dependiendo de preescaler y demas) hay un decremento en el tiempo del desborde, el cual puede ser calculado con precision usando la formula.... ASI QUE si tu CARGAS al principio el TMR... esto tu no lo notas ya que APENAS esta empezando a contar, hay una perdida que no ves o que descartas por inicio de conteo que es la perdida ocurrida por escribir en el registro(tmr0) la cual esta estipulada en el DS de cada componentes que es de 2 ciclos de reolj(esto es mucho si es un xtal de 4 y es un porcentaje si es un xtal de 40mhz) como te comento, como APENAS esta arrancando el tiempo o CRONOMETRO.. aunque la perddida existe.. se descarta por inicio.. pero es inegable que posteriormente(en cada recarga del tmr ) que esta perdida va a empezar desviar la curva de temporizacion, produciendose un desfasamiento en tiempo, el cual se ira incrementando en razon del tiempo de operacion de este timer........por eso se recomienda NO INICIALIZAR o cargar el tmr... obtener el valor de temporizacion sin cargas en este, y para obtener tiempos "comunes"  sin necesidad de esta recarga se debe usar otro tipo de cristal,,, ..... ya que con este se obtienen valores en formula  de decimales(no valores cerrados)
Para procesos que no rquieren precision... donde entran procentajes de error normales +-1% o mas! esto se descarta .... pero si requieres precision, este par de comentarios son NECESARIOS.
Si tienes dudas o quieres mas informacion de Temporizaciones con precision, hay varios posts del pana Pocher que podrias buscar y leer, creeme que te sorprenderia ver cuanto tiempo se pierde en unos 5 minutos por ejemplo Sonrisa
SAlu2 pana Sonrisa