Autor Tema: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...  (Leído 7238 veces)

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

Desconectado aiwa_7

  • PIC10
  • *
  • Mensajes: 44
Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« en: 24 de Septiembre de 2009, 20:02:31 »
Hola amigos de todopic... soy nuevo en la foro... me gustaría que me ayudaran con un pequeño problema que tengo... este es que no estoy seguro de que la conexion que hice entre la eeprom 24C64 y el PIC18F452 sea la correcta... ya estuve siguiendo varios diagramas pero no he podido hacer funcionar esta comunicacion... por el codigo del programa no me preocupo, estoy completamente seguro que ese funciona porque ya lo habia probado con anterioridad... la conexion es la que me ha sacado de mis casillas ya que el diagrama que tenia lo perdi y los que he revisado no me han funcionado con mi codigo... si alguien me pudiese ayudar por favor le estaría muy agradecido...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #1 en: 24 de Septiembre de 2009, 22:16:04 »
Seria interesante ver el esquema que montaste y el código en todo caso  ;-)


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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #2 en: 24 de Septiembre de 2009, 22:32:05 »
Sube el diagrama para verlo pss
El papel lo aguanta todo

Desconectado isfan

  • PIC16
  • ***
  • Mensajes: 145
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #3 en: 27 de Septiembre de 2009, 14:18:49 »
Buenas, Para la comunicar el PIC18F452 con la Memoria 24CXX o otro  protocolo I2C solo necesitas 2 pines del microcontrolador:

(SCL) - RC3/SCK/SCL
(SDA) - RC4/SDI/SDA

Conectada respectivamente a los pines 5 (SLC) y 6(SDA) de la memoria 24C64

Recuerda poner una resistencia de pull-up a cada linea, tanto a la SDA como a la SCL, porque son con estas resistencias precisamente las que le marcan la velocidad de transmisión al bus. Prueba con resistencias pull-up de 4K7 que suele ser un valor bastante estándar, pero recuerda que dependiendo de la velocidad hay que subir o bajar el valor de estas pull-ups.


recuerdas que deberas  configurar dichos pines del PIC como entrada o salida atraves de los bits 3 y 4 de TRISC
y en el registro SSPCON1 el modo de funcionamiento I2C como Maestro/Esclavo

4K7<100kbps
2K2>100kps
1K>400Kbps

Prueba a ver si simplemente con esto ya comunicas.


http://ww1.microchip.com/downloads/en/DeviceDoc/i2c.pdf

Saludos
« Última modificación: 27 de Septiembre de 2009, 14:22:26 por isfan »

Desconectado aiwa_7

  • PIC10
  • *
  • Mensajes: 44
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #4 en: 28 de Septiembre de 2009, 19:29:41 »
Que tal de nuevo... muchas gracias por la atencion prestada a este trabajo... en respuesta al compañero isfan... ya realice el circuito de nuevo con las consideraciones que facilitaste y sigue sin trabajar como debe... en si, el problema recurrente desde que se inicio el proyecto es que la memoria retiene un solo valor, por ejemplo se mete una serie de valores y solo guarda el ultimo... esto se corroboró leyendo la memoria con un programador que permite leer estas memorias ya que al leerla con el pic muestra el ultimo valor en todos los sectores... nuevamente agradezco el interes de isfan, MLO y Suky...


P.D: anexo el codigo y el diagrama que se utilizo para conectar la memoria al pic...

Desconectado aiwa_7

  • PIC10
  • *
  • Mensajes: 44
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #5 en: 28 de Septiembre de 2009, 19:32:38 »
anexos...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #6 en: 28 de Septiembre de 2009, 19:55:02 »
En el código veo que estas definiendo los pines B0 y B1 para la comunicación I2C, pero en el esquemático utilizas los pines del módulo MSSP (I2C/SPI), osea RC3 y RC4. Debes definir exactamente cual vas a utilizar.

Aparte veo que configuras el módulo MSSP para trabajar en modo SPI? setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
No contesto mensajes privados, las consultas en el foro

Desconectado aiwa_7

  • PIC10
  • *
  • Mensajes: 44
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #7 en: 28 de Septiembre de 2009, 20:20:29 »
hola suky... en el esquematico se me paso especificar que no utilice esos pines (RC4 y RC3)... si no que si los conecte con lo que esta definido en el codigo (B0 y B1)... pero lo que si me gustaria que explicaras un poco mas eso del modulo MSSP en modo SPI... gracias...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #8 en: 28 de Septiembre de 2009, 20:38:14 »
El PIC tiene el módulo MSSP que lo puedes configurar para trabajar en modo I2C o SPI. La comunicación SPI es a 3 hilos (SDI, SDO y SCL) mas una linea de selección de dispositivo (CS) osea comunicación punto a punto, a diferencia del I2C que se direcciona el dispositivo mediante el envío de un byte. Otra diferencia con I2C es que soporta mayor velocidad de transmisión. Aquí hay un ejemplo de uso generado por software.

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

Desconectado isfan

  • PIC16
  • ***
  • Mensajes: 145
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #9 en: 29 de Septiembre de 2009, 07:22:43 »
El esquema que tienes es para una configuración I2C y el codigo fuente es para SPI  o modificas el esquema o el codigo fuente, No puedo ayudarte con el codigo
fuente ya que mis nociones son de ASM.

Como saben microchip a implantado en la mayoria de los PIC el módulo MSSP (Master Synchronous Serial Port) para proporcionar un protocolo de comunicación a los diversos perifericos (Eeprom, Conversores A/D, controlador de display, etc)

El usuario dispone de esta forma de algunas patitas de la PuertaC que programada debidamente sirve para manejar directamanete la comunicación Serie.

El Módulo MSSP admite 2 alternativas:

1. SPI ( Serial Peripheral Interface)
2. I2C (Inter-Integrated Circuit)

Como digo Suky la comunicacion serie del modo I2C emplea 2 lineas (RC3/SCL y RC4/SDA) y en modo SPI 3 (RC3/SDO, RC4/SDI y RC5/SCK)

Al Comenzar el funcionamiento en modo SPI o I2C, los dispositivos que pueden clasificarse en 2 estados, Maestro  o esclavo. El maestro es el que inicia la tranferencia de datos y general la señal de reloj cualquiera de los dispositivos direccionado por el maestro se considera esclavo en tu caso el PIC18F452 seria el Maestro y la memoria 24c64 esclavo.

Yo te recomiendo que te acostumbre a usar el modo I2C que es el más extendido

Los registro que controla la tranferencia son 6:

SSPCON -> Registro de control
SSPCON2 -> Registro de control 2
SSPSTART -> Registro de estado
SSPBUF -> Buffer para los dato
SSPSR -> Registo de desplazamiento no accesible directamente
SSPADD - > Registro de dirección

Lo primero que tiene que configurar son los 4 bits de menos peso del SSPCON que indica el modo de trabajo entre 3 posibles: Modo I2C Maestro, Modo I2C esclavo 7 bits direccion y modo I2C esclavo de 10 bits de dirección.

El Bit SSPEN (5) del registro SSPCON se pone a 1 para indicar el modulo MSSP si se quedara a 0 actuaria como linea de E/S

Apartir de hay tiene ya varias opciones...

Haci que prueba a hacer la modificación y ya me cuentas.
« Última modificación: 29 de Septiembre de 2009, 12:35:55 por isfan »

Desconectado aiwa_7

  • PIC10
  • *
  • Mensajes: 44
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #10 en: 29 de Septiembre de 2009, 18:41:32 »
  :-/ hola...
NUEVAMENTE AQUI...
PUES MIREN, PRIMERAMENTE MUCHAS GRACIAS POR ATENDER A ESTE TEMA...
Y PUES CON MALAS NOTICIAS...
YA HICE TODOS LOS ARREGLOS Y RECOMENDACIONES QUE ME DIERON...
CONFIGURE PARA I2C, HICE UN CHEQUEO GENERAL AL CODIGO Y CONECTE NUEVAMENENTE...
DESAFORTUNADAMENTE EL CIRCUITO SIGUE HACIENDO LO MISMO...
REPITO LA PROBLEMATICA...
EL PROGRAMA SI INICIA NORMALMENTE, Y PARECE QUE HACE BIEN LAS FUNCIONES...
PUEDO GUARDAR LOS DATROS QUE QUIERA Y EL PROGRAMA SIGUE FUNCIONANDO, SOLO QUE SOLO GUARDA EL ULTIMO DATO QUE LE DOY... LO CURIOSO ES QUE SOLO GUARDA EN UNA DIRECCION, LA "14"...  AL MOMENTO DE LEER CON EL MISMO PIC, ME DESPLIEGA EL ULTIMO VALOR DADO PERO DESDE CUALQUIER DIRECCION...
¿COMO SE QUE SOLO GUARDA EL ULTIMO QUE SE LE DA?...
BUENO PUES LO CHECO CON UN LECTOR DE MEMORIAS, EL PIC-PROG III...
NO SE SI ALGUNO A TENIDO ESE PROBLEMA U OTRO SIMILAR...
LES DEJO EL ULTIMO CODIGO QUE USE...
SI TIENEN OTRA OPINION SERA MUY BIEN RECIBIDA...


Desconectado aiwa_7

  • PIC10
  • *
  • Mensajes: 44
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #11 en: 29 de Septiembre de 2009, 18:44:13 »
 :-/   CODIGO

#define LCD_DATA_PORT PORTD
#define LCD_TYPE 2

#ifndef EEPROM_SDA

#define EEPROM_SDA  PIN_B6
#define EEPROM_SCL  PIN_B7

#endif

#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>     //Para que funcione atoi, atof,...
#include <2464.c>

void  get_string(char * s,int max)  //Permite obtener valores del teclado
{                                   
   int len;
   char c;
   max--;
   len=0;
   c=0;
   do
   
      {
      c=kbd_getc();
      if ((c>= ' ')&&(c<='~')&&(c!='#'))
         if (len<max)
         {
            s[len++]=c;
            lcd_putc(c);
         }
      }
   while (c!='#');
   s[len]=0;
   c=0;
}


void main()
{

   int8 out,in,a,r;
   char d,dir[4],dat[8];
   
   lcd_init();
   init_ext_eeprom();
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
 

  while (true)
   {
   if (r==0)
   {
   lcd_gotoxy(3,1);
   printf(lcd_putc,"PROYECTO");   //Inicio, muestra nombre y materia
   lcd_gotoxy(2,2);
   printf(lcd_putc,":) senaforo :(");
   delay_ms(3000);
   printf(lcd_putc,"\f");                 //Limpia pantalla
   
   }
   r=1;
   if (r==1)
   {
   printf(lcd_putc,"\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc,"read 1) write 2)");   //Muestra menu de inicio
       
   do
      {
         d=kbd_getc();                    //Obtiene instruccion
         if(d=='1')
            a=1;
         if(d=='2')
            a=2;
      }
      while((d!='1')&&(d!='2'));          //Mensaje de error
     
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%d",a);
      delay_ms(3000);
     
      switch(a)
      {
      case (1):                           //Eleccion lectura
         printf(lcd_putc,"\f");           //Limpia pantalla
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Direccion=");   
         get_string(dir,4);               //Obtiene direccion para leer
         lcd_gotoxy(1,2);
         in=read_ext_eeprom(dir);         //Lectura a la memoria
         printf(lcd_putc,"Dato=%u",in);   //Imrime dato contenido en direccion
         delay_ms(1000);
         break;
      case (2):
         printf(lcd_putc,"\f");           //Eleccion escritura
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Direccion=");   
         get_string(dir,4);               //Obtiene direccion a ser escrita
         lcd_gotoxy(1,2);
         printf(lcd_putc,"Dato=");       
         get_string(dat,8);               //Otiene valor de dato
         out=atoi(dat);
         write_ext_eeprom(dir,out);       //Escritura a la memoria
         delay_ms(10);
         break;
      }
   
   }
   }
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #12 en: 30 de Septiembre de 2009, 01:36:58 »
Hola.

Si capturas 8 dígitos con la función get_string(), la función atoi te va a truncar el valor. Además recuerda que los registros de la EEPROM externa son de 8bits también así que hay que tener cuidado con la longitud del valor a guardar.

Saludos
El papel lo aguanta todo

Desconectado aiwa_7

  • PIC10
  • *
  • Mensajes: 44
Re: Cómo comunicar el PIC18F452 con memoria eeprom 24C64...
« Respuesta #13 en: 30 de Septiembre de 2009, 17:31:15 »
hola a todos... buenas nuevas...!!! ya funciono el programa... !!! muchas gracias por las atenciones prestadas... a todos...

les comento... fue un error de codigo... la manera en que se corrigio fue tomando en cuenta que queriamos sacar un valor de una direccion de memoria en cadena de caracteres por lo tanto se tenia que convertir a entero antes de solicitar el dato y desplegarlo en la lcd...

nuevamente les agradezco su participacion y la atencion prestada a a este caso... continuaremos con el proyecto y pues estaremos pendientes a cualquier asunto en el cual podamos aportar algo...

gracias a todos...!!!

P.D: Anexo el codigo para cualquier revision o aplicacion tengan una base...