sábado, 17 de diciembre de 2011

Comunicación serie SPI Maestro esclavo


Muy buenas a todos, en esta entrada os voy a enseñar como comunicar dos pics, en este caso 18f4550 ambos. El objetivo de la práctica será mostrar en un display BCD 7 segmentos, mi nombre, en este caso abreviado (“Gabi”), codificado en hexadecimal.
Para que lo entendáis cuando veais las letras os mostraré esto.
HEXADECIMAL:                                              
7D                                          G           
77                                          a
7C                                          b
06                                          i
Esta es la información que el primer PIC (maestro) enviará al segundo PIC (esclavo), mediante un bus SPI.
Este sería más o menos el esquema en proteus.


Las características de la comunicación entre pics mediante el SPI:
-Existe un PIC que envía información (Maestro) y otro que la recibe (esclavo).
-El sistema de comunicación en serie del spi permite que la información se transmita y se reciba de manera síncrona, es decir, con señales de reloj, datos de 8 bits.
-El bus tiene 4 conexiones.
                SDO – Serial data output – Salida serie de datos.
                SDI – Serial data imput – Entrada serie de datos.
                SCK – Serial clock – Reloj
                SS – Slave select – Selección de esclavo.
-Importante, aunque en este caso exista un pic maestro y otro esclavo, esto no quiere decir que uno tenga peores características que el otro, ambos son exactamente iguales y en otro tipo de comuniaciones, ambos pueden ser maestros y esclavos. Es decir, el esclavo tiene también la capacidad de dar, no sólo de recibir.

Proceso:
El proceso es muy elemental. Tenemos un reloj, el cual cada vez que da un pulso, transmite un bit, cuando adquiere los 8 bits se envía un dato. Y así con todas las letras. En este caso 4.
Las partes del esquemático:
En primer lugar los dos pics, maestro (izq) y esclavo (der)


Un display BCD 7 segmentos de cátodo común con resistencias  de 100 ohms.



Un reset



Y por último el bus SPI con sus respectivos conexionados.






Además de esto tenemos que tener obviamente, nuestros pics programados. El esclavo estará programado para mandar, mientras que el esclavo lo estará para recibir.
Programación del maestro:

////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Gabriel Allende                                            diciembre/2011
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Comunicación SPI entre maestro esclavo(MAESTRO)                      VERSIÓN: 1.0  
//   DISPOSITIVO: PIC 18F4550                                                   COMPILADOR:    CCSC
//   Entorno IDE: MPLAB                                                         SIMULADOR:    Proteus 7.7
//   TARJETA DE APLICACIÓN:                                                        DEBUGGER:    ICD3

/////////////////////////////////////////////////////////////////////////////////                            
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//       
//       
// Programa para comunicar dos microcontroladores con el bus SPI(Maestro)
////////////////////////////////////////////////////////////////////////////////////
 #include
 #fuses INTHS                     //Selecciona el oscilador interno
 #use delay(internal=4000000)        //programar el oscilador del pic a 4MHZ
///////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES                                                            //
///////////////////////////////////////////////////////////////////////////////////
char taBCD[]=0b1111101,0b1110111,0b1111100,0b0000110; // G, A ,B,I
int dato;    //variable entera que sirve para que , al incrementar, vaya variando el dato.
///////////////////////////////////////////////////////////////////////////////////


void main()

{
    setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);

    for(;;)
    {
        for(dato=0;dato<4;dato++)
            {


                spi_write(taBCD[dato]);
                delay_ms(1000);
            }
        dato=0;
    }
}


Ignorad un poco la parte superior con las barras, estoy usando simplemente una plantilla para organizarme mejor, al final acaba siendo más ordenado, sobre todo  para programas grandes.

Programa del esclavo:


////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Gabriel Allende                                             diciembre/2011
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Comunicación SPI en serie Maestro esclavo (esclavo)               VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                           COMPILADOR:    CCSc
//   Entorno IDE: MPLAB                                 SIMULADOR:    Proteus 7.7
//   TARJETA DE APLICACIÓN: ___                         DEBUGGER:    ICD3

/////////////////////////////////////////////////////////////////////////////////                            
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//       
//  Comunicar dos microcontroladores mediante el Bus SPI (esclavo)    
////////////////////////////////////////////////////////////////////////////////////
 #include
 #fuses INTHS                     //Selecciona el oscilador interno
 #use delay(internal=4000000)        //poner el escilador del pic a 4 MHZ
///////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES                                                            //
///////////////////////////////////////////////////////////////////////////////////
char taBCD[]=0b011100,0b0111000,0b011100,0b011100,0b011100,0b011100,0b011100,0b011100,0b011100,0b011100;
int dato;
///////////////////////////////////////////////////////////////////////////////////


void main()
{
 setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16| SPI_XMIT_L_TO_H);

for(;;)
 {
 if(spi_data_is_in())
 {                                 // Esto sirve para detectar que hay o no un dato en el SPI al leer.         
 OUTPUT_D(spi_read());
}

}
}

Y por último la simulación


. Espero que os halla servido de algo, un saludo!



1 comentario:

  1. Hola. Este circuito se puede construir en físico así como estas? No es necesario adaptarle un cristal de cuarzo u otras cosas mas?

    ResponderEliminar