Como Guardar en la ROM un dato

Hola, que tal, tengo una duda para plantear, tengo el siguiente programilla, es sencillo pero no logro saber como guardar en la ROM un dato que al encender, o resetear quede el ultimo dato guardado.

Se trata de un simple programa con un display 7 segmentos catodo comun,
Al iniciar comienza con el segmento central ( - ).
Lo unico que hace es cambiar del 1 al 6 y volver de nuevo( con el boton 1.)
Osea si marca uno, y pulso el boton 2 va a encender un led por ( 1 seg),
Si pulso el boton 1 hasta llegar al numero 2 y pulso el boton 2 ( va a encender por 2 seg, y asi ....



Código:
list p=16F84A
 #include P16F84A.inc
 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
 
;**** Definicion de variables ****
 
Contador equ  0x0C ; Registro para almacenar conteo
Pulsador equ  7 ; Definimos Pulsador como el bit 7, en este caso sera para PORTB
 
;**** Inicio  del Micro ****
Reset  org 0x00  ; Aqui comienza el micro.- 
  goto Inicio  ; Salto a inicio de mi programa.-
 
;**** Programa principal ****
;**** Configuración de puertos ****
Inicio  bsf STATUS,RP0  ; Pasamos de Banco 0 a Banco 1.-
  movlw b'00001' ;RA0 como entrada
  movwf TRISA 
  movlw b'10000000' ; RB7 como entrada y los demas como salida.- 
  movwf TRISB 
  bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0 
  movlw b'1000000' ; Comienza con (-) 
  movwf PORTB 
  clrf Contador
 
; **** TESTEOS DE PULSADORES ****
 
;**** Testeo de Pulsador ****
Testeo   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.- 
   goto Testeo  ; No, seguimos testeando.- 
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.- 
   goto Testeo  ; Falsa Alarma, seguimos testeando.-
   movlw b'0000110' ;  (1)
   movwf PORTB
   goto  UNO
UNO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto UNOB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto UNOB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1011011' ;  (2) 
   movwf PORTB
   goto DOS
UNOB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto UNO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto UNO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg1  ; ( 1 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto UNO
 
DOS   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto DOSB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto DOSB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1001111' ;  (3) 
   movwf PORTB 
   goto  TRES
DOSB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto DOS  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto DOS  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto DOS
 
TRES   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto TRESB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto TRESB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1100110' ;  (4) 
   movwf PORTB 
   goto  CUATRO
TRESB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto TRES  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto TRES  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto TRES
 
CUATRO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto CUATROB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto CUATROB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1101101' ;  (5) 
   movwf PORTB 
   goto  CINCO
CUATROB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto CUATRO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto CUATRO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg2  ; ( 2 SEG )
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto CUATRO
 
CINCO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto CINCOB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto CINCOB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1111101' ;  (6) 
   movwf PORTB  
   goto  SEIS
CINCOB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto CINCO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto CINCO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto CINCO
 
SEIS   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto SEISB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto SEISB  ; Falsa Alarma, seguimos testeando.-
   movlw b'0000110' ;  (6) 
   movwf PORTB 
   goto  UNO
SEISB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto SEIS  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto SEIS  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   call seg3  ; ( 3 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto SEIS
 
   INCLUDE  <TIEMPOS.INC>
   INCLUDE  <RETARDOS.INC>
   end

Lo que quisiera como dije antes seria que al apagarse o reiniciarse quedara el numero ultimo guardado, se que es algo sencillo ( no para mi ) como guardando una variable y mover el dato a la memoria, pero no se como crear la rutina, desde ya muchas gracias !!!
 
Última edición por un moderador:
Hola, Vangeluz.

Para guardar un dato en la EEPROM tienes que utilizar los registros EECON1, EECON2, EEDATA y EEADR. Puedes echar un vistazo a la página 14 del datasheet, donde viene un ejemplo de cómo hacerlo. Por seguridad, hay una secuencia concreta para grabar el dato (así se evita escribir en la EEPROM por error). Esa secuencia consiste en escribir primero el byte que quieres guardar, y después meter el 55h y el AAh en el registro EECON2, en ese orden.

Además, te recomendaría lo siguiente para tu programa:

1- Haz uso de las llamadas a subrutinas (instrucciones CALL y RETURN). Te ahorrarás mucho código.

2- Guarda el número de posición (de 0 a 6) en una posición de la EEPROM, y utilízalo como puntero a una tabla (sumándolo a la dirección de inicio de la tabla). En esa tabla, también en la EEPROM, puedes poner los valores que quieras sacar por el puerto.

De momento, con esto ya mejorará bastante tu programa. Ánimo.
 
Hola, Vangeluz.

Para guardar un dato en la EEPROM tienes que utilizar los registros EECON1, EECON2, EEDATA y EEADR. Puedes echar un vistazo a la página 14 del datasheet, donde viene un ejemplo de cómo hacerlo. Por seguridad, hay una secuencia concreta para grabar el dato (así se evita escribir en la EEPROM por error). Esa secuencia consiste en escribir primero el byte que quieres guardar, y después meter el 55h y el AAh en el registro EECON2, en ese orden.

Además, te recomendaría lo siguiente para tu programa:

1- Haz uso de las llamadas a subrutinas (instrucciones CALL y RETURN). Te ahorrarás mucho código.

2- Guarda el número de posición (de 0 a 6) en una posición de la EEPROM, y utilízalo como puntero a una tabla (sumándolo a la dirección de inicio de la tabla). En esa tabla, también en la EEPROM, puedes poner los valores que quieras sacar por el puerto.

De momento, con esto ya mejorará bastante tu programa. Ánimo.


Gracias Melghost, estoy chequeando el datasheet, como mensionas junto con otros ejemplos, a ver si logro simplificar todo el codigo, tanto con una tabla, como con las llamadas y asi mismo voy a lograr entender el proceso de guardar en la EEPROM.

Muchas gracias por la data !!!!
 
Última edición por un moderador:
Hola de nuevo, queria saber como agregar mas de un registro en la EEPROM.

Por ejemplo yo tengo uno llamado numero y funciona bien :

Código:
        ORG 0x2100    ; Corresponde a la dirección 0 de la zona EEPROM de datos..
Numero
        DE 0x00    ; El contador en principio a cero.
 
; chequeo el dato guardado con :
 
         movlw    Numero            ; Lee la posición 0x00 de memoria EEPROM de datos
         call        EEPROM_LeeDato   ; donde se guarda el Numero.
         movwf    PORTB 
 
 
; Y guardo asi:
 
         movlw    NumeroTurno    ; Se escribe en la posición de memoria EEPROM de
         movwf    EEADR     ; datos donde se guarda el turno. En este caso en 
         movlw    b'0000110' ;  (1)
         call        EEPROM_EscribeDato

Utilizo la libreria EEPROM.INC, Hasta ahi todo me funciona perfecto y puedo guardar y leer el dato guardado, en mi caso numeros en un display 7 segmentos.
Pero cuando quiero guardar o mejor dicho, intentar guardar otro dato en la eeprom me tira mil errores, aca esta como lo hago:

Código:
        ORG 0x2100    ; Corresponde a la dirección 0 de la zona EEPROM de datos..
Numero
Letra
        DE 0x00    ; El contador en principio a cero.
 
###################################################
 
Tambien he intentado algo asi
 
        ORG 0x2100    ; Corresponde a la dirección 0 de la zona EEPROM de datos..
Numero
Letra
         DE 0x00    ; El contador en principio a cero.
        ;DE   0x01       ; 2 LUGAR
        ;DE   0x02        ; 3 LUGAR
 
################################################
 
Luego asi:
 
        ORG 0x2100    ; Corresponde a la dirección 0 de la zona EEPROM de datos..
Numero
Letra
         DE 0x00, 0x00, 0x00, 0x00, ........   ; etc

Y no he tenido mas que fracazos al querer compilar con MPLAB, seguramente debo tener uno, o multitud de errores al intentar hacer eso, no se cual es la forma correcta de grabar mas de 1 registro en la EEPROM, por favor alguien que me de una mano que estoy haciendo mal ... Gracias !!!!
 
Atrás
Arriba