Autor Tema: Fallo coordinacion  (Leído 1321 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Fallo coordinacion
« en: 14 de Febrero de 2016, 14:02:38 »
Tengo que pasar informes de un micro a otro, cada informe consta de un int8 + un int16 en caso de 5 informes en total son
6 int8 + 5 int16 (un int8 mas para que el otro sepa el nº de informes a tratar). Para ganar veloccidad e puesto una
int1 DT=0 detalle 0. Esto hace que las int16 en Master las divida/10 las manda en int8 y cuando llega la multiplica X 10

Se pierde detalle si valia 555 el otro la recoge como 550, pero merece cuando se trata de muchos informes.

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

Lo que quiero aprobechar es lo que falla y no consigo ver lo que es.
Utilizo SPI, todas son unsigned, el codigo es este:

MICRO MASTER
Código: [Seleccionar]
MF=0;
output_high(PIN_C2); // delay_us(10);//RW TRUE
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
//output_low(PIN_C2);//RW FALSE 
}
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); printf(lcd_putc,"%lu",t); break;///////
}//recivido
}//for(t)

if(t>447){  delay_ms(5);
MF++; lcd_gotoxy(36,1);   printf(lcd_putc,"MF %d ",MF); }///Este printf No debe aparecer MF supone numero de fallos en //comunicacion
}


MICRO SLAVE
Código: [Seleccionar]
nu=spi_read(); PS();   
if(DT){//int8 + int16 (detalle alto)
for(co=0;nu>co;co++){//for(co)
k8=spi_read(); PS();///posicion int8
psz[co]=k8;//iden
v8=spi_read(); PS();//distancia INT16
v16=spi_read(); PS();
dis[k8]=v16*256+v8;//distancia int16
}//for(co) rs completa
} else {//int8 + int8 (detalle vajo)
for(co=0;nu>co;co++){//for(co)
k8=spi_read(); PS();///posicion int8
psz[co]=k8;//iden
v8=spi_read(); //PS();//distancia INT16/10  1555/10 serian INT8 155            ....259 serian 25
k16=v8;//155 ---> 1550 (se pierde detalle deberia ser 1555 pero micro-master sabe siempre el verdadero valor a la hora de //operarlo)
//k16*10;
if(k16>24){  dis[k8]=k16*10; }//micro-master if(distancia>240) { RW int16/10 } else { RW int16 entera cabe en int8 }
else { dis[k8]=k16; }//la int16 pasada era inferior a 240 (+ rapido y no se pierde detalle)
PS();
}//for(co) RS Simple
}//end if(DTalle)

void PS(){///protocolo de recivo vajo SPI pic2SLAVE
output_high(PIN_a0);//S.recivido=true -----> pin_c0_MASTER/E.recivido
delay_us(4950);//delay_ms(4);   
output_low(PIN_a0);
delay_us(50);
}

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

Necesito algo mas que la libreria #include <stdio.h>


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Fallo coordinacion
« Respuesta #1 en: 14 de Febrero de 2016, 15:01:50 »
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:

Código: C
  1. MF=0;
  2.         output_high(PIN_C2);
  3.         spi_write(nu);
  4.         PM();                           //numero total-de-objetivos int8
  5.         if(DT)
  6.         {                               //comunicaion detallada + Lenta (int8 + int16)
  7.                 for(co=0;nu>co;co++)
  8.                 {                       //for(co)//MANDAR--->
  9.                         p0=psz[co];
  10.                         spi_write(p0);  
  11.                         PM();           ///posicion int8  
  12.                         d0=dis[p0];
  13.                         v8=make8(d0,0); ///distancia INT16
  14.                         spi_write(v8);  
  15.                         PM();  
  16.                         v8=make8(d0,1);
  17.                         spi_write(v8);
  18.                         PM();
  19.                 }                       //for(co) RW detallada
  20.         }
  21.         else
  22.         {                               //DT=0//comunicaion Simple + rapida (int8 + int8)
  23.                 for(co=0;nu>co;co++)
  24.                 {                       //for(co)//MANDAR--->
  25.                         p0=psz[co];
  26.                         spi_write(p0);
  27.                         PM();           ///posicion int8  
  28.                         d0=dis[p0];     //distancia es improbable que pueda llegar a + de 1000/10-->int8 100
  29.                                         //int16/10  555/10=55 recivira 55*10=550
  30.                         if(d0>240)
  31.                         {
  32.                                 d0=d0/10;  
  33.                         }               //NO COORDINA Si int16 es inferior a 240 Quiero que se la pase entera a int8
  34.                         v8=make8(d0,0);
  35.                         spi_write(v8);
  36.                         PM();
  37.                 }//for(co) RW Simple
  38.         }//end if(DTalle)
  39.  
  40.  
  41.  
  42. // .................................................................................
  43.  
  44.  
  45. void PM()
  46. {                                       /// protocolo de envio vajo SPI MAESTRO
  47.         for(t=0;450>t;t++)
  48.         {
  49.                 if(Input(PIN_C0))
  50.                 {
  51.                         delay_ms(5);
  52.                         lcd_gotoxy(37,2);
  53.                         printf(lcd_putc,"%lu",t);
  54.                         break;          ///////
  55.                 }                       //recivido
  56.         }//for(t)
  57.  
  58.         if(t>447)
  59.         {  
  60.                 delay_ms(5);
  61.                 MF++;
  62.                 lcd_gotoxy(36,1);  
  63.                 printf(lcd_putc,"MF %d ",MF);
  64.         }                               ///Este printf No debe aparecer MF supone numero de fallos en //comunicacion
  65. }

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..

Citar
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.


Citar
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.
« Última modificación: 14 de Febrero de 2016, 17:15:39 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Fallo coordinacion
« Respuesta #2 en: 18 de Febrero de 2016, 20:50:31 »
int1 DT;
int8 psz[201];//200 posiciones
int16 dis[201];//"16" porque la distancia comienza en 800 y termina en 1 (podria valer >1000 variantes de retroceso)

int8 nu solo se aplica una vez. Figate no se mete en el for
//nu es el maximo de informes-objetivos
aunque el maximo de informes es 9// no e utilizado infor[10][201] para evitar 2 for
psz[0]//debe contener la distancia mas corta sucesivamente asta psz[8] la mas larga, todas pueden variar utilizo una
void burbuja() y mas funciones para reordenarlas continuamente, estas no parecen esigir demasiados ciclos

Yo solo utilizo Proteus aqui todo es gratis y no me preocupo por la memoria,componentes y los micros (quizas descomunal). El pago es que el tiempo lo pierdo en los delays, las instrupciones, bukles,funciones que e creado por si solas no parecen repercutir en el tiempo (segun Proteus) Si esta funcionando DT=0 Mejora el tiempo de transmision perder tiempo en una pregunta IF no es significativo segun el.

Este proyecto esta acavado con 3 micros, al menos lo que era mas dificil para my. Si quieres te lo mando para que veas lo que es
Estoy teniendo problemas con los 5 y e cascado algo en el menu de opciones es por donde empece pero las funciones vinculadas ya an cambiado y repercuten.
Ahora en la version de 5 lo primero quiero hacer funcionar a los 3 principales a la vez. Luego si que deberia mirar algo llamado Timer. Cuando utilizo los 5 aunque solo le pida utilizar 3 tarda mas tiempo todo. Ese es el pago

¿Borrar la mitad? Oh! Eso si que no, llevo ya el 4º mes  y no se cuantos paquetes de tabaco con el.





Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Fallo coordinacion
« Respuesta #3 en: 18 de Febrero de 2016, 23:55:20 »
Citar
Si esta funcionando DT=0 Mejora el tiempo de transmision perder tiempo en una pregunta IF no es significativo segun el.

Nadie esta hablando de perder tiempo en un solo if, sino que tenes que implementar toda otra estructura ademas para que el otro micro sepa cuando realmente es que debe o no aplicar eso.
Y ese es el problema. Entonces.. Termina siendo mas rentable directamente enviar todo.

Personalmente no me gusta como programas, o no me es atractivo leer tu codigo por mas que me interese en lo que lo estas aplicando ( y esto no deberia preocuparte a vos para nada obviamente ) , por eso es que me limito unicamente a responderte sobre tu tema en cuestion que era el envio y no quiero adentrarme en mas nada.
Intente en un momento hacer que programaras siguiendo unas reglas simples y decidiste seguir con tu modo, entonces yo me hice al lado de eso y no te pienso decir mas nada de eso de ahora en adelante. Arreglarlo como vos queres es facil. Pero que funcione con ese arreglo simple no lo es por que es mas complejo el tema. Y por eso no te di la "solucion" a eso (por que era una solucion a medias).

ESTA ES MI OPINION! Si alguno desea ayudarte con todo el programa que te pida el codigo asi te da una mano. Yo intente opinar sobre el codigo que pusiste, lo que decia de borrar la mitad era sobre ese codigo que pusiste, es decir quitar lo de DT, quitar varias llamadas a funciones y dejar un simple envio de datos.
« Última modificación: 19 de Febrero de 2016, 01:26:46 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Fallo coordinacion
« Respuesta #4 en: 20 de Febrero de 2016, 06:50:20 »
No te pedia que lo estudiases solo que vieses proyecto que funciona ya incluso con 5 micros. Funciona bien siempre que a bien no le llames veloccidad. El codigo tiene ideas que me habeis hecho ver algunos de vosotros algunas tuyas, si las e modificado a mi conveniencia y os hace daño a la vista, lo siento, pero no existe ley que oblige a estudiarlas. Quizas no sepa hacer las preguntas adecuadamente La mayoria de soluciones que e en contrado, es por comentarios de otras preguntas hechas por otros usuarios.
No me gustan las Structuras veo que todo seria mas ordenado con ellas. pero prefiero que coja todo directamente de una sola variable, no buscando una dentro de otra. Me obsesiona la veloccidad. DTalle=0 Es muy importante, esta ya por defecto en el menu de opciones. No se le puede llamar malo a algo que hace que todo funcione con mas fluided.