Autor Tema: Problema SPI (CCS)  (Leído 5512 veces)

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

Desconectado Elzar

  • PIC10
  • *
  • Mensajes: 5
Problema SPI (CCS)
« en: 20 de Junio de 2014, 11:59:32 »
¡¡Hola a todos!!

A ver si me podéis ayudar con esto =)

Estoy intentando hacer una comunicación mediante SPI entre diferentes PIC 16F877 pero estoy teniendo problemas.

Tengo un PIC que hace de maestro y 4 PICs que harán de esclavos. La idea es que los PIC esclavos envíen al maestro un mensaje de 7 Bytes, por ejemplo, 'MENSAJE', el PIC maestro lo lea, lo muestre por un LCD y envíe a los PIC esclavos otro mensaje también de 7 bytes ('HOLAAAA'). Este mensaje será transmitido por los PICs esclavos por un RS232 (uno por PIC).

El problema que tengo empieza ya en transmitir el mensaje ya que por lo que he visto las funciones de CCS spi_write() y spi_read() solo funcionan con bytes... así que ya no se como enviarlos =(

Para hacer la prueba he hecho un pequeño código con solo un maestro y un esclavo. A partir de ahí iré aumentandolo.

Os enseño lo que tengo hecho a ver como puedo solucionarlo.

Este sería el MAESTRO:
Código: [Seleccionar]
#include <16F877.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOWDT
#use RS232(XMIT=PIN_C6, RCV=PIN_C7, BAUD=9600, BITS=8) // Voy a utilizar un RS232 pero en realidad se mostraría por un LCD

void main() {

   setup_spi(spi_master |spi_l_to_h | spi_clk_div_16 );

   unsigned char dato;

   while(true){


         if(spi_data_is_in( )){
            dato = spi_read();

            printf("%c",dato);

        }
   }
}


Este el esclavo:

Código: [Seleccionar]
#include <16F877.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOWDT


void main() {

   setup_spi(spi_slave |spi_l_to_h | spi_clk_div_16 );

   unsigned char mensaje[8]={'M','E','N','S','A','J','E','\0'};
   unsigned int i=0;

   while(true){



   while(mensaje[i] != '\0'){
   spi_write(mensaje[i]);
   i++;
   }
  
   i=0;

   }
}





La verdad es que estoy hecho un lió, a ver si me podéis ayudar. Estaría muy agradecido =)

Muchas gracias a todos!!

Saludos ;)
« Última modificación: 20 de Junio de 2014, 12:07:16 por Elzar »

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: Problema SPI (CCS)
« Respuesta #1 en: 22 de Junio de 2014, 10:11:59 »
No sé muy bien lo que digo, pero cero que con los códigos que has colgado cada uno, tanto el maestro como el esclavo están a lo suyo sin prestar atención el uno al otro, supongo que tendrás un bit de estado que el esclavo detecte cuando un master hace una petición, lo único que te veo implementado en el esclavo es la función de esclavo en el spi pero nada que indique que cuando recibe una solicitud del maestro envíe el dato solicitado.
no sé al igual es un disparate lo que digo, mírate lo que dice el manual del ccs
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Elzar

  • PIC10
  • *
  • Mensajes: 5
Re: Problema SPI (CCS)
« Respuesta #2 en: 22 de Junio de 2014, 10:50:31 »
No sé muy bien lo que digo, pero cero que con los códigos que has colgado cada uno, tanto el maestro como el esclavo están a lo suyo sin prestar atención el uno al otro, supongo que tendrás un bit de estado que el esclavo detecte cuando un master hace una petición, lo único que te veo implementado en el esclavo es la función de esclavo en el spi pero nada que indique que cuando recibe una solicitud del maestro envíe el dato solicitado.
no sé al igual es un disparate lo que digo, mírate lo que dice el manual del ccs


Leyendo sobre el bus SPI vi que cuando tienes varios PIC de esclavo estos se controlan con el pin CS pero he buscado y en ningún lugar encuentro una implementación con varios PIC para ver como se hace.  :(

Por otro lado, si hay solo un esclavo (que es lo primero que quiero hacer para probar que funcione) no se como se puede gestionar, si con el mismo pin o con otra cosa.

El manual CCS lo he revisado bastantes veces pero no me queda claro como se implementa este tipo de comunicaciones solo sé que hay varias funciones spi_read, spi_write, spi_xfer, que unas funcionan con SPI por sofware y otras por hardware pero no se como gestionar que se lean o se envíen datos y menos aún cadenas de caracteres. Estoy en hecho un lío.  :(

Muchísimas gracias por contestar!  :wink:


A ver si alguien controla sobre el tema este de comunicaciones SPI con varios PIC y me pudiera ayudar.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: Problema SPI (CCS)
« Respuesta #3 en: 22 de Junio de 2014, 17:15:31 »
Yo he utilizado ese protocolo para leer un dato de un convertidor analógico digital de temperatura y para enviar cadenas largas lo que he tenido que hacer es separar la cadena en datos de 8 bits y juntarlas en el receptor y luego trabajar con ellas, es muy fácil.
te voy a pasar el proyecto que hice que es un horno de temperatura para soldadura smd pero el control es manual, he estado trabajando en el control automático pero por falta de tiempo no he seguido.
te paso el proyecto en CCS y con el simulador en proteus solo tienes que darle a run y estudiar el comportamiento, espero te ayude
esta subido al foro reballing en este enlace está la explicación y el archivo

http://www.reballing.es/viewtopic.php?f=58&t=1955

si tienes alguna duda pergunta
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Elzar

  • PIC10
  • *
  • Mensajes: 5
Re: Problema SPI (CCS)
« Respuesta #4 en: 22 de Junio de 2014, 18:11:04 »
Yo he utilizado ese protocolo para leer un dato de un convertidor analógico digital de temperatura y para enviar cadenas largas lo que he tenido que hacer es separar la cadena en datos de 8 bits y juntarlas en el receptor y luego trabajar con ellas, es muy fácil.
te voy a pasar el proyecto que hice que es un horno de temperatura para soldadura smd pero el control es manual, he estado trabajando en el control automático pero por falta de tiempo no he seguido.
te paso el proyecto en CCS y con el simulador en proteus solo tienes que darle a run y estudiar el comportamiento, espero te ayude
esta subido al foro reballing en este enlace está la explicación y el archivo

http://www.reballing.es/viewtopic.php?f=58&t=1955

si tienes alguna duda pergunta


Le he dado un vistazo rápido y creo que me va a servir mucho, además he visto que esta muy bien comentado.  ((:-))

De verdad, muchísimas gracias!

También he visto que el proyecto que tienes es con un esclavo y un maestro, ¿sabrías como se debería controlar de haber más esclavos?, me explico, leer los datos del esclavo1 y mostrarlos por un LCD, pasar a hacer lo mismo con el esclavo 2 y por último el esclavo3. Ese sería el segundo paso que debo realizar en mi proyecto.

De momento, mañana revisaré todo poco a poco y si tengo más dudas te comentaré.

Saludos y muchas gracias! ;)

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re: Problema SPI (CCS)
« Respuesta #5 en: 22 de Junio de 2014, 18:46:19 »
si claro, creo que si, con un pin del micro por cada esclavo, este protocolo funciona cuando el pin cs pasa del estado alto al bajo envía el dato o lo recibe, lo que tendrás es que hacer que cuando el maestro ponga el pin CS al estado bajo, esa línea llegue a un pin del esclavo que sera el pin CS también, envíe el dato y en el maestro que lea, ponle unos milisegundos para que no hayan colisiones ni nada y a ver que pasa.

 échale un vistazo a la simulación en proteus, aveces más vale una imagen que mil palabras

edito: me refiero que a los tres pines tanto el SCK, SI y S0 son comunes a todos y el CS es uno para cada esclavo, échale un vistazo al datasheet del micro que vas ha utilizar en la sección "MASTER SYNCHRONOUS SERIAL PORT (MSSP) MODULE", está la explicación del protocolo SPI
« Última modificación: 23 de Junio de 2014, 05:13:44 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Elzar

  • PIC10
  • *
  • Mensajes: 5
Re: Problema SPI (CCS)
« Respuesta #6 en: 23 de Junio de 2014, 05:08:29 »
si claro, creo que si, con un pin del micro por cada esclavo, este protocolo funciona cuando el pin cs pasa del estado alto al bajo envía el dato o lo recibe, lo que tendrás es que hacer que cuando el maestro ponga el pin CS al estado bajo, esa línea llegue a un pin del esclavo que sera el pin CS también, envíe el dato y en el maestro que lea, ponle unos milisegundos para que no hayan colisiones ni nada y a ver que pasa.

 échale un vistazo a la simulación en proteus, aveces más vale una imagen que mil palabras

edito: me refiero que a los tres pines tanto el SCK, SI y S0 son comunes a todos y el CS es uno para cada esclavo 

Ok! Me miro todo a ver. Primero probaré a enviar una cadena de 7 carácteres entre dos PIC (maestro y esclavo) y luego pasaré a probarlo con más PICs. Si tengo dudas te comento.  :mrgreen:

Saludos ;)

Desconectado ginnie

  • PIC10
  • *
  • Mensajes: 4
Re:Problema SPI (CCS)
« Respuesta #7 en: 13 de Enero de 2016, 18:46:35 »
Thulsa Doom, pude ver que para el horno utilizaste un max6675, yo estoy usando uno para un proyecto con un 18f4550 lo tengo conectado a los pines SO-D0,CS-D1 Y CSK-D3, y funciona bastante bien, pero no se si pueda leer dos max6675 en un mismo pic he estado buscando, espero me puedan ayudar.  :(

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema SPI (CCS)
« Respuesta #8 en: 13 de Enero de 2016, 19:50:26 »
Thulsa Doom, pude ver que para el horno utilizaste un max6675, yo estoy usando uno para un proyecto con un 18f4550 lo tengo conectado a los pines SO-D0,CS-D1 Y CSK-D3, y funciona bastante bien, pero no se si pueda leer dos max6675 en un mismo pic he estado buscando, espero me puedan ayudar.  :(

Si podes siempre y cuando tengas un CS para cada MAX. nomas que ahora el CS lo vas a tener que controlar vos con 2 pines cualquiera. Supongamos RB0 y RB1 para dar un ejemplo. RB0 para el 1er MAX y RB1 para el 2do.

Si queres enviar al 1er MAX,esperas que termine la transmision/recepcion si es que hay en curso, pones a 1 RB1 y a 0 RB0, y luego usas el SPI.
Si queres enviar al 2do MAX, esperas que termine la transmision/recepcion si es que hay en curso, pones a 0 RB1 y a 1 RB0, y luego usas el SPI.

Con SPI me refiero a solo 2 lineas es decir CLK y SD ( clock y datos sin CS ya que lo manejamos "manualmente" )
Y listo. Ya podes conectar ambos MAX a un mismo SPI

Desconectado ginnie

  • PIC10
  • *
  • Mensajes: 4
Re:Problema SPI (CCS)
« Respuesta #9 en: 13 de Enero de 2016, 22:02:41 »
Efectivamente como me comentaste puse el CS a dos pines diferentes y lo demás junto, funciona perfecto censando las dos temperaturas y mostrándolas en la LCD. Muchísimas gracias.

Desconectado w3-sistemas

  • PIC12
  • **
  • Mensajes: 89
Re:Problema SPI (CCS)
« Respuesta #10 en: 14 de Enero de 2016, 08:19:17 »
hola yo estoy solo transmitiendo por spi, pero para iluminacion
pero creo que lo que tendrias que ver es que todas las letras, simbolos y numeros, tienen un codigo asci, creo que se escribe asi, eso te da un codigo binario, sino como se transmitiria a una pantalla, fijate si transmitiendo cada codogo binario de cada letra es como solucionar el problema, saludos


 

anything