TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Enigma en 03 de Abril de 2008, 00:20:12

Título: Contar un seg....
Publicado por: Enigma en 03 de Abril de 2008, 00:20:12
Una pregunta muchachos, tengo un lapsus mental!!!! El máximo valor que puede contar el timer 0 cuanto es 0.2 us, corrijanme si estoy mal por favor!!!! ahora si quiero contar 1 segundo con este, como haria?... se hacerlo en ASM pero en C me volvi un ocho!! help me! :(

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Contar un seg....
Publicado por: migsantiago en 03 de Abril de 2008, 00:21:49
Enigma, depende del microcontrolador que estés usando. Hay unos que traen post y prescaler y depende de la velocidad del cristal.

Aquí una aplicación para calcular el valor de tiempo generado por el timer0, para PICs con Prescaler nadamás.

http://www.4shared.com/file/42847804/cf551413/PIC_TMR0.html
Título: Re: Contar un seg....
Publicado por: Enigma en 03 de Abril de 2008, 00:30:43
Ay perdón no dije el pic.... El pic es el 2550 y con un cristal de 20 MHZ!!!!!

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Contar un seg....
Publicado por: reiniertl en 03 de Abril de 2008, 01:01:46
Enigma, usa la fórmula o simplemente te vas al datasheet y allí seguro aparece. Para el timer1 hice una hoja de excel que está muy inteesante, podría pasártela, pero tengo que buscarla. Yo personalmente dejo el TIMER0 para el RTOS, y meto el resto de las temporizaciones con otros TIMERS.
Título: Re: Contar un seg....
Publicado por: pocher en 03 de Abril de 2008, 06:38:58
¡¡¡ En busca del segundo perfecto !!! ... que recuerdos cuando queria hacer un reloj con PIC.

Aquí tienes la información:  http://www.todopic.com.ar/foros/index.php?topic=18909.0 (http://www.todopic.com.ar/foros/index.php?topic=18909.0)

Un saludo
Título: Re: Contar un seg....
Publicado por: KALLITOS en 03 de Abril de 2008, 10:21:07
Estos tiempos es basico conocer el funcionamiento de nuestros pic y sus modulos entre los que estan los timers, pero con esto del avanze tecnológico las cosas se nos hacen mas faciles y sencillas; el amigo RED PIC, en su afan de facilitarnos las cosas nos deja a libre uso su Pic Timer Calculator (http://picmania.garcia-cuervo.com/Recursos.php), una herramienta muy util y sencilla de usar que la pueden descargar libremente desde su pagina, en la parte inferior denominada utilidades.

Que sea de su entero agrado, gracias RedPic
Título: Re: Contar un seg....
Publicado por: El_Guitre en 03 de Abril de 2008, 12:38:47
Justo en estos dias tambien necesito generar un segundo, pero con un 16F628 y un cristal de 4MHz
Título: Re: Contar un seg....
Publicado por: migsantiago en 03 de Abril de 2008, 13:00:54
Estos tiempos es basico conocer el funcionamiento de nuestros pic y sus modulos entre los que estan los timers, pero con esto del avanze tecnológico las cosas se nos hacen mas faciles y sencillas; el amigo RED PIC, en su afan de facilitarnos las cosas nos deja a libre uso su Pic Timer Calculator (http://picmania.garcia-cuervo.com/Recursos.php), una herramienta muy util y sencilla de usar que la pueden descargar libremente desde su pagina, en la parte inferior denominada utilidades.

Que sea de su entero agrado, gracias RedPic

Es parecida a la primera aplicación que puse pero trabaja con timer0 de 16 bits también. Una mejora que puede hacerle Redpic a su programa es ponerle el postscaler  :mrgreen:
Título: Re: Contar un seg....
Publicado por: manex_1987 en 04 de Abril de 2008, 20:37:54
Si queremos contar un segundo y aun poniendo el prescaler y el postscaler mas alto no nos da, hacemos lo siguiente:

- Cuando entremos en la interrupcion por overflow del timer, incrementamos una variable.
- Cuando esa variable sea igual a X, hacemos Flag=1 y X=0.
- En el programa principal, esperamos a que Flag=1, y cuando asi sea, ponemos Flag=0 (importante) , y hacemos lo que nos parezca.

Como calcular X?

Si el timer tarda un tiempo T_timer (con el prescaler y el postscaler incluidos claro),  X sera   tiempo_en_seg_deseado / T_timer .

Título: Re: Contar un seg....
Publicado por: KALLITOS en 05 de Abril de 2008, 01:09:50
Segun el Datasheet, el timer0 del PIC 18F2525 puede configurarse a 8 o 16 bits entonces con un Timer de 16 bits, osc 20 Mhz, prescaler de 128 y el tmr0 cargado a 26473 da un desborde cada 1000.012 ms creo que es el valor mas cercano al segundo.

Creo que servira de ayuda. :)
Título: Re: Contar un seg....
Publicado por: PalitroqueZ en 05 de Abril de 2008, 14:32:42
también está este programilla

PicMultiCalc (http://www.mister-e.org/pages/homepag.html)

trae una ventana para configurar los timer

(http://img174.imageshack.us/img174/1541/programillaks3.jpg)




Título: Re: Contar un seg....
Publicado por: Cryn en 06 de Abril de 2008, 00:15:05
muhcas formas, recientemente hice esto (http://www.todopic.com.ar/foros/index.php?topic=21209.0), lamentablemente es para un 16f88 a 8MHz, pero te puede servir como base, y que no se te olvide descargar el programa de Redpic para observar los valores de preescaler, precarga, etc, es muy bueno

pd. fijate en el código ahí se puede entender creo, para despues pasar a 20MHz, sino avisanos que te damos la mano :mrgreen:
Título: Re: Contar un seg....
Publicado por: Enigma en 14 de Abril de 2008, 14:21:24
Gracias por sus respuestas chicos!!!!  pero les digo algo? no se, si es que soy lenta, tarada o no se que :( Pero he descargado los programitas esos, que calculan el tiempo del timer  como el que hzo redpic, el timer pic calculator.... Aja, adivinen que? no se usar esa broma!!!! :( a ver no entiendo.... el me va a dar el máximo tiempo en que se desborda el timer no?, más no me va a decir, mira: si quieres temporizar un seg has esto!!! o si??? :shock:

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: Contar un seg....
Publicado por: migsantiago en 14 de Abril de 2008, 18:05:03
Mmmhh

En este mensaje hice un programa para pic16f84a que genera un retardo de 1 segundo usando el timer0...

http://www.todopic.com.ar/foros/index.php?topic=1124.msg9345#msg9345
Título: Re: Contar un seg....
Publicado por: Cryn en 14 de Abril de 2008, 23:09:01
aquí esta el mio :mrgreen:

http://www.todopic.com.ar/foros/index.php?topic=17304.0
Título: Re: Contar un seg....
Publicado por: pocher en 16 de Abril de 2008, 06:49:34
Y el mio, que estaba más arriba, pero que se le ha debido de pasar a Enigma:

No se emplean decimales para la temporización del TMR0, ya que lo hago girar una vuelta completa, sin precargarlo y al no haber precarga no se pierde tiempo en la instrucción de precarga (no hay set_timer0()).

Tampoco entra en la interrupción con lo que tampoco se pierde tiempo.

Para esta técnica es necesario usar un cristal de 3,2768MHz ó otro cualquiera de forma que no aparezcan decimales en el cálculo de la temporización y que aunque el cálculo de la temporización sea exacto no haya que precargar al TMR0 (el de 4MHz no sirve), es decir que la precarga sea de 0.

Como alguién habrá deducido esta es la técnica para programar un reloj con un PIC que funcione bien, sin retrasos ni adelantos.

Este es el programa:

Código:

#include <16f876.h>

#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use fast_io(B) 
#use delay(clock=3276800)       //Para conseguir 1s sin precargar (retrasos) al TMR0
#include <lcd.c>
#include <math.h>

#bit T0IF=0x0B.2

#define radios 4                                             //Encoder de 4 radios

main()
{
   float n;
   int16 pulsos;
   int8 cuenta_interrupciones;
   int16 velocidad_s,velocidad_m;
   
   lcd_init();
   lcd_putc('\f');   
   
   set_tris_c(0x01);                              //Entrada de pulsos por RC0
   
   setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_128);
   // El TMR0 se desbordará cada: Temp=(256-0)·(4·128)/3,2768=40ms (40ms · 25 = 1s)
   setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1);
   
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RTCC);
   
   cuenta_interrupciones=0;
   set_timer1(0);             
   set_timer0(0);
   T0IF=0;
   
   while(1)
   {
      if(T0IF)
      {
         T0IF=0;
         cuenta_interrupciones++;
         if(cuenta_interrupciones==25)          //  40ms · 25 = 1s
         {   
            pulsos=get_timer1();           
           
            n=pulsos/radios;
           
            velocidad_s=floor(n+(n-floor(n)));   //Redondea n, por si recibe algún pulso
                                                //de más ó de menos
            velocidad_m=velocidad_s*60;
     
            lcd_putc('\f');                        //Borra display
            lcd_gotoxy(1,1);             
            printf(lcd_putc,"%lu rev/s %uradios",velocidad_s,radios);      //rev/s
            lcd_gotoxy(1,2);       
            printf(lcd_putc,"%lu r.p.m.",velocidad_m);                     //r.p.m.           
   
            cuenta_interrupciones=0;
            set_timer1(0);             
            set_timer0(0);   
         }
      }
   }
}

 
La técnica es no utilizar rutina de interrupción para que no se pierda tiempo.

Un saludo
Título: Re: Contar un seg....
Publicado por: PalitroqueZ en 16 de Abril de 2008, 12:13:39
Enigma, si estas usando un 18F2550, recuerda que la frecuencia del timer que éste usa NO es la del cristal, es la que entra al cpu del micro (después de la etapa del bloque oscilador)






Título: Re: Contar un seg....
Publicado por: Cryn en 02 de Mayo de 2008, 00:53:05
y si en la rutina de interrupcion solamente incremento un contador y seteo el temporizador y despues en el main hago que ese conteo cambie, claro, talvez sea en algo que no haya mucho q hacer en el main solo contar, o bueno, que dicen? ya qeu la interrupcion no haria anda mas, y ya el timer va contando lo que se hace fuera de la interrupcion
Título: Re: Contar un seg....
Publicado por: firepic en 03 de Mayo de 2008, 00:55:37
Saludos!  :-/

Bueno en cuanto a la pregunta del máximo valor que puede contar el timer0:

- Si es de 8 bits: por ahí 255
- La máxima pre-escala es de 256
- El oscilador es de 20MHz, pero como la frecuencia que toma en cuenta el temporizador es Fosc/4 (tal como dice PalitroqueZ), hay que multiplicar por 4 también.
Entonces la cuenta sería:
  Tiempo maximo = 255*256*4*20e6^-1 = 0.013056
  Tiempo maximo = 13.056ms

No obstante, para el pic que usas también hay configuración a 16 bits, por lo cual el cálculo sería:

  Tiempo maximo = (2^16-1)*256*4*20e6^-1
  Tiempo maximo = 3.3554s

Por eso la observación que hace kallitos me parece genial!  :mrgreen:
Me gusta también el método de Porcher, lo único es que el cristal no es de 20 MHz...
Ok nos leemos!  :-)

Título: Re: Contar un seg....
Publicado por: pocher en 03 de Mayo de 2008, 16:07:21
Si el segundo lo quereis como base de tiempos para diseñar un reloj, no sirven los métodos que usan interrupción, si lo haceis así vuestro reloj atrasará je, je.
Título: Re: Contar un seg....
Publicado por: firepic en 03 de Mayo de 2008, 16:28:59
El maestro porcher como siempre... tiene toda la razón!!  :mrgreen:
Título: Re: Contar un seg....
Publicado por: Cryn en 04 de Mayo de 2008, 17:32:27
creo q se me olvido mencionar algo :mrgreen:

y si utilizamos el timer1 con cristal de 32.768KHz cons osc externo y a la vez osc de 20MHz para codigo de programa

entonces una parte del codigo quedaria asi:

#int_tmr1
void isr_tmr1(void)
{
   seg++;
   set_timer1(32767);
}

void main()
{
   setup_timer_1(T1_EXTERNAL|T1_CLK_OUT|T1_DIV_BY_1);
   enable_interrupts(int_TIMER1);
   enable_interrupts(global);
   while(true)
   {
      funcion();//encargada de contar seg hasta 60 e incrementar minutos, horas, dias, meses y años
   }
}

que te parece eso, tb lleva mucha demora, o es algo aceptable??
Título: Re: Contar un seg....
Publicado por: pocher en 05 de Mayo de 2008, 02:26:57
No estaría bien, atrasaría.

El problema viene no de si utilizas un oscilador interno o externo, si no del propio C.

Al hacer un set_timer1(32767) se pierde tiempo en la ejecución de las instrucciones en ensamblador ---> el reloj atrasaría

Al entrar dentro de una rutina de interrupción se pierde tiempo ---> el reloj atrasaría

El problema a simple vista no lo verás, pero si dejas al reloj funcionando varios días verás como cada vez va atrasando más.