Escribir/Leer Eeprom externa

arme un circuito con un pic 16f628a y probe el codigo que han posteado y me funciona tal como esta con una memoria 24c08, pude leer y mostrar el contenido de las 10 posiciones de la eeprom por el puerto B, cambie el valor del bucle para leer 255 posiciones de memoria hasta alli todo bien , pero cuando deseo leer mayor capacidad pues el 24c08 tiene una capacidad de 1 kilobye, entonces elevo a 1023 el bucle pero ohh sorpresa el programa pide que cambie el tipo de variable asignada a ADDR, asi que efectivamente la cambio de BYTE a WORD , complio y ensamblo y todo bien luego cargo el programa al pic y ya no puede leer la memoria , en el manual del pic simulator tambien dice que ADDR debe ser word , pero que es lo que esta fallando? porque no lee la memoria 24c08? alguien que me de un alcanze porque quiero leer y grabar memorias de mayor capacidad
 
La razon por la que quiero poder grabar una memoria 24lc256 o incluso una de mas capacidad es un proyecto que podria parecer extraño habiendo tantos productos que lo hacen como una notebook, palm, celulares modernos etc etc, lo que se me a ocurrido es construir un circuito soportado en un pic + 1 lcd de 16 x 2 lineas + 1 teclado estandar simplificado (unas 40 teclas para letras numeros, simbolos y funciones) para implementar un editor de texto basico portatil que puedas llevar a cualquier parte incluso en el transporte en esas largas horas muertas e las que uno esta atrapado en el trafico, puedes ir escribiendo tus trabajos (solo textos) y despues llegado a tu destino puedas transferir el contenido a una pc ( archivo de texto) donde terminarias el trabajo ya en un word con las de la ley, bueno el artiicio en si debe ser lo mas pequeño posible y con los componentes minimos nesesarios y poder trabajar con baterias recargables al menos alcanzar una hora de autonomia seria un buen comienzo, y por ultimo que sea un equipo economico, con el tiempo podria agregarsele mas funciones como una calculadora , agenda etc etc, no se que les parece esta idea, haber si los expertos nos ayudan o guian en esto o s epueda tomar como un proyecto del tipo codigo abierto.
 
hardwareol5.png


Fuente:
http://www.infopic.comlu.com/joomla/index.php?option=com_content&view=article&id=45&Itemid=66

Fig2207_I2C_24LC256.GIF


Fuente:
http://www.pic16f84a.org/index.php?...w=article&id=66&Itemid=87#Proteus_Capitulo_22
 
gracias por las imagenes, son una buena base, pero lo de usar un teclado ps/2 lo descarto porque queria armar un equipo que entrara facilmente en la mochila y no sea mas grande que un cuaderno
 
aunque ahora he visto en el comercio tecladitos pekeńos casi del tamańo del que usan en laptos, quizas mi artilugio podria entrar adentro, y la pantalla lcd asomar por una ranura, con el tiempo podria usarse una pantalla de esas GLC para tener una vista mas amplia del texto, pero por ahora la cuestion es un equipo de bajo costo que puedas sacar en el transporte sin riesgo de tener una gran perdida por robo versus perder un notebook o palmtop o celulares de ultima generacion que son costosos.
sigo estancado en lo de la grabacion/ lectura del 24lc256 en todo su extencion, el codigo del mismo oshon basic ide no me esta muy claro, existen manuales de como usar el programa y sus herramientas pero no de como utilizar mas ampliamente el juego de instrucciones, quizas con la compra del producto ellos den un manual mas completo de todas sus instrucciones.
 
Última edición:
Hola a todos y disculpen por meterme en su discucion por q en vez de solucion traigo dudas. necesito grabar una eeprom 24c01a por medio de un pic 16f887. desde ya muchas gracias
 
Estoy buscando la forma de aumentar eprom externo a un cartel de led pero no se como hacerlo pero con los datos que me indicaron veré que puedo hacer gracias por su respuesta .
 
Hola, alguien sabe de que manera puedo agilizar la comunicacion entre PIC y memoria?, lo que pasa es que tengo una matriz de 16 X 80, utilizo registros de desplazamiento para las filas y para las columnas (10 y 2 respectivamente de 8 bits cada uno), lo que hago es leer un byte desde la memoria, partirlo en 8 bits, mostrar el primero en la entrada del 1er registro, esperar, cambiar el clock, esperar, volver a cambiar el clock y luego el segundo dato y asi, hasta acompletar 80 bits, luego prendo la fila correspondiente haciendo esta misma operacion con las columnas y sigo con la fila que sigue, pero hice cuentas y para llenar mi matriz me tardo alrededor de 120 milisegundos, el tiempo solo me alcanza para mostrar unos 8 o 9 frames y el minimo es de 24, no me alcanza!!! y eso que lo hice con un cristal de 20MHz.

alguien sabe un método más rapido?

P.D. yo tenia problemas con el direccionamiento de la memoria, no guardaba, lo que estaba mal era que mi direccion la habia declarado como byte, siendo que debe estar como word, y el comando de control para leer lo puse como A1, si a alguien le sirve.

Para tercules:

para usar la EEPROM en mi matriz de LEDs lo que hice fue guardar el contenido en la memoria, para eso ya han explicado algunos que en Basic se hace con I2Cwrite, SDA, SCL, 0xA1, direccion, dato donde la direccion debe ser word, luego para utilizar esos datos en tu matriz, primero debes leer un byte y guardarlo en una variable del PIC, luego esa variable la reflejas bit por bit en el puerto donde tengas tus registros de desplazamiento, (solo si los usas, claro), haces tu rutina para sincronizar la linea de datos con el reloj de los registros, y presentas el sigueinte bit, esto se hace por medio de la instruccion portX.X = variable.0 a variable.7, y asi solo se muestra un bit a la vez.
 
Última edición:
Buenas realice un proyecto en el cual se realiza un muestreo de palabras, el problema es que programe en Basic, y utilice el comando Print aproximadamente 3 veces por palabra, en la memoria interna del 16F877A me permite tener unicamente 24 palabras.
Es factible utilizar una memoria 24LC256 para extender la cantidad de palabras? O el seguir utilizando muchas veces el comando Print no me permitiria expandir la cantidad de palabras?
 
Hola. ¿Podría usar una memoria externa, ejemplo 24C04 y almacenar salidas para led por el puerto B?
Esto lo realicé documentándome sobre las memorias eeprom, pero no me funciona.
¿Alguien me puede dar una guía como hacerlo?

Gracias

Código:
DEFINE   I2C_SCLOUT  1  ;para que no necesite resistencia pull-up en SCL  
contro CON   %10100000       ;contro contiene valor constante %10100000
PinSCL   VAR   Porta.1                    ;pin señal de reloj I2C 
PinSDA   VAR   Porta.0                    ;pin de datos I2C 
dato         VAR BYTE                    ;variable para almacenar dato leído
a var portb.0 
b var portb.1 
c var portb.2 
d var portb.3 
e var portb.4 
f var portb.5 
g var portb.6 
h var portb.7 


Inicio:
I2CWRITE PinSDA,PinSCL,contro,0,[01]    
PAUSE 10                                  
I2CWRITE PinSDA,PinSCL,contro,1,[02]    
PAUSE 10                                  
I2CWRITE PinSDA,PinSCL,contro,2,[03]    
PAUSE 10                                   
I2CWRITE PinSDA,PinSCL,contro,3,[04]    
PAUSE 10
I2CWRITE PinSDA,PinSCL,contro,4,[05]    
PAUSE 10
I2CWRITE PinSDA,PinSCL,contro,5,[06]   
PAUSE 10                                  
I2CWRITE PinSDA,PinSCL,contro,6,[07]    
PAUSE 10                                   
I2CWRITE PinSDA,PinSCL,contro,7,[08]    
PAUSE 10                                   
lee
if porta.2=1 then goto ya
goto lee
ya
leer:        ;programa para leer la memoria serial. 
I2CREAD PinSDA,PinSCL,contro,0,[dato]       
dato=a                            
PAUSE 10                              
I2CREAD PinSDA,PinSCL,contro,1,[dato]       
dato=b                             
PAUSE 10                              
I2CREAD PinSDA,PinSCL,contro,2,[dato]        
dato=c                            
PAUSE 10                            
I2CREAD PinSDA,PinSCL,contro,3,[dato]        
dato=d                         
PAUSE 10
I2CREAD PinSDA,PinSCL,contro,4,[dato]      
dato=e                         
PAUSE 10
I2CREAD PinSDA,PinSCL,contro,5,[dato]        
dato=f                         
PAUSE 10
I2CREAD PinSDA,PinSCL,contro,6,[dato]        
dato=g                         
PAUSE 10
I2CREAD PinSDA,PinSCL,contro,6,[dato]         
dato=h                         
PAUSE 10


end
 
Buenas. Realicé un proyecto en el cual se realiza un muestreo de palabras.
El problema es que programé en Basic y utilicé el comando Print aproximadamente 3 veces por palabra. La memoria interna del 16F877A me permite tener unicamente 24 palabras.
La memoria EEPROM interna del PIC16F877A tiene una capacidad de 256 Bytes.
¿A qué te refieres con palabras? (Tal vez un Word) :confused:
Tampoco mencionas que tipo de compilador Basic estás usando. :confused:
¿Es factible utilizar una memoria 24LC256 para extender la cantidad de palabras?
¿O el seguir utilizando muchas veces el comando Print no me permitiría expandir la cantidad de palabras?
Si no te son suficientes los 256 bytes de la memoria interna, entonces si es conveniente usar una externa.

Cuando nos des más información, te podremos responder mejor.

Hola. ¿Podría usar una memoria externa, ejemplo 24C04 y almacenar salidas para led por el puerto B?
Esto lo realicé documentándome sobre las memorias eeprom, pero no me funciona.
¿Alguien me puede dar una guía como hacerlo?
Si se puede, pero mira bien por qué no funciona lo que haces.
En esta parte tienes lo siguiente...
I2CREAD PinSDA,PinSCL,contro,0,[dato]
dato=a
PAUSE 10
I2CREAD PinSDA,PinSCL,contro,1,[dato]

dato=b

a lo definiste como el bit 0 del puerto B
b lo definiste como el bit 1 del puerto B
Etcétera.

Tendría que ser...
a = dato
b = dato

Etcétera.

Y por cada bit del puerto B tan sólo puedes colocar un 0 o un 1.
No puedes hacer por ejemplo, PORTB.0 = 5
Lo correcto sería que por cada locación de memoria almacenaras, ya sea un 0 o un 1 y ese valor enviarlo a cada pin del PIC.
O almacenar un byte de información y ese valor enviarlo directamente al puerto B.

Algo así:
I2CWrite PinSDA,PinSCL,contro,0,[$0A]
Pause 10
I2CRead PinSDA,PinSCL,contro,0,[dato]
PORTB = dato

Suerte.
 
Última edición:
Hice un programa para grabar datos en una memoria i2c con el pic 16f877a, lamemoria es una 24lc04b, se supone que la primer aparte del programa graba los datos y la segunda los lee, y muestra en una lcd la dirección de la memoria, y la información que encuentra en esta, al parecer la graba bien, pero al leerla en todas las direcciones de la memoria que se supone deberían estar escritas, la lcd muestra un valor de 31, en que podría estar mal? Wp de la memoria lo tengo a gnd junto con A0,A1 y A2 les adjunto el programa, esperando me puedan ayudar.

Código:
DEFINE OSC 4
DEFINE LCD_DREG		PORTB	'DEFINE EL PUERTO A USAR EL PIC
DEFINE LCD_DBIT		0 		'DEFINE EL PRIMER BIT A USAR EL PUERTO
DEFINE LCD_RSREG		PORTB	'DEFINE EL PUERTO A USAR PARA RS
DEFINE LCD_RSBIT		5		'DEFINE EL BIT DE RS EN EL PUERTO
DEFINE LCD_EREG		PORTB	'DEFINE EL PUERTO A USAR PARA E
DEFINE LCD_EBIT		4		'DEFINE EL BIT DE E EN EL PUERTO
DEFINE LCD_BITS		4		'DEFINE EL NUMERO DE BITS CONECTADOS AL LCD
DEFINE LCD_LINES		2		'DEFINE EL NUMERO DE LINEAS
DEFINE LCD_COMMANDAUS	1000	'RETARDO ENTRE ENVIO DE COMANDOS AL LCD
DEFINE LCD_DATAUS		50		'RETARDO ENTRE EL ENVIO DE DATOS ENVIADOS

PORTB=%00000000
TRISD=%00000100

SYMBOL SDA = PORTD.0
SYMBOL SCL = PORTD.1

START VAR PORTD.2
LED VAR PORTD.3

CONTROL VAR  BYTE
CONTROL= $A0
DIREC VAR WORD
DATO VAR BYTE
A1 VAR BYTE
X VAR BYTE 
A1=0

LCDOUT $FE,1	'LIMPIA LCD
LCDOUT $FE,2

INICIO:D

LCDOUT $FE,1, "  GRABADORA DE"
LCDOUT $FE,$C0,"  MEMORIAS I2C"
IF START ==1 THEN
GOTO RUTINA
ENDIF
PAUSE 2000

LCDOUT $FE,1	'LIMPIA LCD
LCDOUT $FE,2
IF START ==1 THEN
GOTO RUTINA
ENDIF
PAUSE 200

 LCDOUT $FE,1, "    PRESIONE"
LCDOUT $FE,$C0,"    START.."
IF START ==1 THEN
GOTO RUTINA
ENDIF
PAUSE 2000

IF START ==1 THEN
GOTO RUTINA
ENDIF

GOTO INICIO

RUTINA:

GRABAR:
LCDOUT $FE,1	'LIMPIA LCD
LCDOUT $FE,2

FOR DIREC =0 TO 207

GOSUB DATOS

LCDOUT $FE,1, "DATO.     DIREC."
LCDOUT $FE,$C0, DEC DATO ,"          ",DEC DIREC

LED=1
PAUSE 700
I2Cwrite SDA, SCL, CONTROL, DIREC, [DATO], {ERRORD}

LED=0
PAUSE 10

LCDOUT $FE,1	'LIMPIA LCD
LCDOUT $FE,2
PAUSE 20

LCDOUT $FE,1,"DATO GUARDADO"
PAUSE 700


LCDOut $fe, 1 ' Limpia la LCD
LCDOUT $FE,2
PAUSE 20

NEXT DIREC

FINAL:
LCDOUT $FE,1, "    GRABADO."
LCDOUT $FE,$C0,"   TERMINADO."
PAUSE 2000

LCDOUT $FE,1	'LIMPIA LCD
LCDOUT $FE,2

FOR DIREC =0 TO 207

LED=1
I2CRead SDA,SCL,CONTROL,DIREC,[A1], {ERRORD}
PAUSE 10

LCDOUT $FE,1, "DATO.     DIREC."
LCDOUT $FE,$C0, DEC A1 ,"          ",DEC DIREC

PAUSE 250
LED=0
PAUSE 500

NEXT DIREC

GOTO INICIO


ERRORD:
LCDOUT $FE,1, "    ERROR DE"
LCDOUT $FE,$C0,"    CONEXION"
PAUSE 2000

GOTO INICIO



DATOS:
lookup DIREC,[0,0,0,0,0,0,0,31,27,27,31,27,27,27,0,31,27,27,30,27,27,31,0,31,31,27,24,27,31,31,0,30,31,27,27,27,31,30,0,31,31,28,31,28,31,31,0 _
,31,31,24,30,24,24,24,0,31,31,24,27,25,31,31,0,27,27,27,30,27,27,27,0,31,31,14,14,14,31,31,0,31,31,6,6,22,31,31,0,27,27,30,28,30,27,27,0,24,24,24,24,27,31,31,0,27,31,21,17,17,17,17,0 _
,25,25,29,21,29,19,19,0,31,27,27,27,27,27,31,0,31,25,25,31,24,24,24,0,31,17,17,17,21,19,31,0,3,25,27,28,30,27,27,0,31,31,16,31,1,31,31,0,31,31,14,14,14,14,14,0,27,27,27,27,27,31,31,0 _
,27,27,27,27,27,31,14,0,17,17,17,21,21,31,27,0,17,17,10,4,10,17,17,0,27,27,27,17,4,4,4,0,31,31,1,14,16,31,31],DATO

RETURN
 
Mira ahora las correcciones y el funcionamiento del programa.
Está adjunto con simulación.
 

Adjuntos

  • 16F887A Memoria 24LC04.rar
    22.1 KB · Visitas: 45
Hola saludos, tal vez mi pregunta sea llover sobre mojado, pero estoy algo confundido.
Trabajando en CCS Compiler, pic de estudio es el PIC16f877a. Antes cuando quería grabar algo en la memoria por ejemplo una clave int clave =520, yo lo grababa en un solo espacio o si necesitaba mas de un espacio no tenia problema porque el tipo de dato es int.
write_eeprom(1,clave);

for( n=0;n<5;n++)
{
write_eeprom(n,clave);//escribo el valor 0 en la dirección 0 de la memoria EEPROM
}

Pero ahora quiero grabar una cadena por ejemplo “9999999999999999” Según he estado leyendo, es de forma similar write_eeprom( 1,“9999999999999999”);. He incluso no me manda error, pero al momento de presentarlo en un lcd no me sale nada.
Printf(Lcd_putc,"clave:%s",read_eeprom(1)); // ni presentado de esta forma
Printf(Lcd_putc,"clave:%c",read_eeprom(1)); // ni presentado de esta forma

Les agradesco su ayuda, no se que me falta, o si grabar una cadena de forma directamente no se puede, o lleva otras funciones antes de grabarla.
** Es importante mencionar de mi parte, que decidí pasar a grabar en memoria datos tipo cadena porque ahora quiero manejar numero mucho mas grande (1 hasta 9999999999999999) y creo que es muy grande para manejarlo de forma entera y en un solo espacio de memoria.
ademas como solo es para presentar en un lcd me pareció bien de esta forma.
 
Si lo que quieres es guardar el valor de una clave con 16 o más dígitos, lo correcto es que la clave la guardes en un arreglo. (Array)

A modo de ejemplo, de ésta manera:
PHP:
void main (void)
{
   int8 clave[16] = {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9};
   int8 a;
   
   lcd_init();
   
   while (true)
   {
      if(!input(PIN_B3))
      {
         lcd_putc("\fGrabando clave");

         for(a=0;a<sizeof(clave);a++)
         {
            write_eeprom(a,clave[a]);
            clave[a] = 0;
         }
         while(!input(PIN_B3));

         lcd_putc("\fLeyendo la clave");
         
         for(a=0;a<sizeof(clave);a++)
         {
            clave[a] = read_eeprom(a);       
            lcd_gotoxy(a+1,2);
            printf(lcd_putc,"%u",clave[a]);
         }
      }
   }
}
Ya que usando una variable tipo int32, tan sólo puedes ingresar hasta 999999999, o su valor máximo de 4294967295.
Y eso será usando la librería; "internal_eeprom.c"

Si quieres guardar los dígitos de la clave en la EEPROM interna al grabar el PIC, puedes hacerlo así:
#ROM Dir_EEPROM = {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}
Donde Dir_EEPROM, corresponde a la dirección de la memoria interna del PIC. P.E. 0x2100
 
Última edición:
Hola saludos, estoy teniendo un problema con un programa que desarrollé y no puedo encontrar una solución o el por qué de mi problema.
El programa trata de lo siguiente: utilizo un sensor de temperatura y lo conecto al pic 16F88 para utilizar un adc, las temperaturas las registra cada 500ms, cada temperatura medida la guarda en una memoria externa eeprom (24LC256), y luego de X cantidad de medidas guardadas deberá imprimir en un lcd la temperatura más alta, que fue comparada antes de ser guardada en la memoria.
Por lo tanto en la memoria en la posición 0 se encuentra guardada la temperatura más alta y en las siguientes posiciones todas las temperaturas medidas.

El problema es el siguiente cuando registra una temperatura y el compilador (CCS C Compiler) lee
write_ext_eeprom(dir_ext_eeprom,dato);
(donde dir_ext_eeprom es de tipo BYTE, y dato es de tipo char)
entra en un bucle infinito dentro de ese write y no sale de ahí, esto lo se porque la memoria externa fue depurada con una opción del proteus y se registró que sólo guardó el primer dato y después se quedó ahí sin ejecutar la instrucción siguiente, donde hago que imprima cualquier cosa en el lcd para corroborar que haya continuado con la ejecución del programa pero esto no sucede.
¿Alguna idea de por qué puede suceder esto?

Como van a ver, por el tipo de pic se tuvo que modificar la librería de la memoria a lo siguiente, para cambiar los pines del pic.

Libreria de la memoria:
Código:
#ifndef EEPROM_SDA

#define EEPROM_SDA  PIN_B3
#define EEPROM_SCL  PIN_A1

#endif
Programa:
Código:
#include <16f88.h>
#device adc=10
#fuses HS, NOWDT, XT, NOPROTECT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)
#define lcd_data4 pin_b4
#define lcd_data5 pin_b5
#define lcd_data6 pin_b6
#define lcd_data7 pin_b7
#define lcd_rs_pin pin_b0
#define lcd_rw_pin pin_b1
#define lcd_enable_pin pin_b2
#include <lcd.c>
#include <24256.c>   //Libreria del 24LC256

void main ()
{

   init_ext_eeprom();                           //INICIALIZAMOS MEMORIA EXTERNA EEPROM
   int16 q;
   char p,aux;
   char t_max=0;                             //variable donde guardo Temperaturia máxima
   BYTE dir_ext_eeprom=1;                        //la direccion de memoria de la eeprom  externa. La ubico en la posición 1 porque la 0
                                                //tiene la temperatura maxima
   int cant_datos=6;                            //como tomamos datos cada 5seg. durante 5 minutos puedo tomar 60 datos.
    
    aux=1;                                       
   char t_max_mostrar=0;                            //variable que muestrea T max obtenida de eeprom ext.                                                  
   setup_adc_ports(0);                          //Selecciona el puerto a realizar la conversion
   setup_adc(adc_clock_internal);               //Selecciona el reloj de conversion
   lcd_init();
    
    
     write_ext_eeprom(dir_ext_eeprom,aux);                       //NO PASA DE ACA!
   printf(lcd_putc,"lala");                             //esto es para probar si salia del write
 
   while (1) {

      set_adc_channel(0);                         //Selecciona el canal de conversion
      lcd_gotoxy(1,1);
      q=read_adc();
      p=((5.0*q)/1024.0)*100;                    //aca guardo la temperatura 
    
      if(cant_datos!=0){
         lcd_gotoxy(1,1); 
         printf(lcd_putc,"Colectando datos"); //imprimo temperatura maxima
         printf(lcd_putc,"\n %d",cant_datos);
        
         cant_datos = cant_datos - 1;                //decremento cant_datos
         
         write_ext_eeprom(dir_ext_eeprom,p);       //guardo en memoria externa el dato sensado
         dir_ext_eeprom= dir_ext_eeprom+1;           //estaba comentado              //incremento una posicion de memoria la eeprom externa. 

          //comparacion de p con t_max
         if (p>t_max){                              //si p>t_max lo reemplazo, sino sigo igual
            t_max=p;     
           write_ext_eeprom(0,t_max);          //estaba comentado         //reemplazo la t_max.
         } 
         
      } else {
         t_max_mostrar=read_ext_eeprom(0);            //tomo la T_max almacenada en la posicion 0 de la eeprom ext.
      
         printf(lcd_putc,"\f");
         printf(lcd_putc,"\n\f");
         printf(lcd_putc,"Temperatura");            //imprimo temperatura maxima
         printf(lcd_putc,"\n%s",t_max_mostrar);
         lcd_gotoxy(6,2);
         printf(lcd_putc,"C");
         break;
      }
      delay_ms(500);
      
      
       
   }
}
Muchas gracias y saludos.
 

Adjuntos

  • prot1.jpg
    prot1.jpg
    104.9 KB · Visitas: 12
  • prot2.jpg
    prot2.jpg
    146.6 KB · Visitas: 12
Última edición por un moderador:
El problema es el siguiente cuando registra una temperatura y el compilador (CCS C Compiler) lee
write_ext_eeprom(dir_ext_eeprom,dato);
(donde dir_ext_eeprom es de tipo BYTE, y dato es de tipo char)
entra en un bucle infinito dentro de ese write y no sale de ahí, esto lo se porque la memoria externa fue depurada con una opción del proteus y se registró que sólo guardó el primer dato y después se quedó ahí sin ejecutar la instrucción siguiente, donde hago que imprima cualquier cosa en el lcd para corroborar que haya continuado con la ejecución del programa pero esto no sucede.
¿Alguna idea de por qué puede suceder esto?
Si se ejecuta la instrucción de escritura en la parte que mencionas en el programa:
PHP:
   write_ext_eeprom(dir_ext_eeprom,aux);                       //NO PASA DE ACA!
   printf(lcd_putc,"lala");                             //esto es para probar si salia del write
Lo que sucede, es que inmediatamente pasa a las siguientes instrucciones del bucle y por eso no te dará tiempo de ver la escritura en pantalla.

Si pusieras un punto de ruptura en write_ext_eeprom, verás que se ejecuta y continúa con printf.
También puedes detener la ejecución del programa con sleep();
Como no tienes interrupciones, ahí sí podrás ver físicamente o en el simulador, cuando se escribe "lala" en la pantalla.
Por ejemplo:
PHP:
   aux = 0x0A;
   write_ext_eeprom(dir_ext_eeprom,aux);                       //NO PASA DE ACA!
   printf(lcd_putc,"lala");                             //esto es para probar si salia del write
   sleep();
Y en la ventana de depuración podrás ver que el dato de ejemplo (0x0A) se ha escrito en la dirección 1 (Dirección asignada por "dir_ext_eeprom")
Depuración.jpg
 
Última edición:
Gracias por responder, hice lo del sleep e igualmente sigue sin funcionar, porque cuando graba un dato en la memoria no sale de la memoria, sino que se queda ahí dentro como esperando a recibir mas datos que no recibe. Por eso no me ejecuta la siguiente linea de imprimir en el lcd para asegurarme que salió de la memoria.
Adjunte la imagen de debugguear la memoria y se puede ver que recibe el dato que lo guarda y después se queda ahí en el bucle infinito de la memoria y no ejecuta más. (recibe con el ack el primer dato pero después en vez del ack aparece una N por lo tanto no hay envío y transmisión de información, solo tiene que escribir un solo dato y continuar con la ejecución del programa).

Gracias.
 

Adjuntos

  • memoria.jpg
    memoria.jpg
    177.3 KB · Visitas: 7
Gracias por responder, hice lo del sleep e igualmente sigue sin funcionar, porque cuando graba un dato en la memoria no sale de la memoria, sino que se queda ahí dentro como esperando a recibir mas datos que no recibe. Por eso no me ejecuta la siguiente linea de imprimir en el lcd para asegurarme que salió de la memoria.
Adjunte la imagen de debugguear la memoria y se puede ver que recibe el dato que lo guarda y después se queda ahí en el bucle infinito de la memoria y no ejecuta más. (recibe con el ack el primer dato pero después en vez del ack aparece una N por lo tanto no hay envío y transmisión de información, solo tiene que escribir un solo dato y continuar con la ejecución del programa).

Gracias.

Buenas.
No entiendo cual es el problema, a mi me funciona bien, solo había algunos detalles como la configuración del puerto Analógico. Tu lo has configurado así "setup_adc_ports(0);" y tiene que ser así "setup_adc_ports(sAN0);".
También la librería <24256.c> al modificarla tienes que guardar en la carpeta donde esta tu proyecto y llamarla desde el compilador así "24256.c" con las comillas, porque si no haces ese paso llama a la librería por defecto.
Adjunto la simulación y el código modificado:
 

Adjuntos

  • temp+eeprom.rar
    148.5 KB · Visitas: 8
Atrás
Arriba