Leer Eeprom PIC16f877A

Hola, Tengo un problema. Resulta que estoy haciendo un sistema de alarma para el hogar con un PIC16f877A, un display de 4 led 7segmentos y un teclado matricial, todo funciona bien la cosa es a la hora de leer la Eeprom no logro entender la rutina, la dejo para que la analisen y me digan donde esta el error, La de escritura que es mas complicada la entendi y funciona ok pero ya se me formo una laguna en la cabeza.
Gracias de antemano!

de la rutina GUARDAR salto aqui hasta terminar de guardar los 4 digtos
;------------------copiar de Eeprom a Flash-----------------


LEER BSF STATUS,RP1
BCF STATUS,RP0 ; Banco 2
MOVF DATA_EE_ADDR,W ; direccion a leer, la misma la voy incrementando
MOVWF EEADR ; Dirección de leer
BCF EECON1,EEPGD ; punto de Datos
BSF EECON1,RD ; EE leer
BCF STATUS,RP0 ; Banco 2
MOVWF 0X11 ;dato a cargar en flash
GOTO GUARDAR ;salto a rutina guardar (en flash)
 
no entirndo nada de C, Me gustaria aprender pero no se por donde empezar, el problema es que tengo todo el programa en asm ye es muuuy extenso como para hacerlo nuevamente, tendria que hacer un programa pequeño para aprender.
Vos no entendes ASM?
 
y más o menos , tengo un libro que te explica todo relacionado a la programación en asm pero es para el 16f84a. Aunque si me pongo lo entiendo.

Tengo una librería de control de la eeprom interna del pic , que en una de esas te puede ayudar (en ASM)
 

Adjuntos

  • eeprom_147.rar
    1.1 KB · Visitas: 172
Gracias pero la del 877 es totalmente diferente para grabar, tiene4 bancos no como la del 84 que solo tiene 2 voy a ver como me arreglo. Ya pude grabar pero me hago lio con los bancos para leer y eso que grabar es mucho mas complicado.
Una ultima consulta Como hago para aprender C? Realmente no se por donde comenzar. Como aprendistes vos?
 
Primero que nada la estructura de programación (lo más largo), luego de a poco ir aprendiendo los comandos. Yo utilizo c de ccs y tengo que leer el manual en inglés para aprender los comandos pero igual no es dificil y te olvidas de los bancos de memoria.
 
Hola marcelo26, supongo que habrás consultado el datasheet del pic, ahí hay una rutina de ejemplo para leer la EEPROM (también hay un ejemplo de escritura), usando esa rutina de ejemplo y la rutina que pusiste tu al principio se obtiene la siguiente rutina:
Código:
LEER		BSF		STATUS, RP1		;
		BCF		STATUS, RP0		; Banco 2
		MOVF	DATA_EE_ADDR, W	; Direccion a leer, la misma la voy incrementando
		MOVWF	EEADR			; Direccion de leer
		BSF		STATUS, RP0		; Banco 3
		BCF		EECON1, EEPGD	; Apunta a la memoria de Datos
		BSF		EECON1, RD		; Comienza lectura
		BCF		STATUS, RP0		; Banco 2
		MOVF	EEDATA, W		; W = EEDATA (lee memoria EEPROM y lo guarda en W)
En ese momento ya leiste la memoria EEPROM y el valor de la lectura está en el registro de trabajo W, además estás en el banco 2, lo que sigue ahí es guardar ese valor en algún registro o usarlo para el propósito que quieras.

Tu rutina no funcionaba porque nunca cambiabas al banco 3 y en ese banco es donde se encuentra el registro de control EECON1. Prueba la modificación de la rutina, debe funcionar sin problemas.
 
dale y luego te puedo pegar una mano en c , aunque a mi me falta mucho todavía para considerarme alguien respetable en el tema de la programación en c , pero de a poco todo se puede

pd: como el dicho con paciencia y con saliba el elefante.....
 
pic-man cuando pondo la rutina leer se cuelga todo, si la saco funciona todo ok. Me faltara salir de algun banco o poner algun bit a 0?

me quedó así

LEER MOVF 0x10,w ; Numero de direccion de eeprom 0 a 3
BSF STATUS,RP1 ;
BCF STATUS,RP0 ; Banco 2
MOVF DATA_EE_ADDR,W ;Direccion a leer, la misma la voy incrementando con (0x10)
MOVWF EEADR ; Direccion de leer
BSF STATUS,RP0 ; Banco 3
BCF EECON1,EEPGD ; Apunta a la memoria de Datos
BSF EECON1,RD ; Comienza lectura
BCF STATUS,RP0 ; Banco 2
MOVF EEDATA,W ;W = EEDATA (lee memoria EEPROM y lo guarda en W)
MOVWF 0X11 ; EEDATA a 0x11
GOTO GUARDAR ;Salto a guardar el dato
 
Ya vi cual es el problema pero no puedo solucionnarlo porque no se como se genera el mismo.
lo que pasa es que cuando trato de leer sigue todos los pasos hasta terminar de leer ahora cuando muestro un numero en el display se traba en la tabla, hago CALL Tabla salto a (TABLA ADDWF PCL,F) tomo el numero y RETLW y ahi en ves de regresar donde se quedo antes de CALL salta a cualquier lado y se estanca, pero si saco la rutina de leer Eeprom anda todo ok. yo supongo que me fralta reiniciar algun Bit luego de leer. Que opinan?
Gracias por su ayuda!
 
Sin duda ese es el problema es cuando hago una llamada CALL a la Tabla, esta en ves de regresar donde se realizo la llamada salta nuevamente a "Leer EEprom" ahora si saco la etapa de leer eeprom el programa funciona ok. La eeprom la lee bien cuando leo las bariavles leidas las mismas estan con los valores de la eeprom.
Ya me estoy quedando sin hideas
 
La verdad es que no tengo idea, no entiendo muy bien el código, pero no veo nada que pueda hacer que al regresar de la tabla vuelva a la rutina de lectura de la EEPROM.
 
Yo tampoco.
Ya puse movlw 0x03 y movwf PCLATH antes de call com en tu tutorial pero nada!
es raro porque en el pic 16 f84 arme programas con eeprom y no tube problema
 
Atrás
Arriba