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