TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: david2130 en 24 de Noviembre de 2010, 05:45:12

Título: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 24 de Noviembre de 2010, 05:45:12
Hola  a todos!!!

Necesito conectar el pic 16f876 a una eeprom externa 25LC1024.

Os dejo los data sheet de la memoria y del pic.

Esta es la libreria del PIC 16f876 :http://www.datasheetcatalog.org/datasheets2/36/3629224_1.pdf
Esta es la de la eeprom: http://docs-europe.origin.electrocomponents.com/webdocs/0b04/0900766b80b04b70.pdf

espero vuestra ayuda.

Gracias
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: ASTROCAR en 24 de Noviembre de 2010, 06:23:20
Hola buenas noches oye disculpa que no te lo muestre con un diagrama lo que pasa es que en esta pc no tengo instalado proteus pero de igual forma te lo escribo de una manera sencilla:

pic (pines)...........................................................Eeprom(pines)
24-Serial Data Out (SDO)                                          5-SI
23-Serial Data In (SDI)                                             2-SO
18-Serial Clock (SCK)                                               6-SCK
7-Slave Select (SS)                                                   1-CS

Nota: Vss es tierra y Vcc=WP=HOLD= 5volt o 3.3volt es decir alimentacion para la eeprom en tal caso.

Saludos y espero haber sido claro sino me comentas y hago algo en proteus.
Atten.
Alexander Santana.
Venezuela-Barcelona.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 24 de Noviembre de 2010, 08:20:03
Lo siento pero no me quedó claro, si puedes hacer lo del proteus te lo agradeceria.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: ASTROCAR en 24 de Noviembre de 2010, 09:46:36
Lo siento pero no me quedó claro, si puedes hacer lo del proteus te lo agradeceria.
Lamento decirte que no tengo proteus instalado, pero ejemplo el pin 24 del pic va al pin 5 de la eeprom y asi sucesivamente.

pin 23 del pic va al pin 2 de la eeprom
pin 18 del pic va al pin 6 de la eeprom.

Saludos y espero no enredarte con eso de las coneccion.

Atten.
Alexander Santana.
Venezuela-Barcelona.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 26 de Noviembre de 2010, 09:55:35
Gracias!!! lo hice, pero ahora necesito el programa para que funcione. si me pudieras ayudar sera mejor.gracias el programa lo tengo que hacer con ccs
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: jeremylf en 26 de Noviembre de 2010, 10:10:54
Ponte a buscar hombre, no pidas tanto que los foros no trabajan así...
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: bigluis en 26 de Noviembre de 2010, 13:18:32
Hola david!

A como dice Jeremy si buscas un poco en el foro puedes encontrar la respuesta.

Si te fijas en la hoja de datos la memoria 25lc1024 es igual a la memeoria 25aa1024, posiblemente solo buscaste para la primera por lo cual no te dio ningun buen resultado.

Por Aquí (http://www.todopic.com.ar/foros/index.php?topic=32792.0) puedes encontrar una libreria para la memoria 25aa1024. Aún no esta completa pero te puede servir de inicio.

 :-/ Suerte.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 03 de Diciembre de 2010, 08:13:55
Haber, al final hemos decicido hacerlo con el pic 12f683, conectarlo a la misma memoria mediante spi por software.

Os cuento, el pic funciona y la eeprom tambien, pero cuando grabamos en la eeprom mediante el pic, al leer lo que tiene la eeprom lo unico que nos sale es "yyyyyyy" entonces, ya no sé si esque no lee o no graba. haber que pensais vosotros.

Os dejo los programas del pic el primero es el de grabar en la eeprom y el segundo es el de leer:
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: bmfranky en 03 de Diciembre de 2010, 09:57:04
Perdona , no leí bien, creía que usabas la 24lc , porque no le echas un ojo a la librería 25640.c de ccs, solo tendrás que adaptarla a tus necesidades, aumentando el tamaño de la memoria. Esta en la carpeta drivers.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: AngelGris en 03 de Diciembre de 2010, 10:19:02
También hay que tener en cuenta los tiempos de grabado antes de intentar volver a leer la memoria.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 03 de Diciembre de 2010, 20:38:57
la memoria 25640 ya la vi. lo de que hay qye tener en cuenta los tiempos de grabado antes de leer a que te refieres¿?
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: AngelGris en 03 de Diciembre de 2010, 20:46:22
la memoria 25640 ya la vi. lo de que hay qye tener en cuenta los tiempos de grabado antes de leer a que te refieres¿?

  A que en toda memoria, cuando yo intento escribir un dato, debo esperar x cantidad de tiempo para que el dato se grabe correctamente en la misma.  Por ejemplo una 24C04 tarda 1ms por byte. Es decir que si le mando un paquete de 8 byte debo esperar 8ms antes de querer hacer cualquier otra cosa con la memoria.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 13 de Diciembre de 2010, 04:50:36
la memoria tarda 6 ms, que es lo que esperamos para ver si ha grabado, pero aun asi sigue igual.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: bmfranky en 13 de Diciembre de 2010, 07:55:25
Pasa-nos el código fuente completo, para poder simularlo, e intentar ayudarte.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: ASTROCAR en 13 de Diciembre de 2010, 08:41:47
Hola buenos dias, hermano una consulta usted aun no tiene hecho el diagrama en  proteus cdomo lo prueba que avance lleva en el codigo en fin que ha hecho usted.

Saludos y dinos cual es tu falla o problema en particular para asi ver de que manera ayudamos porque si es por hacerlo por ti no tendra ciencia porque no aprenderas nada y la idea tuya se que es aprender de corazon quiero pensarlo asi.

Atten.
Alexander Santana.
Venezuela- Barcelona.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 13 de Diciembre de 2010, 08:42:46
os paso los programas que hicimos en ccs para grabar y para leer.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: AngelGris en 13 de Diciembre de 2010, 10:01:10
os paso los programas que hicimos en ccs para grabar y para leer.

  Un consejito, la próxima vez que quieras mostrar un código intentá hacerlo con la opción para insertar código dentro del propio post (es el botón que dice GeSHi, es un menú desplegable y tenés varios formatos de códigos), así es más fácil y rápido para quien esté leyendo.

  Estuve viendo un poquito tus programas, yo no sé como será la función spi_xfer pero no veo que actives ningún pin para la línea CS de la memoria.
  Normalmente las memorias comienzan el proceso de grabado interno cuando aparece un "1" en dicho pin.
Ese pin tiene que estar normalmente en "1", cuando hacés "0" el pin CS de algún dispositivo es porque querés acceder a él, cuando terminaste de trabajar con él lo volves hacer "1".
  La idea básica de la transmisión sería algo así

Código: C
  1. void main(void)
  2. {
  3.   ........
  4.   ........
  5.   ........
  6.   pin CS memoria = 1;
  7.   ........
  8.   ........
  9.   while (1);
  10.   {
  11.     pin CS memoria = 0;       // indica que quiero trabajar con la memoria
  12.     spi_xfer (EEPROM, 0x0f);
  13.     spi_xfer (EEPROM, 0xff);
  14.     pin CS memoria = 1;       // recien despues de esta linea comenzara el proceso interno de grabado
  15.     delay_ms (10);               // espera para asegurar el grabado
  16.   }
  17. }
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: bigluis en 13 de Diciembre de 2010, 19:37:43
Estuve viendo un poquito tus programas, yo no sé como será la función spi_xfer pero no veo que actives ningún pin para la línea CS de la memoria.
  Normalmente las memorias comienzan el proceso de grabado interno cuando aparece un "1" en dicho pin.
Ese pin tiene que estar normalmente en "1", cuando hacés "0" el pin CS de algún dispositivo es porque querés acceder a él, cuando terminaste de trabajar con él lo volves hacer "1".

Pues precisamente esa es la ventaja de la función spi_xfer, te permite enviar una cantidad de bits especificada previamente con la instrucción #use spi(...), y además ella activa y desactiva el pin CS autmaticamente.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: AngelGris en 13 de Diciembre de 2010, 19:48:28
Estuve viendo un poquito tus programas, yo no sé como será la función spi_xfer pero no veo que actives ningún pin para la línea CS de la memoria.
  Normalmente las memorias comienzan el proceso de grabado interno cuando aparece un "1" en dicho pin.
Ese pin tiene que estar normalmente en "1", cuando hacés "0" el pin CS de algún dispositivo es porque querés acceder a él, cuando terminaste de trabajar con él lo volves hacer "1".

Pues precisamente esa es la ventaja de la función spi_xfer, te permite enviar una cantidad de bits especificada previamente con la instrucción #use spi(...), y además ella activa y desactiva el pin CS autmaticamente.

  Ah, mira que interesante. Entonces david debería definir un pin para CS dentro del #use spi(....) y listo. Porque en el programita de él no tiene ningún pin definido como CS.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: bigluis en 13 de Diciembre de 2010, 20:16:29
os paso los programas que hicimos en ccs para grabar y para leer.

En el link que puse en el primer post, te muestro una librería completamente funcional para escribir y para leer un dato de la eeprom.

Hola david!

A como dice Jeremy si buscas un poco en el foro puedes encontrar la respuesta.

Si te fijas en la hoja de datos la memoria 25lc1024 es igual a la memeoria 25aa1024, posiblemente solo buscaste para la primera por lo cual no te dio ningun buen resultado.

Por Aquí (http://www.todopic.com.ar/foros/index.php?topic=32792.0) puedes encontrar una libreria para la memoria 25aa1024. Aún no esta completa pero te puede servir de inicio.

 :-/ Suerte.

En mi librería solo debes modificar la linea de #use spi(), recordando que en tu caso debes utilizar transmisión spi por software no por hardware a como lo hago yo, y además debes decir que la cantidad de bits es de 16, al igual que como esta en mi librería.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: bigluis en 13 de Diciembre de 2010, 20:24:34
  Ah, mira que interesante. Entonces david debería definir un pin para CS dentro del #use spi(....) y listo. Porque en el programita de él no tiene ningún pin definido como CS.

Así es, para ello debes poner ago como esto #use spi(......,ENABLE=PIN_A3,......)
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 15 de Diciembre de 2010, 08:15:48
os paso los programas que hicimos en ccs para grabar y para leer.

  Un consejito, la próxima vez que quieras mostrar un código intentá hacerlo con la opción para insertar código dentro del propio post (es el botón que dice GeSHi, es un menú desplegable y tenés varios formatos de códigos), así es más fácil y rápido para quien esté leyendo.

  Estuve viendo un poquito tus programas, yo no sé como será la función spi_xfer pero no veo que actives ningún pin para la línea CS de la memoria.
  Normalmente las memorias comienzan el proceso de grabado interno cuando aparece un "1" en dicho pin.
Ese pin tiene que estar normalmente en "1", cuando hacés "0" el pin CS de algún dispositivo es porque querés acceder a él, cuando terminaste de trabajar con él lo volves hacer "1".
  La idea básica de la transmisión sería algo así

Código: C
  1. void main(void)
  2. {
  3.   ........
  4.   ........
  5.   ........
  6.   pin CS memoria = 1;
  7.   ........
  8.   ........
  9.   while (1);
  10.   {
  11.     pin CS memoria = 0;       // indica que quiero trabajar con la memoria
  12.     spi_xfer (EEPROM, 0x0f);
  13.     spi_xfer (EEPROM, 0xff);
  14.     pin CS memoria = 1;       // recien despues de esta linea comenzara el proceso interno de grabado
  15.     delay_ms (10);               // espera para asegurar el grabado
  16.   }
  17. }



hice esto, pero no me hizo nada de nada
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 15 de Diciembre de 2010, 08:20:13
hice lo que me decis, no hace nada de nada, haber, hemos estado comprobando si a la eeprom llega la señal del relog, y llegar llegua, pero la eeprom no graba, estamos haciendo un codgio nuevo, cuando lo tenga os lo pasaré para que lo veais.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: bigluis en 20 de Diciembre de 2010, 01:53:04
En esta ocasion traigo una versión modificada de la libreria para el 25xx1024.
Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
////   Autores:  
////     Luis Alberto Vargas Tijerino
////     Francisco Sevilla
////  
////   Version: 2.0
////   Fecha: 19-Dic-10
////  
////   LIBRERIA PARA EEPROM EXTERNA 25AA1024 UTILIZANDO SPI            ////
////                                                                   ////
////   init_ext_eeprom();    Call before the other functions are used  ////
////                         if you use hardware spi                   ////
////                                                                   ////
////   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    ////
////                                                                   ////
////   ext_eeprom_ready();  wait until the eeprom is ready             ////
////                            to receive opcodes                     ////
////                                                                   ////
////   The main program may define EEPROM_SELECT and #use spi(...)     ////
////                                                                   ////
////                                                                   ////
////                      Pin Layout                                   ////
////   -----------------------------------------------                 ////
////   |    __                                       |                 ////
////   | 1: CS   EEPROM_SELECT | 8: VCC   +5V        |                 ////
////   |                       |    ____             |                 ////
////   | 2: SO   EEPROM_DO     | 7: HOLD  +5V        |                 ////
////   |    __                 |                     |                 ////
////   | 3: WP   +5V           | 6: SCK   EEPROM_CLK |                 ////
////   |                       |                     |                 ////
////   | 4: VSS  GND           | 5: SI    EEPROM_DI  |                 ////
////   -----------------------------------------------                 ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////      Este codigo fue modificado para utilizarzse en               ////
////      SPI Serial Bus 25AA1024 a partir de la libreria 25640.c      ////
////      9356SPI.c y ex_spi.c                                         ////
///////////////////////////////////////////////////////////////////////////

//Definicion de pines
#ifndef EEPROM_SELECT
   #define EEPROM_SELECT PIN_A4
   #use spi(MASTER,DI=PIN_A0,DO=PIN_A1,CLK=PIN_A2,MODE=0,MSB_FIRST,BITS=8)
#endif

#use spi(MASTER,DI=PIN_A0,DO=PIN_A1,CLK=PIN_A2,MODE=0,MSB_FIRST,BITS=8)

#define EEPROM_SIZE    8388608            //1024Kb = 1024*1024*8=8388608

//SET DE INSTRUCCIONES DE 25AA1024
#define READ   0x03     //Read data from memory array beginning at selected address
#define WRITE  0x02     //Write data to memory array beginning at selected address
#define WREN   0x06     //Set the write enable latch (enable write operations)
#define WRDI   0x04     //Reset the write enable latch (disable write operations)
#define RDSR   0x05     //Read STATUS register
#define WRSR   0x01     //Write STATUS register
#define PE     0x42     //Page Erase – erase one page in memory array
#define SE     0xD8     //Sector Erase – erase one sector in memory array
#define CE     0xC7     //Chip Erase – erase all sectors in memory array
#define RDID   0xAB     //Release from Deep power-down and read electronic signature
#define DPD    0xB9     //Deep Power-Down mode

#define init_ext_eeprom() SETUP_SPI(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4);   //Configurar SPI

void ext_eeprom_ready(){
   OUTPUT_LOW(EEPROM_SELECT);
   spi_xfer(RDSR);                     //Espera a que el registro status de la eeprom sea
   while(bit_test(spi_xfer(RDSR),0));  //igual a cero
   OUTPUT_HIGH(EEPROM_SELECT);
}

void write_enable_extee(){
   OUTPUT_LOW(EEPROM_SELECT);
   spi_xfer(WREN);      //Enviamos el comando Write Enable
   OUTPUT_HIGH(EEPROM_SELECT);
}
  

void write_ext_eeprom(int32 address, BYTE data) {
   int cmd[5];
   int i;
   cmd[0]=WRITE;
   cmd[1]=make8(address,2);//Tomamos el byte 2 de address
   cmd[2]=make8(address,1);//Tomamos el byte 1 de address
   cmd[3]=make8(address,0);//Tomamos el byte 0 de address
   cmd[4]=data;
  
   write_enable_extee();
  
   OUTPUT_LOW(EEPROM_SELECT);//Habilito el pin de seleccion de chip.
   for(i=0;i<=4;i++)
      spi_xfer(cmd[i]);       //Envio los cmd del 0 hasta el 4
   OUTPUT_HIGH(EEPROM_SELECT);//Deshabilito el pin de seleccion de chip.
}


BYTE read_ext_eeprom(int32 address) {
   int cmd[4];
   int i,data;
   cmd[0]=READ;
   cmd[1]=make8(address,2);//Tomamos el byte 2 de address
   cmd[2]=make8(address,1);//Tomamos el byte 1 de address
   cmd[3]=make8(address,0);//Tomamos el byte 0 de address
  
   ext_eeprom_ready();
  
   OUTPUT_LOW(EEPROM_SELECT);
   for(i=0;i<=3;i++)
      spi_xfer(cmd[i]);       //envio los cmd desde el 0 hasta el 3
   data=spi_xfer(0);          //luego envio 0 y recivo el dato.
   OUTPUT_HIGH(EEPROM_SELECT);
   return data;
}

Y a continuacion el ejemplo de utilización.
Código: [Seleccionar]
#include <12f683.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOCPD                    //No EE protection
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4M)

#define EEPROM_SELECT PIN_A4
#use spi(MASTER,DI=PIN_A0,DO=PIN_A1,CLK=PIN_A2,MODE=0,MSB_FIRST,BITS=8)
#include <251024.c>


void main(){
   int datos_recibidos,i=0;
   OUTPUT_HIGH(EEPROM_SELECT);
   while (TRUE){
      write_ext_eeprom(i,i+' ');
  
      datos_recibidos=read_ext_eeprom(i);
      
      i++;
   }
}

La ventaja de esta version es que puede ser utilizada por los PIC que no tienen spi por hardware.

A continuacion dejo el archivo adjunto del trabajo.
Título: Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
Publicado por: david2130 en 13 de Enero de 2011, 09:23:19

He tenido q poner en la libreria antes de #use spi..e tenido q poner #use delay (clock=8000000) xq sino no me dejaba compilrlo, aciendo esto lo e compilado pero no me va y nose si es problema de la libreria o es xq tenga mal puestas las entradas o las salidas es decir nose si tengo mal el SET_TRIS_A(0b00001001).De todas maneras la libreria q hicistes es par el pic 12f683 no?¿ por que es el pic q estoy utilizando. Segire probando cosas aver y avisame con algo muxhas gracias