Autor Tema: duda sobre uso timer1  (Leído 4860 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado ferna108

  • PIC10
  • *
  • Mensajes: 12
duda sobre uso timer1
« en: 13 de Diciembre de 2009, 16:54:24 »
hola amigos estoy probando el timer1 (interrupcion) y funciona a medias, es decir temporiza pero a los 4 segundos no apaga el led, es decir no entra nunca en la interrupcion aqui os dejo el codigo  ver si veis donde esta el fallo.

#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use standard_io(b)

int cont=0;

#INT_TIMER1         //Interrupción Timer1
void interrupcion()
{
  if (cont==8) //Cada 8 interrupciones de 4 segundos
  {
  output_low (PIN_B1);
  set_timer1 (3036); //recarga del TMR1
  }
  else
  set_timer1 (3036);
}

void main ()
{

 output_high (PIN_B1);
 setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
 set_timer1 (3036);                          //recarga del TMR1 16 bit (256*256)= 65535 microsegundos
                                            //4mhz * preescaler 8 * (65535-3036)=500000 microsegundos, 0,5 segundos
 enable_interrupts(INT_TIMER1);             //habilita interrupcion timer1
 enable_interrupts(global);                  //habilita interrupción general
 cont++;
 
 while(1);
}

un cordial saludo

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: duda sobre uso timer1
« Respuesta #1 en: 13 de Diciembre de 2009, 17:06:38 »
prueba asi:
Código: C
  1. #include <16f876.h>
  2. #fuses XT,NOWDT
  3. #use delay(clock=4000000)
  4. #use standard_io(b)
  5.  
  6. int cont=0;
  7.  
  8. #INT_TIMER1         //Interrupción Timer1
  9. void interrupcion()
  10. {
  11.   cont++;
  12.   if (cont==8) //Cada 8 interrupciones de 4 segundos
  13.   {
  14.   cont=0;
  15.   output_low (PIN_B1);
  16.   }
  17. set_timer1(3036)  ;
  18. }
  19.  
  20. void main ()
  21. {
  22.  
  23.  output_high (PIN_B1);
  24.  setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
  25.  set_timer1 (3036);                          //recarga del TMR1 16 bit (256*256)= 65535 microsegundos
  26.                                             //4mhz * preescaler 8 * (65535-3036)=500000 microsegundos, 0,5 segundos
  27.  enable_interrupts(INT_TIMER1);             //habilita interrupcion timer1
  28.  enable_interrupts(global);                  //habilita interrupción general
  29.  
  30.  
  31.  while(1)
  32.   {
  33.   }
  34. }
« Última modificación: 13 de Diciembre de 2009, 17:11:01 por jhozate »
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado ferna108

  • PIC10
  • *
  • Mensajes: 12
Re: duda sobre uso timer1
« Respuesta #2 en: 13 de Diciembre de 2009, 17:22:24 »
Gracias GeSHi funciono y de la siguiente forma tambien, pero ahora se queda parado (o sea el led apagado)

#INT_TIMER1         //Interrupción Timer1
void interrupcion()
{
 
  if (cont==8) //Cada 8 interrupciones de 4 segundos
  {
  output_low (PIN_B1);
  set_timer1 (3036); //recarga del TMR1
  cont=0;
  }
  else
  {
  set_timer1 (3036); //recarga del TMR1
  cont++;
  }
}
no deberia borrar cont y seguir hasta que la interrupcion se haga otra vez 8 veces, es decir a los 8 segundos y asi sucesivamente.
un saludo

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: duda sobre uso timer1
« Respuesta #3 en: 13 de Diciembre de 2009, 17:26:24 »
 :D  si lo quieres poner a parpadear has esto en la interrupcion

Código: C
  1. #INT_TIMER1         //Interrupción Timer1
  2. void interrupcion()
  3. {
  4. cont++;
  5.   if (cont==8) //Cada 8 interrupciones de 4 segundos
  6.   {
  7.    cont=0;
  8.   output_toggle (PIN_B1);
  9.   }
  10.   set_timer1 (3036);
  11. }
cuando se cuentan las ocho veces hay q poner cont a cero por seguira incrementandose y no volvera a entrar a los 4 segundos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado ferna108

  • PIC10
  • *
  • Mensajes: 12
Re: duda sobre uso timer1
« Respuesta #4 en: 13 de Diciembre de 2009, 17:41:11 »
Amigo jhozate  fijate que en el programa principal, cuando regresa de la interrupcion vuelvo a encender el led
void main ()
{

 output_high (PIN_B1); setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
 set_timer1 (3036);                          //recarga del TMR1 16 bit (256*256)= 65535 microsegundos
                                            //4mhz * preescaler 8 * (65535-3036)=500000 microsegundos, 0,5 segundos
 enable_interrupts(INT_TIMER1);             //habilita interrupcion timer1
 enable_interrupts(global);                  //habilita interrupción general
 
 
 while(1);

y aqui ya borro cont;
void interrupcion()
{
 
  if (cont==8) //Cada 8 interrupciones de 4 segundos
  {
  cont=0;  
output_low (PIN_B1);
  set_timer1 (3036); //recarga del TMR1
 
  }
  else
  {
  set_timer1 (3036); //recarga del TMR1
  cont++;
  }
}

o sea por lo que yo entiendo deberia encenderse y apagarse el led a los 4,8,12,16, etc segundos

un saludo

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: duda sobre uso timer1
« Respuesta #5 en: 13 de Diciembre de 2009, 17:56:26 »
no porque fijate que al empezar prendes el led y luego dejas al micro un while(1); entonces el se queda ahi hasta que ocurre la interrupcion, cuando ocurre la interrupcion lo apagas pero el vuelve al while(1) y se queda eternamente
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado ferna108

  • PIC10
  • *
  • Mensajes: 12
Re: duda sobre uso timer1
« Respuesta #6 en: 13 de Diciembre de 2009, 18:19:30 »
Amigo jhozate  perdoname pero no entiendo, este programa lo estoy simulando en proteus.
y hace esto cuando le doy a run empieza temporizar (lo veo en counter timer) se enciende el led y cuando llega 4 segundos el led se apaga
el tiempo se queda parado como si no saliera nunca de la interrupcion.
yo tengo entendido:
se produce interrupcion el micro la atiende, apaga el led, cont =0 y carga el timer1.
se acaba la interrupcion vuelve al programa principal while(1) no deberia entonces encender el led o es que a condicion es falsa ya que
output_high (PIN_B1); y como esta low no entra mas en ese bucle.
porque si entra deberia encender el led

un cordial saludo

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: duda sobre uso timer1
« Respuesta #7 en: 13 de Diciembre de 2009, 18:33:09 »
si, es que mira, a la primera vez funciona bien, pero lo que pasa es que cuando dejas al pic en
Código: [Seleccionar]
while(1); se queda clavado en ese ciclo infinito, cuando vuelve de la interrupcion nuevamente queda en esa linea osea, el pic ya no vuelve a ver el output_high y por eso no se enciende el led nuevamente.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado ferna108

  • PIC10
  • *
  • Mensajes: 12
Re: duda sobre uso timer1
« Respuesta #8 en: 13 de Diciembre de 2009, 18:47:31 »
Gracias amigos ya busque una forma y se soluciono
#INT_TIMER1         //Interrupción Timer1
void interrupcion()
{
 
  if (cont==8) //Cada 8 interrupciones de 4 segundos
  {
  cont=0;
  set_timer1 (3036); //recarga del TMR1
  output_low (PIN_B1);
  }
  else
  {
  set_timer1 (3036); //recarga del TMR1
  output_high (PIN_B1); poniendo esta instruccion aqui ahora apaga y enciende y sigue temporizando 4, 8, 12, 16, etc segundos
  cont++;                                      entra y sale bien de la interrupcion
  }
}

void main ()
{
   

 setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
 set_timer1 (3036);                          //recarga del TMR1 16 bit (256*256)= 65535 microsegundos
                                            //4mhz * preescaler 8 * (65535-3036)=500000 microsegundos, 0,5 segundos
 enable_interrupts(INT_TIMER1);             //habilita interrupcion timer1
 enable_interrupts(global);                  //habilita interrupción general
 while(1);
 

}
un cordial saludo

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: duda sobre uso timer1
« Respuesta #9 en: 13 de Diciembre de 2009, 18:51:42 »
me alegra q lo hayas solucionado, aunque es mas optimo utilizar el output_toggle(pin_Bx) y hacia lo mismo  :-/
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA