En este ejercicio realizaremos la lectura y escritura de una EEPROM mediante un módulo SPI y programando un PIC18f4550. La EEprom que utilizaremos es 25LC020.
Lo primero es realizar el código del programa para poder escribir y leer en la memoria EEPROM.
///////////////////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Clara Alonso Fernández Mayo/2011
//////////////////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA:Escritura y Lectura de una EEPROM con un SPI VERSIÓN: 1.0
// DISPOSITIVO: PIC 18F4550 COMPILADOR: PCWHC Compiler v4,093
// Entorno IDE: SIMULADOR: Proteus 7.6 sp0
// TARJETA DE APLICACIÓN: Virtual DEBUGGER:
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
//Ejercicio; Escribir en una EEPROM con un 18F4550 mediante el bus SPI
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// CABECERA //////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h> //PIC que se va a utilizar.
#fuses INTHS//oscilador interno //Configuración de los fusibles.
#use delay(internal=8Mhz) //Configuración de la velocidad del oscilador.
#include <LCD_flexible.c> //Librería del LCD.
/////////////////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES ///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
int a;
int p;
//////////////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
escribir()
{
output_bit(pin_a0,1); //Habilita la salida CS.
spi_write(0x06); //Con esta instrucción habilitamos la escritura en la EEPROM.
spi_write(0x02); //Dirección para configurar que vamos a escribir.
spi_write(0x00); //Dirección de la memoria.
lcd_putc("ESCITURA: ");
lcd_gotoxy(1,0);
for(a=0;a<5;a++)
{ //Configuración para escribir datos desde 0x00 hasta 0x07.
spi_write(a); //Escribe en el SPI el valor de los datos.
printf(lcd_putc,"%u",a); //Muestra en el LCD el valor de los datos.
delay_ms(500); //Retardo de 500 mseg.
}
}
leer()
{
output_high(pin_a0); //Deshabilita la salida CS.
delay_ms(1000); //Retardo de 1 seg.
lcd_putc("\f"); //Muestra en la segunda fila del LCD la palabra LECTURA.
delay_ms(300);
lcd_putc("LECTURA: ");
lcd_gotoxy(1,0);
output_low(PIN_A0); //Volvemos ha habilitar la salida CS.
spi_read(0x03); //Configurar la operación de escritura.
spi_read(0x00); //Dirección de lectura.
for(p=0;p<5;p++)
{
a=(spi_read(p)); //Lee de la direccion 0×00 hasta la 0×09.
printf(lcd_putc,"%u",a); //Lo muestra en el LCD.
delay_ms(500); //Retardo de 500 mseg.
}
output_high(PIN_A0); //Volvemos a deshabilitar la salida CS.
}
///////////////////////////////////////////////////////////////////////////////
// PRINCIPAL //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main()
{
lcd_init(); //Inicializa el LCD.
setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16);
//ESCRITURA EN EEPROM
output_bit(pin_A0,1); //Se vuelve ha habilitar CS.
spi_write(0x06); //Se habilitar la escritura.
spi_write(0x02); //Direcccion para configurar que vamos a escribir.
spi_write(0x00); //Direccion de la memoria donde se guarda.
delay_ms(300); //Retardo de 300 mseg.
escribir(); //Función de escritura.
leer(); //Función de lectura.
}
Después haremos el esquemático en el PROTEUS para poder simular su funcionamiento y realizar luego el diseño de la placa en el otro entorno de proteus, el ARES.
La siguiente imagen muestra la ventana donde se ve si la EEPROM tiene contenido escrito:
Una vez terminado el esquemático pasamos a realizar el diseño en ARE:
Con la siguiere imagen nos podemos hacer una idea bastante aproximada de cómo quedaría la placa en la realidad: