ELECTRONIC MEMORIES

EEPROM

Posted by discobolo100 en 15 abril, 2011

EEPROM

Finalidad del ejercicio: Conseguir manejar las instrucciones del bus spi para así poder escribir y leer en una EEPROM.

La EEPROM que vamos a utilizar es la 25LC020, que además está disponible en las librerías del entorno de Proteus. Para descargar el datasheet de la EEPROM hacer click Aquí.

Primero realicé un programa con ayuda de CS’S Compiler, he dejado bastantes comentarios que os pueden ayudar a la comprensión del código, así que no me hago mas de rogar y paso a mostrarlo.

Código:
////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Ismael Muriedas Abril / 2011 //
////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: EEPROM //
// DISPOSITIVO: PIC 18F4550 COMPILADOR: CCS 4.068 //
// Entorno IDE: SIMULADOR: ISIS Proteus 7.7 sp2 //
// TARJETA DE APLICACIÓN: VIRTUAL DEBUGGER: VIRTUAL //
////////////////////////////////////////////////////////////////////////////////////
// ENUNCIADO: Escribir y leer en una EEPROM ( 25LC020 ), mediante //
// mediante comunicación SPI. //
// Utilizando una serie de pulsadores, se puede controlar el valor //
// que se desea introducir en la eeprom; tambien se puede controlar//
// la dirección donde se quiere introducir los datos. //
// Para leer o escribir no hay mas que hacer clik en el pulsador de//
// escribir o el de leer para ejecutar la operación requerida //
////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include
#fuses INTHS //Sel el oscilador interno
#use delay(internal=8Mhz) // Selecciona la velocidad del oscilador interno
#include // Librería LCD.
////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

int direccion;
int valor;
int valor2;

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

void leer()
{
output_low(PIN_A0); // Subrutina de lectura
spi_read(0x03);
//spi_read(direccion);
//valor=spi_read(valor);
output_high(PIN_A0);
}
void lcd() // Subrutina LCD.
{
lcd_putc(“\f”);
printf(lcd_putc,”Direccion: %d”, direccion);
lcd_gotoxy(1,2);
printf(lcd_putc,”Dato: %d”, valor);
delay_ms(200);
}
void leer(); // Subrutina de lectura
void lcd(); // Subrutina displayar en LCD

////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

void main()
{
setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16| SPI_XMIT_L_TO_H); // Configuración SPI

lcd_init(); // Inicializo LCD
lcd_putc(‘\f’); // Borro pantalla
lcd_gotoxy(1,1); // Posiciono LCD en la fila 1 y la columna 1
valor2=0;
leer();
lcd();
while(true)
{
if(!input(PIN_A1)) // Si pulso incrementar
{
direccion++; // Incremento dirección
if(direccion==6)direccion=5; // Si la dirección llega al máx. lo limito (‘5’).
leer();
lcd();
}
if(!input(PIN_A2)) // Si pulso decrementar
{
direccion–; // Decremento dirección
if(direccion==-1)direccion=0; // Si dirección llega al mín. lo limito (‘0’).
leer();
lcd();
}
if(!input(PIN_A4)) // Si pulso decrementar
{
valor++; // Decremento dirección
leer();
lcd();
}
if(!input(PIN_A5)) // Si pulso decrementar
{
valor–; // Decremento dirección
leer();
lcd();
}
if(!input(PIN_A6)) // Si pulso decrementar
{ // Decremento dirección
output_low(PIN_A0); // Subrutina de lectura
spi_read(0x03);
spi_read(direccion);
valor=spi_read(direccion);
output_high(PIN_A0);
lcd();
}
if((valor>=10)||(valor {
valor=0;
lcd();
}
if(!input(PIN_A3)) // Si escribo
{
output_low(PIN_A0); // Habilito CS
spi_write(0x06); // Habilito escritura
output_high(PIN_A0); // Deshabilito CS
output_low(PIN_A0); // Habilito de nuevo la EEPROM
spi_write(0x02); // Configuro la operación de escritura.
spi_write(direccion); // Direcciono la escritura del dato
spi_write(valor); // Escribo el dato
output_high(PIN_A0); // Deshabilito CS
lcd();

}
}
}

Una vez hemos realizado el código lo suyo seria realizar el esquemático. Para el esquemático usaremos el entorno de proteus ya que es muy sencillo de usar, y a diferencia de otros programas, este permite simular los propios esquemáticos diseñados.

El esquemático es el siguiente:

Para que entendáis el funcionamiento del circuito, os pongo un video que mostrará el funcionamiento del esquemático y el programa que tiene integrado el pic18f4550.

Después de realizar el esquemático se ha de pasar a realizar el PCB del circuito para así poder ser llevado a una tarjeta de circuito impreso. Dejo una captura de pantalla del layaut del circuito.

Para descargar el ejercicio junto con las librerías actualizadas de proteus tenéis que hacer click en el siguiente enlace: http://cid-2d81d75b5f40e144.office.live.com/self.aspx/.Public/SPI/EEPROM/4.-%20EEPROM.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: