Autor Tema: Usar memoria 24lc256 con PIC16F877 en C  (Leído 6248 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado diegoap

  • PIC10
  • *
  • Mensajes: 20
Usar memoria 24lc256 con PIC16F877 en C
« en: 14 de Marzo de 2011, 19:50:56 »
Bueno gente.
Hace rato que le dedico tiempo a los PICs, pero nunca me meti con el tema de las memorias. He probado con la libreria que trae el CCS <24256.c> pero cuando simulo en Proteus 7.7 SP2, se cuelga el micro en el instante en que ejecuta la instruccions i2c_write(). Tambien probe con las versiones de Proteus 7.2 SP2 y 7.4 SP3, y sucede lo mismo.
Busque por todos lados, incluso copie y pegue los ejemplos de personas que trataron el teme y les funciono en este foro, pero no logro ni escribir y/o leer la memoria.
Podrian por favor darme una mano ???. Estoy trabajando en un proyecto, y necesito hacer andar esta memoria cuanto antes. Además, como podria hacer para direccionar 4 de estas memorias?. Tal vez estare configurando mal el wizzard del CCS, o conectando algo mal, o simplemente no usando bien las funciones, pero lo dudo. Si alguien puede, que suba un mini ejemplo en C y Proteus para ver como hacerlo. SE LOS AGRADECERE MUCHO !!!!!.
Un Saludo.
« Última modificación: 14 de Marzo de 2011, 19:53:14 por diegoap »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #1 en: 14 de Marzo de 2011, 19:54:07 »
Has colocado las resistencias Pull-up que necesita I2C?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado diegoap

  • PIC10
  • *
  • Mensajes: 20
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #2 en: 14 de Marzo de 2011, 20:12:54 »
Sip, 4K7 en pull up a SDA y SCL

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #3 en: 14 de Marzo de 2011, 20:17:17 »
         Mira este hilo que publicó b.stronger. Quizá te sea de ayuda.
http://www.todopic.com.ar/foros/index.php?topic=31205.msg260784#msg260784
                 Saludos a ambos.
                       Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #4 en: 14 de Marzo de 2011, 21:08:48 »
Sip, 4K7 en pull up a SDA y SCL

  ¿Colocaste resistencias tipo pull-up o tipo genérica? Porque para que funcione bien el I2C tenés que colocar las tipo pull-up
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #5 en: 14 de Marzo de 2011, 22:43:05 »
Hola.

Por la respuesta, creo que ha colocado del tipo MINRES ... busca las de tipo PULLUP como te dice AngelGris.

Para direccionar varias de estas memorias, lo haces con los pines de dirección de la memoria, configurando así el byte de dirección.

Saludos
El papel lo aguanta todo

Desconectado diegoap

  • PIC10
  • *
  • Mensajes: 20
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #6 en: 15 de Marzo de 2011, 20:34:50 »
Ok. Lo de las Pull Up, pues entonces las cambiare por las del tipo pull up q mencionan. No lo sabia... :S
Despues de algo de reniego, se le dio por andar. Ahora escribo y leo la memoria, pero me sigue tirando muchos warnings el proteus.
Como hago para configurar los pines de direccionamiento ???. Es decir, como tendria que escribir el codigo para eso?, xq creo q las instrucciones que vienen en la libreria 24256.c solo son utiles para escribir y lee la memoria. A menos q no esté entendiendo algo, claro.
Gracias por aportar todos gente, en verdad se los recontra agradezco !!!.
Un Saludo.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #7 en: 15 de Marzo de 2011, 20:49:29 »
Hola.

Ya cambiaste las resitencias? sería mejor que subas un esquema ...

En la hoja técnica de la memoria te indica como debes modificar el primer byte que se envía a la memoria. En algunos casos (para una memoria 2416 p.ej.), se escribe 0xa0, donde la dirección de la memoria es 0, la cual puedes modificar con los 3 pines A0, A1, A2.

Saludos
El papel lo aguanta todo

Desconectado Marito_26

  • PIC10
  • *
  • Mensajes: 37
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #8 en: 16 de Marzo de 2011, 00:35:09 »
Diego, en las memorias simuladas con PROTEUS solo funciona si le colocas las resistencias que se llaman PULLUP en proteus, no las resistencias convencionales que luego le colocas el valor de ohms.

Saludos

Desconectado diegoap

  • PIC10
  • *
  • Mensajes: 20
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #9 en: 21 de Marzo de 2011, 22:19:37 »
Bueno gente. Finalmente solucione el problema, y ya puedo simular bien las memorias y estoy direccionando las 4 24LC256 que necesitaba.
Estoy usando el Proteus 7.7 SP2, y cuando ponia las resistencias PULL-UP , se colgaba el micro. Por lo que puse las resistencias comunes RES como pull-up de 4K7 y empezo a funcionar al pelo.
En cuanto al direccionamiento segui el perfecto y asertado consejo de " MLO__ ", de usar los pines A0, A1 y A2, sabia exactamente para que eran, pero no sabia como emplear el direccionamiento en la progragramacion, pero despues de renegar casi una horita, me funciono. Simplemente toque un poco la libreria de la memoria que trae el CCS. Y me quedo asi:

////< libreria modificada 24256mux >
///////////////////////////////////////////////////////////////////////////
////   Library for a 24LC256 serial EEPROM                             ////
////                                                                   ////
////   init_ext_eeprom();    Call before the other functions are used  ////
////                                                                   ////
////   write_ext_eeprom(command, a, d);  Write the byte d to the address a at command memory      ////
////                                                                   ////
////   d = read_ext_eeprom(command, a);   Read the byte d from the address a at command memory    ////
////                                                                   ////
////   The main program may define eeprom_sda                          ////
////   and eeprom_scl to override the defaults below.                  ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////


#ifndef EEPROM_SDA

#define EEPROM_SDA  PIN_B1
#define EEPROM_SCL  PIN_B0

#endif

#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)

#define EEPROM_ADDRESS long int
#define EEPROM_SIZE   32768

void init_ext_eeprom()
{
   output_float(EEPROM_SCL);
   output_float(EEPROM_SDA);

}


void write_ext_eeprom(BYTE command, long int address, BYTE data)
{
   short int status;
   command = command<<1;
   i2c_start();  
   i2c_write(0xa0|command);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0|command);
   while(status==1)
   {
   i2c_start();
   status=i2c_write(0xa0|command);
   }
}


BYTE read_ext_eeprom(BYTE command, long int address) {
   BYTE data;
   command = command<<1;
   i2c_start();
   i2c_write(0xa0|command);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_start();
   i2c_write(0xa1|command);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}


Simplemente agregue una variable " BYTE command" la cual maneja el direccionamiento, y a las funciones para escribir y leer, le agregue dicha variable como paso de parametro en la declaracion para elegir la memoria que se quiere operar.

Espero que quien tenga la misma duda le sirva esta informacion.
Gracias a todos por aportar y correr a mi ayuda.

Un Saludo.
« Última modificación: 21 de Marzo de 2011, 22:22:20 por diegoap »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Usar memoria 24lc256 con PIC16F877 en C
« Respuesta #10 en: 22 de Marzo de 2011, 16:48:27 »
 :-/ :-/

Felicitaciones!!!!

Que bueno que lo solucionaras.

Saludos.
El papel lo aguanta todo


 

anything