Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

12/12/2009 #21


Respuesta: 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
13/12/2009 #22


Respuesta: Escribir/Leer Eeprom externa
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.
14/12/2009 #24


Respuesta: Escribir/Leer Eeprom externa
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
22/12/2009 #25


Respuesta: Escribir/Leer Eeprom externa
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.
28/12/2009 #26


Respuesta: Escribir/Leer Eeprom externa
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
28/12/2009 #27

Avatar de Meta

Respuesta: Escribir/Leer Eeprom externa
Arol dijo: Ver Mensaje
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
Mira aquí.
Como usar la EEPROM de los PICs

Saludo.
30/12/2009 #28


Respuesta: Escribir/Leer Eeprom externa
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 .
07/02/2010 #29


Respuesta: Escribir/Leer Eeprom externa
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.
22/03/2012 #30


zgouki dijo: Ver Mensaje
Amigo meledu: Primero ante todo buscate el datasheet de la memoria que vas a utilizar, yo uso la página siguiente www.datasheets.org.uk, en el buscador pon las siglas de la eeprom. De todos modos, creo que todas las eeprom de la familia 24LC son iguales, cambian la capacidad de memoria nada mas. Una vez que tengas el datasheet, fijate cuales son los pines de DATA y de CLOCK (SDA y SCL, respectivamente) Cuando hagas las conexiones de dichos pines de la eeprom con el PIC que vas a utilizar (acuerdate que debes poner unas resistencias en configuración PULL-UP, osea a Vcc, cualquier duda pregunta), si vas a utilizar el PSI, en el editor de PIC BASIC, el comando para escribir un byte (en binario, hexa, decimal, lo que tu quieras) en la EEPROM desde el PIC en una dirección que tu elijas es el siguiente I2CWRITE SDA, SCL, 0xA0, ADDR, DATA Donde: SDA: el pin del PIC el cual esta conectado con el pin de DATA de la eeprom externa (supongamos PORTA.2 (debes poner esto exactamente, no SDA), que es el PIN1 en el 16F628A y en el 16F84A) SCL:lo mismo que antes pero el de CLOCK (supongamos PORTA.3 = PIN2) 0xA0: esto esta en hexadecimal, pero puedes poner en binario anteponiendo el simbolo %, representa el nº de memoria, es decir, por si quieres conectar mas de una memoria al bus de datos (hasta 8, lee el datasheet). En este caso, los 3 pines de la EEPROM que corresponden a A0,A1,A2 estan a GND (sino no funcionara). ADDR: La direccion de la eeprom que quieres escribir (debes leer el datasheet de la eeprom para saber cuantas direcciones posibles puedes usar) DATA: Finalmente, el dato que quieres que se aloje en la memoria (recuerda, un solo BYTE por dirección), por ejemplo en binario, puedes poner reeemplazando DATA por %10101111. Si tienes que leer luego ese dato de la eeprom usas la siguiente directiva: I2CREAD SDA, SCL, 0xA0, ADDR, DATA Lo mismo que antes, solo que en DATA no debs escribir nada, ya que DATA es el nombre de la variable que alojara el Byte que lea de la eeprom, despues puedes usar ese dato dentro del programa de tu PIC cuando y como quieras. Acuerdate del WaitMs, por lo menos de 5 milisegundos (seria WAITMS 5)entre instruccion, sino no funcionara (trata de experimentar con tiempos menores y despues comenta en el foro). Espero que te sirva de ayuda. Recuerda que es solo para el lenguaje PIC BASIC del PIC SIMULATOR IDE (te lo recomiendo, es muy facil de usar), para assembler debes preguntarle a meta o a otro forista. Saludos desde Argentina.
mira hermano usa proteus 7.7sp2
por ejemplo
i2cwrite sda,scl,1010000,0,["y"] ;escribir la letra y en la posicion 0 de la eeprom
i2cwrite sda,scl,1010000,1,["s"] ;igual a la anterior solo que esta ves en la posision 1 de la eeprom
{{{{{{{}}
leer la eeprom
i2cread sda,scl,1010000,0,["y"]dato por de decir algo guardo la letra y en la variable datos
lcdout, dato;y te sale la y en la lcd
pause 500
i2Cread sda,scl,1010000,1,["s"]dato leo la direccion 1 de la eeprom y la guardo en dato
LCDOUT,dato ; y te sale la s
pause 500
yo era igual que tu yo no eh tenido maestro solo lectura hermano
y escudriñando tutoriales por todos lados preguntando se llega a roma compadre
08/04/2012 #31


zgouki dijo: Ver Mensaje
Amigo meledu: Primero ante todo buscate el datasheet de la memoria que vas a utilizar, yo uso la página siguiente www.datasheets.org.uk, en el buscador pon las siglas de la eeprom. De todos modos, creo que todas las eeprom de la familia 24LC son iguales, cambian la capacidad de memoria nada mas. Una vez que tengas el datasheet, fijate cuales son los pines de DATA y de CLOCK (SDA y SCL, respectivamente) Cuando hagas las conexiones de dichos pines de la eeprom con el PIC que vas a utilizar (acuerdate que debes poner unas resistencias en configuración PULL-UP, osea a Vcc, cualquier duda pregunta), si vas a utilizar el PSI, en el editor de PIC BASIC, el comando para escribir un byte (en binario, hexa, decimal, lo que tu quieras) en la EEPROM desde el PIC en una dirección que tu elijas es el siguiente I2CWRITE SDA, SCL, 0xA0, ADDR, DATA Donde: SDA: el pin del PIC el cual esta conectado con el pin de DATA de la eeprom externa (supongamos PORTA.2 (debes poner esto exactamente, no SDA), que es el PIN1 en el 16F628A y en el 16F84A) SCL:lo mismo que antes pero el de CLOCK (supongamos PORTA.3 = PIN2) 0xA0: esto esta en hexadecimal, pero puedes poner en binario anteponiendo el simbolo %, representa el nº de memoria, es decir, por si quieres conectar mas de una memoria al bus de datos (hasta 8, lee el datasheet). En este caso, los 3 pines de la EEPROM que corresponden a A0,A1,A2 estan a GND (sino no funcionara). ADDR: La direccion de la eeprom que quieres escribir (debes leer el datasheet de la eeprom para saber cuantas direcciones posibles puedes usar) DATA: Finalmente, el dato que quieres que se aloje en la memoria (recuerda, un solo BYTE por dirección), por ejemplo en binario, puedes poner reeemplazando DATA por %10101111. Si tienes que leer luego ese dato de la eeprom usas la siguiente directiva: I2CREAD SDA, SCL, 0xA0, ADDR, DATA Lo mismo que antes, solo que en DATA no debs escribir nada, ya que DATA es el nombre de la variable que alojara el Byte que lea de la eeprom, despues puedes usar ese dato dentro del programa de tu PIC cuando y como quieras. Acuerdate del WaitMs, por lo menos de 5 milisegundos (seria WAITMS 5)entre instruccion, sino no funcionara (trata de experimentar con tiempos menores y despues comenta en el foro). Espero que te sirva de ayuda. Recuerda que es solo para el lenguaje PIC BASIC del PIC SIMULATOR IDE (te lo recomiendo, es muy facil de usar), para assembler debes preguntarle a meta o a otro forista. Saludos desde Argentina.
buenas hermano mira soy principiante y al igual que el compañero no entiendo algo yo escribo en la eeprom 24lc1025 pero tengo una duda sustancial al problemita de la eeprom y es el siguiente programando en picbasic pro (pbp) y es si yo quiero meter en la eeprom 24lc1025 el programa para leer un sensor por Ejemplo el lm35 por decir algo como configuro el programa para utilizar el bus i2c o sea como hago para meter el programa de configuracion del conversor analogico a digital (adcin 0,data )osea todo lo conserniente a el programa del conversor gracias y disculpa tanta molestias algo mas si puedo usar en el mismo bus I2C con el dallas ho el relox d1307 sin que me afecte el desempeño de este gracias una ves mas
22/10/2014 #32


Escribir/Leer Eeprom externa
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?
22/10/2014 #33


Escribir/Leer Eeprom externa
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
22/10/2014 #34
Moderador

Avatar de D@rkbytes

Turcoo dijo: Ver Mensaje
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)
Tampoco mencionas que tipo de compilador Basic estás usando.
Turcoo dijo: Ver Mensaje
¿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.

Cristobal Zelaya Morales dijo: Ver Mensaje
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.
06/06/2016 #35


Escribir/Leer Eeprom externa
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
06/06/2016 #36
Moderador

Avatar de D@rkbytes

Mira ahora las correcciones y el funcionamiento del programa.
Está adjunto con simulación.
Archivos Adjuntos
Tipo de Archivo: rar 16F887A Memoria 24LC04.rar (22,1 KB (Kilobytes), 22 visitas)
10/06/2016 #37


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.
11/06/2016 #38
Moderador

Avatar de D@rkbytes

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:
Código 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
09/11/2016 #39


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.
Imágenes Adjuntas
Tipo de Archivo: jpg prot1.jpg (104,9 KB (Kilobytes), 10 visitas)
Tipo de Archivo: jpg prot2.jpg (146,6 KB (Kilobytes), 9 visitas)
09/11/2016 #40
Moderador

Avatar de D@rkbytes

Hermi dijo: Ver Mensaje
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:
Código 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:
Código 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")

¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.