Autor Tema: Ayuda con EEPROM interna 16F628A  (Leído 9576 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Descarriado

  • PIC10
  • *
  • Mensajes: 3
Ayuda con EEPROM interna 16F628A
« en: 18 de Junio de 2010, 04:11:19 »
Hola a todos

  Tengo un problema y unas dudas que me gustaría saber si alguien del foro amablemente me puede despejar.

  Primero el proyecto en el que estoy trabajando es bien sencillo, un temporizador para encender y apagar unas luces mediante un relé, los tiempos en minutos de cada temporizacion los guardo en la EEPROM interna del pic y los puedo modificar mediante datos ingresados por el puerto serie. Hasta aquí todo bien.

  Mi problema esta en que luego de encender y apagar unas cuantas veces el sistema los datos guardados en la EEPROM se borran.

  Alimento todo el sistema (pic, luces y reles) con una batería de gel de 12V 7AH y utilizo para la alimentación del pic un regulador LM7805 con los respectivos condensadores en la entrada y salida del regulador y el encendido y apagado de todo el sistema lo realizo conectando y desconectando la batería através de un interruptor.

 Las Luces que son alógenas son las que mas consumen y obviamente me generan ruido el encenderse y apagarse, así como la excitación de la bobina del relé, pero eso ya lo tengo solucionado con los respectivos diodos conectados en paralelo.

 En un principio se me resteaba el pic algunas veces cuando entraban las luces pero lo solucione con el típico condensador de tantalio conectado entre MCLR y tierra.

 Mi problema ahora es solo el borrado de la eeprom que ocurre exclusivamente luego de desconectar y reconectar la alimentación y no esta relacionado con la operación de las luces porque he realizado numerosas pruebas.

 Alguien se ha encontrado con un problema similar y tiene algún indicio de cual pude ser el problema? falla del pic o algún detalle de hardware que debería considerarse?

 Lo otro siempre los datos perdidos de la EEPROM vuelven a FF lo que según entiendo es el valor cuando están completamente borradas, es eso así?

 Existe alguna operación que logre borrar completamente la memoria? y es posible que la este realizando sin querer?

Bueno eso seria, quedo atento a cualquier sugerencia.

Desde ya muchas gracias   

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 666
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #1 en: 18 de Junio de 2010, 05:06:52 »
muestramnos el codigo para ver si te damos opimniomnes lo mas seguro es que tu falla este emn el codigo que estas elaborado para el pic.

Saludos y estamos emn conmtacto.

Atten.
Alexander Santana.
Barcelona-Venezuela.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado Descarriado

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #2 en: 18 de Junio de 2010, 13:40:10 »
Hola

Aca esta el codigo, pero sinceramente no creo que sea eso, pero nunca se sabe

saludos

; **** Encabezado ****
      list      p=16f628A      ; directiva para indicar el micro a utilizar
      #include   <p16f628A.inc>   ; archivo con definiciones de variables especificas del micro
      __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
      ;sentencia para configurar los fuses del micro
 
;**** Definicion de variables ****
Segundos   equ    0x22   ; contador para los segundos
Minutos      equ      0x23   ; contador de minutos
tiempo      equ      0x24   ; donde guardare el tiempo a contar
addr      equ      0x25   ;mantiene direccion del daro en eprom
Cont_parp   equ      0x27    ; cuenta cuantos parpadeos han ocurrido
flagP      equ      0x28   
;variables asociadas a puerto serie
Dato_Dec   equ      0x20   ; Dato recibido desde PC
Dato_Uni   equ      0x32
Flag      equ      0x21   ; Bandera que me indicara si llego un dato unidad o decena
flagS      equ      0x26   ; Bandera que dice que tiempo debo guardar (addr2)
Sleep_temp   equ      0x29
ON_temp      equ      0x30
OFF_temp   equ      0x33
Temp      equ      0x34
Write      equ      0x35

;**** Inicio del Micro ****
Reset.      
   org   0x00            ; Aquí comienza el micro
   goto   Inicio         ; Salto a inicio de mi programa
 
;**** Vector de Interrupcion ****
   org   0x04            ; Atiendo Interrupcion
   goto   ISR
 
; **** Programa Principal ****
   org   0x05
Inicio
;configuracion puertos
   bsf      STATUS,RP0      ; Paso al Banco 1
   movlw   0x02
   movwf   TRISB         ; Configuro pines para Usart
   movlw   0x00
   movwf   TRISA         ; Configuro todo PORTA como salidas
   bcf      STATUS,RP0      ; Paso del Banco 1 al Banco 0
   movlw   0x07          ; desabilitamos comparadores del puerto A.-   
   movwf   CMCON
   bsf      STATUS,RP0      ; Paso al Banco 1
;config USART
   movlw   0x04
   movwf   TXSTA          ; Configura modo asincrono, baud rate de alta velocidad
   movlw   0x19          ; Configura velocidad a 9600 baudios con cristal de 4 Mhz
   movwf   SPBRG
   bsf      PIE1,RCIE       ; Habilita interrupcion de puerto serie para recepcion
   bsf       PIE1,TMR1IE    ; Seteo bit Habilitacion interrupción por TMR1.   
   bsf    INTCON,GIE       ; Habilitacion general interrupciones
   bsf      INTCON,PEIE    ; Habilitacion de interrupciones por perifericos
; Activar recepcion, transmision.-
   ;bsf     TXSTA,TXEN       ; Habilita transmision
   bcf      STATUS,RP0       ; Banco 0
   bsf      RCSTA,SPEN       ; Habilitacion puerto serie
   bsf      RCSTA,CREN      ; Habilita recepcion
   bcf      Flag,0         ; Limpiamos bandera.
;**** Configuracion Timer 1 *****
   movlw   b'00110001'      ; Se activa TMR1 y preescaler de 1/8, modo temporizador.-   
   movwf   T1CON   
   movlw   0x0B         ; Cargamos 3035 en TMR1 para lograr 500ms aprox   
   movwf   TMR1H         ; Byte alto de TMR1.-   
   movlw   0xDB   
   movwf   TMR1L          ; Byte bajo de TMR1.-
;inicializacion de variables
   clrf   Segundos
   clrf    Minutos
   clrf   PORTA
   clrf   PORTB         ; limpio puertos
   clrf   addr         ; dejo direccion en cero
   clrf    Cont_parp
   clrf   Flag
   clrf   flagS
   clrf   flagP
   clrf   Write

   movfw   addr         ; cargo direccion en W
   bsf    STATUS, RP0    ; Bank 1
   movwf    EEADR          ; Address to read
   bsf    EECON1, RD       ; EE Read
   movf    EEDATA, W       ; W = EEDATA
   bcf    STATUS, RP0    ; Bank 0
   movwf   tiempo          ; paso valor a variable tiempo
   ;movwf   PORTB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   incf   addr,f         ; incremento contador de memoria
   
; ciclo principal del programa
Bucle
   btfss   Write,0         ; programa se mantiene preguntando si debe o no escribir en memoria   
   goto    Bucle           ; esto ocurre cuando se ha recivido un set de valores nuevos para
                     ; los contadores y luego se reinicia el programa


   ;movlw   b'00100000'
   ;xorwf   PORTB,f


   clrf   addr         ; limpio la direecion
   movfw   addr         ; cargo direccion en W
   bsf    STATUS, RP0    ; Bank 1
   movwf    EEADR          ; Address to write
   bcf      STATUS, RP0    ; Bank 0
   movfw   Sleep_temp      ; cargo dato a escribir en W
    call   Escribir      ; llamo a rutina de escritura en eprom

   incf   addr,f          ;incremento direccion
   movfw   addr         ; cargo direccion en W
   bsf    STATUS, RP0    ; Bank 1
   movwf    EEADR          ; Address to write
   bcf      STATUS, RP0    ; Bank 0
   movfw   ON_temp         ; cargo dato a escribir en W
    call   Escribir      ; llamo a rutina de escritura en eprom

   incf   addr,f          ;incremento direccion
   movfw   addr         ; cargo direccion en W
   bsf    STATUS, RP0    ; Bank 1
   movwf    EEADR          ; Address to write
   bcf      STATUS, RP0    ; Bank 0
   movfw   OFF_temp         ; cargo dato a escribir en W
    call   Escribir      ; llamo a rutina de escritura en eprom

   bcf    PIR1,RCIF      ; Limpiamos bandera de interrupcion por recepcion serie
   bcf      PIR1,TMR1IF      ; Borro bandera de control de Interrupcion por timer
   goto   Inicio         ; reinicio el programa


;subrutina de escritura
Escribir
   BSF    STATUS, RP0 ; Bank 1
   movwf    EEDATA      ; mover dato a escribir
   BSF    EECON1, WREN ; Enable write
   BCF    INTCON, GIE ; Disable INTs.
   MOVLW    0x55 ;
   MOVWF    EECON2 ; Write 55h
   MOVLW    0xAA ;
   MOVWF    EECON2 ; Write AAh
   BSF    EECON1,WR ; Set WR bit
      ; begin write
   btfsc   EECON1,WR   ;esperar a que termine (10 ms)
   goto   $-1
   BCF    EECON1, WREN ; Disable write
   BSF    INTCON, GIE ; Enable INTs.
   bcf      STATUS, RP0    ; Bank 0
   return



Parpadear
   incf    Cont_parp,f
   movlw   b'00000011'
   xorwf   PORTA,f         ; hago togle para prender o apagar salidas
   movlw   d'6'
   subwf   Cont_parp,w
   btfsc   STATUS,Z
   bsf      flagP,0
   goto    Load_Timer

; actualizacion contadores
Timer
   btfss   flagP,0
   goto   Parpadear
Load_Timer
   movlw   0x0B         ; recargo timer con 500 seg   
   movwf   TMR1H            
   movlw   0xDB   
   movwf   TMR1L         
   
   incf   Segundos,f      ; incremento segundos      
   movlw   d'120'          ;120 debe ser en realidad
   subwf   Segundos,w
   btfss   STATUS,Z
   goto   Fin_ISR         ;vuelvo de interrupcion
   clrf   Segundos

   ;movlw   b'10000000'
   ;xorwf   PORTB,f

   incf   Minutos,f      ;incremento minutos
   movfw   tiempo         ;muevo el tiempo que debe pasar a W
   subwf   Minutos,w
   btfss   STATUS,Z
   goto   Fin_ISR         ;vuelvo de interrupcion
   clrf   Minutos
; tengo que cargar nuevo temporizador en tiempo usando addr
; en este punto addr vale 01 o 10
   movfw   addr         ; cargo direccion en W
   bsf    STATUS, RP0    ; Bank 1
   movwf    EEADR          ; Address to read
   bsf    EECON1, RD       ; EE Read
   movfw    EEDATA          ; W = EEDATA
   bcf    STATUS, RP0    ; Bank 0
   movwf   tiempo          ; paso valor a variable tiempo
   ;movwf   PORTB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   movlw   b'00000011'
   xorwf   addr,f         ; hago togle para pasar de 01 a 10 en addr
   xorwf   PORTA,f         ; hago togle para prender o apagar salidas
   goto   Fin_ISR   


;**** Rutina de atencion de Interrupcion ****
;**** Interrupcion por Usart (Recepcion de Dato)****
ISR    
   btfss   PIR1,TMR1IF      ; Consultamos si es por timer 1
   goto   ISR2         ; vamos a preguntar si es por usart
   goto    Timer

Fin_ISR
   bcf      PIR1,TMR1IF      ; Borro bandera de control de Interrupcion por timer
   retfie   

ISR2
   btfss   PIR1,RCIF      ; Consultamos si es Usart.-
   retfie               ; No, Salimos de interrupción.-         
   movfw   RCREG         ; Llego dato, lo guardamos en registro W

   movwf   Temp         ; rescato el dato
   movlw   0x30         ; resto 30 al ascii del numero para quedar con numero
   subwf   Temp,w         ; dejo resultado en w


   ;movwf   PORTB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   btfss   Flag,0           ; pregunto si flag vale 1
   goto    $+4             ; si vale 1 recibo unidad, si vale 0 recibo decena
      movwf   Dato_Uni      ; recivo unidad y proceso datos
   bcf      Flag,0
   goto   $+4            ; voy a procesar datos
   movwf   Dato_Dec        ;recibo decena y termino interrupcion
   bsf      Flag,0
   goto   Fin_ISR2
;comienzo operacion sobre decena
   bcf      STATUS,C         ;limpio carry
   rlf      Dato_Dec,w       ; roto una vez y guardo en W (multx2)   
   rlf      Dato_Dec,f       ;roto 3 veces y guardo en f(multx8)      
   rlf      Dato_Dec,f
   rlf      Dato_Dec,f
   addwf   Dato_Dec,w      ; sumo multx2 y multx8 = multx10 y resultado en w
   addwf   Dato_Uni,f      ; sumo decena con unidad y tengo valor ingresado
   
;busco que dato fue el que llego

   movlw   d'0'
   subwf   flagS,w
   btfss   STATUS,Z
   goto   $+5   ;5 sin portB
   movfw   Dato_Uni
   ;movlw   d'5'
   movwf   Sleep_temp
   ;movwf   PORTB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   incf   flagS,f
   goto   Fin_ISR2
   
   movlw   d'1'
   subwf   flagS,w
   btfss   STATUS,Z
   goto   $+5
   movfw   Dato_Uni
   ;movlw   d'2'
   movwf   ON_temp
   incf   flagS,f
   goto   Fin_ISR2

   movfw   Dato_Uni
   ;movlw   d'3'
   movwf   OFF_temp
   bsf      Write,0

   ;goto   Fin_ISR2

Fin_ISR2
   bcf    PIR1,RCIF      ; Limpiamos bandera de interrupcion por recepcion serie
   retfie               ; Salimos de interrupción.-



;...............................................
   end

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #3 en: 18 de Junio de 2010, 17:58:59 »
.


Por lo que puedo ver, hay dos cosas que podrías mejorar para evitar problemas con la escritura de la eeprom:

- A la hora de deshabilitar el bit GIE (del registro INTCON), verificar que se ha puesto en 0 usando BTFSC INTCON,GIE, después de BCF... Si una interrupción asincrónica se origina justo en el ciclo correspondiente a la instrucción BCF, en el próximo ciclo (cuando ya se suponía que GIE estaba en 0), se activa la interrupción, y al ejecutar RETFIE, GIE se pone en 1 automáticamente. Tiene que ser mucha la casualidad, pero más vale prevenir que lamentar luego.
- Guardar los registros W y STATUS al entrar en la interrupción y cargarlos al salir (el datasheet del pic tiene las rutinas para esto en la parte de interrupciones). En tu caso, si una interrupción se genera entre las instrucciones CALL Escribir y MOVWF EEDATA, el contenido que había en W se altera en la interrupción y al final escribe cualquier cosa en la eeprom.

Aún así, no creo que el problema sea el código, porque ya de por sí es difícil que se produzcan estas cosas, pero que encima terminen guardados todos FF ya es mucho.. Yo le hecharía una ojeada al PICmicro™ Mid-Range Reference Manual (DS33023) (que recomienda el datasheet).
Y una cosita más que no tiene que ver con tu problema, pero que de seguro te va a servir: en vez de poner la directiva EQU cuando tenés que declarar muchas variables, mejor usá:
Código: ASM
  1. CBLOCK     0x20     ; la dirección de inicio de la memoria RAM
  2. Segundos
  3. Minutos
  4. tiempo
  5.  
  6. ;...
  7.  
  8. Temp
  9. Write
  10.      ENDC

Con esto le asigna al registro que pusiste en la línea de CBLOCK (0x20 en este caso) el primer nombre de la lista, al siguiente (0x21) el segundo nombre, y así sucesivamente hasta el cierre (ENDC). Más sencillo y elegante  ;-)

¡Saludos!


When you see a good move, look for a better one (Emanuel Lasker)

Desconectado Descarriado

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #4 en: 18 de Junio de 2010, 18:29:58 »
Hola.
 
 Gracias por los comentarios

 Pero el problema no es en la escritura o lectura de los datos guardados en la EEPROM siempre se escriben y leen bien, lo he probado por mucho tiempo.

 Mi problema es "algunas veces" cuando desconecto la alimentacion y vuelvo a alimentar, se espera que los ultimos datos escritos en la EEPROM sigan ahi y sean rescatados para la operacion del programa, pero estos datos se borran y vuelven a FF.

 El programa funciona correctamente, pero las temporizaciones del timer no son las requeridas y obviemente se pierde la idea del sistema.

 Insisto, esto no ocurre siempre, es solo de vez en cuando, pero la EEPROM se me borra solo luego de apagar el sistema y volver a encenderlo, por lo que creo que es algo relacionado con transientes de alimentacion o algo similar y no tengo mas ideas del como solucionarlos.

 En este momento estoy trabajando en rutinas de revision de la eprom y en caso de perdida carge un dato por default y avice del problema al iniciar con una secuencia de parpadeos, pero de todos modos me gustaria saber cual es el problema, porque se borran las EEPROM cuando se supone que eso no deberia ocurrir

Saludos

Desconectado arielba

  • PIC10
  • *
  • Mensajes: 6
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #5 en: 30 de Mayo de 2011, 17:58:28 »
Hola.
 
 Gracias por los comentarios

 Pero el problema no es en la escritura o lectura de los datos guardados en la EEPROM siempre se escriben y leen bien, lo he probado por mucho tiempo.

 Mi problema es "algunas veces" cuando desconecto la alimentacion y vuelvo a alimentar, se espera que los ultimos datos escritos en la EEPROM sigan ahi y sean rescatados para la operacion del programa, pero estos datos se borran y vuelven a FF.

 El programa funciona correctamente, pero las temporizaciones del timer no son las requeridas y obviemente se pierde la idea del sistema.

 Insisto, esto no ocurre siempre, es solo de vez en cuando, pero la EEPROM se me borra solo luego de apagar el sistema y volver a encenderlo, por lo que creo que es algo relacionado con transientes de alimentacion o algo similar y no tengo mas ideas del como solucionarlos.

 En este momento estoy trabajando en rutinas de revision de la eprom y en caso de perdida carge un dato por default y avice del problema al iniciar con una secuencia de parpadeos, pero de todos modos me gustaria saber cual es el problema, porque se borran las EEPROM cuando se supone que eso no deberia ocurrir

Saludos

Hola Descarriado,  a mi me sucede exactamente lo mismo con un 18f2550, y también hice mi y una pruebas para ver en que momento se borran los datos y estoy casi seguro que es al conectar la alimentación, En mi caso son unos variadores de velocidad de motores brussless que al conectarle la batería hacen una chispa por la carga capacitiva que tienen, y los mismos variadores traen un regulador de 5v interno, el cual alimenta el pic.
El caso es que no me falla nunca utilizando una fuente de alimentación , y si al conectarlo a los variadores. 

Has podido descubrir que era y/o solucionarlo de alguna forma?

Un saludo.

Desconectado arielba

  • PIC10
  • *
  • Mensajes: 6
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #6 en: 30 de Mayo de 2011, 18:02:31 »
Se me olvida un detalle, lo he probado en mas de 50 pics con el mismo código, ya que esta en un producto qeu fabrico, y me lo hace solo en el 5% , con lo cual estoy pensando también que es algún tipo de pico de tensión que algunos soportan mas que otros, o bien que algunos tienen ese problema. el algunos he notado incluso, que no graban nunca en la eeprom, siempre lee FF.

Desconectado wilmerariza

  • PIC10
  • *
  • Mensajes: 5
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #7 en: 10 de Julio de 2011, 02:41:11 »
a mi me acaba de pasar con un 877A,e producido mas de 100 maquinas y es la primera ves que me pasa ,estoy mas perdido porque desoues de cierto numero de ciclos la maquina pierde el dato de la posicion 01 pero no el resto de los datos de la eeprom la maquina tiene filtros de red emi ,capacitancias de filtrado de armonicos,transformador para aislar y el micro esta con tierra separas respecto a donde existe ruido en la red.no entiendo porque se genera este efecto ,cualquier ayuda seria  bienvenida

Desconectado pablete

  • PIC10
  • *
  • Mensajes: 36
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #8 en: 20 de Noviembre de 2011, 23:40:04 »
resucito el tema...
Me pasa lo mismo con unos encendidos electronicos. Resulta que andaban bien, y decidi hacerle una reforma al circuito y empezaron los problemas de la desprogramacion.
Pero no se desprograma funcionando, sino a veces cuando arranca el motor. Ahi es cuando se borra. El circuito se alimenta de C.A. del motor que pasa por una resistencia, diodo, zener, 7805. El voltaje de operacion es estable (4,8v constantes).
Debe ser un problema en los picos de tension en el arranque. Pero lo peor es que no tengo un metodo para hacer las pruebas y ver cuando se borra, sino que es medio aleatorio. Tambien me perjudica porque es algo que fabrico para vender...
Espero que alguno haya dado con la solucion.
Saludos!

Desconectado Vtronic

  • PIC16
  • ***
  • Mensajes: 121
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #9 en: 28 de Noviembre de 2011, 20:23:45 »
Que tal, yo se que esta pregunta es muy basica pero si usas rele estas usando el diodo de proteccion? Yo creo que sus problemas se dan por esa razon, han probado utilizar un photo diac y un triac para sustituir los componentes mecanicos? en lo personal me inclino mas al uso de interruptores de estado solido. Saludos.

Desconectado arvaloez

  • PIC10
  • *
  • Mensajes: 1
Re: Ayuda con EEPROM interna 16F628A
« Respuesta #10 en: 01 de Noviembre de 2012, 17:10:42 »
Hola a todos.

Lamentablemente soy otro mas que tiene el mismo problema de la EEPROM en un PIC16F688. a diferencia  de todos, yo enciendo y apago mi sistema constantemente y siempre la informacion esta guardada pero yo alimento mi circuito con una bateria la cual al descargarse la recargo nuevamente y es en ese momento cuando el sistema ya aparece con la EEPROM borrada.

aun no estoy certeramente seguro pero cuando la bateria se descarga y se carga, el cambio de voltajes es lento y posiblemente en algun valor de voltaje por el que pasa la alimentacion del pic hace que la EEPROM se borre. vuelvo y digo que no estoy seguro pero es lo unico que se me ocurre.
seguire en pruebas para hallar la verdadera razon y si es posible para encontrar la solucion.

de cualquier manera seria bno que alguno de ustedes tambn pueda hallar la solucion.

exitos con este dilema

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:Ayuda con EEPROM interna 16F628A
« Respuesta #11 en: 20 de Mayo de 2021, 15:10:11 »
Se que es muy viejo el tema, pero va exacto a lo que me sucede, y no veo que se llegara a una posible solucion, por lo que me gustaria saber sus sugerencias y opiniones.

El problema esta mas que descrito, yo tengo grabando unos valores en la eeprom interna, y manejo motores de CA, 1/2 HP, pequeños, pero de ves en cuando, la posicion 0 (cero), se borra el valor colocado y lo manda a 0 (cero)

Es completamente aleatorio, y no necesariamente cuando encienden o apagan las bombas, sucede a veces.

Se usan relevadores para las bombas

Saludos ojala alguien pueda sugerir alguna pista
Nunca se deja de aprender

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:Ayuda con EEPROM interna 16F628A
« Respuesta #12 en: 20 de Mayo de 2021, 18:18:44 »
Parecen ser problemas de ruido.
Recomiendo evitar que la masa del circuito, sea el mismo para la parte de gran consumo. También, ponerle una jaula de faraday al pic o todo el circuito; para evitar interferencias.

Una vez me pasó, que los concensadores de desacoplo del cristal; me generaba comportamientos erráticos en el PIC. Me di cuenta cuando se los saqué (porque ya ni sabía que verificar y era una de las cosas que no había comprobado aún) y se solucionó.

Para evitar inconvenientes, de reseteo del PIC, es útil usar banderas (flag) en partes estratégicas del programa; para ir guardando el avance del microprocesador; y guardarlo en la EEPROM. Incluso en tres posiciones y hacer una comparación para garantizar que la info guardada sea la correcta.

Al iniciar, se debería comprobar una bandera si el pic ya estuvo en funcionamiento. En caso afirmativo, revisar las posiciones de la EEPROM y, según el dato, continuar por donde se había quedado.
En caso de que es la primera vez que se enciende el pic, que su encendido sea desde el principio.

Por supuesto que esta estrategia dependerá del tipo de trabajo que haga el pic. Seguramente habrá situaciones donde implementarlo sea costoso (en memoria) y lo haga imposible de aplicarlo, o no se justifique hacerlo por el trabajo que debe hacer.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Ayuda con EEPROM interna 16F628A
« Respuesta #13 en: 20 de Mayo de 2021, 18:44:02 »
Yo cuando tengo problema de pérdida de datos en eeprom lo que hago es paginar en redundancia tipo RAI1, pero uso triple redundancia.

 Si lo permite la cantidad de eeprom disponible y las necesidades de la misma.