Autor Tema: Problemas con el i2c entre un pic-eeprom  (Leído 4452 veces)

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

Desconectado Kanick

  • PIC10
  • *
  • Mensajes: 9
Problemas con el i2c entre un pic-eeprom
« en: 12 de Noviembre de 2008, 07:35:43 »
Hola,

Estoy intentando comunicar un Pic 18f2550 con una EEPROM mediante i2c y con otro 18f2550 mediante rs-232. La comunicacion rs-232 funciona perfectamente pero la i2c no hay manera.

He estado mirando y al parecer este pic tiene problemas de fabrica con el módulo i2c. Mirando, mirando he visto que no es el único con ese tipo de problemas.

Alguien ha hecho esa comunicación pic-eeprom via i2c?

Alguien me podria recomendar algún Pic de la serie 18F al que le funcione bien el i2c para que lo pueda usar ente la EEPROM y el otro 18f2550?

Gracias de antemano

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Problemas con el i2c entre un pic-eeprom
« Respuesta #1 en: 12 de Noviembre de 2008, 15:32:20 »
seria mala suerte que a ti nomas te venga justo el modulo i2c dañado,

mejor veamos tu codigo, el problema debe estar en el programa, y también indicanos que codigo de memoria usas.

saludos
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado Kanick

  • PIC10
  • *
  • Mensajes: 9
Re: Problemas con el i2c entre un pic-eeprom
« Respuesta #2 en: 13 de Noviembre de 2008, 12:30:37 »
Gracias micro_cadaver por responder,

La EEPROM que uso es la 24AA1025. Por hardware la tengo direccionada a 4 (11) y los valores que pretendo leer los he gravado previamente y son palabras de 8 bits cada uno. El programador que uso es el GTB-USB[plus] y el programo con el Compilador CCS v4.065.

En principio el código es muy sencillo. Leo bloques de 12 bytes de la EEPROM y los envio por rs-232. El led es solo indicación para saber si algo va o no.

Aquí está el código que ha quedado al final despues de múltiples pruebas.

Código: [Seleccionar]
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN

#use delay(clock=48000000) //Cristal de 12 mhz

#use i2c(master, sda=PIN_B0, scl=PIN_B1)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(A)
#use fast_io(C)


int16 contador=0x0000;
int const address_EEPROMR=0b10100111;  // Direccion I2C de EEPROM (para lectura)
int const address_EEPROMW=0b10100110;  // Direccion I2C de EEPROM (para escritura)
int const ddeeeprom=32;                // Delay Default EEPROM

void i2cr(int16 i2cdev);           // lectura I2C

void i2cr(int16 i2cdev){           

  int8 r=0x00;

  i2c_start();
  i2c_write(address_EEPROMW);
  i2c_write(i2cdev>>8) ;
  i2c_write(i2cdev);

  i2c_start();
  i2c_write(address_EEPROMR);

  for (i=0;i<12;i++)
  {
      r = i2c_read();
      tSERVO[i]=r;
  }

  i2c_stop();
  delay_ms(ddeeeprom);
}
   
int1 led=0;

void main() {
   
   delay_ms(300);
   
   set_tris_a(0b00000000);
   set_tris_c(0b00000100);
   output_a(0b00000000);
   output_c(0x00);
   
   do {
      output_low(PIN_A0);
     
      delay_ms(500);

      while(!input(PIN_C2)); //Espero un pulsador para empezar

      output_high(PIN_A0); //Enciendo un led para indicar que funciona

      do{
         delay_ms(500);
         
         i2cr(contador); //Leo EEPROM
           
         if (contador>1200) contador=0x0000; //Actualizo direccion de lectura
         else contador=contador+12;
           
         for(i=0;i<12;i++)
         {
            putc(tServo[i]); //Envio lo leido al 2º Pic
         }
         
         if(led) //Hago parpadear un led para saber que funciona
         {
            output_low(PIN_A0);
            led=0;
         }
         else
         {
            output_high(PIN_A0);
            led=1;
         }

      } while (TRUE);

   } while (TRUE);
}


Gracias

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Problemas con el i2c entre un pic-eeprom
« Respuesta #3 en: 13 de Noviembre de 2008, 12:45:28 »
Creo que cuando no especificas la velocidad del bus i2c en el ccs, este lo pone a la tradiciona/normal (slow, 100Khz) y, creo, que las eeprom's con version AA para usar dicha velocidad tiene que estar en el rango vcc de: 1.7V ≤ VCC ≤ 2.5V.

Quiza por ahi venga la forma en la que falla tu eeprom, que ni dices como es que falla, comenta eso.

Suerte.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Problemas con el i2c entre un pic-eeprom
« Respuesta #4 en: 13 de Noviembre de 2008, 18:26:13 »
Creo que cuando no especificas la velocidad del bus i2c en el ccs, este lo pone a la tradiciona/normal (slow, 100Khz) y, creo, que las eeprom's con version AA para usar dicha velocidad tiene que estar en el rango vcc de: 1.7V ≤ VCC ≤ 2.5V.

Quiza por ahi venga la forma en la que falla tu eeprom, que ni dices como es que falla, comenta eso.

Suerte.

Segun entiendo del datasheet, te dice que si alimentas con menos de 2.5v la frecuencia maxima sera de 100khz. pero no porque vayas a 100khz tienes que alimentar con menos de 2.5v.
no se si es asi, ojala yo NO tenga razon, porque  estoy teniendo problemas con una memoria 24AA128, alimentada a 4,5v... con la 24LC128 no tengo problemas...   :?
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Kanick

  • PIC10
  • *
  • Mensajes: 9
Re: Problemas con el i2c entre un pic-eeprom
« Respuesta #5 en: 14 de Noviembre de 2008, 06:33:23 »
Hola,

Pues no se si tendrá algo que ver eso de la velocidad. Yo lo alimento a 5v (4,95). Y por ver lo que tu decias jeremylf, he intentado provarlo de varias formas puesto que no se como se varia la velocidad del bus i2c. Lo que he hecho en 2 pruebas distintas es lo siguiente:


#use i2c(master, sda=PIN_B0, scl=PIN_B1,fast)
y
#use i2c(master, sda=PIN_B0, scl=PIN_B1, fast=4000)

Obteniendo los mismos resultados. Pero no se si con eso es suficiente para configurar la velocidad o hay que hacer algo mas.

El porque no va la comunicacion con la eeprom lo deduzco por lo siguiente:

La comunicacion que conecta los dos pics 18f2550 por rs232 sirve para mandar del primero al segundo las consignas de posicion de los servos que quiero controlar con el segundo. Si esas consignas, que son bytes, las genero dentro del primer pic y las mando al segundo (por ejemplo he provado incrementando y decrementando los valores) los servos se mueven acorde con ellas, por lo tanto hasta ahi creo que funciona todo.

Ahora, si en vez de generarlas las voy a buscar a la eeprom donde ya las tengo almacenadas es donde ya no se mueve nada. El servo se va a un extremo y se queda ahi inmóbil.

La eeprom creo que también está bien grabada porque si la leo con winpic800 recibo datos distintos segun la posicion de memoria.


Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Problemas con el i2c entre un pic-eeprom
« Respuesta #6 en: 14 de Noviembre de 2008, 12:36:55 »
Si lo puedes leer con el winpic quiere decir que esta bien la memoria. Ahora, como te digo, eso es lo q se me ocurre para q en tu hardware no este funcionando.

Para usar el bus i2c a fast yo lo pongo asi:
FAST = 400000


Y lo uso por hardware, no hago rutinas en software. Entonces quedaria asi:
#USE I2C (MASTER, FORCE_HW, FAST = 400000, SDA = Pin_B0, SCL = Pin_B1)
en el caso del 18f2550.

Suerte.

Desconectado Kanick

  • PIC10
  • *
  • Mensajes: 9
Re: Problemas con el i2c entre un pic-eeprom
« Respuesta #7 en: 17 de Noviembre de 2008, 10:16:52 »
Citar
Y lo uso por hardware, no hago rutinas en software. Entonces quedaria asi:
#USE I2C (MASTER, FORCE_HW, FAST = 400000, SDA = Pin_B0, SCL = Pin_B1)

Disculpa la pregunta pero lo que no me queda claro es eso de las rutinas en software.

En el código que puse mas arriba, yo uso la rutina "void i2cr(int16 i2cdev)" para leer la memoria. Es a eso a lo que te refieres con "las rutinas software"?

O estas son solo para usarlo por hard?

De todas formas, probare eso que dices a ver si sale algo.

Saludos y gracias.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Problemas con el i2c entre un pic-eeprom
« Respuesta #8 en: 17 de Noviembre de 2008, 12:26:52 »
Cuando NO poner FORCE_HW lo que hace el compilador es crear codigo que simule la comunicacion i2c en los pines que tu quieras. Ocea, crea mas codigo para hacer uso de esto. Mientras que si poner FORCE_HW, estas forzando al compilador a usar el hadware de tu pic para comunicacion i2c que es solo por esos dos pines, ya que ese pic solo tiene i2c por hadware solo por esos pines, en consecuencia, usa esto (que es mejor) y genera menos codigo.

Me refiero a las funciones del ccs como i2c_start(), i2c_read(), ...

Salu2.