Autor Tema: timer 1 con pic16f876 no me funciona.  (Leído 4753 veces)

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

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
timer 1 con pic16f876 no me funciona.
« en: 21 de Julio de 2010, 08:32:12 »
hola, tengo este programita para usar el t1, pero, aunque lo pongo en marcha (TMR1ON=1;), nunca llega a generarse ni la primera interrupcion del t1. (lo se porque no se enciende el led en rb1), ¿veis algo mal??


#include <pic1687x.h>

#define valor_t1_h 0x85   //    4.000.000(fosc)/4*8(prescaler)=125.000Hz ************ 1/125.000 s ->125.000 incrementos para obtener 1s ******* 16bits sólo dan para 65.536 incrementos ***** hacemos 4 incrementos de 31.250 osea que recargamos con 65.536-31.250=85ee
#define valor_t1_l 0xee

void interrupcion_t1()
{RB1=1;
TMR1L=valor_t1_l;TMR1H=valor_t1_h;  //recargar t1
}   

static void interrupt ISR ()
{if(TMR1IF==1)
   {interrupcion_t1();
   TMR1IF = 0;
   }
}

void main()
{ TRISB1=0;

GIE=1;          //habilitar int general
TMR1IE=1;         //habilitar int t1
TMR1CS=0;     //Timer1 en modo Timer, incrementa con oscilador interno (fosc/4)
T1CKPS1=1;      //prescaler a 1/8
T1CKPS0=1;
TMR1H=valor_t1_h;
TMR1L=valor_t1_l;//cargar t1
T1OSCEN=1;     //activar t1 oscilador
TMR1ON=1;    //para echar a andar el t1

while(1);
}

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #1 en: 21 de Julio de 2010, 09:52:04 »
Hola amigo, prueba con esto

saludos.
Código: [Seleccionar]
#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use standard_io(b)

short ban_05seg=0;

///////////////////////////////////////
#int_timer1         //Interrupción Timer1
void temp1s(void)   //Función
{
   delay_cycles(2);
   set_timer1(3041); //62.500 * 8 (prescaler) = 0,5 seg
   ban_05seg = 1;  //bandera que se activa cada 0,5 seg
}
///////////////////////////////////////
void main ()
{
setup_timer_1 (t1_internal | t1_div_by_8);
set_timer1 (3041);                          //recarga del tmr1
enable_interrupts(int_timer1);             //habilita interrupcion timer1
enable_interrupts(global);                //habilita interrupción general
  output_b(0);
 
while(true)
{   
    if(ban_05seg)
    {    
    }
}
}
///////////////////////////////////////

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #2 en: 21 de Julio de 2010, 12:41:29 »
Hola black_flowers, te falta habilitar las interrupciones de los periféricos

Código: C
  1. PEIE = 1;

Además tenés que eliminar la línea

Código: C
  1. T1OSCEN=1;     //activar t1 oscilador

Porque eso activa un oscilador para uso exclusivo del timer1 y es conectando un cristal de hasta 200KHz entre los pines T1OSO y T1OSI
« Última modificación: 21 de Julio de 2010, 12:48:56 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #3 en: 22 de Julio de 2010, 06:50:06 »
Hola amigo, prueba con esto

saludos.
Código: [Seleccionar]
#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use standard_io(b)

short ban_05seg=0;

///////////////////////////////////////
#int_timer1         //Interrupción Timer1
void temp1s(void)   //Función
{
   delay_cycles(2);
   set_timer1(3041); //62.500 * 8 (prescaler) = 0,5 seg
   ban_05seg = 1;  //bandera que se activa cada 0,5 seg
}
///////////////////////////////////////
void main ()
{
setup_timer_1 (t1_internal | t1_div_by_8);
set_timer1 (3041);                          //recarga del tmr1
enable_interrupts(int_timer1);             //habilita interrupcion timer1
enable_interrupts(global);                //habilita interrupción general
  output_b(0);
 
while(true)
{   
    if(ban_05seg)
    {    
    }
}
}
///////////////////////////////////////


estoy utilizandon hitech.

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #4 en: 22 de Julio de 2010, 06:53:49 »
Hola black_flowers, te falta habilitar las interrupciones de los periféricos

Código: C
  1. PEIE = 1;

Además tenés que eliminar la línea

Código: C
  1. T1OSCEN=1;     //activar t1 oscilador

Porque eso activa un oscilador para uso exclusivo del timer1 y es conectando un cristal de hasta 200KHz entre los pines T1OSO y T1OSI

probe lo que tu me dices pero sigue sin funcionar, en otra aplicación que tengo (con la configuración que puse al principio) me funcionaba perfectamente la única diferencia era que en lugar de activarlo en el main (TMR1ON=1;) lo activaba cuando saltaba la interrupcion del cad.

el codigo que tengo ahora es este (con las modificaciones que tu me dijiste) y sigue sin funcionar.

#include <pic1687x.h>

#define valor_t1_h 0x85   //    4.000.000(fosc)/4*8(prescaler)=125.000Hz ************ 1/125.000 s ->125.000 incrementos para obtener 1s ******* 16bits sólo dan para 65.536 incrementos ***** hacemos 4 incrementos de 31.250 osea que recargamos con 65.536-31.250=85ee
#define valor_t1_l 0xee

void interrupcion_t1()
{RB1=1;
TMR1L=valor_t1_l;TMR1H=valor_t1_h;  //recargar t1
}   

static void interrupt ISR ()
{if(TMR1IF==1)
   {interrupcion_t1();
   TMR1IF = 0;
   }
}

void main()
{ TRISB1=0;

GIE=1;          //habilitar int general
PEIE=1;          //habilitar interrupciones perifericos
TMR1IE=1;         //habilitar int t1
TMR1CS=0;     //Timer1 en modo Timer, incrementa con oscilador interno (fosc/4)
T1CKPS1=1;      //prescaler a 1/8
T1CKPS0=1;
TMR1H=valor_t1_h;
TMR1L=valor_t1_l;//cargar t1
//T1OSCEN=1;     //activar t1 oscilador
TMR1ON=1;    //para echar a andar el t1

while(1);
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #5 en: 22 de Julio de 2010, 09:50:15 »
Yo simule el siguiente código en Proteus y funciona bien

Código: C
  1. #include <htc.h>
  2.  
  3. void interrupt ISR()
  4. {
  5.   //GIE = 0;
  6.   if (TMR1IF == 1)
  7.   {
  8.     TMR1ON = 0;
  9.     RB1 ^= 1;
  10.     TMR1L = 0xEE;
  11.     TMR1H = 0x85;
  12.     TMR1IF = 0;
  13.     TMR1ON = 1;
  14.   }
  15. }
  16.  
  17. void main (void)
  18. {
  19.   TRISB1 = 0;
  20.   RB1 = 0;
  21.   PEIE = 1;
  22.   GIE = 1;          //habilitar int general
  23.   TMR1IE = 1;         //habilitar int t1
  24.   TMR1CS = 0;     //Timer1 en modo Timer, incrementa con oscilador interno (fosc/4)
  25.   T1CKPS1 = 1;      //prescaler a 1/8
  26.   T1CKPS0 = 1;
  27.   TMR1H = 0x85;
  28.   TMR1L = 0xEE;//cargar t1
  29. //  T1OSCEN = 1;     //activar t1 oscilador
  30.   TMR1IF = 0;
  31.   TMR1ON = 1;    //para echar a andar el t1
  32.   while(1);
  33. }

Fijate que hasta se nota que fue copipasteado de tu primer mensaje. Sólo hice unas mínimas modificaciones.

Dentro de la rutina de interrupción, apago al inicio y enciendo al final el timer1 (no sé si será necesario, no lo probé sin ello). Y otra modificación es que al pin RB1 le hago una orexclusiva con 1 así el pin cambia de estado cada vez que se entra en la rutina de interrupción
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #6 en: 22 de Julio de 2010, 10:33:59 »
Yo simule el siguiente código en Proteus y funciona bien

Código: C
  1. #include <htc.h>
  2.  
  3. void interrupt ISR()
  4. {
  5.   //GIE = 0;
  6.   if (TMR1IF == 1)
  7.   {
  8.     TMR1ON = 0;
  9.     RB1 ^= 1;
  10.     TMR1L = 0xEE;
  11.     TMR1H = 0x85;
  12.     TMR1IF = 0;
  13.     TMR1ON = 1;
  14.   }
  15. }
  16.  
  17. void main (void)
  18. {
  19.   TRISB1 = 0;
  20.   RB1 = 0;
  21.   PEIE = 1;
  22.   GIE = 1;          //habilitar int general
  23.   TMR1IE = 1;         //habilitar int t1
  24.   TMR1CS = 0;     //Timer1 en modo Timer, incrementa con oscilador interno (fosc/4)
  25.   T1CKPS1 = 1;      //prescaler a 1/8
  26.   T1CKPS0 = 1;
  27.   TMR1H = 0x85;
  28.   TMR1L = 0xEE;//cargar t1
  29. //  T1OSCEN = 1;     //activar t1 oscilador
  30.   TMR1IF = 0;
  31.   TMR1ON = 1;    //para echar a andar el t1
  32.   while(1);
  33. }

Fijate que hasta se nota que fue copipasteado de tu primer mensaje. Sólo hice unas mínimas modificaciones.

Dentro de la rutina de interrupción, apago al inicio y enciendo al final el timer1 (no sé si será necesario, no lo probé sin ello). Y otra modificación es que al pin RB1 le hago una orexclusiva con 1 así el pin cambia de estado cada vez que se entra en la rutina de interrupción

yo dejé de utilizar el proteus cuando ví que había cosas que me funcionaban en proteus y no me funcionaban en el montaje del cirucuito. simula bien, es fiable pero no al 100%.
y sigo sin saber por qué no me funciona, ya que en otro proyecto sí me funciona, la diferencia es que en el otro lanzo el t1 en la rutina de interrupcion del cad.

Lo he probado con varios pics (siempre el mismo modelo) y nada.
He probado a crear un nuevo proyecto y añadir el codigo de nuevo y tampoco.
No se en donde está el problema.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #7 en: 22 de Julio de 2010, 17:47:24 »
Una pregunta ingenua, ¿El PIC está funcionando? Digo.... ¿encendés algún led de otra manera como para saber que el PIC inició bien?

Y sí, entiendo lo que decís respecto del Proteus
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #8 en: 23 de Julio de 2010, 05:13:47 »
Una pregunta ingenua, ¿El PIC está funcionando? Digo.... ¿encendés algún led de otra manera como para saber que el PIC inició bien?

Y sí, entiendo lo que decís respecto del Proteus

sí, por supuesto, es lo primero que he comprobadol dado que es muy raro que no me funcione el timer ahora que está el programa limpio, y sí me funcione con la misma configuración si lo lanzo en la interrupción del cad. Parece que tiene que haber algún error ingenuo por el medio, pero como siempre son los más difíciles de detectar. O a lo mejor no, igual hay un error clamoroso, no consigo resolverlo por más vueltas que le doy. Hasta me estoy planteando que sea un error del compilador.

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #9 en: 23 de Julio de 2010, 14:36:08 »
es increíble, era un error del mplab. Hice un step into y me estaba saltando a la rutina de atención a interrupción de otro proyecto. La borré y la reescribí  (sólo hice cortar pegar) y se solucionó. El otro proyecto (al cual saltaba) es el proyecto del cual partía éste. Lo que hice fue grabar con otro nombre y en otra carpeta el proyecto y parece ser que saltaba entre las dos rutinas de atención a interrupción. Muy extraño la verdad, son el tipo de errores que odio ya que parece más culpa del mplab que otra cosa.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #10 en: 23 de Julio de 2010, 16:23:56 »
¡Qué loco!

Se me había ocurrido probar el código en un 16F876A que tengo y lo iba a hacer mañana y comentarte los resultados pero viendo que se solucionó, me quedo más tranquilo
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #11 en: 24 de Julio de 2010, 05:07:11 »
¡Qué loco!

Se me había ocurrido probar el código en un 16F876A que tengo y lo iba a hacer mañana y comentarte los resultados pero viendo que se solucionó, me quedo más tranquilo

pues, gracias por tu ayuda, saludos. ;-)

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #12 en: 18 de Agosto de 2011, 12:32:43 »
Estoy simulando algo parecido con un PIC16F886, y no me funciona. He copiado y pegado como dice black_flowers por si era el mismo problema, pues el programa es origen de otro, pero no funciona.

Dejo el código por si me podeis echar una mano.

Saludos.

PD: Lo estoy simulando en Proteus 7.7
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #13 en: 18 de Agosto de 2011, 14:27:11 »
  Hola micro_pepe, simulándolo en el proteus 7.8 sp2 (utilizando un breakpoint dentro de la interrupción, justo cuando testeas el flag del timer1) veo que entra cada 8.0155ms.

  Si es que no vez el el cambio en el pin (en modo play de simulación) seguramente es debido que estás manejando una frecuencia muy alta. Probá de cambiar los tiempos del timer, para que tarde mas en cambiar.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: timer 1 con pic16f876 no me funciona.
« Respuesta #14 en: 19 de Agosto de 2011, 09:26:19 »
  Hola micro_pepe, simulándolo en el proteus 7.8 sp2 (utilizando un breakpoint dentro de la interrupción, justo cuando testeas el flag del timer1) veo que entra cada 8.0155ms.

  Si es que no vez el el cambio en el pin (en modo play de simulación) seguramente es debido que estás manejando una frecuencia muy alta. Probá de cambiar los tiempos del timer, para que tarde mas en cambiar.

Pues lo he probado en real y con tiempos mayores y nada  :( no sé que puede estar pasando.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


 

anything