//variables i2c
int8 state, comando;
//int8 iic_dato, Direc_master;
int8 direc_Mas_esc, recivo=0;
int8 dato[4];
//int8 dato_1[4];
int8 cnt=0;
int8 angulo;
int8 inclina;
int8 motor_on;
//servos pwm soft
int8 servos[]={sv_0,sv_1,sv_2,sv_3,sv_4,0,0,0,0,0};
//variables timer
int8 cnt_t0=0;
int8 cnt_t1=0;
int1 t0=0;
int1 t1=0;
#priority timer0, timer1, ssp
/*
#int_RTCC
void RTCC_isr(void)
{
}
*/
#int_TIMER0
void TIMER0_isr(void)
{
output_high (servos[cnt_t0]); //activo servo
//ventana de 1 ms cambio de svmotor
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //activo timer1
set_timer1(g_90); //tiempo en alto
set_timer0(ventana); //desborda cada 1ms
if(cnt_t0==20){ //cambio de ventana
cnt_t0=0;
//printf("\n\r -->T0 1ms 20 ventanas 1 perido");
}
//printf("\n\r cnt_t0: %d "cnt_t0);
//cnt_t0=cnt_t0+1; //incremta ventana => motor
}
#int_TIMER1
void TIMER1_isr(void)
{
output_low (servos[cnt_t0]); //apago motor
//printf("\n\r OFF servo: %d "cnt_t0-1);
cnt_t0=cnt_t0+1; // incremta ventana => motor
setup_timer_1(0); // desactivo timer 1
}
#int_SSP
void SSP_isr(void){
//disable_interrupts(INT_SSP);
//disable_interrupts(INT_TIMER0);
//disable_interrupts(INT_TIMER1);
//int8 comando;
//master escribe de esclavo menor de <80
//master lee de esclavo mayor de >80
state = i2c_isr_state();
if(state==0)
{
direc_Mas_esc=i2c_read();
if(direc_Mas_esc==S1){
////////////////////////////////
printf("\n\r --> Direccion: %X "direc_Mas_esc); //--- debug mas rapido
////////////////////////////////
recivo=1;
output_high(PIN_B2); //---debug rapido
}
//printf("\n\r Direccion : %X "direc_Mas_esc); //para solo imprime s1
//if(SSPADD==S1){
//printf("\n\r state==0 soy S1: %X "SSPADD);
//}
}
if(state < 0x80)
{
//iic_dato=i2c_read();
//comando=iic_dato;
if(recivo==1){
dato[cnt]=i2c_read();
// coreccion para lo de error en dato=1
if(dato[cnt]==10){
dato[cnt]=1;
}
if(dato[0]==1){ // control de motor
output_high(PIN_B6);
motor_on=1;
}
if(dato[cnt]!=0){ //control de angulo
angulo=dato[1];
inclina=dato[2];
}
///////////////////////
/////////////////////////////
printf("\n\r dato[%u]:%u"cnt,dato[cnt]); //-- debug +rapido
/////////////////////////////
recivo=0;
output_low(PIN_B2); //--- debug rapido
// para resetear almacen dato
if(dato[cnt]==99){ //cnt resetea en 3 si es 99
cnt=0;
}
else{
cnt=cnt+1;
}
}
//Aqui colocas lo que necesites hacer con el dato enviado por el maestro
//printf("\n\r comando recibo <80: %u"comando);
}
if(state == 0x80)
{
/*
switch(comando)
{
Case Pide_Dato1:
i2c_write(Dato1);
output_high(PIN_B7);
delay_ms(300);
output_low(PIN_B7);
printf("\n\r Llego dato.");
break;
Case Pide_Dato2:
i2c_write(Dato2);
output_high(PIN_B2);
break;
}
*/
}
enable_interrupts(INT_SSP); //para imprimir completo priff del main
//enable_interrupts(INT_TIMER0);
//enable_interrupts(INT_TIMER1);
}
#int_BUSCOL
void BUSCOL_isr(void)
{
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_SSP);
enable_interrupts(INT_BUSCOL);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
set_timer0(ventana);
setup_timer_1(T1_DISABLED); // timer 1 no activo
//set_timer1(0);
printf("\n\r Prueba de timer: ");
while(true){
if(t0==2){
printf("\n\r -->T0 20ms");
}
if(t1==4){
printf("\n\r -->T1 40ms");
}
enable_interrupts(INT_SSP);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
}
}