Autor Tema: como utilizo timer0 16f877??  (Leído 2841 veces)

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

Desconectado cegomez99

  • PIC10
  • *
  • Mensajes: 8
como utilizo timer0 16f877??
« en: 07 de Abril de 2009, 13:09:18 »
hola a todos, necesito hacer una temporizacion (simplemente practica) de 40ms, y con la ecuacion si no la estoy haciendo mal es..
TMR0=(40ms)/((4/4Mhz)(256))=99.75    preescaler de 256,cristal de 4Mhz pero pasan dos cosas, la primera el tiempo no da, me parecen como 8ms
y el otro es que cuando no se preciona el pin b0 y se queda en el ciclo de espera (rb0=1), el conteo empieza (tmr0) y me imagino que no deberia ser asi, puesto que si tengo el timer0 como interrupcion se me activa o me equivoco???

el programa lo que hace es que al oprimir el boton rb0 tenga una temporizacion de 40ms y encienda el led rc0, cualquier colaboracion muchas gracias....a otra pregunta puedo utilizar este timer0 sin interrupciones o siempre se debe utilizar una interrupcion, a continuacion el programa...



#include<16f877.h>
#fuses XT,NOPUT,NOPROTECT,NOWDT,NOBROWNOUT
#use delay (clock=4000000)
#use standard_io(c)
#use standard_io(b)
#bit T0IF=0X0B.2


void timer1(void);

void main(void)
{
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); //RELOJ INTERNO Y PREES DE 256

   output_low(pin_c0);            //LIMPIO EL PIN C0
   

   do{
      if(input(pin_b0)==1)      //ESPERO QUE SEA PRECIONADO RB0
      {
         delay_ms(150);   //ANTIRREBOTE
         if(input(pin_b0)==0)   //ANTIRREBOTE
         {
            timer1();   
         }

      }

   }while(true);
}


//---------SUBRUTINAS----------
//-----------------------------
void timer1(void){
   set_timer0(99);               //CARGO EL TIMER CON 99 PARA OBTENER RETARDO DE
   do{                  //50MS
   }while(T0IF==0);         //CICLO HASTA QUE TERMINE EL CONTEO
   T0IF==0;            //PONGO LA BANDERA DE DESBORDAMIENTO EN 0
   output_high(pin_c0);         //ENCIENDO LED RC0   
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: como utilizo timer0 16f877??
« Respuesta #1 en: 07 de Abril de 2009, 13:24:06 »
Hola.

Ahi no estas usando interrupciones.

Para usarlas debes definirlas con #int_TIMER0 y luego en el main activarlas con: enable_interrupts();.

Saludos
El papel lo aguanta todo

Desconectado cegomez99

  • PIC10
  • *
  • Mensajes: 8
Re: como utilizo timer0 16f877??
« Respuesta #2 en: 08 de Abril de 2009, 13:03:22 »
Hola.

Ahi no estas usando interrupciones.

Para usarlas debes definirlas con #int_TIMER0 y luego en el main activarlas con: enable_interrupts();.

Saludos
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Hola, realmente lo quiero hacer sin interrupciones, esa era otra pregunta se puede hacer sin interrupciones???, lo pregunto porque todos los ejemplos que he visto con el timer0 del 16f877 son con interrupciones, el problema en el programa es el tiempo, y que cuando se queda en el ciclo al no pulsar el boton, el empieza a contar desde cero, y ps comentaba lo de la interrupcion por esta razon, que si la tuviese me imagino que el va a la interrupcion cuando se desborda....espero haberme hecho entender.....muchas gracias, muchos exitos!!!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: como utilizo timer0 16f877??
« Respuesta #3 en: 08 de Abril de 2009, 13:20:31 »
... puesto que si tengo el timer0 como interrupcion se me activa o me equivoco???

Tu puedes habilitar la interrupcion cuando pulses la tecla y decirle al PIC que comience a contar desde ese instante. La ventaja de hacerlo con interrupciones es que el conteo del tiempo se hace sin tener que afectar el resto de codigo del main, lo que da mayor ventaja a la hora de programar.

Si no quieres usar interrupciones, pues coloca un delay_ms(40); y listo, pero ten en cuenta que no podras hacer nada durante esos 40 milisegundos.

Saludos
El papel lo aguanta todo