TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: movwf en 09 de Octubre de 2013, 11:20:57
-
Hola , estoy intentando guardar valores en la eeprom de un pic 16F628.
Son tres datos , todos se graban y leen con exactamente la misma rutina.
Pero al cargar los valores luego de una desconección de la fuente , sólo recupero 2.
El tercero siempre tiene un valor que desconozco pero mas alto que el guardado.
He buscado por todo el foro , pero sólo encontré una indicación de no usar CALL para ir a la rutina de grabación.
Por lo cual uso GOTO para ir a la rutina y nada , le he cambiado el nombre al registro que contiene el valor y nada.
Las rutinas que uso son las siguientes pero no está en ellas el error , de todas formas lo subo.
Si alguien a tenido problemas parecidos con éste pic le agradezco me indique como lo solucionó.
graba movf REGISTRO,0 ; grabo en EEPROM valor de dimmer , cargo el dato en W porque está en el banco 0 y luego paso al banco1.
bsf status,0x5
movwf eedata
movlw 0x00
movwf eeadr
bcf intcon,0x7
bsf eecon1,0x2
movlw 0x55
movwf eecon2
movlw 0xAA
movwf eecon2
bsf eecon1,0x1
btfsc eecon1,0x1
goto $-1
bcf status,0x5
call disparo
goto ciclo1
Como ven espero el flag para darle tiempo a la escritura.
leer bsf status,0x5
movlw 0x00
movwf eeadr
bsf eecon1,0x0
movf eedata,0
bcf status,0x5
movwf REGISTRO2
La verdad que le he dado muchas vueltas y no encuentro el motivo para que no grabe o lea los tres
registros por igual.
-
A simple vista las rutinas parecerían estar bien, pero habría que ver el resto del programa. Si estás utilizando interrupciones debes tener en cuenta el deshabilitarlas para la escritura en la eeprom. También puede ocurrir algún problema con el tema de los bancos...
-
Gracias por responder angelgris.
No uso interrupciones ni watchdog , sólo el tmr0 como temporizador y funciona bien.
Para aclararte un poco mas el problema,te explico que tengo varias rutinas seleccionables dentro del programa
por medio de un pulsador.
Pues lo que intento es memorizar en eeprom un número correspondiente a cada rutina.
Cada vez que selecciono una rutina ésta guarda ese número para en caso de desconección del dispositivo.
Al iniciar el programa lo primero que hace es ir a leer la eeprom y cargar el valor en un registro para luego ir a la rutina correspondiente.
Pues no se la razón por la cual a 2 rutinas va sin problemas pero a la tercera o las que le agregue simplemente se queda en nada.
Y si lo que guardo es un valor de uso de una de las rutinas que si arrancan, éste valor no se guarda tampoco.
La verdad que me tiene delirando,porque he revisado la configuración, todos los valores se graban y leen exactamente igual,la verdad que por el momento no tengo idea
ya que es la primera vez que uso éste pic porque es el único que encontré en el comercio.
-
¿Podrías mostrar el programa completo? De ser posible con la opción GeSHi de editor de mensajes del foro, para que sea más fácil la lectura.
-
Estas son las subrutinas que yo utilizo y funcionan, aunque no recuerdo de donde las saqué (No son mias)
hechales un vistazo, posiblemente te puedan ayudar.
; *******************************************************
CBLOCK
GuardaINTCON ; Guarda temporalmente el registro INTCON.
ENDC
; Para leer una posición de la eprom.
movf Dirección_X ; Donde queremos leer.
call LeeDato
.
.
; Para guardar en la eprom:
movf Dirección_X ;
movwf EEADR ; Posición donde vamos a guardar.
movf Registro1,W ; Lo que queremos guardar.
call Guarda
.
.
; ----------------------------------------------------
; Esta subrutina devuelve el dato leido en W
LeeDato
bsf STATUS,RP0
movwf EEADR
bsf EECON1,RD
btfsc EECON1,RD
goto $-1
movf EEDATA,W
bcf STATUS,RP0
return
; ******************************************************
Guarda
bsf STATUS,RP0
movwf EEDATA
movf INTCON,W
movwf GuardaINTCON
bcf INTCON,GIE
bsf EECON1,WREN
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
btfsc EECON1,WR
goto $-1
bcf EECON1,WREN ; Desautoriza la escritura.
bcf EECON1,EEIF ; Limpia este flag.
movf GuardaINTCON,W
movwf INTCON
bcf STATUS,RP0
return