23 may 2011

COMUNICACIÓN ENTRE UN PIC18F4550 Y UNA MEMORIA EEPROM MEDIANTE SPI



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:




Aquí os dejo un enlace para que podáis descargar el programa y el datasheet de la EEPROM: http://cid-64f7131e50857260.office.live.com/self.aspx/EEPROM/EEPROM.rar










1 comentarios:

Anónimo dijo...

Hola, muy buen post.

Las conexiones tienes que ser asi:

PIC--EEPROM
B0--SDI
B1--SCK
C3--SDO
A0--CS

Lo que pasa es que tengo conectado un LCD al Puerto B.. pero lo tengo que mover obligadamente, verdad??

Publicar un comentario

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes Powered by Blogger | DSW printable coupons