Autor Tema: configurar interrupción con timer  (Leído 3866 veces)

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

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
configurar interrupción con timer
« en: 12 de Mayo de 2008, 03:39:53 »
Hola, muy buenas!

Estoy intentando programar un pic para que salte una interrupción cada vez que pase 1 hora y no se exactamente como configurar el timer0 y la interrupción,

Estoy trabajando con un pic16f877, si alguien me puede echar una mano para configurar esa interrupción.

Muchas gracias de antemano!

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: configurar interrupción con timer
« Respuesta #1 en: 12 de Mayo de 2008, 04:04:32 »
pero si usa el buscador como lo hice yo encontrara un monton de opciones
aqui te pongo una
http://www.todopic.com.ar/foros/index.php?topic=21401.msg166049#msg166049

Saludo
« Última modificación: 12 de Mayo de 2008, 04:08:25 por stk500 »

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: configurar interrupción con timer
« Respuesta #2 en: 13 de Mayo de 2008, 01:13:41 »
Saludos!
Algo así podría funcionar:

Código: C
  1. #INT_RTCC
  2. void interrupcion_timer ()
  3. {
  4.       i++;
  5.       if (i>275735)
  6.       {
  7.              i=0;
  8.              una_hora=1;
  9.        }
  10.        set_rtcc (0);
  11. }
  12.      
  13. void main (void)
  14. {
  15.      una_hora=0;
  16.      i=0;
  17.      setup_timer_0 (RTCC_INTERNAL, RTCC_DIV_256);                                        
  18.      enable_interrupts(INT_RTCC);
  19.      enable_interrupts(GLOBAL);
  20.      while (TRUE)
  21.      {
  22.             if (!una_hora)
  23.              {
  24.                //codigo cuando no ha pasado la hora...
  25.               }
  26.              else
  27.              {
  28.                //codigo de lo que hay que hacer cuando pase la hora...
  29.               }
  30.       }
  31. }

Aquí usarías timer0 con pre-escala de 256, entonces 255*256*4*(20e6^-1)*275735 aprox = 3600s = 1hora.
Claro que deberás definir "i" como una variable int16 y "una_hora" como una variable tipo bit (servirá como bandera para indicar si ha transcurrido o no la hora). Ambas deberás definirlas en la cabecera como variables globales.

Creo que así debería funcionar... no lo compilé, así que pruebalo y dices que tal...
Dale pues, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: configurar interrupción con timer
« Respuesta #3 en: 13 de Mayo de 2008, 02:22:11 »
Muchisimas gracias firepic, lo pruebo y te digo algo.

De verdad!!!! gracias!!!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: configurar interrupción con timer
« Respuesta #4 en: 13 de Mayo de 2008, 04:18:22 »
Solo un pequeño detalle Firepic, el 255 de la fórmula ¿no debiera de ser 256?

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: configurar interrupción con timer
« Respuesta #5 en: 13 de Mayo de 2008, 08:26:32 »
Una pregunta,
¿en el programa principal puedo tener el programa en modo sleep y cuando pase la hora en el programa se producirá la interrupción que hará que se transmitan los datos ?

gracias de antemano¿?

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: configurar interrupción con timer
« Respuesta #6 en: 13 de Mayo de 2008, 11:55:28 »
HOla muy buenas firepic, muchas gracias por tu codigo;

#INT_RTCC
void interrupcion_timer ()
{
     i++;
     if (i>275735)
     {
            i=0;
            una_hora=1;
      }
      set_rtcc (0);
}
Al compilar en ccs me dice que la i nunca sera mas grande que este numero, y que la condicion siempre sea falsa.

el if saltara cada vez que en el programa pase una hora?

pero no lo hace

Saludos!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: configurar interrupción con timer
« Respuesta #7 en: 13 de Mayo de 2008, 12:23:16 »
La i la tendrás que definir como int32 (los int16 "solo" llegan hasta 65536)

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: configurar interrupción con timer
« Respuesta #8 en: 13 de Mayo de 2008, 13:39:05 »
Saludos!  :-)
El maestro pocher! Gracias por las correcciones!  :P

Solo un pequeño detalle Firepic, el 255 de la fórmula ¿no debiera de ser 256?
Tienes razón...

Claro que deberás definir "i" como una variable int16 y "una_hora" como una variable tipo bit (servirá como bandera para indicar si ha transcurrido o no la hora). Ambas deberás definirlas en la cabecera como variables globales.
La i la tendrás que definir como int32 (los int16 "solo" llegan hasta 65536)

También tienes razón gran pocher!  :-/
Se me han pasado algunas burradas  :D  La variable debe ser declarada int32 no int16...

Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: configurar interrupción con timer
« Respuesta #9 en: 18 de Mayo de 2008, 20:26:26 »
Hola cheapekt, lamento decirte que no puedes contar con el timer0 mientras el PIC esta durmiendo, pues este depende del oscilador principal que se apaga cuando el micro entra en modo Sleep. Si puedes hacerlo con el Timer1, si este se encuentra en modo contador asincrónico. Además, su interrupcion despertará al micro de su "siesta" para que puedas realizar la transmisión.
Luego nos cuentas.

Un saludo.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado kcire

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 84
Re: configurar interrupción con timer
« Respuesta #10 en: 23 de Mayo de 2008, 17:08:38 »
cheapekt espero te sirva este codigo utilice el TMR1, como dijo Gonzalo_BlackHawk seria bueno
trabajar con TMR1 pero la verdad nunca trabaje con el PIC en modo sleep y tambien espero como
tu si alguien podria explicarlo con un ejemplo.

Saludos a todos
"La imaginación es más rica que el lenguaje... sugiere con palabras, la imaginación podrá hacer el resto."

Desconectado CEAUGO

  • PIC10
  • *
  • Mensajes: 13
Re: configurar interrupción con timer
« Respuesta #11 en: 26 de Mayo de 2008, 01:10:09 »
Saludos!
Algo así podría funcionar:

Código: C
  1. #INT_RTCC
  2. void interrupcion_timer ()
  3. {
  4.       i++;
  5.       if (i>275735)
  6.       {
  7.              i=0;
  8.              una_hora=1;
  9.        }
  10.        set_rtcc (0);
  11. }
  12.      
  13. void main (void)
  14. {
  15.      una_hora=0;
  16.      i=0;
  17.      setup_timer_0 (RTCC_INTERNAL, RTCC_DIV_256);                                        
  18.      enable_interrupts(INT_RTCC);
  19.      enable_interrupts(GLOBAL);
  20.      while (TRUE)
  21.      {
  22.             if (!una_hora)
  23.              {
  24.                //codigo cuando no ha pasado la hora...
  25.               }
  26.              else
  27.              {
  28.                //codigo de lo que hay que hacer cuando pase la hora...
  29.               }
  30.       }
  31. }

Aquí usarías timer0 con pre-escala de 256, entonces 255*256*4*(20e6^-1)*275735 aprox = 3600s = 1hora.
Claro que deberás definir "i" como una variable int16 y "una_hora" como una variable tipo bit (servirá como bandera para indicar si ha transcurrido o no la hora). Ambas deberás definirlas en la cabecera como variables globales.

Creo que así debería funcionar... no lo compilé, así que pruebalo y dices que tal...
Dale pues, nos leemos!  :mrgreen:
-----------------------------------------------------------------------------------------------------------------------
Hola me gustaria hacerte una pregunta respecto el tema..... para que haya una interrupcion no se debe cargar el timer con un valor para que este se desborde y entre a la interrupcion, o de esta forma el queda cargado con cero y hace el conteo completo hasta desbordarse???. hasta pronto...

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: configurar interrupción con timer
« Respuesta #12 en: 26 de Mayo de 2008, 01:17:28 »
depende, tu dices ponerle al comienzo de la funcion de la interrupcion del timer: set_timer0(xxxx); bueno, depende delos calculos que hagas, y de ahi, cual te conviene, en el caso del ejemplo que pones, comienza a contar desde cero hasta 0xff, que serian 255, que es igual a los 8 bits del timer 0, el timer 1 tendria 16 bits, a lo que es igual a 65536 ticks para que se desborde y asi crea una interrupcion, espero haberte ayudado
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: configurar interrupción con timer
« Respuesta #13 en: 26 de Mayo de 2008, 13:06:00 »
Saludos!
Solo una observación, la instrucción set_timer0 que menciona scientist es equivalente a la set_rtcc que coloqué en la línea 11 del código y que efectivamente carga el timer con 0.
Nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web