Autor Tema: eeprom spi(solucionado)  (Leído 3259 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado ALVARETE

  • PIC10
  • *
  • Mensajes: 6
eeprom spi(solucionado)
« en: 02 de Mayo de 2014, 17:55:02 »
alguien por favor podria darme una mano estoy tratando de escribir una memoria eeprom spi 25lc020a. simulando con el proteus. la verdad no se que pasa en la memoria nunca escribe.
este es el codigo lo encontre en internet.
Este ejercicio consiste en escribir y leer en la eeprom (25LC020).
Los pasos para poder escribir y leer en este caso, serán los siguientes:
ESCRITURA:
1-      ) Habilitar la escritura (para esto hay que habilitar el chip-select (cs) y deshabilitarlo.
2-      ) Mandarla instrucción de escritura, (se requiere volver habilitar el cs).
3-      ) Direccionar donde se quiere escribir.
4-      ) MANDAR los 16 datos.(en este caso enviaré 5 datos).
LECTURA:
1-      ) Habilitar el cs.
2-      ) configurar como lectura.
3-      )  direccionar la eeprom.
Una vez teniendo esto en cuenta, lo siguiente es hacer el pro

////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Esmelis Rafael                                                  Noviembre/2011
////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Escritura EEPROM (25LC020)                                            VERSIÓN: 1.0
// DISPOSITIVO: PIC18F4550                                                                          COMPILADOR: CCS vs4.088
// Entorno IDE: MPLAB 8.56                                                                             SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: VIRTUAL                                                     DEBUGGER: VIRTUAL
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// Escribir 5 bytes en la memoria EEPROM a través del bus SPI
//
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include <c:\h\18F4550.h>
#fuses INTHS //Selecciona el oscilador interno
#use delay(internal=8Mhz) // Selecciona la velocidad del oscilador interno
#include <c:\h\LCD_SIS.c>
/*
Mientras no empleemos el bus USB, se utilizará el oscilador interno para simplificar
la configuración de reloj y reducir componentes externos.
*/
////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
int direccion;
int dato;
setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16| SPI_XMIT_L_TO_H);
lcd_init();
/*
Para decidir cual es la configuración de la lógica de control del bus SPI del micro,
debemos de mirar el databook de la EEPROM
Esta configuración deja el estado IDLE en bajo activo, recoje el dato en el flanco
de subida y deja la velocidad del reloj de transferencia en FOSC/16
El IDLE y el FLANCO deben de coincidir en ambos dispositivos
*/
//ESCRITURA //////////////////////////////////////////////////////////
//1º PASO (HABILITAR LA ESCRITURA)
//Para ello es necesario habilitar el CS y deshabilitarlo.
output_low(PIN_A0);            //HABILITO CS
spi_write(0×06);               //HABILITO ESCRITURA
output_high(PIN_A0);           //DESHABILITO CS
//2º PASO (MANDAR LA INSTRUCCIÓN DE ESCRITURA).
output_low(PIN_A0);            //Hay que volver a habilitar la EEPROM
spi_write(0×02);                //CONFIGURO OPERACIÓN ESCRITURA
//3º PASO (DIRECCIONAR DONDE SE QUIERE ESCRIBIR)
spi_write(0×10);                 //DIRECCIONO
//4º PASO (MANDAR LOS 5 DATOS)
//Para una transferencia de datos correcta, hay que finalizar deshabilitando la EEPROM
for(dato=65;dato<70;dato++)
{
spi_write(dato); //No ha hecho falta poner retardos para mandar los datos
printf(lcd_putc,”%u “,dato); //escribir en el LCD el valor de dato
delay_ms(200);
}
output_high(PIN_A0);
delay_ms(1000);                    //esperar 1 segundo
lcd_putc(“\n “);                        //escribir en la siguiente linea del LCD L (lectura)
//// LECTURA///////////////////////////////////////////////////////////
//1º PASO (HABILITAR CS)
output_low(PIN_A0);                    //Es necesario habilitar el CS
//2ºPASO (CONFIGURAR COMO LECTURA)
spi_read(0×03);                        //Además de leer, con esta función puedo escribir en la EEPROM.
//siempre que meta un dato en el paréntesis.
//En nuesto caso aprovechamos para mandar la instrucción de LECTURA.
//De este modo no hace falta habilitar el permiso de escritura.
//3ºPASO (DIRECCIONAR LA EEPROM)
spi_read(0×10);                     //DIRECCIONO
for(direccion=65;direccion<70;direccion++)
{
//dato=(spi_read(direccion));
dato =(spi_read(direccion));
// printf(lcd_putc,”%u”,dato);
printf(lcd_putc,”%c”,dato);
delay_ms(500);
}
output_high(PIN_A0);
for (;;){}
}

saludos..y gracias
« Última modificación: 05 de Mayo de 2014, 17:04:08 por ALVARETE »

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: eeprom spi
« Respuesta #1 en: 02 de Mayo de 2014, 18:23:02 »
al empezar la funcion main, deberias de configurar el oscilador interno con setup_oscillator(OSC_INTRC|OSC_8MHZ);
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado ALVARETE

  • PIC10
  • *
  • Mensajes: 6
Re: eeprom spi
« Respuesta #2 en: 02 de Mayo de 2014, 21:34:16 »
hice lo que me dijiste pero no pasa nada, la lectura la hace bien leo 255 255 255 255. pero no escribe.

Desconectado ALVARETE

  • PIC10
  • *
  • Mensajes: 6
Re: eeprom spi
« Respuesta #3 en: 03 de Mayo de 2014, 17:24:16 »
 :-/ funciona!!! quedo bien le hice unas modificaciones al programa. gracias por la ayuda ppyote. slds.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: eeprom spi
« Respuesta #4 en: 03 de Mayo de 2014, 18:19:46 »
:-/ funciona!!! quedo bien le hice unas modificaciones al programa. gracias por la ayuda ppyote. slds.

me alegro, sería bueno que mostrarás los cambios por sí alguien lee tú post buscando una posible solución
un saludo
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: eeprom spi
« Respuesta #5 en: 04 de Mayo de 2014, 05:25:44 »
:-/ funciona!!! quedo bien le hice unas modificaciones al programa. gracias por la ayuda ppyote. slds.

me alegro, sería bueno que mostrarás los cambios por sí alguien lee tú post buscando una posible solución
un saludo

Y de paso modificar el título para añadirle un "** SOLUCIONADO **" con lo cual cualquier posible interesado ve inmediatamente que tienes la solución publicada  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado ALVARETE

  • PIC10
  • *
  • Mensajes: 6
Re: eeprom spi(solucionado)
« Respuesta #6 en: 05 de Mayo de 2014, 17:00:19 »
/*Este ejercicio consiste en escribir y leer en la eeprom (25LC020).
Los pasos para poder escribir y leer en este caso, serán los siguientes:
ESCRITURA:
1-      ) Habilitar la escritura (para esto hay que habilitar el chip-select (cs) y deshabilitarlo.
2-      ) Mandarla instrucción de escritura, (se requiere volver habilitar el cs).
3-      ) Direccionar donde se quiere escribir.
4-      ) MANDAR los 16 datos.(en este caso enviaré 5 datos).
LECTURA:
1-      ) Habilitar el cs.
2-      ) configurar como lectura.
3-      )  direccionar la eeprom.
Una vez teniendo esto en cuenta, lo siguiente es hacer el pro*/

////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Esmelis Rafael                                                  Noviembre/2011
////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Escritura EEPROM (25LC020)                                            VERSIÓN: 1.0
// DISPOSITIVO: PIC18F46k20                                                                         COMPILADOR: CCS vs4.088
// Entorno IDE: MPLAB 8.56                                                                             SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: VIRTUAL                                                     DEBUGGER: VIRTUAL
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// Escribir 5 bytes en la memoria EEPROM a través del bus SPI
//
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include <main.h>
//#USE SPI (MASTER, CLK=PIN_C0, DI=PIN_C1, DO=PIN_C2, ENABLE=PIN_C3, LOAD=PIN_C5, DIAGNOSTIC=PIN_C4, MODE=0, BITS=8, STREAM=SPI_1)
#use delay(internal=8Mhz) // Selecciona la velocidad del oscilador interno
#include <LCD.c>
/*
Mientras no empleemos el bus USB, se utilizará el oscilador interno para simplificar
la configuración de reloj y reducir componentes externos.
*/
////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

void main()
{
   //setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
  // setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
int8 direccion=0;
int8 dato;
int8 blank;
setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16| SPI_XMIT_L_TO_H);
setup_oscillator(OSC_INTRC|OSC_8MHZ);
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"\fpresione A1");
lcd_putc("\n");
printf(lcd_putc,"para escribir");
for(;;){

if(input(pin_A1)==0){         //si es cero A1 escribe
                              /*
                              Para decidir cual es la configuración de la lógica de control del bus SPI del micro,
                              debemos de mirar el databook de la EEPROM
                              Esta configuración deja el estado IDLE en bajo activo, recoje el dato en el flanco
                              de subida y deja la velocidad del reloj de transferencia en FOSC/16
                              El IDLE y el FLANCO deben de coincidir en ambos dispositivos
                              */
                              //ESCRITURA //////////////////////////////////////////////////////////
                             
lcd_putc("\f");                          // PASO (HABILITAR LA ESCRITURA)
lcd_gotoxy(1,1);                              //Para ello es necesario habilitar el CS y deshabilitarlo.
for(dato=0;dato<255;dato++)   //256 es el max de cap de la eeprom
{

output_low(PIN_A0);            //HABILITO CS
spi_write(0x06);               //HABILITO ESCRITURA
output_high(PIN_A0);           //DESHABILITO CS
                              //2º PASO (MANDAR LA INSTRUCCIÓN DE ESCRITURA).
output_low(PIN_A0);            //Hay que volver a habilitar la EEPROM
spi_write(0x02);                 //CONFIGURO OPERACIÓN ESCRITURA
                               //3º PASO (DIRECCIONAR DONDE SE QUIERE ESCRIBIR)

spi_write(direccion);                 //DIRECCIONO
                               //4º PASO (MANDAR LOS 5 DATOS)
                                //Para una transferencia de datos correcta, hay que finalizar deshabilitando la EEPROM
spi_write(dato);
                     
output_high(PIN_A0);
                                   //spi_write(dato); //No ha hecho falta poner retardos para mandar los datos
printf(lcd_putc,"%u ",dato);      //escribir en el LCD el valor de dato
delay_ms(200);
++direccion;
}
lcd_putc("\f");
printf(lcd_putc," escritura ");
lcd_putc("\n");
printf(lcd_putc," finalizada ");
}
output_high(PIN_A0);
delay_ms(1000);                    //esperar 1 segundo

lcd_putc("\n");                        //escribir en la siguiente linea del LCD L (lectura)
if(input(pin_A2)==0){                    //si es cero A2 lee
                                       //// LECTURA///////////////////////////////////////////////////////////
                                    //1º PASO (HABILITAR CS)
output_low(PIN_A0);                    //Es necesario habilitar el CS
                                          //2ºPASO (CONFIGURAR COMO LECTURA)
spi_read(0x03);                        //Además de leer, con esta función puedo escribir en la EEPROM.
                                    //siempre que meta un dato en el paréntesis.
                                    //En nuesto caso aprovechamos para mandar la instrucción de LECTURA.
                                    //De este modo no hace falta habilitar el permiso de escritura.
                                    //3ºPASO (DIRECCIONAR LA EEPROM)
spi_read(0x10);                     //DIRECCIONO
lcd_putc("\f");
lcd_gotoxy(1,1);
for(direccion=0;direccion<255;direccion++)   //255 es el max de cap de la eeprom
{

dato =(spi_read(direccion));

printf(lcd_putc,"%u",dato);
//printf(lcd_putc,"%c",dato);
delay_ms(500);
}
output_high(PIN_A0);
lcd_putc("\f");
printf(lcd_putc," lectura  ");
lcd_putc("\n");
printf(lcd_putc," finalizada ");
}
if(input(pin_A3)==0){            // rutina de borrado
direccion=0;
for(blank=0;blank<255;blank++)   //255 es el max de cap de la eeprom
{
dato=0x00;
output_low(PIN_A0);            //HABILITO CS
spi_write(0x06);               //HABILITO ESCRITURA
output_high(PIN_A0);           //DESHABILITO CS
                              //2º PASO (MANDAR LA INSTRUCCIÓN DE ESCRITURA).
output_low(PIN_A0);            //Hay que volver a habilitar la EEPROM
spi_write(0x02);                 //CONFIGURO OPERACIÓN ESCRITURA
                               //3º PASO (DIRECCIONAR DONDE SE QUIERE ESCRIBIR)

spi_write(direccion);                 //DIRECCIONO
                               //4º PASO (MANDAR LOS 5 DATOS)
                                //Para una transferencia de datos correcta, hay que finalizar deshabilitando la EEPROM
spi_write(dato);
                     
output_high(PIN_A0);
                                   //spi_write(dato); //No ha hecho falta poner retardos para mandar los datos
printf(lcd_putc,"%u ",dato);      //escribir en el LCD el valor de dato
delay_ms(200);
++direccion;
}
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc," borrado ");
lcd_putc("\n");
printf(lcd_putc," finalizado");
}
}
 

}
//este es el programa que escribe y lee una memoria 25lc020. una mem 25lc1024 no! ese problema tengo ahora. slds.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Gracias amigo
« Respuesta #7 en: 01 de Enero de 2016, 12:42:44 »
Amigo estaba trabajando con ese mismo codigo y no lograba hacer simular la eeprom llegue a pensar que era el sistema operativo que no me dejaba emular la eeprom que es windows10 y hasta le di al proteus compactibilida con XP sp2 y nada pero tu codigo funciona de maravilla es bueno ver que gente como todos ustedes les hacen la vida mas facil a los que recien nos iniciamos en esto. :-/
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.