lunes, 26 de diciembre de 2011

SPI 2 Kbit serial EEPROM 25LC020



Voy a escribir mi nombre en la EEPROM 25LC020 a través del bus SPI. Leeré los datos escritos y los mostraré en el LCD alfanumérico 16x2. Utilizaremos el PIC18F4550.

Características:

EEPROM 25LC020:
Esta memoria no volátil esta organizada en 256 x 8 bit (2 Kbit).
El modo de escritura de página es de hasta 16 bytes.
Lectura secuencial.
La frecuencia máxima de trabajo es de 10MHz.
Tecnología CMOS de bajo consumo, 5mA para leer o escribir y 5uA en Standby.
Se accede a la memoria por medio del bus serie SPI.


Nos ayudaremos de la librería 25C040.c del CCSC, para hacer el programa. Esta librería no es de nuestra EEPROM, pero nos vale igualmente. Modifiqué su nombre y la llame: EEPROM_25LC020.C ya que me daba problemas de programación al contener números en al principio de su nombre.
También utilizaremos la librería personal de control del LCD alfanumérico.


Diseño del esquemático:

- El microcontrolador utilizado será el PIC18F4550, con un reloj externo de 20Mz y un pulsador con circuito R-C a modo de reset:


- Conectaremos la EEPROM de 2 Kbit 25LC020 al bus SPI del PIC.


- Mostraremos el valor de la conversión en un LCD alfanumérico 16x2, tendrá un potenciómetro para modificar el contraste, y un condensador de desacoplo.


- Utilizaremos el depurador SPI para depurar el programa.



Código:

////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Daniel de Cos                                       Noviembre/2011    //
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA: EEPROM                                               VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                           COMPILADOR:    CCS vs4.023
//   Entorno IDE: MPLAB ID v8.56                        SIMULADOR:    Proteus 7.7 sp2
//   TARJETA DE APLICACIÓN:  interface_2011             DEBUGGER:   ICD3
////////////////////////////////////////////////////////////////////////////////////
//   Escribir y leer datos en la memoria EEPROM a través del bus SPI.                                //
////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                                                                                                                               //
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

#include <C:\H\18F4550.h>
//#FUSES INTHS    //reloj interno     
#FUSES HS     //reloj de alta velocidad
#FUSES MCLR    //Master clear pin enable
#use delay(clock=20000000)  //20MHz
//#use delay(internal=8Mhz)   // Selecciona la velocidad del oscilador interno
#include <EEPROM_25LC020.C>
#include <LCD_flexible.c>

////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

int dato, i;
int address= 0;
char name[]= "Daniel de Cos";
int1 temp;
  
////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
            //setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16| SPI_XMIT_L_TO_H);

            init_ext_eeprom();
            lcd_init();
            lcd_putc("EEPROM 25LC020");
           
            //Escritura:
            for(i= 0; i< 13; i++){
                        write_ext_eeprom(address, name[i]);
                        address++;
                        lcd_gotoxy(1, 2);
                        if(!temp){       //Hacemos el parpadeo para simular la escritura
                                   lcd_putc("writing...");
                                   temp= 1;
                        }
                        else{
                                   lcd_putc("                ");//Si estaba escrita la 2º línea la borramos
                                   temp= 0;
                        }
                        delay_ms(100);
            }
           
            //Lectura:
            lcd_gotoxy(1, 2);
            lcd_putc("                ");
            lcd_gotoxy(1, 2);
            for(address= 0; address< 14; address++){
                        dato= read_ext_eeprom(address);
                        printf(lcd_putc, "%c", dato);
                        delay_ms(50);
            }         
            while(1);
}


Simulación:




Comprobación programa:

No hay comentarios:

Publicar un comentario