Inicio > PIC > Comunicacion entre un PIC18f4550 y una memoria EEPROM 25LC020A mediante el protocolo SPI

Comunicacion entre un PIC18f4550 y una memoria EEPROM 25LC020A mediante el protocolo SPI

En este ejercicio vamos a leer y escribir datos en una memoria EEprom 25LC020A que trabaja mediante el bus  SPI y los vamos a programar atreves del PIC18f4550.

Para acceder al dispositivo es necesario hacerlo mediante el bus SPI. Las señales requeridas son de una entrada de reloj (SCK), ademas de los datos de entrada (SI) y los datos de salida (SO) y para acceder al dispositivo se controla mediante el pin de selección (CS).

Diagrama de bloques

Lo primer es escribir el codigo fuente del programa en lenguaje c para PIC’s. El microcontrolador estara programado como Master cuando use el protocolo SPI. Vamos a comenzar escribiendo, que en mi caso los valores que voy a escribir seran 4 datos “0,1,2,3” esto quiere decir que desde el valor 0x00 hasta 0x03 en hexadecimal. Esto tambien se va a ir mostrando en el LCD segun vaya escribiendo en la memoria y de la misma manera cuando termine de escribir pasaremos a leerlos y mostrarlos.

Conjunto de instrucciones

A continuacion el codigo fuente:


///////////////////////////////////////////////////////////////////////////////
//   AUTOR: Trujillo Alcocer Jesus Fernando                     Enero/2011
//////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:Escribir y Leer 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:                  DEBUGGER:
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//Ejercicio; Escribir en una EEPROM con un 18F4550 mediante el bus SPI

///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// CABECERA ///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#fuses INTHS//oscilador interno
#use delay(internal=8Mhz)//velocidad del oscilador
#include <LCD_flexible.c>
///////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES /////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
int a;
int p;
///////////////////////////////////////////////////////////////////////////////
// FUNCIONES //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
escribir()
{
 output_bit(pin_a0,1);        //Habilitar CS
 spi_write(0x06);           //Habilitar la escritura
 spi_write(0x02);           //Direcccion para configurar que vamos a escribir
 spi_write(0x00);           //Direccion de la memoria
 lcd_putc("     Escribe");
 lcd_gotoxy(1,0);
 for(a=0;a<4;a++)
 {                                //escribir el dato del 0×00 al 0×07
 spi_write(a);               //escribir en e SPI el valor de dato
 printf(lcd_putc,"%u",a);   //escribir en el LCD el valor de dato
 delay_ms(500);                 //esperar 500 milisegundos
 }
}

leer()
{
 output_high(pin_a0);      //Deshabilitar CS
 delay_ms(1000);           //esperar 1 segundo
 lcd_putc("\f");         //escribir en la siguiente linea del LCD L (lectura)
 delay_ms(300);
 lcd_putc("       Lee");
 lcd_gotoxy(1,0);
 output_low(PIN_A0);       //HABILITO CS
 spi_read(0x03);           //CONFIGURAR OPERACION ESCRITURA
 spi_read(0x00);           //1ª DIRECCION QUE QUEREMOS LEER
 for(p=0;p<4;p++)
 {
 a=(spi_read(p));      //LEE de la direccion 0×00 hasta la 0×09
 printf(lcd_putc,"%u",a);      //lo que lee lo mete en dato
 delay_ms(500);                   //y usando el arrai pintamos en el
 }                                   //display de 7 segmento por el puertoD
 output_high(PIN_A0);     //DESHABILITO CS
}
///////////////////////////////////////////////////////////////////////////////
// PRINCIPAL //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main()
{
 lcd_init();
 setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16);
 //ESCRITURA EN EEPROM
 output_bit(pin_A0,1);        //Habilitar CS
 spi_write(0x06);           //Habilitar la escritura
 spi_write(0x02);           //Direcccion para configurar que vamos a escribir
 spi_write(0x00);           //Direccion de la memoria
 delay_ms(300);
 escribir();
 leer();
 }

Una vez hecho el código el siguiente paso será diseñar el circuito en Proteus para poder simularlo y comprobar que funcione correctamente.

Una vez terminado el diseño con proteus, lo siguiente es pasar con Ares.  Colocamos los componentes y cuando tengamos definido las medidas con las que vamos a trabajar, que caras vamos a usar, que en nuestro caso solo seran dos, la top y la bottom; Una vez definido estos puntos solo nos quedaria hacer el autorutado de las pistas y ver como queda todo el diseño en 3D.

Anuncios
Categorías:PIC
  1. Aún no hay comentarios.
  1. No trackbacks yet.

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: