Autor Tema: Ayuda urgente con I2C y EEPROM serie  (Leído 3504 veces)

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

Desconectado telecoacme

  • PIC10
  • *
  • Mensajes: 14
Ayuda urgente con I2C y EEPROM serie
« en: 26 de Mayo de 2004, 08:05:00 »
Hola a todos, necesitaría saber si a alguien le ha funcionado el ejemplo que proporciona el CCS, sobre grabación de memoria externa serie, via I2C (ex_extee.c)

La verdad es que cuando ejecuto el programa y estoy apunto de leer o escribir, el micro se cuelga y muere la aplicación. La memoria es una 24c16.

Alguien saber porqué?

Cómo puedo solucionarlo?

Me podeis enviar alguna rutina para leer o escribir en una memoria serie 24c16 mediante el I2C?

Aqui os envío el programa de ejemplo del CCS.

Salu2 y gracias



FICHERO ---->  ex_extee.c


#if defined(__PCB__)
#include <16c56.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2)  // Jumpers: 11 to 17, 12 to 18

#elif defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
#endif

#include <input.c>
#include <2402.c>


void main() {

   byte value,cmd;
   EEPROM_ADDRESS address;

   init_ext_eeprom();

   do {
      do {
         printf("
Read or Write: ";
         cmd=getc();
         cmd=toupper(cmd);
         putc(cmd);
      } while ( (cmd!="R") && (cmd!="W") );

      printf("
Location: ";

#if sizeof(EEPROM_ADDRESS)==1
      address = gethex();
#else
#if EEPROM_SIZE>0xfff
      address = gethex();
#else
      address = gethex1();
#endif
      address = (address<<8)+gethex();
#endif

      if(cmd=="R")
         printf("
Value: %X
",READ_EXT_EEPROM( address ) );

      if(cmd=="W") {
         printf("
New value: ";
         value = gethex();
         printf("
";
         WRITE_EXT_EEPROM( address, value );
      }
   } while (TRUE);

}



FICHERO ---->  24c16.c


#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    2048

void init_ext_eeprom() {
   output_float(eeprom_scl);
   output_float(eeprom_sda);
}


void write_ext_eeprom(long int address, byte data) {

   i2c_start();
   i2c_write((0xa0|(byte)(address>>7))&0xfe);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   delay_ms(11);
}


byte read_ext_eeprom(long int address) {
   byte data;

   i2c_start();
   i2c_write((0xa0|(byte)(address>>7))&0xfe);
   i2c_write(address);
   i2c_start();
   i2c_write((0xa0|(byte)(address>>7))|1);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}




Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Ayuda urgente con I2C y EEPROM serie
« Respuesta #1 en: 26 de Mayo de 2004, 09:58:00 »
Debes de cambiar en el programa el include <2402.c>, por include <2416.c> que es la tuya física.

Desconectado telecoacme

  • PIC10
  • *
  • Mensajes: 14
RE: Ayuda urgente con I2C y EEPROM serie
« Respuesta #2 en: 26 de Mayo de 2004, 10:37:00 »
Ya lo hice Pocher, ha sido un tipico error de copiar y pegar, alguna otra solución?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Ayuda urgente con I2C y EEPROM serie
« Respuesta #3 en: 26 de Mayo de 2004, 11:07:00 »
En el programa hay:

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12

Usas estos pines para comunicación con el PC?

En la memoria hay:

#ifndef EEPROM_SDA #define EEPROM_SDA PIN_B1 #define EEPROM_SCL PIN_B0 #endif

Usas estos pines para comunicación I2C con la memoria?

Supongo que tendrás puestas las resistencias de pull-up, que el PIC usado será el 877 o el 452 y que el cristal será de 20MHz.

Estos dos ficheros de CCS en proteus funcionan perfectamente. No los he probado físicamente, pero si funcionan en proteus ... al revés no siempre es así.

Un saludo




Desconectado telecoacme

  • PIC10
  • *
  • Mensajes: 14
RE: Ayuda urgente con I2C y EEPROM serie
« Respuesta #4 en: 26 de Mayo de 2004, 11:24:00 »
Pocher realmente uso un 16f876, la cabecera del programa (16F877) y
la velocidad del cristal lo tengo cambiado en mi programa (este es sólo
como referencia, yo uso 10MHZ), la comunicación via RS232 con el PC funciona
correctamente (una prueba de ello es que uso un Bootloader).
También tengo conectados las 2 resistencias de Pullup (les he
puesto 2K) y la memoria serie lo he conectado al SCL y  SCA del PIC
(SCL-->RC3) (SDA --->RC4). El pin de Proteccion de código de la
24c16 no lo tengo conectado.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Ayuda urgente con I2C y EEPROM serie
« Respuesta #5 en: 26 de Mayo de 2004, 11:48:00 »
En el original de CCS son C3 y C4, pero tú en el archivo que has pegado los has cambiado:

FICHERO ----> 24c16.c


#ifndef EEPROM_SDA

#define EEPROM_SDA PIN_B1
#define EEPROM_SCL PIN_B0

#endif

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

¿será esto?


 

anything