//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)
{
if(cnt_t0==20){ //cambio de ventana
cnt_t0=0;
printf("\n\r -->T0 1ms 20 ventanas 1 perido");
}
//desborda cada 1ms
set_timer0(ventana); //ventana de 1 ms cambio de svmotor
printf("\n\r ON SERVO: %d " cnt_t0); //debug ---
switch(cnt_t0){
//sv_x seria un vector(cnt_to), y lo del timer1 otro
case 0: output_high (servos[cnt_t0]); set_timer1(g_90); break;
case 1: output_high (servos[cnt_t0]); set_timer1(g_90); break;
case 2: output_high (servos[cnt_t0]); set_timer1(g_90); break;
case 3: output_high (servos[cnt_t0]); set_timer1(g_90); break;
case 4: output_high (servos[cnt_t0]); set_timer1(g_90); break;
/*case 5: output_high (sv_0); set_timer1(g_0); break;
case 6: output_high (sv_1); set_timer1(g_0); break;
case 7: output_high (sv_2); set_timer1(g_0); break;
case 8: output_high (sv_3); set_timer1(g_0); break;
case 9: output_high (sv_4); set_timer1(g_0); break;
*/
}//fin switch
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]);
printf("\n\r OFF servo: %d "cnt_t0);
cnt_t0=cnt_t0+1; //incremta ventana => motor
}
/*
#int_SSP
void SSP_isr(void)
{
}
*/
#int_SSP
void SSP_isr(void){
disable_interrupts(INT_SSP);
//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);
recivo=1;
}
//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]);
recivo=0;
// 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;
}
}
}
#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(0);
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");
}
}
}