#include <16f877a.h>
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOPROTECT
#use delay (clock=20000000)
#use FAST_IO(a)
#use FAST_IO(B)
#use FAST_IO(c)
#use FAST_IO(e)
#priority timer1,RB
#include <lcd_flex.c>
//**************************REGISTROS DEL MPU ***************************************************************
#define SERVO1 pin_c0
#define SERVO2 pin_c1
float tiempo[4]={0,0,0,0};
int SERVOS[4]={65,65,65,65};
int puerto_b=0;
int1 estado_act1=0,estado_ant1=0,estado_act2=0,estado_ant2=0,estado_act3=0,estado_ant3=0,estado_act4=0,estado_ant4=0;
int16 cont=0,T1[4],T2[4],TT[4];
const float periodo=0.0002;
#int_RB
void rb_isr(){
puerto_b=input_b();
estado_act1=bit_test(puerto_b,4);
estado_act2=bit_test(puerto_b,5);
estado_act3=bit_test(puerto_b,6);
estado_act4=bit_test(puerto_b,7);
if(estado_act1&&!estado_ant1){ // DETECCION DEL PULSO DE SUBIDA
T1[0]=get_timer1();
}
if(estado_ant1&&!estado_act1){ // DETECCION DEL PULSO DE BAJADA
T2[0]=get_timer1();
if(T1[0]<T2[0]){TT[0]=T2[0]-T1[0]; tiempo[0]=TT[0]*periodo;}
}
if(estado_act2&&!estado_ant2){ // DETECCION DEL PULSO DE SUBIDA
T1[1]=get_timer1();
}
if(estado_ant2&&!estado_act2){ // DETECCION DEL PULSO DE BAJADA
T2[1]=get_timer1();
if(T1[1]<T2[1]){TT[1]=T2[1]-T1[1]; tiempo[1]=TT[1]*periodo;}
}
if(estado_act3&&!estado_ant3){ // DETECCION DEL PULSO DE SUBIDA
T1[2]=get_timer1();
}
if(estado_ant3&&!estado_act3){ // DETECCION DEL PULSO DE BAJADA
T2[2]=get_timer1();
if(T1[2]<T2[2]){TT[2]=T2[2]-T1[2]; tiempo[2]=TT[2]*periodo;}
}
if(estado_act4&&!estado_ant4){ // DETECCION DEL PULSO DE SUBIDA
T1[3]=get_timer1();
}
if(estado_ant4&&!estado_act4){ // DETECCION DEL PULSO DE BAJADA
T2[3]=get_timer1();
if(T1[3]<T2[3]){TT[3]=T2[3]-T1[3]; tiempo[3]=TT[3]*periodo;}
}
estado_ant1=estado_act1;
estado_ant2=estado_act2;
estado_ant3=estado_act3;
estado_ant4=estado_act4;
output_toggle(PIN_A0);
clear_interrupt(int_RB);
}
#int_timer0 //la interrupcion por timer0
void timer0_isr(void)
{
if(cont==1){
output_high(SERVO1);
output_high(SERVO2);
}
else if(cont<1000){
if(SERVOS[0]<cont){
output_low(SERVO1);
}
if(SERVOS[1]<cont){
output_low(SERVO2);
}
}
else{
output_low(SERVO1);
output_low(SERVO2);
cont=0;
}
cont++;
set_timer0(156);
}
void main()
{
set_tris_a(0b00000000);
set_tris_b(0xf0);
set_tris_c(0b11100000);
set_tris_d(0b00000000);
set_tris_e(0x00);
//++++++++++++++ ++++++++++++++ ++++++++++++++ ++++++++++++++ ++++++++++++++ ++++++++++++++ ++++++++++++++ //
//++++++++++++++ ++++++++++++++ ++++++++ CONFIGURACION TIMERS ++++++++++++++ ++++++++++++++ ++++++++++++++ //
//++++++++++++++ ++++++++++++++ ++++++++++++++ ++++++++++++++ ++++++++++++++ ++++++++++++++ ++++++++++++++ //
setup_counters( rtcc_internal, rtcc_div_1 | rtcc_8_bit); //configuro timer0 con prescaler 1:1
set_timer0(156); //cargo el timer0 para que desborde en un 0,02ms
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(int_timer0); //activo el timer0
enable_interrupts(int_RB);
enable_interrupts(GLOBAL);
delay_ms(100);
lcd_init();
lcd_putc("\fPrueba int RB");
delay_ms(500);
while(TRUE)
{
//SERVOS[0]=35+(((tiempo[2]*100)-100)/2);
printf(lcd_putc
,"\fT1=%f T2=%f\nT3=%f T4=%f",tiempo
[0],tiempo
[1],tiempo
[2],tiempo
[3]);
output_toggle(pin_a1);
delay_ms(40);
}
}