Escribir/Leer Eeprom externa

Que tal gente. Por mas que he leido y releido distintos posts y despues de cansarme de buscar en el buscador (valga la redundancia ), me vi obligado a iniciar este nuevo tema.
Como siempre en mis post, aqui esta detallada mi situación:
Acabo de construir una matriz de leds y mediante un PIC 16F628A, en ella escribo un mensaje pasante...Mi problema reside en que me gustaría escribir un texto bastante extenso e inevitablemente empezamos a hablar de memorias externas.
Pero la verdad que nose nada sobre ellas...:(
Como soft utilizo el PIC Simulator Ide, el cual tiene como lenguaje el PIC BASIC. Hasta ahora me ha resultado el lenguaje mas facil para programar y no me ha dado problemas.
Me gustaría si alguien me podria ayudar a hacer una rutina para leer un byte de la Eeprom externa (la que uds. me digan). En realidad, tambien necesito saber como grabarla previamente los datos que quiero volcar en la matriz (combinaciones de 0 y 1). Y tambien las conexiónes con el pic y demas componentes necesarios para la comunicacion entre la Eeprom y el pic (osea esquematicos e instrucciones).
En resumen, hoy estoy mas que pedigueño .
Saludos y espero que puedan ayudarme.
 
Basicamente podés usar una memoria 24lcxxx que soporta i2c. El pic no soporta i2c por 'hardware', pero es posible implementarlo por software. En cuanto a escribir combinaciones de 1 y 0 (array de bits) es posible agruparlos de a 8 (byte) y grabarlo. Yo logré hacerlo de forma muy facil usando picc (hay una librería ya hecha para 24lc256 (32kiB). Este IC de 4 pines sale más o menos $7 argentinos.

El datasheet de la memoria lo encontrás acá: ww1.microchip.com/downloads/en/devicedoc/21203N.pdf
En cuanto a cómo conectarlo te puedo decir que necesitás dos lineas bidireccionales: SDC (Clock) y SDA (Data). Es necesario usar resistencias de pull up de 10K en ambas líneas o bien usar las del puerto B del pic.

Cómo interfacear via i2c lo podés encontrár acá: http://www.esacademy.com/faq/i2c/general/i2cproto.htm

Es bastante facil aunque la implementacion puede ser un poco larga.

Espero que te sirva,
Gonzalo
 
Muchas gracias por tu respuesta. Sucede que de ingles se poco y nada pero bueno, algo se entiende. De todos modos me gustaría saber alguna rutina en basic para hacerlo, no me veo bien usando el C++...
Husmenado por la web, encontre este codigo que paso a poner:

Código:
' I2CREAD and I2WRITE Commands
'
' Write to the first 16 locations of an external serial EEPROM
' Read first 16 locations back and send to serial out repeatedly
' Note: for EEPROMS with byte-sized address

        Include "modedefs.bas"          ' Include serial modes

SO      con     0                       ' Define serial output pin
DPIN    var     PORTA.0                 ' I2C data pin
CPIN    var     PORTA.1                 ' I2C clock pin
B0      var     byte
B1      var     byte
B2      var     byte

        For B0 = 0 To 15                ' Loop 16 times
                I2CWRITE DPIN,CPIN,$A0,B0,[B0]  ' Write each location's address to itself
                Pause 10                ' Delay 10ms after each write
        Next B0

loop:   For B0 = 0 To 15 step 2         ' Loop 8 times
                I2CREAD DPIN,CPIN,$A0,B0,[B1,B2]        ' Read 2 locations in a row
                Serout SO,N2400,[#B1," ",#B2," "]       ' Print 2 locations
        Next B0

        Serout SO,N2400,[10]            ' Print linefeed

        Goto loop

Quizas alguien puede decirme para que sirve este código y coo implementarlo.
Ademas, todavia nose lo ás importante...como programo una memoria!
Saludos
 
Aca encontre otro código, algo de :

"i2cslave.bas
i2cmast.bas

PICBASIC PRO program to demonstrate the I2C slave function. Use i2cmast.bas to
read and write data to the slave device."

Código:
' PicBasic Pro I2C slave program - PIC16F877/PIC-X1

DEFINE	ONINT_USED	1			' For use with melabs Loader

' Alias pins
scl     VAR     PORTC.3         ' I2C clock input
sda     VAR     PORTC.4         ' I2C data input


' Define used register flags
SSPIF   VAR     PIR1.3          ' SSP (I2C) interrupt flag
BF      VAR     SSPSTAT.0       ' SSP (I2C) Buffer Full
R_W     VAR     SSPSTAT.2       ' SSP (I2C) Read/Write
D_A     VAR     SSPSTAT.5       ' SSP (I2C) Data/Address
CKP     VAR     SSPCON.4        ' SSP (I2C) SCK Release Control
SSPEN   VAR     SSPCON.5        ' SSP (I2C) Enable
SSPOV   VAR     SSPCON.6        ' SSP (I2C) Receive Overflow Indicator
WCOL    VAR     SSPCON.7        ' SSP (I2C) Write Collision Detect


' Define constants
I2Caddress CON	2				' Make our address 2


' Allocate RAM
result	VAR		BYTE			' ADC result
datain 	VAR     BYTE			' Data in 
dataout	VAR     BYTE[8]			' Data out array
readcnt	VAR     BYTE            ' I2C read count



' Initialize ports and directions
        ADCON1 = $0e			' PORTA.0 analog, rest PORTA and PORTE pins to digital

' Initialize I2C slave mode
        SSPADD = I2Caddress		' Set our address
        SSPCON2 = 0 			' General call address disabled
        SSPCON = $36 			' Set to I2C slave with 7-bit address

        readcnt = 0				' Zero counter

        dataout[0] = "A"		' Preset output data to "ADC=    "
        dataout[1] = "D"
        dataout[2] = "C"
        dataout[3] = "="
        dataout[4] = " "
        dataout[5] = " "
        dataout[6] = " "
        dataout[7] = " "


        GoTo mainloop 			' Skip over subroutines



i2cslave:						' I2C slave subroutine

		SSPIF = 0				' Clear interrupt flag
		
        IF R_W = 1 Then i2crd   ' Read data from us

        IF BF = 0 Then i2cexit  ' Nothing in buffer so exit

        IF D_A = 1 Then i2cwr   ' Data for us (not address)

        IF SSPBUF != I2Caddress Then i2cexit	' Clear the address from the buffer
        
        readcnt = 0				' Mark as first read
        
        GoTo i2cexit


i2cwr:							' I2C write data to us

        datain = SSPBUF			' Put data into array
        GoTo i2cexit


i2crd:							' I2C read data from us

        IF D_A = 0 Then
                readcnt = 0		' Mark as first read
        EndIF

        SSPBUF = dataout[readcnt]	' Get data from array
        CKP = 1                 	' Release SCL line
        readcnt = readcnt + 1   	' Move along read count
        
        GoTo i2cexit            	' That's it


i2cexit:

		Return



mainloop:						' Main program loop
        

        IF SSPIF Then			' Check for I2C interrupt flag
                GoSub i2cslave
        EndIF

		ADCIN 0, result			' Read ADC channel 0
	
		dataout[5] = datain[0] - result		' Add offset to result value


        GoTo mainloop           ' Do it all forever


Y aca hay el otro:

Código:
' PicBasic Pro program to read and write to I2C slave
'
' Writes a 1-byte offset value, pauses, then reads an 8
' character string from the slave. Expects to find the
' ADC conversion value (- offset) in the 6th position of
' the string.
 
 
' Define LCD registers and bits
DEFINE  LCD_DREG        PORTD
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTE
DEFINE  LCD_RSBIT       0
DEFINE  LCD_EREG        PORTE
DEFINE  LCD_EBIT        1

DEFINE  I2C_HOLD        1

SCL     VAR     PORTC.3				' Clock pin
SDA     VAR     PORTC.4				' Data pin
a		VAR	BYTE[8]					' Holds 8 characters read from slave



        ADCON1 = 7					' Set PORTA and PORTE to digital
        Low PORTE.2					' LCD R/W line low (W)
        Pause 100					' Wait for LCD to start up

        LCDOut $fe, 1, "I2CX"		' Display
		Pause 1000


loop:
        I2CWrite SDA,SCL,$02,[127], bogus	' Write offset to slave
        Pause 500               


        I2CRead SDA,SCL,$02,[STR a\8], bogus	' Read string from slave
        

        LCDOut $fe, 1, STR a\5,SDEC a[5]	' Display result, preceded by 5 character
        									' string received from slave.
        
        Pause 500

        GoTo loop					' Do it forever


bogus:
		LCDOut $fe,1, "timed out"	' I2C command timed out
		Pause 1000

		GoTo loop

        End
 
sabes? yo estoy trabajando en el mismo proyecto y he logrado mostrar caracteres en mi pantalla de led pero tenemos el mismo problema (la eeprom) tengo los datos de como conectarlaal pic y como deveria ser la subrrutina para lleer los datos y enviarlos al integrado encargado de mostrar los datos en la pantalla pero mi problema radica en que no se que programa usar para generar el codigo de la eemprom y ni siquiera como deverian ser escritos estos por eso seria buena idea si compartimos datos y aver si juntos llegamos a la solucion.
 
meledu dijo:
sabes? yo estoy trabajando en el mismo proyecto y he logrado mostrar caracteres en mi pantalla de led pero tenemos el mismo problema (la eeprom) tengo los datos de como conectarlaal pic y como deveria ser la subrrutina para lleer los datos y enviarlos al integrado encargado de mostrar los datos en la pantalla pero mi problema radica en que no se que programa usar para generar el codigo de la eemprom y ni siquiera como deverian ser escritos estos por eso seria buena idea si compartimos datos y aver si juntos llegamos a la solucion.
Amigo meledu:
Disculpa que no te haya contestado antes, me surgieron algunos improvistos. Al final pude leer los datos de una eeprom y escribir en esta: Utilicé la familia 24LC, y como lenguaje el PIC BASIC del PIC SIMULATOR IDE. AL final, la solución estaba enfrente de mis narices : Cuando instalás el PSI, se te generán un par de páginas HTML, en una de ellas esta el PIC BASIC COMPILER REFERENCE MANUAL (sino puedes entrar aquí
http://www.oshonsoft.com/picbasiccompiler.html )
De todos modos, para terminar el post, aquí te dejo el código que te digo:

● I2C communication with external I2C devices
I2C communication can be implemented in basic programs using I2CWRITE and I2CREAD statements. The first argument of both statements must be one of the microcontroller's pins that is connected to the SDA line of the external I2C device. The second argument of both statements must be one of the microcontroller's pins that is connected to the SCL line. The third argument of both statements must be a constant value or Byte variable called 'slave address'. Its format is described in the datasheet of the used device. For example, for EEPROMs from 24C family (with device address inputs connected to ground) the value 0xA0 should be used for slave address parameter. Both statements will take control over bit 0 of slave address during communication. The forth argument of both statements must be a Byte or Word variable (this depends on the device used) that contains the address of the location that will be accessed. If a constant value is used for address parameter it must be in Byte value range. The last (fifth) argument of I2CWRITE statement is a Byte constant or variable that will be written to the specified address, and for I2CREAD statement it must be a Byte variable to store the value that will be read from the specified address. It is allowed to use more than one 'data' argument. For I2C devices that do not support data address argument there is short form of I2C statements (I2CWRITE1 and I2CREAD1) available where slave address argument is followed with one or more data arguments directly. For some I2C slave devices it is necessary to make a delay to make sure device is ready to respond to I2CREAD statement. For that purpose there is I2CREAD_DELAYUS parameter that can be set by DEFINE directive and has default value of 0 microseconds. Also, for slower I2C devices, it might be necessary to use longer clock pulses. That can be done by setting I2CCLOCK_STRETCH parameter using DEFINE directive. This parameter will set clock stretch factor. Its default value is 1. Here is one combined example with LCD module and 24C64 EEPROM (SDA connected to RC2; SCL connected to RC3):
Código:
DEFINE LCD_BITS = 8 
DEFINE LCD_DREG = PORTB 
DEFINE LCD_DBIT = 0 
DEFINE LCD_RSREG = PORTD 
DEFINE LCD_RSBIT = 1 
DEFINE LCD_EREG = PORTD 
DEFINE LCD_EBIT = 3 
DEFINE LCD_RWREG = PORTD 
DEFINE LCD_RWBIT = 2 
DIM ADDR AS WORD 
DIM DATA AS BYTE 
SYMBOL SDA = PORTC.2 
SYMBOL SCL = PORTC.3 
LCDINIT 3 
WAITMS 1000 
FOR ADDR = 0 TO 31 
   LCDCMDOUT LcdClear 
   DATA = 255 - ADDR 
[b]   I2CWRITE SDA, SCL, 0xA0, ADDR, DATA [/b]
   LCDOUT "Write To EEPROM" 
   LCDCMDOUT LcdLine2Home 
   LCDOUT "(", #ADDR, ") = ", #DATA 
[b]   WAITMS 1000 [/b]
NEXT ADDR 
FOR ADDR = 0 TO 31 
   LCDCMDOUT LcdClear 
[b]   I2CREAD SDA, SCL, 0xA0, ADDR, DATA [/b]
   LCDOUT "Read From EEPROM" 
   LCDCMDOUT LcdLine2Home 
   LCDOUT "(", #ADDR, ") = ", #DATA 
[b]   WAITMS 1000 [/b]
NEXT ADDR

There is a set of low-level I2C communication statements available, if it is needed to have more control over I2C communication process. I2CPREPARE statement has two arguments that must be one of the microcontroller's pins. The first argument defines SDA line and second argument defines SCL line. This statement will prepare these lines for I2C communication. I2CSTART statement will generate start condition, and I2CSTOP statement will generate stop condition. One byte can be sent to the I2C slave using I2CSEND statement. After the statement is executed C bit in STATUS register will hold the copy of the state on the SDA line during the acknowledge cycle. There are two statements that can be used to receive one byte from I2C slave. I2CRECA or I2CRECEIVEACK will generate acknowledge signal during acknowlegde cycle after the byte is received. I2CRECN or I2CRECEIVENACK will generate not acknowledge signal during acknowlegde cycle after the byte is received. One example:

Código:
DIM ADDR AS WORD 
DIM DATA(31) AS BYTE 
SYMBOL SDA = PORTC.4 
SYMBOL SCL = PORTC.3 
ADDR = 0 
I2CPREPARE SDA, SCL 
I2CSTART 
I2CSEND 0xA0 
I2CSEND ADDR.HB 
I2CSEND ADDR.LB 
I2CSTOP 
I2CSTART 
I2CSEND 0xA1 
FOR ADDR = 0 TO 30 
   I2CRECEIVEACK DATA(ADDR) 
NEXT ADDR 
I2CRECN DATA(31) 
I2CSTOP

Lo que está en negrita vendría a ser el code en sí que necesitas. Waitms puede ser menor, creo que lo más bajo que probé y me funcionó es 10ms :S, pero de todos modos te recomiendo que experimentes vos.

Saludos desde Argentina
 
zgouki dijo:
Que tal gente. Por mas que he leido y releido distintos posts y despues de cansarme de buscar en el buscador (valga la redundancia ), me vi obligado a iniciar este nuevo tema.
Como siempre en mis post, aqui esta detallada mi situación:
Acabo de construir una matriz de leds y mediante un PIC 16F628A, en ella escribo un mensaje pasante...Mi problema reside en que me gustaría escribir un texto bastante extenso e inevitablemente empezamos a hablar de memorias externas.
Pero la verdad que nose nada sobre ellas...:(
Como soft utilizo el PIC Simulator Ide, el cual tiene como lenguaje el PIC BASIC. Hasta ahora me ha resultado el lenguaje mas facil para programar y no me ha dado problemas.
Me gustaría si alguien me podria ayudar a hacer una rutina para leer un byte de la Eeprom externa (la que uds. me digan). En realidad, tambien necesito saber como grabarla previamente los datos que quiero volcar en la matriz (combinaciones de 0 y 1). Y tambien las conexiónes con el pic y demas componentes necesarios para la comunicacion entre la Eeprom y el pic (osea esquematicos e instrucciones).
En resumen, hoy estoy mas que pedigueño .
Saludos y espero que puedan ayudarme.

Hola:

En este libro www.pic16f84a.org te cuenta teoría y mucha practica sobre la comunicación I2C y memoria EPROM externa. Muy pero que muy bueno. A pesar de que está en ASM, lo explica muy bien.

Código:
;************************************ I2C_EEPROM_01.asm *******************************
;
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		[url]www.pic16f84a.com[/url]
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================
;
; Programa para manejar la escritura y lectura en la memoria EEPROM serie 24LC256.
; Tiene dos partes:
;    1ª	Escribe un mensaje grabado en el programa del PIC16F84A a partir de la posición
;		3B00h dentro de la 24LC256.
;    2ª	Lee el mensaje grabado en la memoria 24LC256 anteriormente y lo visualiza en la
;		pantalla del módulo LCD.
;
; El mensaje tendrá menos de 16 caracteres, que es la máxima longitud de la pantalla.
;
; ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK	0x0C
	ENDC

PAGINA	EQU	0x3B					; Escribe y lee en esta página, por ejemplo.

; ZONA DE CÓDIGOS ********************************************************************

	ORG 	0
Inicio
	call	LCD_Inicializa
Principal
	movlw	PAGINA					; Escribe a partir de la dirección 0 de esta
	call 	M24LC256_EscribeMensaje	; página de la memoria.
	movlw	PAGINA					; Lee a partir de la dirección 0 de esta página
	call	M24LC256_Mensaje_a_LCD	; de la memoria.
	sleep							; Pasa a reposo.

; Subrutina "M24LC256_EscribeMensaje" ----------------------------------------------------------------
;
; Escribe la memoria M24LC256 con el mensaje grabado al final de este programa a partir
; de la posición 0 de la página de la memoria 24LC256, señalada por el contenido del
; registro de trabajo W.
; El tamaño de memoria que se puede grabar por este procedimiento es de 64 bytes como máximo.

	CBLOCK
	ValorCaracter					; Valor ASCII del carácter a escribir.
	ENDC

M24LC256_EscribeMensaje
	movwf	M24LC256_AddressHigh	; El registro W apunta a la página donde va a
	clrf	M24LC256_AddressLow		; grabar el mensaje a partir de la dirección 0.
	call	M24LC256_InicializaEscritura
M24LC256_EscribeOtroByte
	movf	M24LC256_AddressLow,W
	call	Mensaje					; Obtiene el código ASCII del carácter.
	movwf	ValorCaracter			; Guarda el valor de carácter que ha leído del
	call	I2C_EnviaByte			; mensaje y lo escribe en la 24LC256.
	call	Retardo_5ms				; Tiempo de escritura entre byte y byte.
	movf	ValorCaracter,F			; Lo único que hace es posicionar flag Z. En caso
	btfsc	STATUS,Z				; de que sea "0x00", que es código indicador final
	goto	FinEscribeMensaje		; del mensaje sale de la subrutina.
	incf	M24LC256_AddressLow,F
	goto	M24LC256_EscribeOtroByte
FinEscribeMensaje
	call	I2C_EnviaStop			; Termina la escritura.
	call	Retardo_5ms
	return

Mensaje
	addwf	PCL,F
	DT " Estudia D.P.E.",0x0

	INCLUDE  <BUS_I2C.INC>			; Subrutinas de control del bus I2C.
	INCLUDE  <M24LC256.INC>			; Subrutinas de control de la memoria 24LC256.
	INCLUDE  <RETARDOS.INC>
	INCLUDE  <LCD_4BIT.INC>
	END
	
;	===================================================================
;	  Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;	  E. Palacios, F. Remiro y L. López.		[url]www.pic16f84a.com[/url]
; 	  Editorial Ra-Ma.  [url]www.ra-ma.es[/url]
;	===================================================================

Un cordial saludos.
 
pero me puedes dar un atillo mas en que esta la información que metiste en la memoria en binario hex. esque no lo tengo muy claro , se supone que deve ser 000 y 1111 por eewso es que no me queda claro.
porfarvo envame unos datos mas gracias de amtemano.
 
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.
 
hola yo tambien quisiera armarme una matrix de leds para pasar mensajes , pero tambien lo d ela conexion a la memoria eeprom me a sido un dolor de cabeza pero ahora que leo los datos y alcanzes que presentan , tratare de ponerlo en practica, y respecto al amigo que pregunta de que contenido poner en la eeprom externa no seria grabarle los mismos datos que escribio en la misma memoria interna del pic?, los programadores de pics tambien programan eeproms , asi que podrias cargar esa parte en un codigo hex aparte (la data 0101.. del mensaje) y grabarla directamente a la eeprom, antes de conocer los pics yo experimentaba manejar un panel de display por medio del puerto paralelo de la PC, y me cree una utilidad en turbopascal mediante tablas que le ponia un mensaje dentro de un archivo txt por ejemplo "hola bienvenidos a nuestra tienda..." y el programita este me generaba el patron correspondiente en 1s y 0s en otro archivo hex, creo que quizas crearte una utilidad asi podria servirte.
 
creo que ya ha pasado mucho tiempo desde la ultima respuesta, pero necesito ayuda urgente, a ver si alguien puede ayudarme, paso a exponer mi problema.

pues bien, mi intensión es hacer un letrero con leds, en el cual se pueda ver una palabra de al menos 10 letras, el detalle, es que esa palabra pueda modificarse ingresandola por medio de la pc, por puerto serie, y que ademas se almacene en una memoria externa del tipo 24lcxx.

mas detalles, pienso usar un pic16f628, que tiene el protocolo rs232, no hay problema con eso, ya consegui comunicarme con la pc, ahora voy con la memoria externa, hice la conexion como lo indican aqui, y oh maravilla, consegui guardar datos en la memoria, pero he aqui me desilucion, que por mas que trato no puedo leer nada de esta memoria, no se porque, o que esta mal, me imagino que es algo en el codigo, por que si no tampoco guardaria nada y se que lo hace porque al simular en proteus, veo que los datos estan guardados en sus respectivos registros, escribo pero no puedo leer........

me gustaria subir el codigo que uso, pero tampoco es seguro si alguien se interese en mi problema, o si alguien sabe de un codigo para leer y escribir, pero usando el basic del PSI, para la proxima subire mi codigo pero quisiera ver si alguien puede ayudarme o si se interesa en hacerlo.

es todo, espero respuestas..........
 
Hola, a todos quisiera participar tambien de este foro, con una duda mia, si alguien me pudiera responderla le estaria muy agradecido. Estoy utilizando Pic simulator ide, en mi programa que estoy compilando necesito que el valor de una variable no se borre cuando apague todo el circuito y la inicie de nuevo; me dijeron que tengo que grabarlo en la eeprom, ¿como hago esto? que comandos utilizar si mi variable es de tipo long? con un ejemplo me quedaria mejor, de antemano muchas gracias.
 
mira, recurriendo al manual arriba mencionado del PSI, encontre esto, talvez te sirva, me imagino que si, ya que esta facil, prueba y comenta.....

● Using internal EEPROM memory

Access to EEPROM data memory can be programmed using READ and WRITE statements. The first argument is the address of a byte in EEPROM memory and can be a constant or Byte variable. The second argument is data that is read or written (for READ statement it must be a Byte variable). It is suggested to keep interrupts disabled during the execution of WRITE statement.
DIM A AS BYTE
DIM B AS BYTE
A = 10
READ A, B
WRITE 11, B
 
mientras yo sigo esperando respuestas, como hago para leer mi memoria externa... bueno ahi les subo el codigo que estoy usando, aver si alguien me corrige o me ayuda en algo....

Código:
AllDigital

Dim addr As Byte
Dim data As Byte

Symbol sda = PORTA.1
Symbol scl = PORTA.0

TRISB = 00000000
PORTB = 00000000

'aqui se escribe en la memoria externa
For addr = 0 To 10

data = 20 - addr

I2CWrite sda, scl, 0xa0, addr, data
WaitMs 500
PORTB = data

Next addr

WaitMs 500

'aqui se lee en la memoria externa, aqui es el problema

For addr = 0 To 10

I2CRead sda, scl, 0xa0, addr, data
WaitMs 500
PORTB = data

Next addr

End
 
Código:
AllDigital

Dim addr As Byte
Dim data As Byte

Symbol sda = PORTA.2
Symbol scl = PORTA.3

TRISA = %00001100
TRISB = 00000000
PORTB = 00000000

'aqui se escribe en la memoria externa
For addr = 0 To 10

data = 20 - addr

I2CWrite sda, scl, 0xa0, addr, data
WaitMs 500
PORTB = data

Next addr

WaitMs 500

'asi me funciona con PIC16F628A y 24C01 en protoboard 

For addr = 0 To 10

I2CRead sda, scl, 0xa0, addr, data
WaitMs 500
PORTB = data

Next addr

End
 
hola a todos:
estoy armando un medidor de RPM con un pic 16F628A ,
el programa funciona correcto,
pero yo quiero agregarle la posibilidad de leer la ultima medicion una vez que ya fue realizada
si no comprendi mal se hace con la memoria eeprom no?
lo que necesito es que me digan si se puede guardar el valor de una variable(es el de las RPM) y luego
poder leerla -en display lcd- nuevamente...
no se cuales son las instrucciones para decirle al pic que haga esto
me falto decir que el idioma que estoy usando es BASIC ..

SALUDOS
 
hola ponce 1021...
tengo una duda, es que a mi no me sale, por mas que pongo tu codigo al pie de la letra, nada,
o es que no me sirve el proteus para simular este circuito.
un favor, ahi subo el ckto, y dime si estoy haciendo mala alguna conexion...
o a cualquiera que pueda ayudarme porfa
 

Adjuntos

  • ckto_eeprom_119.rar
    13.4 KB · Visitas: 504
hola amigo moreno12

si quieres entender algo sobre como usar la memoria eeprom del pic, te recomiendo leer el tutorial sobre eso, claro que no te dice nada del lenguaje basic, pero al menos te da una introduccion al respecto.

ahora, sobre el basic, ya se menciono antes las instrucciones necesarias, solo tienes que buscar en el mismo manual del PSI....

espero poder ayudarte mas la proxima ves, yo tambien estoy estancado y estoy ocupando mi tiempo en eso.... suerte

https://www.forosdeelectronica.com/f24/usar-eeprom-pics-23626/
 
Atrás
Arriba