ELECTRONIC MEMORIES

Comunicación de dos pic’s 18f4550 en modo maestro-esclavo via SPI

Posted by discobolo100 en 15 marzo, 2011

Maestro-Esclavo

En esta entrada mostraré como comunicar dos pic’s 18f4550 mediante el bus SPI.

Realización del programa: Tenemos que saber que se requieren dos programas, en uno configuraremos el primer pic como maestro. Ademas decidí que en el programa del maestro mandase por el bus SPI un O ó un 1 dependiendo de si tenemos pulsado o no el interruptor que esta asociado al pin RA0. En el segundo programa lo que hacemos es configurar el segundo pic como esclavo de tal manera que esté leyendo continuamente el contenido del bus, cuando lea un O visualizara en un display un O, por el contrario si lo que lee es un 1 visualziará un 1 en el display.

Código del maestro:

///////////////////////////////////////////////////////////////////////////////
// AUTOR: Ismael Muriedas Saro 15-Marzo-2011
//////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Comunicacion SPI entre PIC’s VERSIÓN: 1.0
// DISPOSITIVO: PIC 18F4550 COMPILADOR: PCWHC Compiler v4,093
// Entorno IDE: SIMULADOR: Proteus 7.2 sp2
// TARJETA DE APLICACIÓN: DEBUGGER:
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/*Utilizar 2 PIC’s 18F4550. Comunicarlos entre ellos mediante el bus SPI.
El maestro
comprueba si la patilla RA0 esta a un 0 o a 1.Si esta a
1 escribe en el bus SPI que “f”(una varable) esta a 1; en casoaso de que tenga un 0
en RA0 dejara “f” a 0 y al igual que antes lo escribira por el bus SPI.
El esclavo
Si en el bus SPI haya un 0 escribira en un display de 7 segmentos catodo común un 0
encambio si lo que hay en el bus es un 1 escribirá un 1 en el display.*/
///////////////////////////////////////////////////////////////////////////////
#include <18f4550.h>
#fuses INTHS //Selecciona el oscilador interno
#use delay(internal=8Mhz) //poner el oscilador interno a 8Mhz
///////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES /////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
int1 f=0;

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

 

///////////////////////////////////////////////////////////////////////////////
// PRINCIPAL //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main()
{ //programar el pic como maestro
//que funcione de Bajo a Alto
//que tenga un relog con division de 16
setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);
spi_write(f=0); //escribe cuenta=0;
do{ //se ejecuta constantemente
if(INPUT(PIN_A0)){ //si hay un 1 logico en RA0
f=1; //escribe cuenta 1
spi_write(f);} //escribe el valor de cuenta en el SPI
else{ //si hay un 0 ligoc en RA0
f=0; //escribe cuenta 0
spi_write(f);} //escribe el valor de cuenta en el SPI
}while(true); //el bucle se repite continuamente
}

Seguidamente paso a mostraros el código del esclavo:

///////////////////////////////////////////////////////////////////////////////
// AUTOR: Ismael Muriedas Saro 15-Marzo-2011
//////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Comunicacion SPI entre PIC’s VERSIÓN: 1.0
// DISPOSITIVO: PIC 18F4550 COMPILADOR: PCWHC Compiler v4,093
// Entorno IDE: SIMULADOR: Proteus 7.2 sp2
// TARJETA DE APLICACIÓN: DEBUGGER:
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/*Utilizar 2 PIC’s 18F4550. Comunicarlos entre ellos mediante el bus SPI.
El maestro
comprueba si la patilla RA0 esta a un 0 o a 1.Si esta a
1 escribe en el bus SPI que “f”(una varable) esta a 1; en casoaso de que tenga un 0
en RA0 dejara “f” a 0 y al igual que antes lo escribira por el bus SPI.
El esclavo
Si en el bus SPI haya un 0 escribira en un display de 7 segmentos catodo común un 0
encambio si lo que hay en el bus es un 1 escribirá un 1 en el display.*/
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// CABECERA ///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#include <18f4550.h>
#fuses INTHS //Selecciona el oscilador interno
#use delay(internal=8Mhz) //poner el oscilador interno a 8Mhz

///////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES /////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
int a=0;

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

 

///////////////////////////////////////////////////////////////////////////////
// PRINCIPAL //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main()
{
//programar el PIC para que funcione como Esclavo
//que el relog tenga una division de 16
setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16| SPI_XMIT_L_TO_H);
output_bit(pin_A0,0); //inicializar la salida RA0, a un 0 logico
do{
if(spi_data_is_in()){ //si hay un dato entrante por el SPI
a=spi_read(); //numero es igual a lo que lee el SPI
if(a==1){ //si el a es un 1
output_bit(pin_A0,0);
output_bit(pin_A1,1);
output_bit(pin_A2,1);
output_bit(pin_A3,0);
output_bit(pin_c0,0);
output_bit(pin_A5,0);
output_bit(pin_A6,0);
}
else{
output_bit(pin_A0,1);
output_bit(pin_A1,1);
output_bit(pin_A2,1);
output_bit(pin_A3,1);
output_bit(pin_c0,1);
output_bit(pin_A5,1);
output_bit(pin_A6,0);
}
}
}
while(true); //el bucle se repite continuamente
}

Una vez tenemos realizado el código de ambos programas tenemos que pasar a Proteus. En P realizaremos el esquematico y la simulación de nuestro circuito,posteriormente con ayuda de ARES realizaremos el PCB del circuito.

El esquemático estará formado por dos pic’s 18f4550, un display cátodo común, una par de circuitos de reset para cada uno de los pic’s, una regleta de 2 para las alimentaciones y otra de 8 para el display(esta última la excluiré de la simulación debido a que nos da errores). Muestro una captura de pantalla de como quedaría el esquemático.

Para la simulación solo hay que dar al botón para comprobar si cuando se presiona sale un 1 en el display y cuando el interruptor esta abierto se muestra un O. Pongo un video que e realizado como aclaración.

Terminada la simulación pasamos a la realización del PCB con la herramienta que incluye proteus llamada  ARES, con esa herramienta ubicaremos los componentes y trazaremos las pistas tal y como quedaria en la realidad.

Dentro de ARES tenemos una opción llamada output 3D que se encuentra dentro del menú que sale en la parte superior del entorno en una pestaña llamada “Output” . Al dar a esa opción se nos despliega una ventana que nos muestra la placa que hemos realizado en 3 dimensiones, pongo las capturas de pantalla de la cara de los componentes(top) y la de las pistas(bottom) en 3D.

Para descargar el ejercicio hacer click en el siguiente enlace: http://cid-2d81d75b5f40e144.office.live.com/self.aspx/.Public/SPI/maestro^_esclavo.rar

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: