En este ejercicio vamos a comunicar dos PIC18F4550, utilizando el bus SPI (Serial Peripheral Interface).
Como en el ejercicio anterior vamos a utilizar el CCS C para programar y compilar en C y el Proteus 7.7 sp2 para simular el circuito. Finalmente usaremos el Ares para diseñar el pcb y ver como quedaría finalmente.
En este caso existen dos PIC´s, por lo que tendrá que haber dos progrmas distintos, uno para cada pic. El primero actuará como maestro que se encargará de mandar un dato al otro pic, el esclavo que leerá el dato.
En la imagen se ve como en el primer pic (maestro) hay un switch y en el segundo (esclavo) hay un diodo led rojo, el otro símplemente es de prueba. Cuando el switch está activado se enciende el led, por lo que está habiendo una comunicación entre pic´s.
El código del maestro, en el que configuro el pic como maestro para el uso del SPI y escribo en un pin:
/////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Diego Lavín Febrero/2011
/////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Comunicación entre PICs VERSIÓN: 1.0
// DISPOSITIVO: PIC18F4550 COMPILADOR: CCS vs4.93
// Entorno IDE: SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: DEBUGGER:
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//Comunicar 2 PICs 18F4550 utilizando el protocolo SPI. Cuando hay un "1" lógico
//en el pin ra1 se enciende un diodo led.
//
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//CABECERA///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
#include < 18f4550.h> //pic a utilizar
#fuses inths //oscilador interno
#use delay(internal=8Mhz) //frecuencia del oscilador
/////////////////////////////////////////////////////////////////////////////////////
//VARIABLES GLOBALES////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//FUNCIONES/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//PRINCIPAL/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void main( )
{
setup_spi(spi_master | spi_l_to_h | spi_clk_div_16); //configurar spi como maestro
while(1)
{
// spi_write(input(pin_a0)); //escribir en el pin ra0
spi_write(input(pin_a1)); //escribir en el pin ra1
delay_ms(1000);
}
}
Código del esclavo, aquí configuro el pic como esclavo y leo continuamente si hay dato en el SPI y si le hay que active el puerto c como salida:
/////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Diego Lavín Febrero/2011
/////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Comunicación entre PICs VERSIÓN: 1.0
// DISPOSITIVO: PIC18F4550 COMPILADOR: CCS vs4.93
// Entorno IDE: SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: DEBUGGER:
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//Comunicar 2 PICs 18F4550 utilizando el protocolo SPI. Cuando hay un "1" lógico
//en el pin ra1 se enciende un diodo led.
//
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//CABECERA///////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
#include < 18f4550.h> //pic a utilizar
#fuses inths //oscilador interno
#use delay(internal=8Mhz) //frecuencia del oscilador
/////////////////////////////////////////////////////////////////////////////////////
//VARIABLES GLOBALES////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//FUNCIONES/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//PRINCIPAL/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
void main()
{
setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16); //configurar spi como esclavo
for(;;)
{
if(spi_data_is_in()) //si hay un dato en el spi
{
//output_d(spi_read());
output_c(spi_read());
}
}
}
Vista en Ares y como dije anteriormente cuidado con los packages de los componentes porque pueden faltar al no haber sido asignados en el Proteus o porque no existe package de ese componente:
3D:
DESCARGA EL EJERCICIO
3 comentarios:
El archivo de ejemplo no esta disponible u.u
Disculpe amigo podria subir de nuevo el archivo le agradeceria mucho
Publicar un comentario