Hola
sigue ahciendo cosas raras al cambiar envio de datos
si envio:
2,3,0,9999 es distintivo de reset del contador de interrupcion
para que me ponga el dato recibido donde yo quiero, en la posicion del vector que yo quiero
recivo[cnt]=2
....
recivo[0]=2
recivo[1]=3
recivo[2]=0
recivo[3]=99
esto lo hace bien
pero si le envio
2,3,1,99
me recoge:
recivo[0]=2
recivo[1]=3
recivo[2]=0
recivo[3]=176 // que se corresponde con B2 que es la direcion del esclavo
en ese momento se jode la trasmision
si envio un paquete a S1 y otro a S2
si esto lo hago con s2 S1 llega bien
pero si lo hago con S1 a s2 no llega nada.
con : 0 en el tercer bit no pasa nada:
es decir si envio esto:
2,3,0,99pero si envio esto
2,3,1,99 ya se a liado. el master no envia mas y el esclavo me escribe 2,3,1,176
funciones que uso en i2c
void escribe_i2c_01(int8 pic, int8 dato ){
i2c_start(); // Condicion Inicio
i2c_write(pic);// Direccion dispositivo
//delay_ms(3); // *** Necesario ***
i2c_write(dato);// dato
//delay_ms(3); // *** Necesario ***
//i2c_write(++dato);// dato
i2c_stop(); // Stop
//delay_us(20);
}
//traspado giro
//angulo, inclinacion, envio, posicion de v1,v2 estdo de motor
void pasa_giro(int8 *v1[], int8 *v2[],int8 *v3[], int8 pos_v, int8 m_on){
v3[0]=v1[pos_v];
v3[1]=v2[pos_v];
v3[2]=m_on;
v3[3]=99;
}
//funcion de envio de vector por i2c
//S1, envio,rango
void envia_sv(int8 PIC, int8 *v[]){
int8 e;
for(e=0;e<4;e++){
printf("\n\r dato envio: %d" v[e]);
escribe_i2c_01(PIC, v[e]);
delay_ms(50);
}//fin for
delay_ms(1000);
}
desde el main en el master lo llamo asi:..
..
printf("\n\r\n\r angulos S1: "); //--- debug
pasa_giro(angulo, inclina, envio, 0, 1);
envia_sv(S1, envio);
printf("\n\r\n\r angulos: S2 "); //---debug
pasa_giro(angulo, inclina, envio, 0, 1);
envia_sv(S2, envio);
//envia_g(angulo, inclina, envio, 1);
..
..
en el esclavo recivo asi:int8 state, Direc_master, iic_dato, comando;
int8 direc_Mas_esc, recivo=0;
int8 dato[4];
int8 cnt=0;
#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();
printf("\n\r dato[%u]:%u"cnt,dato[cnt]);
recivo=0;
if(dato[3]==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);
delay_ms(300);
output_high(PIN_B7);
delay_ms(300);
output_low(PIN_B7);
delay_ms(300);
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;
}
}
}
....
...
se bloquea la trasmision cuando pongo 1 en el vector pos 3 contado desde 0
y no me muestra 99 sino 176 en la recepcion del esclavo que se coresponde con su direcion de esclavo.
no se lo que le ocurre, pero no logro ver lo que le esta pasando lo depure con proteus y nada
gradeceria que alguienm e dira alguna idea del problema.si le envio 0, funciona
si envio 1 no funciona
si le envio 2 tambien funciona que
le pasara con el uno?
si asi es no le puedo mandar dato que sea un 1 por que termina la comunicacion o se bloquea
a que es debido eso.
sigo rulando.me refiero
pasa_giro(angulo, inclina, envio, a, b);
a deberia de ser cualquier valor de 1 a 7
b deberia de ser 1 o 0
el envio lo hace bien el master si no tiene 1, pero al recibir dato si dato es 1
se termina comunicacion o se bloquea y el sigueinte dato
lo asigna a la direccion.
sigo con esto..
http://www.todopic.com.ar/foros/index.php?topic=36248.0http://www.todopic.com.ar/foros/index.php?e;topic=34581.0esto continua..
si envio a,b,c,d
por i2c desde el master al esclavo
y despues vuelvoa volver a repetir
como alguno de los datos a enviar sea un 1
el eclavo al llegar al 1 no recibe nada y termina la recepcion
del esclavo
puede alguien decirme que esta pasando?
...