No se por que te complicas tanto la vida. Vas a terminar haciendo el codigo de una bomba atomica en longitud para mandar un dato por SPI.
Encima te complicas dividiendolo por 10, el cual dividirlo por 10 estoy mas que seguro que termina en utilizar mas ciclos que enviar otro byte.
Para las personas que cuidan de su salud, aqui esta el codigo identado:
MF=0;
output_high(PIN_C2);
spi_write(nu);
PM(); //numero total-de-objetivos int8
if(DT)
{ //comunicaion detallada + Lenta (int8 + int16)
for(co=0;nu>co;co++)
{ //for(co)//MANDAR--->
p0=psz[co];
spi_write(p0);
PM(); ///posicion int8
d0=dis[p0];
v8=make8(d0,0); ///distancia INT16
spi_write(v8);
PM();
v8=make8(d0,1);
spi_write(v8);
PM();
} //for(co) RW detallada
}
else
{ //DT=0//comunicaion Simple + rapida (int8 + int8)
for(co=0;nu>co;co++)
{ //for(co)//MANDAR--->
p0=psz[co];
spi_write(p0);
PM(); ///posicion int8
d0=dis[p0]; //distancia es improbable que pueda llegar a + de 1000/10-->int8 100
//int16/10 555/10=55 recivira 55*10=550
if(d0>240)
{
d0=d0/10;
} //NO COORDINA Si int16 es inferior a 240 Quiero que se la pase entera a int8
v8=make8(d0,0);
spi_write(v8);
PM();
}//for(co) RW Simple
}//end if(DTalle)
// .................................................................................
void PM()
{ /// protocolo de envio vajo SPI MAESTRO
for(t=0;450>t;t++)
{
if(Input(PIN_C0))
{
delay_ms(5);
lcd_gotoxy(37,2);
break; ///////
} //recivido
}//for(t)
if(t>447)
{
delay_ms(5);
MF++;
lcd_gotoxy(36,1);
} ///Este printf No debe aparecer MF supone numero de fallos en //comunicacion
}
Realmente hay tantas cosas MAL o mal aplicadas realmente que no se por donde empezar.
Voy a ponerme a adivinar y decir que:
psz[] posee los datos de 8 bits, pero lo peor de todo es que el dato que sale de aca es el indice de ¿dis?, y no veo ninguna "limitacion" en eso.
dis[] posee los datos de 16 bits
A limitacion me refiero es que uno normalmente crea un array con una cantidad limitada de valores.. supongamos int16 dis[10]; pero aqui estas haciendo esto:
p0=psz[co];
d0=dis[p0];
Si por alguna casualidad psz[co] termina dando un numero mayor o igual a 10 estariamos enviando cualquier cosa. Entonces me lleva a pensar.. que psz debe tener numeros solamente que entre en este rango.. de 0 a 9, los cuales si estan "ordenados" es decir la salida de psz[co] es algo asi 0..1..2...3...4...5..etc, no tiene sentido tener psz, si estan desordenados 5..9..2..3..6..etc podria llegar a entenderlo. Pero aun asi no veo el por que debrias haberlo puesto desordenado de esa forma ya en dis o psz. Pienso que llevan una relacion uno y otro por que estas usandolo de indice.
Lo otro que no entiendo es que me decis que necesitas enviar 6 int8, y 5 int 16, pero tus for parecen como si enviaran 6 y 6 de cada uno.
Lo peor de todo es que PM es una MALA funcion.. tenes un "super for" que cuenta hasta 450 y que solo entra al if si es que la entrada RC0 se pone a 1.. El problema de esto, es que es un "delay" esperando por la entrada, pero que espera por un cierto tiempo. Un for asi deberia tomar unos 15/20 ciclos hacerlo, eso por 449 son 89xx ciclos casi 9k, Supongamos a 4Mhz y son 9ms o casi 2ms a 20Mhz.
Seguido de eso un delay de 5ms mas, y seguido de eso tenes LCD!!! siii algo bastante lento, especialmente el printf(). Y como si fuera poco.. si llego a 447+ mas delays y mas LCD.
Otro problema con tu logica..
Lo que pasa es que me gustaria aprovechar lo siguiente.
Si la int16 es menor a 240. No la dividas/10. Mandala entera cabe en int8 Y el Slave a su vec no debe multiplicarla X10
Como va a saber el esclavo cual es el de 16bits recortado a 8, por que no todos los de 16bits van a ser menor a 240 ?.. Hacer algo asi te llevaria a tener un pin mas para indicarle al esclavo eso.
Y voy a ir directamente al problema principal: Si realmente queres que la comunicacion sea "rapida" no deberias estar llamando a PM() a cada rato, ni dividir por 10. Utiliza una politica de "recibi todo?" y no una de "recibi un solo dato?".
Es todo lo que tengo para decirte sobre el envio, no puedo arreglar tu programa con todas esas cosas. Para arreglarlo deberia borrar mas de la mitad de las cosas. Y quedaria un simple envio.
Otra cosa porque no puedo hacer directamente int16 = int8 y tengo que armar este cacao
k16=v8;
k16=k16*10;
dis[k8]=k16;
unsigned int16 k16,dis[200]
unsigned int8 v8,k8;
k16=v8*10;//mal
dis[k8] =v8;//lo curioso es que esto tambien me da un valor erroneo, las 2 son int16
dis[k8] = (int16)v8 * 10;
Con respecto a :
dis[k8] =v8;
dis es una array de int16, por lo tanto no son ambos de 8bits, lo que es de 8 bits es lo que usas de indice.
Aun asi eso deberia ser correcto. No se como lo estas probando.