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 el conteo empieza 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
}
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 el conteo empieza 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
}