Proteus no guarda el estado actual en memoria EEPROM ?

Funcionamiento del siguiente programa:
Cada vez que pulsamos el boton reset o apagamos y volvemos a encender el circuito incrementa un contador guardado en la EEPROM que luego se muestra en un display.

bueno mi pregunta es si cuando trabajo con la EEPROM, ya sea de un pic, o un circuito integrado independiente, en este caso un PIC 16F84A , cargo el programa , pero al apagar y volver a iniciar la simulacion la EEPROM vuelve a su estado inicial, proteus no guarda la EEPROM al apagar la simulacion? o como podria hacer eso? les dejo mi programa para que puedan verlo, he escuchado que si guarda,pero no se por que en este caso no

Código:
;ZONA DE DATOS*************************************************************************************

      __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
      LIST P=16F84A
      INCLUDE <P16F84A.INC>
      
      CBLOCK 0x0C
      Contador
      ENDC
      
      ORG          0x2100
      DE           "Primer eeprom",0x00
      
NumeroSecreto EQU .13
      
;ZONA DE CODIGOS***********************************************************************************

      ORG          0
Inicio
      call         LCD_Inicializa
      movlw        .13                   ;es la posicion despues del mensaje grabado "Primer eeprom"
      call         EEPROM_LeeDato        ;lee la primera posicion de EEPROM
      movwf        Contador
      movlw        NumeroSecreto
      subwf        Contador,W
      btfsc        STATUS,Z              ;comprobamos si llego al maximo
      goto         MicroBloqueado        ;alcanzado maximo de reseteos, se bloquea
      movf         Contador,W            ;no se alcanzo el maximo, sigue rutina
      call         BIN_a_BCD
      call         LCD_Byte
      movlw        MensajeReseteado
      call         LCD_Mensaje
      incf         Contador,W
      call         EEPROM_EscribeDato
Principal
      sleep
      goto         Principal
MicroBloqueado
      movlw        MensajeBloqueado
      call         LCD_Mensaje
      goto         Principal
      
Mensajes
      addwf        PCL,F
MensajeReseteado
      DT " Reseteados.   ",0x00
MensajeBloqueado
      DT  "Estoy Bloqueado",0x00

incluso al comienzo tuve un pequeño error, y en vez de indicar la direccion de la eepron donde lo cargue con 0x00, lei la direccion siguiente, es decir .14 en vez de .13 en el siguiente codigo

movlw .13 ;es la posicion despues del mensaje grabado "Primer eeprom"

y gracias a ese error si guardaba los datos a la eeprom simulando proteus aunque lo apagara y volviera a encender o_O ... raro, obviamente que comenzaba desde un numero raro, ya que esa direccion originalmente viene cargada con 0xFF si no me equivoco, igual que en cualquier otra direccion no utilizada

la cuestion es que aumentaba normal con el Contador, (supongo que se desbordo) y al detener la simulacion y volver a iniciar mostraba el valor en que se quedó, pero con el codigo actual no pasa eso, alguien sabe por que?
 

Adjuntos

  • Proteus.rar
    15.7 KB · Visitas: 9
  • asm.rar
    715 bytes · Visitas: 4
Última edición:
Usa el modo depurador del Proteus, dentro del MPLAB

bueno nolose :)
en todo caso escribe directamente los valores de la EEPROM
 
probaste el archivo? es algo raro que en la circunstancias que describi si guarde, tan solo cambiando el .13 por .14, (obviamente fue un error mio al comienzo) o_O
 
Claro, cómo no. Aquí los pongo, aunque no creo que haya error ahí.

PD: Me equivoqué con el del eeprom, ya subí el correcto que estoy usando.
Olvidé poner los necesitaban para poder generar los .hex, lo siento, pero ahí están.

El archivo Librerías también tiene EEPROM.INC, pero subí otro donde está el correcto que usé.
¿Alguien sabe la respuesta a la pregunta que planteé en el primer mensaje?
 

Adjuntos

  • Librerias.rar
    7.6 KB · Visitas: 24
  • EEPROM.rar
    1.1 KB · Visitas: 28
Última edición por un moderador:
¿Alguien sabe la respuesta a la pregunta que planteé en el primer mensaje?
Si cambias los datos de la posición 0x00 de la EEPROM, que es donde se guarda el valor del contador, siempre leerás al iniciarse el PIC, lo que agregaste en la dirección 0x00.
Si agregaste una letra, leerás su valor valor ASCII correspondiente, y ese será tomado como el valor del contador.

Si quieres que el valor del contador al resetar el PIC tenga el último valor del conteo que se guardó en la memoria, entonces necesitas modificar la rutina inicial de lectura de la EEPROM y no tomar siempre un valor inicial.

Tomando el código original y modificandolo para que se realice esto, debe quedar así:
Código:
; [COLOR=Red]Comentar o eliminar la escritura inicial de la EEPROM[/COLOR]
;    ORG    0x2100                ; Corresponde a la dirección 0 de la zona EEPROM de datos.
;    DE    0x00                ; El contador en principio a cero.

NUM_SECRETO    EQU    .13

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                        ; El programa comienza en la dirección 0.
Inicio
    call    LCD_Inicializa
    clrw                            ; Leerá la primera posición de memoria EEPROM.
    call    EEPROM_LeeDato
    movwf    Contador
    [COLOR=Blue][B]movlw[/B]    0xFF[/COLOR]                    [COLOR=Green]; Verificar EEPROM sin grabar (Valor inicial = 0xFF).[/COLOR]
    [B][COLOR=Blue]subwf [/COLOR][/B]   [COLOR=Purple]Contador,w[/COLOR]
    [B][COLOR=Blue]btfsc[/COLOR][/B]    [COLOR=Purple]STATUS,C [/COLOR]               [COLOR=Green]; ¿Contador = 0xFF?[/COLOR]
    [COLOR=Blue][B]clrf [/B][/COLOR]   [COLOR=Purple]Contador[/COLOR]                [COLOR=Green]; Si, Contador = 0[/COLOR]
    [B][COLOR=Blue]movlw[/COLOR][/B]    [COLOR=Purple]NUM_SECRETO[/COLOR]                [COLOR=Green]; No, lo compara con el número secreto.[/COLOR]
    subwf    Contador,W                ; Si llega al máximo pasa al modo bloqueado.
    btfsc    STATUS,C
    goto    ModoBloqueado
Así, tras cada reseteo del microcontrolador se incrementará el valor del contador y el último valor será guardado en la EEPROM interna y leído al iniciar.

Prueba de esta forma, así te debe funcionar.

Para borrar los datos de la EEPROM en ISIS cuando el contador llegue a 13 (NUM_SECRETO), ve al menú Debug y selecciona "Reset Persistent Model Data", con eso se borran los datos de la EEPROM del PIC y de cualquier dispositivo reprogramable.

Suerte.
 
Última edición:
quieres decir que de la forma que lo hice nunca se va a guardar el dato al apagarse el circuito? o solo ocurre en la simulacion? lo que quiero decir es que para que funcione de esa manera en la simulacion si o si tiene que ser una posicion de la eeprom de la cual no tiene un valor inicial? pero en la realidad funcionaria bien lo que hice?
 
¿Quieres decir que de la forma que lo hice nunca se va a guardar el dato al apagarse el circuito? o solo ocurre en la simulación? lo que quiero decir es que para que funcione de esa manera en la simulación si o si tiene que ser una posición de la eeprom de la cual no tiene un valor inicial? pero en la realidad funcionaria bien lo que hice?
Creo que no leíste bien lo que expliqué, no me expliqué bien o no entendiste.

De la forma como lo hiciste, si se guardan los datos en la EEPROM, pero como se sobre escribe el valor guardado en la posición 0x00 cada vez que se inicia el microcontrolador, es por eso que piensas que no se guardó.

La directiva DE en ese programa siempre está escribiendo algo en la EEPROM al iniciarse el PIC.
ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM de datos.
DE 0x00 ; El contador en principio a cero.

Así que, aunque el dato sea guardado al apagar el circuito, al iniciarse se sobre escribirá nuevamente.
 
entonces en este caso utilizar el boton de reset practicamente no es lo mismo que apagar y encender el pic no?

La directiva DE en ese programa siempre está escribiendo algo en la EEPROM al iniciarse el PIC.
ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM de datos.
DE 0x00 ; El contador en principio a cero

pensaba que esa directiva no se ejecutaba cada vez que se iniciaba el pic, sino mas bien era para el momento del grabado del pic

pd: pensaba que funcionaba como lo habia descrito puesto que en el libro de "microcontrolador pic16f84" asi describe el programa, segun el libro dice que cada vez que se apague y encienda el pic queda guardado el valor, y explica que una vez que llegue a su limite y salga el mensaje de bloqueado , la unica manera de desbloquearlo es regrabando el pic
 
Última edición:
entonces en este caso utilizar el boton de reset practicamente no es lo mismo que apagar y encender el pic no?
Si se produce el mismo efecto físicamente, pero no en la simulación.
Pensaba que esa directiva no se ejecutaba cada vez que se iniciaba el pic, sino mas bien era para el momento del grabado del pic
Así es, pero tú estás simulando, y el comportamiento no es el mismo al simular que físicamente.
pensaba que funcionaba como lo había descrito puesto que en el libro de "microcontrolador pic16f84"
Si, así es como debe funcionar físicamente. No durante la simulación.
segun el libro dice que cada vez que se apague y encienda el pic queda guardado el valor, y explica que una vez que llegue a su limite y salga el mensaje de bloqueado , la unica manera de desbloquearlo es regrabando el pic
Físicamente así sería una forma de restablecer el valor del contador.
Por eso también expliqué como hacerlo en ISIS.

Compruébalo tú mismo montando el circuito.

Saludos.
 
Última edición:
ok muchas gracias, lamentablemente aun no tengo un grabador para probarlo, todo lo que he hecho en pic hasta ahora ha sido en simulador , ya que hace tres dias he empezado a leer ese libro para aprender sobre los pic, ovbiamente ya tenia conocimiento previo de circuitos digitales.

sino no estaria haciendo este tipo de preguntas y lo primero que hubiera hecho despues de simular es probarlo en proto, gracias por las molestias.

saludos
 
ok muchas gracias, lamentablemente aun no tengo un grabador para probarlo, todo lo que he hecho en pic hasta ahora ha sido en simulador , ya que hace tres días he empezado a leer ese libro para aprender sobre los pic, obviamente ya tenia conocimiento previo de circuitos digitales.

sino no estaría haciendo este tipo de preguntas y lo primero que hubiera hecho después de simular es probarlo en proto, gracias por las molestias.

saludos
Bien, pues el paso siguiente es hacerte de un programador de PIC's y realizar las pruebas físicamente.
ISIS tan solo es un simulador, no un protoboard ni una tarjeta de entrenamiento.
Simular circuitos te podrá dar una idea del funcionamiento, pero nada comparado a la realidad.

Suerte.
 
Atrás
Arriba