Timer0 en C++ con PCW pic 18f4550

A continuación os pongo un programa hecho en c++ con el PCW, y estoy haciendo un proyecto para el instituto en el que voy a hacer un radar de velocidad, y mi problema está en que, utilizo dos sensores infrarrojos, en el primero quiero activar un contador y en el segundo infrarrojo pararlo. Para calcular ese tiempo quiero utilizar la interrupción del timer0, entonces me he informado y he intentado hallar ese tiempo pero no lo logro, ya que simulo en proteus y no me funciona bien. por lo que a continuacion pongo el programa que tengo hecho a ver si alguien le puede echar un vistazo.
en el programa quiro cargar el timer0, que desborde cuando cuente FF, que se vuelva a cargar, que vuelta a desbordar, asi sucesivamente hasta que se accione el segundo sensor de infrarrjoos. la variable "int a" debe contar todas las veces que desborda para finalmente, sumar las veces que ha desbordado, para realizar los calculos. GRACIAS DE ANTEMANO.


#include <18F4550.h>
//#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,PLL3,CPUDIV1,V REGEN,nomclr
#use delay(clock=4000000)
#use standard_io(a)
#use standard_io(b)
#include <lcd.c>
int receptor1;
int receptor2;
long a=0; //variable que se incrementa cada vez q desborda el timer0



/////////////FUNCION INTERRUPCION//////////////////// llamada cuando desborda el tmr0 >FF
#int_TIMER0
void TIMER0_isr(void)
{
a++; //incrementa cada vez que desborda el timer0, activado en el bloque del receptor2
//set_timer0(0x00); //¿¿supongo que carga el timer con ese valor y vuelve a donde se llamo las instruccion timer???¿?¿?¿?
//y si no inicializara el timer, no deberia seguir incrementando la a, puesto que no deberia desbordar...
}


//////////// FUNCION PRINCIPAL////////////////////////
void main(void){
lcd_init(); //Inicializamos el LCD.
set_tris_a(011011); //Ponemos el puerto A como Entradas,(algunas salidas).
set_tris_b(0x00); //Ponemos el puerto B como Salidas.


/////////////// DO WHILE DEL RECEPTOR1 ///////////////
do{
output_b(0x00); //saco nivel bajo por todo puerto b para apagar leds,borrar info..
receptor1=input(pin_a0); //leo la entrada del pin_a0 y se la asigno a var.
}while(receptor1==0); /*mientras el pin_a0 sea valor bajo hace el bucle,continua el bucle
hasta que cambie a valor alto y continue el programa*/
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
SET_TIMER0(0);



/////////////// DO WHILE DEL RECEPTOR2 ///////////////
output_b(0x00); //saco nivel bajo por todo puerto b para apagar leds,borrar info..
do{
receptor2=input(pin_a1);
//SET_TIMER0(0); //CADA VEZ QUE PASA POR ÉL SE RESETEA EL TIMER0, CON LO QUE NO DESBORDARIA EN ESTE BUCLE.
}while(receptor2==0); //cuando al pin_a1 le llegue un 1 (nivel alto) se sale del bucle.
output_high(pin_b1); //enciendo led 2 para entenderlo en la simulación.


lcd_gotoxy(1,1);
printf(lcd_putc,"increm a= %ld",a); //incrementos de a
}
 
Este... no veo en ningun lugar una funcion main, aunque estes usando interrupciones, requieres un ciclo infinito o en su defecto tener dormido el microcontrolador. Ademas no veo alguna funcion o instruccion para inicializar el timer con sus parametros de prescalador, source de reloj, accion de interrupcion.

mmm no te confies absolutamente nada del proteus, mejor usa el depurador del mplab y la implementación física.
 
Atrás
Arriba