Autor Tema: Problema con int timer0  (Leído 2906 veces)

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

Desconectado zira

  • PIC10
  • *
  • Mensajes: 6
Problema con int timer0
« en: 06 de Mayo de 2008, 05:31:32 »
hola amigos de todo pic, me estoy iniciando en microcontroladores y la verdad es q han sido una gran ayuda.
En este momento entoy trabajando con la pic 16f873a y tengo una duda con la int tmr0, he buscado en el foro pero no he encontrado nada q me ayude, quiero hacer rotar un bit a traves de leds conectados al puerto c, es decir se debe prender un led cada 1 seg, pero la temporizacion deseo hacerla con la interrupcion del timer0 pero no lo he logrado.
espero alguien pueda ayudarme, esto es lo q he hecho:

#include <16f873a.h>
#use  delay(clock=4000000)
#byte puerto_c=0x07



///////  VARIABLES   GLOBALES    /////////

int   cont;
char  led_on=0x01;

   ////////    INTERRUPCION TIMER0   ///////////

#int_timer0

void  int_tmr0()
{
   
   for(cont=0; cont<21; cont++)
   {
      set_timer0(61);
   }
   
   disable_interrupts(int_timer0);
}


   /////////// PRINCIPAL //////////
   
void   main()
{
   set_tris_c(0x00);
   
   do{
         enable_interrupts(int_timer0);
         setup_counters(rtcc_internal,rtcc_div_256);
         set_timer0(61);
         enable_interrupts(global);

         output_c(led_on);
         rotate_left(&led_on,1);

   }while(1);
}



saludos

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Problema con int timer0
« Respuesta #1 en: 06 de Mayo de 2008, 07:33:17 »
Tienes varias cosas mal:

- Este bloque:

         enable_interrupts(int_timer0);
         setup_counters(rtcc_internal,rtcc_div_256);
         set_timer0(61);
         enable_interrupts(global);

sácalo del while y déjalo en el main

- Esto:

   for(cont=0; cont<21; cont++)
   {
      set_timer0(61);
   }

conforme está, no hace nada. El TMR0 lo recargas a toda leche 21 veces seguidas, pero eso no consigue 1s

Ideas:

- Calcula cada cuantos ms quieres que se dispare la interrupción (por ejempo 25ms). Hay que hacer números.

- Entra en la interrupción x veces hasta conseguir 1s

- Cuando entre por última vez, en la misma interrupción activas un flag (flag=1)

- En el while pones: if (flag==1) ----> rotar

Un saludo

Desconectado manuelroin24

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 665
Re: Problema con int timer0
« Respuesta #2 en: 06 de Mayo de 2008, 09:37:23 »
Dentro de la interrupcion del timer 0 para 1sg aproximadamente puedes hacer lo siguiente:

Código: [Seleccionar]
char i=0,cuenta=0;

#int_TIMER0
void  TIMER0_isr(void)
{
   if(cuenta ==250) // 1 sg aprox
   {
     cuenta = 0;
     rotate_left(&led_on,1);
    }
   cuenta++;
   set_timer0(6); // Setea a 5 el timer 0
}


void main()
{
   
   set_timer0(6);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   
   
   do{
       output_c(led_on);

       }while(true);

}


Podrias probar con esto aunque no lo he probado.... :P
El conocimiento se consigue a base de esfuerzo...

Desconectado zira

  • PIC10
  • *
  • Mensajes: 6
Re: Problema con int timer0
« Respuesta #3 en: 06 de Mayo de 2008, 16:57:50 »
De verdad muchas gracias por sus respuestas, una vez mas el foro no me falla........
manuelroin24 funciona a la perfeccion..
Saludos

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Problema con int timer0
« Respuesta #4 en: 07 de Mayo de 2008, 01:21:31 »
¿Sabrías hacer el programa haciendo que rotara en el while?