elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Informática
| |-+  Electrónica
| | |-+  Manejar EEPROM interna
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Manejar EEPROM interna  (Leído 3,025 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Manejar EEPROM interna
« en: 7 Marzo 2013, 15:51 pm »

Hola:

Uso el PIC12F629 puedo leer un valor en la EEPROM interna pero no soy capaz  de almacenarlo en la misma dirección.

Este es el código.
Código:
;No olvidar que si GP2 detecta un un 0 en la entreda menor de 5 segundos,
;el PIC no actua, vuelve a lo suyo como si no pasara nada.
;
; Cuando detecte
;GP2|GP0 GP1 GP4 GP5
;---+----------------
;1) | 0   1   0   0
;2) | 1   0   1   0
;3) | 0   1   1   0
;4) | 1   0   0   1
;
;ZONA DE DATOS*****************************************************************

    LIST P=12F629                          ; Procesador usado.
    INCLUDE <P12F629.INC>                  ; Fichero que definen las etiquetas.

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _FOSC_INTRCIO
    ERRORLEVEL -302

#DEFINE     Pulsador    GPIO,2      ; Pulsador.
#DEFINE     Leds        GPIO        ; Leds está conectado al GPIO.

VARIABLES UDATA_SHR
ContadorEstado RES 1
RAM_ret RES 1
RAM_ret_1 RES 1
Contador RES 1

;ContadorEstado     equ  20h
;RAM_ret         equ 21h
;RAM_ret_1       equ 22h
;Contador        equ 23h

; ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM de datos.
; DE 0x00 ; El contador en principio a cero.

;ZONA DE CÓDIGOS***************************************************************
    ORG     0     
                  ; El programa comienza en la dirección 0.
    goto    Inicio

Inicio
    bsf     STATUS,RP0                  ; Selecciona banco 1.
    call    0x3FF                    ; Lo el valor de la calibración que sera almacenada en W.
    movwf   OSCCAL                    ; Paso el valor de W a OSCCAL para calibrar el oscilador.
    movlw   b'00000100'
    movwf   TRISIO
    movlw   b'00001111'
    movwf   OPTION_REG              ; Activa Pull Up.
    movlw   b'0000100'
    movwf   WPU                     ; Activada Pull Up del GP0.
    bcf     STATUS,RP0                      ; Selecciona banco 0.
    movlw   b'00000111'             ; Desactivar comparadores.
    movwf   CMCON
movlw .3
    movwf Contador
clrf GPIO
;***************************************************************************

Principal
    btfsc   Pulsador                ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Principal               ; No. Vuelve a leerlo.
;    call    Retardo_20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc   Pulsador                ; Comprueba si es un rebote.
    goto    Principal               ; Era un rebote y sale fuera.
    call    IncrementaVisualiza             ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
    btfss    Pulsador                ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar         ; No. Espera que deje de pulsar.
Fin    goto    Principal

;***************************************************************************   
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
call Lee_Dato_EEPROM
incf Contador,F ; Incrementa el contador y comprueba si ha
call Escribe_Dato_EERPOM
movlw d'4' ; llegado a su valor máximo mediante una
subwf Contador,W ; resta. (W)=(Contador)-4.
btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
Visualiza
movf Contador,W
call Tabla ; Lo pasa a siete segmento para poder ser
movwf GPIO ; visualizado en el display.
return


Tabla
    addwf PCL,F                      ; Sumo W al contador de programa. ;
    retlw b'00000010'  ;1
    retlw b'00010001'  ;2         
    retlw b'00010010'  ;3               ; Retorno con el valor correspondiente. 
    retlw b'00100001'  ;4
;Subrutina EEPROM ******************************************************************

Lee_Dato_EEPROM
    bsf     STATUS,RP0              ; Banco 1
    movlw   0x00              ; Primera posición de la tabla
    movwf   EEADR                  ; Apunta ahí
;    movf    Contador,W       ; Coge el contador
;    addwf   EEADR                  ; Suma el contador para apuntar al dato que nos interesa
    bsf     EECON1,RD              ; Lee el valor de la tabla
    movf    EEDATA,W              ; Pasa el valor a W para trabajar con él.
bcf STATUS,RP0
    return



;Guarda en la EEPROM el valor del contador
Escribe_Dato_EERPOM
    bsf      STATUS,RP0             ; Banco 1.
    movlw    0x00                 ; Elijo esta dirección de la EEPROM y
    movwf    EEADR                  ; lo cargo en EEADR con el dato a escribir.
    movlw    Contador
    movwf    EEDAT                  ; Cargo el registro EEDAT con el dato a escribir.
    bsf      EECON1,WREN            ; Habilitar
    bcf     INTCON,GIE              ; Deshabilitar intercepciones.
    movlw     0x55                  ; Desbloquear escritura.
    movwf     EECON2
    movlw     0xAA
    movwf     EECON2
    bsf     EECON1,WR               ; Inicie la escritura.
    bsf     INTCON,GIE              ; Habilitar INTS.
bcf STATUS,RP0
    return
   
;Subrutina Retardo_20ms ************************************************************
 ; Retardo = 0.02 segundos.
; Frecuencia Reloj = 4 MHz.
; Retardo actual = 0.02 segundos = 20000 ciclos.

Retardo_20ms
            ;19993 ciclos.
    movlw    0x9E
    movwf    RAM_ret
    movlw    0x10
    movwf    RAM_ret_1
Retardo_20ms_0
    decfsz    RAM_ret, f
    goto    $+2
    decfsz    RAM_ret_1, f
    goto    Retardo_20ms_0
            ;3 ciclos.
    goto    $+1
    nop
            ;4 ciclos (incluyendo call).
    return

END

Salu2.


En línea

Firos
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.410


Enseña lo que sepas... y oculta lo peor...


Ver Perfil
Re: Manejar EEPROM interna
« Respuesta #1 en: 7 Marzo 2013, 21:56 pm »

He encontrado esto por ahí:

http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/datasheet-en-espanol-pic12f629675/msg7676/#msg7676


Es el datasheet en español de ese PIC que estas usando.



Pues a simple vista parece que estas cumpliendo con lo que pide el datasheet. ¿Has probado a debuggear paso a paso y revisando el codigo de el programa con el MPLAB o con Proteus para ver en que paso se queda enganchado?

Es posible que el código de escritura en la EEPROM esté bien y esté fallándote otra cosa.


Por otro lado. ¿No era necesario esperar a que la operación de escritura en la EEPROM se realizase con éxito? Aunque en el datasheet ponga habilitar la interrupción inmediatamente después de mandar la escritura, la escritura requiere un tiempo para que no de fallos y como bien dice, hay que deshabilitar interrupciones para evitar fallos, puesto que no debe interrumpirse.


¿Habías probado alguna vez a escribir la EEPROM de esa manera? ¿Te ha funcionado?


Prueba a darle las ordenes de escritura pero no habilites las interrupciones hasta que el FLAG de escritura en la EEPROM se active. Métele un búcle que compruebe el FLAG.

En tu caso creo que es el bit 7 (EEIF) de el registro PIR1. Asi que ya sabes:

Código:
Bucle        btfss  PIR1,EEIF
                goto  Bucle

... Habilita interrupciones y sigue con tu programa




Si te funciona pónnoslo aquí para corroborarlo. Gracias.



Un saludo.


En línea

El final del camino no está determinado, lo determinamos nosotros mismos paso a paso, día a día, y se puede cambiar.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
desamblar eeprom
Electrónica
kaoskiller 4 4,758 Último mensaje 3 Noviembre 2004, 06:41 am
por botboat
Guardar datos en la EEPROM interna del PIC
Electrónica
Meta 0 4,483 Último mensaje 27 Agosto 2009, 14:15 pm
por Meta
eeprom xbox sin key
Juegos y Consolas
SOMBRIO 2 6,195 Último mensaje 23 Junio 2010, 17:37 pm
por SOMBRIO
EEPROM y Arduino
Electrónica
@synthesize 2 7,550 Último mensaje 18 Julio 2010, 12:41 pm
por Debci
(PIC) Borrar EEPROM con bootloader
Electrónica
LiLou 2 5,466 Último mensaje 27 Septiembre 2014, 20:09 pm
por gmola17
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines