Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   ASM y Microcontroladores (https://www.clubdelphi.com/foros/forumdisplay.php?f=44)
-   -   Manejar EEPROM interna (https://www.clubdelphi.com/foros/showthread.php?t=82448)

REHome 07-03-2013 16:10:35

Manejar EEPROM interna
 
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.

Casimiro Notevi 07-03-2013 17:18:50

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

fenixariel 16-03-2013 18:43:10

Que te parece mejor hacerlo con un lenguaje de alto nivel, mi opinion es que se tiene que aprender si o si con asm al inicio, pero el paso a un lenguaje de alto nivel es natural.

MikroC, MikroPascal, en sus nuevas versiones espectaculares en su rendimiento, tambien PICC, C18, Hitech, etc etc..



Saludos.

REHome 16-03-2013 20:39:54

Buenas:

En ese sentido tienes razón. Si usas PIC de gama baja o gama media se usan ASM, si ya son de gama alta se recomienda lenguaje de alto nivel como el C o otros, recomendable usar los de fabriante, ya que son los más actualizados y tienen ejemplos asm y C de sus PIC para practicar.

Un cordial saludo.


La franja horaria es GMT +2. Ahora son las 13:18:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi