viernes, 9 de diciembre de 2011

SPI maestro esclavo con PIC´s 18F4550



Mostraremos el código hexadecimal en un display de 7 segmentos a través del bus serie SPI. Conectaremos dos PIC18F4550, un hará de maestro y el otro de esclavo.
Descargar documentos.


Características:

Comunicación serie SPI:
Permite la transmisión y recepción síncrona simultánea de datos de 8 bits.
Para la comunicación debe existir un dispositivo Maestro (genera la señal de reloj) y uno ó varios esclavos (reciben la señal de reloj).
El bus consta de tres pin y un cuarto cuando el PIC trabaja a modo de esclavo:
 - Salida Serie de Datos (SDO) Serial Data Output.
 - Entrada Serie de Datos (SDI) Serial Data Input.
 - Reloj de comunicación Serie (SCK) Serial Clock.
 - Selección de Esclavo (SS) Slave Select.
Los bits se van transmitiendo con cada pulso de reloj, al transmitir 8 bits, se envía un dato. El maestro también recibe los datos del esclavo:



Diseño del esquemático:

- Conectaremos dos PIC18F4550 a través del bus SPI. Uno a modo de maestro y otro esclavo. La salida de datos del maestro (SDO) irá conectado a la entrada de datos del esclavo (SDI). Y la entrada de datos del maestro con la salida del esclavo. Los relojes de comunicación del bus irán conectados.
Como vamos a utilizar el reloj interno, no le añadiremos un cristal externo.


- Utilizaremos un pulsador con un circuito RC a modo de reset.


- Conectaremos un display 7 segmentos de cátodo común al puerto D del PIC con sus resistencias de 330 Ohm.


- Utilizaremos el depurador SPI para depurar el programa.



Código:

Maestro:

////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Daniel de Cos                                       Noviembre/2011    //
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Maestro-esclavo                       VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                           COMPILADOR:    CCS vs4.023
//   Entorno IDE: MPLAB ID v8.56                        SIMULADOR:    Proteus 7.7 sp2
//   TARJETA DE APLICACIÓN:  -------                    DEBUGGER:   ----
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// A través del bus SPI mostramos el código hexadecimal en un display              //
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

#include <C:\H\18F4550.h>
#FUSES INTHS    //reloj interno     
//#FUSES HS     //reloj de alta velocidad
#FUSES MCLR    //Master clear pin enable
//#use delay(clock=20000000)  //20MHz
#use delay(internal= 4Mhz)   // Selecciona la velocidad del oscilador interno

////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

int i;
int display[16]= {0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111, 0b1110111, 0b1111100, 0b0111001, 0b1011110, 0b1111001, 0b1110001};
  
////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

  

////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
   setup_spi(spi_master | spi_l_to_h | spi_clk_div_16); //Configuración SPI
  
   while(1){
      for(i= 0; i< 16; i++){
         spi_write(display[i]);      //Escribimos los números que se mostrarán por el display
              delay_ms(1000);
         }
      }
}


Esclavo:

////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Daniel de Cos                                       Noviembre/2011    //
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Maestro-esclavo                       VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                           COMPILADOR:    CCS vs4.023
//   Entorno IDE: MPLAB ID v8.56                        SIMULADOR:    Proteus 7.7 sp2
//   TARJETA DE APLICACIÓN:  -------                    DEBUGGER:   ----
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

#include <C:\H\18F4550.h>
#FUSES INTHS    //reloj interno     
//#FUSES HS     //reloj de alta velocidad
#FUSES MCLR    //Master clear pin enable
//#use delay(clock=20000000)  //20MHz
#use delay(internal=1Mhz)   // Selecciona la velocidad del oscilador interno

////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

  

////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
   setup_spi(spi_slave | spi_L_to_H | spi_clk_div_16);  //configuración SPI
  
   while(1){
      if(spi_data_is_in())     //leemos el bus SPI si tiene información
         output_D(spi_read());   //Mostramos el contenido del bus en el display (puerto D)
   }
}


Simulación:

No hay comentarios:

Publicar un comentario