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;
}
}
// 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());
}
}
}
// 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!
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