Autor Tema: Problema con TIMER1  (Leído 2453 veces)

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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Problema con TIMER1
« en: 14 de Julio de 2004, 12:56:00 »
Si teneis un rato, probar este programa en PROTEUS, a ver si os pasa lo mismo que a mí.

Sucede que si en el    while(get_timer1()<65517); pongo un número mayor que 65517 no va bien y no se genera la onda cuadrada.

¿Será culpa del PROTEUS? ... no lo sé

Lo ideal sería probarlo con un osciloscopio real.

Codigo:
#include <16F876.h>

#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT

#use delay (clock=4000000)

#use fast_io(A)
#use fast_io(B)

main()
{
   set_tris_b(0x00);

   setup_timer_1(t1_internal | t1_div_by_1);   

     while (1)                    
     {               
      output_bit(pin_b2,1);
      set_timer1(0);               
      while(get_timer1()<65517);
         
      output_bit(pin_b2,0);
      set_timer1(0);         
      while(get_timer1()<65517);                                 
   }         
}  


Un saludo

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: Problema con TIMER1
« Respuesta #1 en: 15 de Julio de 2004, 13:13:00 »
Pocher, el programa fué montado en circuito y probado con un osciloscopio real pero, desafortunadamenta no se observa onda cuadrada despues de ajustar con un numero mayor a 65517, de ser inferior si se puede obervar sin problema alguno.
Despues de analizar y simular un poco llegué a la conclusión de que no es culpa del proteus. Fijate que al simular en MPLAB-IDE Version 6.60,  y observar el registro TMR1 con un numero inferior o igual a  65517 se puede observar que el programa sigue su curso al siguiente while cuando el TMR1 llega a ese valor, pero cuando se incrementa a 65520 (por ejemplo) el programa siempre se queda en el primer while. Para mi es problema del CCS probablemente del código que genera al equivalente en asm.

Saludos

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Problema con TIMER1
« Respuesta #2 en: 15 de Julio de 2004, 23:58:00 »
Muchas gracias gfp por tu prueba física real.

Vaya, no me lo esperaba, pensaba que sería culpa del PROTEUS.

Personalmente es la primera vez que me encuentro un error del compilador.

Alguién más quiere opinar al respecto?

Un saludo

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Problema con TIMER1
« Respuesta #3 en: 16 de Julio de 2004, 11:06:00 »
Seguramente el Timer al desbordarse empieza la cuenta desde cero otra vez .
Con los ciclos que pierdes en el While se le escapa esta lectura del < ya que 65517 está muy cerca de 65535 .

Posible solucion .

Codigo:

       output_bit(pin_b2,0);
       set_timer1(0);   
       Borrar TMR1IF      
       while(get_timer1()<65517) & ( no TMR1IF );   



Si este es el problema "calcula la precision que obtienes"

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: Problema con TIMER1
« Respuesta #4 en: 16 de Julio de 2004, 12:25:00 »
Hola, POCHER, la funcion get_timer (), creo que no tuvo en cuenta lo que comenta SISPIC, me paso que el tiempo no era lo seteado con esto la solucion  fue esta, calro debes declarar el bit tmr1if no esta en el include.

void retardo (){                         tmr1if=0;
       set_timer1 (65535-50000);
       while (!tmr1if);
      }

con esto cuenta a 4 mhz 50 ms

saludos

Ariel
saludos
PikMan

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Problema con TIMER1
« Respuesta #5 en: 16 de Julio de 2004, 13:44:00 »
Lo probaré con el bit de desbordamiento, de todas formas y ójala me equivoque me dá mala espina.

Siguiendo con el TIMER1, otra construcción que támpoco funciona bien:

Codigo:
#include <16F876.h>

#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT

#use delay (clock=4000000)

#use fast_io(A)
#use fast_io(B)

main()
{
   set_tris_b(0x00);

   setup_timer_1(t1_internal | t1_div_by_1);   

     while (1)                    
     {               
      output_high(pin_b2);
      set_timer1(0);            
      while(get_timer1()!=6500);   //Esta construcción no va con ningún número
         
      output_low(pin_b2);      
      set_timer1(0);         
      while(get_timer1()!=6500);                                 
   }         
}  



Vamos que se desea detectar la llegada del TMR1 a un número y no lo detecta ¿porqué? ... debe ser por lo que comenta Sispic!

Quizá poniendo un intervalo de números, le dé tiempo a coger algún número del intervalo ... pero a mí lo que me interesa es que detecte un número concreto !!

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Problema con TIMER1
« Respuesta #6 en: 16 de Julio de 2004, 14:39:00 »
setup_timer_1(t1_internal | t1_div_by_1);

Esto quiere decir que va a tope , incrementa 1 por cada ciclo de reloj (no ?).
segun mis calculos en while tarda unos 17..20 ciclos en cada comprovación .


Alguno tiene que pillar en tu ultimo codigo , ves provando con valores de 15 a 25 haver por curiosidad.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Problema con TIMER1
« Respuesta #7 en: 16 de Julio de 2004, 23:06:00 »
Ya he dado con la solución para que me detecte un determinado número entre 0 y 65535 y es ¡¡¡ usando el módulo de comparación !!!

Bueno pués ya sabeis, cuidado con construcciones tipo while(get_timer1()<numero) [Idem con >, ==, !=)] que dan problemas.

Un saludo

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Problema con TIMER1
« Respuesta #8 en: 17 de Julio de 2004, 00:11:00 »
Ok...  Aunque el sistema de pikman es mas preciso ya que  pierde muchos menos ciclos en comparar un bit que un word en el while .


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Problema con TIMER1
« Respuesta #9 en: 17 de Julio de 2004, 05:09:00 »
Yo lo que quería era detectar de forma directa, cuando el TMR1 llegaba a un determinado número, sin necesidad de hacer el complemento a 1 y usar entonces el bit de desbordamiento, que por cierto no lo he probado pero debe de funcionar perfectamente.

Un saludo

Desconectado dj_ircnick

  • PIC10
  • *
  • Mensajes: 3
RE: Problema con TIMER1
« Respuesta #10 en: 26 de Septiembre de 2004, 15:38:00 »
Una pregunta esto que se esta discutiendo o debatiendo es para hacer un timer como los que comandan las luces de los edificios, tipo prendiendola a cierta hora y apagandola a tal hora.
Si no es asi, disculpen y agradeceria me pasaran un link para armar alguno, no tengo ni idea de pics pero si es cuestion de aprender estoy dispuesto.