Autor Tema: No consigo comunicar EEPROM por I2c  (Leído 3598 veces)

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

Desconectado campeon1982

  • PIC10
  • *
  • Mensajes: 22
No consigo comunicar EEPROM por I2c
« en: 09 de Diciembre de 2004, 06:24:00 »
Hola, ya estoy aquí otra vezGiño
!= variable negada
Tengo un memoria eeprom 24c04, la cual tiene patillas para SCL, SDA, VDD, VSS, E0, E1, E2,!WC. Pues conecto scl y sda a mi bus que está con las resistencias de pull up a 5v (el bus funciona porque entre dos pics ya lo he probado y funciona). VDD y VSS alimentados correctamente. !WC lo tengo a 0 porque quiero escribir jeje (lo tengo puenteado con VSS). La dirección genérica de la memoria es 1010xxxx, donde las tres primeras X son las E.  Segun el datashett mi E0 es A8 que dice que representa el bit más significativo de la dirección. El último bit es R!W que me imagino que el ccs lo generará dependiendo de si quiero escribir o leer. Entonces, según eso he probado varias maneras de direccionarlo pero no rula, en proteus no lo puedo simular porque el 16f73 no rula el I2c simulado. El código sería algo así ( es que en el manual solo veo como manejar la eeprom interna, si me podeis facilitar algún manual aunque sea en inglés donde salga la instrucciones ext_eeprom etc etc):

#include <16F73.h>
#fuses HS, NOWDT, NOPROTECT, PUT, NOBROWNOUT
#byte puerto_b=06
#use standard_io(c)
#use fast_io(B)
#use delay(clock=16000000)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,FAST,FORCE_SW)
#include <2404.c>

set_tris_c( 0xFF ); //port c como salidas porque lo pone en el data sheet
set_tris_b(0b00000000);


main()
{



byte valor;
byte lectura;
eeprom_ADDRESS address;


init_ext_eeprom();


delay_ms(50);

do {
puerto_b=0;




//////////////Escribir en la eeprom: escribimos valor= en el address=

valor=0b00001010; //B
address=0b10101110;//según datasheet cambio el RW para que escriba

write_ext_eeprom(address,valor);
delay_ms(100);


//////////////leer de la eeprom lo que escribimos
address=0b10101111;//según datasheet cambio el RW para que lea
lectura=read_ext_eeprom(address);
puerto_b=lectura;
delay_ms(100);



} while (TRUE);



}



El ejemplo está basado en otro que he visto por ahí, si teneis algo sencillito rogaría una ayudita jeje.
Creo que el fallo estará en la manera de direccionarlo.

Saludos y gracias de antemano.

Desconectado akydes_

  • PIC12
  • **
  • Mensajes: 68
RE: No consigo comunicar EEPROM por I2c
« Respuesta #1 en: 09 de Diciembre de 2004, 08:17:00 »
hola, yo estoy empezando con esto del C para PICs, pero ya he hecho algún que otro programa que maneja memorias I2C.
Lo que hago es lo siguiente,

utilizo el fichero correspondiente a la memoria que quiero usar:

#include <2416.c> // o la que vayas a usar tú. Estos ficheros se encuentran en el
directorio /drivers/ dentro del directorio de instalación de CCS.

y luego hago uso de las funciones de "write_ext_eeprom()" y "read_ext_eeprom()" sin preocuparme para nada DEL BIT DE ESCRITURA/LECTURA QUE DICES PONER AL FINAL DE LA DIRECCIÓN, ya que si te vas al fichero 2416.c, las funciones están definidas para incorporarlo sin tú tener que preocuparte.

No sé si me he explicado bien :)

De todas formas, échale un vistazo a cómo están creadas estas funciones, y así verás cómo funciona :D

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: No consigo comunicar EEPROM por I2c
« Respuesta #2 en: 09 de Diciembre de 2004, 14:27:00 »
el address se refiere a la posicion de memoria que quieres leer en la eeprom, no a la direccion fisica (esa creo recordad que la puedes modificar en el fichero con las rutinas....

por que usas el I2C en modo FAST y forzando software??

Desconectado campeon1982

  • PIC10
  • *
  • Mensajes: 22
RE: No consigo comunicar EEPROM por I2c
« Respuesta #3 en: 09 de Diciembre de 2004, 17:44:00 »
Escrito originalmente por pacalaconcurso
el address se refiere a la posicion de memoria que quieres leer en la eeprom, no a la direccion fisica (esa creo recordad que la puedes modificar en el fichero con las rutinas....

por que usas el I2C en modo FAST y forzando software??


Hola si me pudieras pasar algún ejemplito me gustaría echarle un ojo jeje.
Lo del forzar sw, es que lo tengo montado y solo me rula de esa manera (otro montaje entre dos pics). Acepto cualquier sugerencia, muchas gracias.
saludos

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: No consigo comunicar EEPROM por I2c
« Respuesta #4 en: 09 de Diciembre de 2004, 18:11:00 »
Hola, lo que dice FELIX es correcto, la direccion de dispositivo esta definida dentro del driver, el segundo error es que no llamas al la inicializacion del driver, por lo demas no debes precuparte, entonces


En tu rutina de incio agregas la sigiente linea,



init_ext_eeprom();                      // inicializa memoria I2C externa


luego es tan sencillo como esto,

leer un valor de la memoria

 dato=READ_EXT_EEPROM(0); // lee lo que hay en la direccion 0 de la memoria

grabar un valor en la memoria

 write_ext_eeprom(0x00,0xAA);  //  escribe en la direccion 0 el valor 0xAA


aqui te pego la cabecera del driver de la 24c04 de CCS

///////////////////////////////////////////////////////////////////////////
////   Library for a MicroChip 24LC04B                                 ////
////                                                                   ////
////   init_ext_eeprom();    Call before the other functions are used  ////
////                                                                   ////
////   write_ext_eeprom(a, d);  Write the byte d to the address a      ////
////                                                                   ////
////   d = read_ext_eeprom(a);   Read the byte d from the address a    ////
////                                                                   ////
////   The main program may define eeprom_sda                          ////
////   and eeprom_scl to override the defaults below.                  ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////


saludos y espero que te sirva

ARIEL







saludos
PikMan

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: No consigo comunicar EEPROM por I2c
« Respuesta #5 en: 10 de Diciembre de 2004, 15:05:00 »
pues Ariel te dio la solucion...

creo recordar que si usar el I2C Hardware debes ponerlo en slow, con el CCS (al menos en algunas versiones) no funciona correctamente en modo fast.

saludos

Desconectado campeon1982

  • PIC10
  • *
  • Mensajes: 22
RE: No consigo comunicar EEPROM por I2c
« Respuesta #6 en: 14 de Diciembre de 2004, 11:47:00 »
Bueno a ver si me aclaro jeje. Esto sigue sin ir, lo que yo no entiendo es que yo he seleccionado la dirección de mi dispositivo que es:
1010 E2 E1 E0 RW, entonces mi pregunta es que para que sirve esa dirección?
Otra cosa, en la librería la memoria está como master, es decir que si yo quiero mandar datos a la memoria, ésta debería estar como esclava, no?
Por cierto, eso de slow y hw no rula jeje.
muchas gracias por adelantado
pd: si teneis algun ejemplito de comunicación entre pic y eeprom sencillito y que rule lo agradeceré jeje
gracias de nuevo

edito: como se como llamar a los pines de SDA y SCL? en la librería estandar los llama B0 y B1, aunque supongo que eso estará bien jeje

Desconectado campeon1982

  • PIC10
  • *
  • Mensajes: 22
RE: No consigo comunicar EEPROM por I2c
« Respuesta #7 en: 14 de Diciembre de 2004, 12:50:00 »
Bueno decir que ya entiendo el funcionamiento jeje. He tenido que cambiar mi librería 2404 las patillas del bus I2c según he leído por ahí.
Entonces el chip se me queda todo a masa menos la VCC, y el WC que se queda al aire y los sda y scl que éstán con pull up.
yo las cabeceras que pongo al usar el bus i2c es ésta:
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3,SLOW,FORCE_SW)
puede ser que el problema esté en lo de force_sw?
bueno, sigo intentando jeje

Desconectado campeon1982

  • PIC10
  • *
  • Mensajes: 22
RE: No consigo comunicar EEPROM por I2c
« Respuesta #8 en: 15 de Diciembre de 2004, 05:01:00 »
ya funciona, muchas gracias a todos.


 

anything