Autor Tema: Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)  (Leído 2561 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« en: 08 de Diciembre de 2015, 14:53:43 »
//Mas o menos quiero hacer lo que indica el grafico adjunto
//Por mas que miro solo me encuentro con graficos El codigo que e intentado modificar a partir de Arduino...
#define SCK PIN.CO
#define MOSI PIN.C1
#define MISO PIN.C2
//...No sirve CCS entiende SCK como una variable cualquiera que no tiene que ver nada con SPI podria ser
//SCFHK y da lo mismo Lo mismo ocurre con todo lo demas

#define SS1 SS2//me gustaria mediante flanco alto 1

Ocurre lo mismo en "slave" como se invoca exactamente a esto
Opciones en modo slave:
01 01    -> No se usa SS                                   
01 00    -> Se usa SS

Me interesa tambien que un micro en un momento dado sea neutro ni_rw-ni_rs sus 3 o mas pines de comunicacion
no deben influir sobre los demas

Si esto no es "standar" agradeceria un ejemplo de codigo a partir de 16f877 o 18f452

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #1 en: 08 de Diciembre de 2015, 15:33:13 »
Los PIC no tienen para varios "Chip Select" CS, si para uno solo si es que lo necesita el integrado a conectar,para varios podes usar varios pines comunes, y cuando queres transmitir de cada uno activas/desactivas. Obviamente como maestro.

Si queres comunicarte con el dispositivo 1, pones a 0 esa salida (CS1) y te comunicas, si ahora te queres comunicar con el 2do, pones a 0 la del 2do dispositivo (CS2) y las demas en 1 (CS1 y CS3). Y listo ahi tenes lo que queres hacer.

CS o SS como sea.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #2 en: 09 de Diciembre de 2015, 07:13:14 »
Humn Me e quedado igual segun el compilador si se puede esto es lo que hace:
#USE SPI (MASTER, CLK=PIN_C0, DI=PIN_C1, DO=PIN_C2, MODE=0, BITS=8, STREAM=SPI_1)//seleccion C 0 1 2
Simplemente esto se hacerlo funcionar y hago lo primero que vi

MASTER=1; set_tris_c(208); delay_ms(2);// 1101 0000 /// "C5_S C4_E C3_S  01 0"
setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);

E hecho un pequeño programa con 3 micros comunicandose pero tengo que armar un follon a vase de puertas OR Y AND para que no interfieran los tres a lavec
Que hay de "spi(false)" poner esto por si solo no funciona

Respecto a las llamadas tengo pensado hacer lo adjunto A si con 3 pin podre elejir asta 7 sclavos
 - Adjunto no válido -

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #3 en: 09 de Diciembre de 2015, 07:24:25 »
Citar
Simplemente esto se hacerlo funcionar
Sorry Quise decir NO SE hacerlo
¿porque pesa tanto una fotografia? 594kb

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #4 en: 09 de Diciembre de 2015, 10:11:44 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #5 en: 09 de Diciembre de 2015, 12:03:48 »
Citar
Simplemente esto se hacerlo funcionar
Sorry Quise decir NO SE hacerlo
¿porque pesa tanto una fotografia? 594kb

Depende del formato en que este la imagen, hay formatos de imagenes sin perdidas y otros con perdidas, para favorecer el tamaño.

Citar
E hecho un pequeño programa con 3 micros comunicandose pero tengo que armar un follon a vase de puertas OR Y AND para que no interfieran los tres a lavec

Empecemos por eso... hasta ahora yo pensaba que eran 3 dispositivos nomas y solamente esclavos. Que queres coenctar? 3 microcontroladores ?

Si es asi tal ves te sea mejor un I2C mas que un SPI, a pesar que sea mas lento. De todas formas no entiendo en que lo vas a aplicar, asi que es complicado responderte algo.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #6 en: 09 de Diciembre de 2015, 18:19:11 »
Solo e leido sobre SPI     IC2 ni RS232 idea que ventajas tienen sobre spi

Se trata de un juego que juega solo emular las ametralladoras pesadas de Aliens 2
2 torretas 2 micros en vec de utilizar un sensor de prosimidad 1 micro hace de sensor pone de manera aleatoria o programada las nuevas posiciones y el avance de estas la conversion rs-rw es necesaria Si a tantos impactos se derriva el objetivo torreta debe comunicarselo a micro-sensor para que este deje de simular su avance Todo esta muy verde solo estan las opciones de configuracion de juego

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #7 en: 09 de Diciembre de 2015, 20:02:21 »
Seguis sin decir mucho, pero por lo que me has dicho hasta el momento creo que no sabes exactamente que queres hacer, o al menos no tenes idea de como realizarlo (implementarlo). Primero debes entender como funcionan cada uno de las formas de comunicacion que tenes, y de alli tomar una decision sobre que es mejor usar antes de encerrarte en un solo protocolo/formato.

Te sugiero que veas las demas opciones, I2C vas a tener una direccion y solamente vas a necesitar de 2 cables para varios dispositivos, nada de CS (SS) para la seleccion, la UART te da la ventaja de unir 2 dispositivos en modo full-duplex lo cual no hay necesidad de que exista un "maestro" y un "esclavo", sino que ambos pueden enviar cuando se les ocurra al igual que si usas la UART para RS232. Si usas la UART para un RS485 ( preparado para varios dispostivos ) ahi vas a tener que implementar si un protocolo de maestro/esclavo por software.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #8 en: 10 de Diciembre de 2015, 08:46:08 »
De empezar a leer parece que es esto lo que quiero
Citar
la UART para un RS485 ( preparado para varios dispostivos )
pero de nuevo ¿que ventajas tiene que me pierdo? spi se supone que tambien puede hacerlo (los graficos que encuentro sobre el son magnificos (pena de ausencia de codigo)) y no puedo decir que lo domine

Por decirte mas esto es lo que no funciona ahora mismo trato de enviar 10 posiciones pero estoy liando la distancia con el numero de posicion. Se supone que los aliens pueden aparecer entre 0 a 200 ubicaciones

Código: [Seleccionar]
void alea(){
unsigned int16 otra;
int1 sal=0,nu=0;
resejuego();  lcd_putc("\fdentro");//
dt8=elcons; //float constancia[8]={3,6,10,15,20,25,30,35};// jaleo cons=7 = constancia[7]=35/10--->3.5 cons=8---->cons-=4;
if (elcons>7) { dt8-=4; otra=dt8*1000; } else { otra=constancia[dt8]*100; }
//int1 lateral=0;   int1 lesion=0;
//int1 obj[200];   int8 velini=7;   int8 veloz[200];//1   int8 vitini=4;   int8 vital[200];
//int16 dis[200];//3//distancia 400 a 0
peti=1; lcd_gotoxy(1,1);
do{
lcd_gotoxy(1,1);
if (nu>0){ // nu=1;//si ya existen objetivos haclos avanzar
for(psz=1;nu>psz;psz++){
dt16=dis[dis[nu]];
//if(!lesi){
if(dt16>0) { dis[dis[nu]]=dis[dis[nu]]-velini;  }
//if(dis[nu]<1) { dis[psz]=dis[psz]-velini; }
//}//lesion=false objetivo siempre avanza a la misma velozcidad
dt16=dis[dis[nu]];
printf(lcd_putc,"A_%d/%ld ",psz,dt16);
//dt16=dis[psz];
}//for(nu)
}//si ya existen
if (nu<10){//NEW ALIEN no carges + de 10 aliens
for(con=0;10>con;con++){
psz = rand() % (101)+200;//new psz aleatoria entre 1-200
//obj[psz];
dt16=dis[psz];

if(dis[psz]<405){ sal=1; }//esta distancia-posicion ya esta ocupada NO VALIDA
else { sal=0; nu++; dis[psz]=400; break; }//break; }//distancia-posicion VALIDA inicial 400 final 0
}//for(con)
if(sal){ sal=0; lcd_gotoxy(15,2); printf(lcd_putc,"%d fallos ini-new-posicion",con); }

}//NEW ALIEN
//lcd_gotoxy(1,con);
//re(0,0,1);//RW a torret las distancia-posiciones                    //"co" contiene numero de posiciones
re2();//refresca posiciones peti=1-2 (transcurso de juego
lcd_gotoxy(31,2); printf(lcd_putc,"%ld Temp",otra); delay_ms(otra);//tiempo
}while(sal!=1);//de momento no debe salir de aqui
lcd_gotoxy(1,2); lcd_putc("ERROR");
}
void re2(){
//output_high(PIN_C2);//RW TRUE
falloMF=0; con=1; cont=1; //VJ=5;//LCD --->TORRET
for(co=1;nu>co;co++){//VJ
dt16=dis[co]; if(dt16<405){ lcd_gotoxy(con,cont); //existe
if(dt16==400){ lcd_putc("NEW"); con+=4; }//NEW ALIEN
printf(lcd_putc,"A_%d/%ld",co,dt16); con+=8; if(con>40) { con=1; cont++; }
spi_write(dt16);  protMaster(); //RW a torret las distancia-posiciones                    //"co" contiene numero de posiciones
} } //VJ=0;//LCD//LCD --->TORRET
//output_low(PIN_C2);//RW FALSE
}
void resejuego(){
for(dt16=0;200>dt16;dt16++){
//obj[dt16]=1;
dis[dt16]=410; //se supone q no existen en distancia superior>400
} }

Creo que una forma de arreglarlo facil seria esta:
for(co=0;200>co;co++){
if(dis[co]<405){ (existe-manipular) } }
//pero seria muy lento hacerle comprobar las 200 posiciones
//Lo que quiero es que lea solo las 10 "existentes"(quizas mas ya veremos segun el speed-comunica)

Hoy ya no voy a hacer nada pero mañana le dedicare el dia

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #9 en: 10 de Diciembre de 2015, 09:26:14 »
De empezar a leer parece que es esto lo que quiero
Citar
la UART para un RS485 ( preparado para varios dispostivos )
pero de nuevo ¿que ventajas tiene que me pierdo? spi se supone que tambien puede hacerlo (los graficos que encuentro sobre el son magnificos (pena de ausencia de codigo)) y no puedo decir que lo domine

No todo es facil, no todo es simple, para implementar un RS485 vas a tener que poner unos transceiver, si no me equioco MAX485 es uno de ellos, y ademas vas a tener que implementar el protocolo para comunicarse con los mismos, ya qeu vas a poder enviar o recibir. no al mismo tiempo.
Cuando me refiero a protocolo, me refiero a que debes enviar una palabra primero para que todos escuchen + crear una direccion para cada dispositivo, ( es decir enviar otro byte mas) luego esperar o no que responda segun lo enviado etc. Ano ser que implementes un full-duplex RS 485, pero el costo serua un poco  alto

I2C es mas simple, se aplica el mismo principio, nomas que ahora el bus esta implementado de tal forma que podes conectar a todos sobre el mismo bus, por que son todas salidas colector abierto, ademas tenes ya tenes una implementacion de direccion para cada dispositivo, es decir lo mismo que antes pero ya todo incorporado, lo cual tu maestro enviaria la direccion y el dato, y en tu esclavo ( con la direccion correcta) recibiria el dato, los demas lo descartarian. Si las distancias no son muy grandes y no hay demasiado ruido creo que es lo mas viable, por eso te lo ofreci como alternativa, obviamente por tener 2 hilos nomas, poder conectar multiples dispositivos, y la unica desventaja que es de 1 sentido como el RS485 half-duplex.


Si deseas saber mas sobre I2C hay info en google
https://es.wikipedia.org/wiki/I%C2%B2C
http://robots-argentina.com.ar/Comunicacion_busI2C.htm

Tambien estan dando vueltas las specificaciones de NXP
http://www.nxp.com/documents/user_manual/UM10204.pdf


SPI podes usarlo, de la misma forma que dije al comienzo del tema. Usa salidas digitales para simplemente activar un micro y poder enviarle los datos, nada mas. Es todo el trabajo que tenes que hacer. Pero vas a tener que pensar que para recibir con el SPI el maestro debe enviar.

------------------------------------------

Respecto al codigo, no puedo. No se que estas haciendo ni que estas tratando de hacer, ni que son las variables.
Luego de ver el codigo si no mal recuerdo, eras vos el que tenias problemas con la interrupcion/main y que proponia un reset en cada vuelta, en el cual era imposible leer el codigo, al menos para mi. Esto esta en el mismo nivel que el anterior.

Lo que si puedo es tratar de ayudarte aca:

Citar
Creo que una forma de arreglarlo facil seria esta:
for(co=0;200>co;co++){
if(dis[co]<405){ (existe-manipular) } }
//pero seria muy lento hacerle comprobar las 200 posiciones
//Lo que quiero es que lea solo las 10 "existentes"(quizas mas ya veremos segun el speed-comunica)

El tema esta en que no se exactamente cuales son los "existentes", si no sabes a ciencia cierta de antemano cuales son, entonces no existe otra forma de hacerlo.
Si supongamos "creas" tus "existentes" y guardas la posicion en otro array de 10 lugares, entonces ahi es mas facil saber cuales son y no tenes que pasar por todos.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #10 en: 11 de Diciembre de 2015, 18:16:53 »
Bueno el problema de las paginas mencionadas Es que cuando no estan hablando en chino para mi, no importa que entienda ciertas cosas, solo son graficos. Inicial Se lo que significan los pines pero no veo como declararlos Si si mandas un dato de 8bits siempre hay mas de 8 por medio para que el otro sepa cuando es el inicio y el fin de este. Entiendo pero no se como controlarlo. Estaria bien porque a veces solo quiero enviar 1 bit Y estoy metiendo encima algo que igual no necesito una funcion de envio protocolomaster() a parte que utilizo para ello 2 pins adicionales en cada micro a parte de los 3 del spi

distancia
  • Se refiere a la deteccion de esta que actua a partir del valor 400 a 0 segun se hacerque lo que sea, si vale 410 se supone que no existe nada por medio y 0 los tienes encima

esto parece resolver algo las cosas posicion
  • esta entre 0 y 100 ahora


No e tocado el spi en realidad y me a pasado algo que no e visto venir hay un dato yamado constancia contiene el numero de delays(constancia) para que aparezcan los bichos el problema es que repercute en la veloccidad que se desplazan ellos al decrementar distancia[posicion
  • ]-=veloz; dentro de la misma funcion, entre mas vaja es el delay tanbien es el desplazamientodesplazamiento (a menos delays(constancia) el dato veloz tambien debe diminuir o algo a si) Y luego esta esto
Código: [Seleccionar]
if (nu<7){//NEW ALIEN no carges + de 7 aliens
//Esta es la manera que tiene de cargarlo no mas de 7 No puedo controlar mas y es muy champuzera la informacion en un //lcd16x2 esto no esta hecho para videojuegos precisamente
for(con=0;10>con;con++){
// rand()%(101)+100;//Numero aleatorio entre 100 y 200
psz[nu] = rand() % 101; //0-100

if(dis[psz[nu]]<405){ //DISTANCIA [ POSICION [ NUMERO ] ];
sal=1; 
}//esta posicion ya esta ocupada NO VALIDA
else {
sal=0;
dis[psz[nu]]=400;
if(nu>6){ nu=7; } else { nu++; }
break; } }//distancia-posicion VALIDA inicial 400 final 0
}//for(con)
}
El problema no esta en enviarlo. Es que no es limpio. Si me cargo al alien de la posicion[3]; no es valido decrementar nu-de-numero iria a cargar posicon[6] Lo que se me ocurre poner distancia[posicion[3]]=410; no va avaler, pasar 4 a3 5a4 6a5 es muy lento

Buen finde

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #11 en: 11 de Diciembre de 2015, 18:51:04 »
Asi como para vos eso es chino basico, para mi lo es tu programa. No se siquiera de que es el programa, por eso no me meti con ello, no se que hace, por mas que me intentas explicarlo sacas de la galera, cosas como constancia, velocidad de los bichos, alien, etc que no se que es, que debe hacer etc. Estoy perdido totalmente ya que no se cual es el objetivo final de tu codigo ni tengo una idea inicial, ni una imagen en mi cabeza para guiarme de que estas intentnado hacer, no se que usas para X cosa, o como manejas Y dato. De un momento para otro apareciste con un codigo y hablandome como si hubieramos trabajado juntos en ese codigo por mucho tiempo y conociera exactamente todo lo que hace, debe hacer y demas.

Respecto a la comunicacion. Te dejaste mas de la mitad de los datos cuando hiciste la pregunta. Pero esto es por que no conoces como funciona un SPI parece. Entonces no sabes como realizarlo. Como dije faltaron MUCHOS datos, yo asumi que era una comunicacion bi-direccional, por lo tanto es un tanto molesto con el SPI. Con lo ultimo que dijiste pense que solo de 1 micro querias enviar

Asi que si solo vas a enviar de 1 micro, y los demas lo unico que van a hacer es recibir. entonces podes hacerlo facilmente con el SPI. Te lo dije antes pero lo vuelvo a repetir.

Maestro, simple sin SS, envias unicamente, 3 pines digitales ( 1 por cada SS de los demas micros ) para identificar a quien se lo envias, pones el pin a 0 el que necesitas que reciba y los demas a 1. Asi de simple.
Esclavo, con SS, recibis unicamente, nada mas.
El valor minimo a enviar es de 1 byte.

Si ahora necesitas que el Esclavo "responda" ya ahi se complica poco o mucho mas la cosa.
Sinceramente no se por que necesitarias 4 microcontroladores ( creo que es eso lo que estas usando ), a no ser que sea modular, sinceramente es un gasto de material y complicacion del trabajo estupendo.

Respecto al codigo, te sugeriría que comences a ver exactamente como funciona un SPI, un I2C, UART (estos 2 ultimos opcionales), si es que realmente queres llegar a hacer algo y no pensar mas en cosas como esta:
Citar
Que hay de "spi(false)" poner esto por si solo no funciona
Por que eso es simplemente escribir algo que uno no tiene ni idea de lo que hace rogando que funcione. Si supieras bien como funciona el SPI hubieras entendido el grafico que pasaste de entrada. Asi que esa es mi honesta respuesta hacia vos. Lo unico que te falta es leer. Los graficos son muy lindos, pero muchas veces no alcanzan para entender perfectamente como funciona. Sin ir mas lejos tenes como funciona el SPI en el datasheet del micro. Y tal ves todo esto es culpa de CCS y sus funciones pre-armadas el que evitan que pongas mano sobre el datasheet y aprendas realmente sobre el hardware.

Todo esto va a depender unicamente de vos. Sobre el manejo del SPI lo unico que faltaria es que te pase el codigo totalmente realizado, el cual yo no uso CCS ( lo odio ) y ademas no vas a aprender para nada. Y apenas se presente un cambio. Vas a tener problemas por no saber resolverlo.
« Última modificación: 11 de Diciembre de 2015, 19:00:31 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Ayuda en SPI declarar-definir SCK MOSI MISO SS (varios micros)
« Respuesta #12 en: 12 de Diciembre de 2015, 16:40:24 »
Si es una putada no volver a tener un cerbro de 24 years. Solo te e querido comentar la parte del codigo que va mal. Me queda mucho pero no todo va mal. incluso mi respuesta anterior esta mal. Sin haber hecho nada hoy ahora me doy cuenta que no puedo hacer esto  dis[4]=dis[3]; dis[5]=dis[4]; dis[6]=dis[5];///todos los dis
  • serian igual a dis[3]

Mas bien seria:
dis[3]=dis[4]; dis[4]=dis[5]; dis[5]=dis[6];///Es difuso lento pero almacena bien las posiciones. No te pido que mires el resto
Si e oido algo de que ccs esta obsoleto respecto a d18 y otros, pero que tambien es el mas simple, cosa combeniente para mi.
No es que lo odie ni es dibertido Pero si es entretenido en un momento dado


 

anything