Autor Tema: Memoria EEprom con PIC16F876A  (Leído 3884 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Memoria EEprom con PIC16F876A
« en: 04 de Diciembre de 2008, 23:24:24 »
Hola amigos,

Nuevamente solicitando la ayuda del foro....
Sucede que después de lograr hacer interface entre un PIC16F76 y un LCD de 4x20 emigré a un PIC16F876A. La emigración salió bién dado que pude desplegar los datos en el diplay LCD tal y cual los tenía con el PIC16F76. Se trata de un convertidor de ADC que monitorea un voltaje de entrada con un límite de hasta 30VDC, hasta aquí todo bien.

Me dispuse a grabar los datos leidos en la EEPROM interna del PIC por eso es que cambié al 876A para no usar una externa con el 76. Despúes de revisar y estudiar el datashhet del 876A, utilicé las rutinas de ahi y con algunos cambios también pero algo no funciona, o no escribe en la EEPROM o no la lee. Las subrutinas que estoy usando para escribir y leer en la EEPROM son:

;*****************************************************************************************
;SUBRUTINA PARA ESCRIBIR EN EEPROM
;*****************************************************************************************
wrEEP:
      banksel   EECON1
wrchk0   btfsc   EECON1,WR      ;Wait for write
      goto    wrchk0         ;to complete
      banksel   PORTA
      movf   wrADR,W         ;Data Memory
      banksel   EEADR
      movwf   EEADR         ;Address to write
      banksel   PORTA
      movf   wrDAT,W         ;Data Memory Value
      banksel   EEDATA
      movwf   EEDATA         ;to write
      banksel   EECON1
      bcf      EECON1,EEPGD   ;Point to DATA memory
      bsf      EECON1,WREN      ;Enable writes
      movlw   0x55         ;
      movwf   EECON2         ;Write 55h
      movlw   0xAA         ;
      movwf   EECON2         ;Write AAh
      bsf      EECON1,WR      ;Set WR bit to begin write
      banksel   PIR2
wrchk1   btfss   PIR2,EEIF      ;Wait for write
      goto    wrchk1         ;to complete
      bcf      PIR2,EEIF      ;
      bcf      EECON1,WREN      ;Disable writes
      return

;*****************************************************************************************
;SUBRUTINA PARA ESCRIBIR EN EEPROM
;*****************************************************************************************
rdEEP:
   banksel   EEADR
   movf   rdADR,W         ;Data Memory
   movwf   EEADR         ;Address to read
   banksel   EECON1
   bcf      EECON1,EEPGD   ;Point to Data memory
   bsf      EECON1,RD      ;EE Read
   banksel   EEDATA
   movf   EEDATA,W       ;W = EEDATA
   return

Lo que he notado es que cuando quiero leer la EEPROM, no me salen los datos en la LCD, pienso que es porque no se han grabado.

Tengo dos dudas:

Una es el direccionamiento de la dirección y los datos de la EEPROM. Puse

wrADR   equ 0x21   ;Direccion de la EEPROM para escribir
wrDAT   equ 0x22   ;Dato a escribir en la EEPROM
rdADR   equ 0x23   ;Direccion de la EEPROM para leer
rdDAT   equ 0x24   ;Dato a leer de la EEPROM

pero no tuve exito

La otra es el direccionamiento del Data EEPROM que es en 0x2100 y creo que algo he de hacer, pniendo un

ORG 0x2100

pero no se como ni en donde y de que manera me afecta esto.

De cualquier manera espero me puedan ayudar con este tema....

Saludos


Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Memoria EEprom con PIC16F876A
« Respuesta #1 en: 04 de Diciembre de 2008, 23:27:21 »
Ah por cierto, ya estuve revisando con el buscardor del foro pero no encontré algo que me ayudara.... Bueno algo para intentar diferentes formas de escribir y leer pero sin exito.....

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Memoria EEprom con PIC16F876A
« Respuesta #2 en: 04 de Diciembre de 2008, 23:34:39 »
Deja busco unos ejemplitos que hice hace un tiempote y espero te sirvan.

Por cierto lo que dices de la memoria del org . Recuerdo que no es necesario , sino que se maneja desde 00,01,etc..

Org 2100

SEria si quiesieras grabar datos en la eeprom directamente con el compilador.

Creo es asi , tiene tiempo que no toco assembly.

EN un rato más subo si encunetro los programitas.Sino los hacemos nuevamente  xD

Un Saludo

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Memoria EEprom con PIC16F876A
« Respuesta #3 en: 04 de Diciembre de 2008, 23:51:53 »
Aqui te dejo este pequeño código,por cierto nada elaborado.

Esto lo he simulado con el MPlab SIm.

Lo que hace es escribir en X posicion de memoria de la eeprom en este caso puse la 01 y despúes la lee.

EL pic que utilicé gue un pic16f628A

Código: ASM
  1. #DEFINE BANK0 BCF STATUS,5
  2. #DEFINE BANK1 BSF STATUS,5
  3.  
  4. ;------ CONFIGURACION  -----------------
  5.  
  6. main
  7.                 BANK0
  8.  
  9.                 CLRF    PORTB
  10.                 MOVLW   0X07
  11.                 MOVWF   CMCON  ;comparadores apagados
  12.  
  13.                 BANK1
  14.  
  15.                 CLRF    TRISB
  16.                 CLRF    TRISA
  17.                 BSF             TRISA,5
  18.                
  19.                 BANK0
  20. ;---------------------------------------
  21.  
  22.  
  23.                 BTFSC   PORTA,5  ;Puedes omitir esto, es solo para usarlo con el simulador al presionar MCLR
  24.                 GOTO    $-1
  25.                 BTFSS   PORTA,5
  26.                 GOTO    $-1
  27. ;----------------------------------------
  28.  
  29.  
  30.  
  31.  
  32. ;-----------------------------------------
  33.                 CLRF    INTCON                  ;NO INTERRUOCIONES
  34.  
  35.                 BANK1
  36.                 MOVLW   0X01                    ;--DIRECCION DEL DATO-- Yo le di 01,puedes ocupar en tu rutina el FSR si lo haces de
  37.                 MOVWF   EEADR                              ;forma incrementar , etc...
  38.                 MOVLW   0XF0                    ;--DATO--  Yo cargue el dato 0xF0 , puedes cambiarle por cualquier registro
  39.                 MOVWF   EEDATA
  40.  
  41. ;---------Secuencia  Para grabar la EEPROM ----------------------
  42.  
  43.                 BSF             EECON1,WREN             ;HABILITA LA ESCRITURA
  44.  
  45.                 MOVLW   0X55           
  46.                 MOVWF   EECON2                  ;SE INSERTA CODIGO DE
  47.                 MOVLW   0XAA                    ;DE HABILITACION
  48.                 MOVWF   EECON2
  49.  
  50.                 BSF             EECON1,WR               ;SE INICIA ESCRITURA
  51.                
  52.                 NOP
  53.                 BTFSC   EECON1,WR                    ; Esperas a que termine la escritura en caso de no usar interrupciones como este ejemplo
  54.                 GOTO    $-2    
  55.  
  56. ;--------------------------------------------
  57.  
  58.                
  59.                 BCF             PIR1,EEIF
  60.                 BCF             EECON1,WREN             ;DESHABILITA ESCRITURA
  61.                
  62. ;--------------- Lectura de la EEPROM  --------------
  63.  
  64.                 BANK1
  65.  
  66.                 MOVLW   0X01           
  67.                 MOVWF   EEADR                   ; SE DIRECCIONA EN LA POSICION 0X01
  68.                 BSF             EECON1,RD               ;       INICIA LECTURA
  69.                 MOVF    EEDATA,W                ;CARGA LOS DATOS LEIDOS EN " W "
  70.                
  71.                 BANK0
  72.  
  73.                 MOVWF   PORTB
  74.                 GOTO    $-1
  75.  
  76.                 END                       ; directive 'end of program'

NO veo nada con esos colores , lo siento no se que paso  xD

Se ve horrrible e ilegible.

Cuelgo el asm para que lo bajes.

En el ASM Hago lectura de otro registro , pero puedes tomar en cuneta lo que te escribi aca arriba.

Un Saludo
« Última modificación: 04 de Diciembre de 2008, 23:57:22 por AKENAFAB »

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Memoria EEprom con PIC16F876A
« Respuesta #4 en: 04 de Diciembre de 2008, 23:58:57 »
OK, ok.... esperaré cualquier ayuda....

La verdad no sé esto haya sido ético, profesional o no sé qué..... pero mis proyectos acostumbro realizarlos por pasos.....
Inicio como una interface con LCD 4x20, luego trabajando con el conversor ADC del 16F76 y ahora con esto de la EEPROM.

Me descubriré de una vez con la prmesa de compartir el proyecto una vez que jale......

Estoy haciendo un probador de baterias para equipos UPS/SAI.... no sé si estén al tanto de los términos....

Los equpos de energía de respaldo utilizan bancos de baterías para proporcionar energía en los casos de ausencia de enrgía eléctrica comercial, es cuando los bancos de baterías entran en acción....

las rutinas de mantenimiento preventivo requieren la revisón de estas baterias, por lo que como generalmente son en número mas de 20 dependiendo de la marca del equipo: 20, 36, 40.... etc es bastante tedfioso estar leyendo y anotando los valores en descarga de cada baterias....

personalmente me han tocado clientes conbancos de hasta 240 bateriasy bueeeeeno..... ya sabran.....

entonces me di a la tarea de idear un sistemita para ller estos valores y guardrlos en memoria y psoteriormente mandarlos por una RS232..... que implementare mas adelante....

por ahora tengo problemillas con la EEPROM y espero que la RS232 no se me dificulte....
e eso si he visto bastante información

Saludos

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Memoria EEprom con PIC16F876A
« Respuesta #5 en: 05 de Diciembre de 2008, 00:01:13 »
De acuerdo amigo.... uchas gracias..... lo prbaré y les comento los resultados....

Gracias nuevamente.....

Saludos

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Memoria EEprom con PIC16F876A
« Respuesta #6 en: 05 de Diciembre de 2008, 00:06:48 »
Oye amigo AKENAFAB,

Pero no tengo que declarar nada en los EQU u ORG o algo ademas del código????? porque a mi me parecía que mas bien era por ahi..... entiendo lo que comentabas de que en el ORG 0x2100 si quería guardar directamente pero no es el caso.

Puedo comenzar a guardar datos desde 0x00 y lerlos desde esa misma dirección??? porque lestoy dando a la wrADR el valor 0x00 en donde quiero que grabe el primer valor y de ahi en adelante y para leer lo mismo desde la direccion 0x00


Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Memoria EEprom con PIC16F876A
« Respuesta #7 en: 05 de Diciembre de 2008, 00:27:46 »
Oye amigo AKENAFAB,

Pero no tengo que declarar nada en los EQU u ORG o algo ademas del código????? porque a mi me parecía que mas bien era por ahi..... entiendo lo que comentabas de que en el ORG 0x2100 si quería guardar directamente pero no es el caso.

Puedo comenzar a guardar datos desde 0x00 y lerlos desde esa misma dirección??? porque lestoy dando a la wrADR el valor 0x00 en donde quiero que grabe el primer valor y de ahi en adelante y para leer lo mismo desde la direccion 0x00



Exactamente

Inicias desde la 0x00 para grabar y si quieres leer asignas esa misma direccion.
Esto lo puedes ver en el MPlab SIm , en la EEPROM register se ve como graba el dao y esas cosas.

Un saludo y espero te sirva


NO es necesario el org2100.

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Memoria EEprom con PIC16F876A
« Respuesta #8 en: 10 de Diciembre de 2008, 02:56:28 »
Hola amigos,

Una disculpa por contestar hasta ahora, sucede que tuve que salir varios dias de viaje de trabajo.....

Pude reslizar unas prubas con el ejemplo del amigo AKENAFAB y con algunos otros cambios pero nada. He decidido adjuntar mi archivo esperando le puedan dar un vistazo y hecharme una manita.....

Reitero que esta es una continuación de otro hilo en el que pretendía en primer lugar hacer interface con un LCD y posteriormente hacerlo trabajar con el ADC del 16F76:

http://www.todopic.com.ar/foros/index.php?topic=23550.0

y sirva esto como un antecedente de lo que pretendo realizar.

Saludos y gracias nuevamente

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Memoria EEprom con PIC16F876A
« Respuesta #9 en: 18 de Diciembre de 2008, 03:58:15 »
Bueno amigos, con la novedad que ya puedo leer y escribir en la memoria EEPROM interna del PIC16F876A. El código estaba mal y no quiero pecar en ningún aspecto pero al parecer el código que aparece en el datasheet no está del todo bién ejemplificado o tal vez dependa de la aplicación y cómo cada quien estructure su código. Con estas secuencias me funcionó perfectamente:

;*****************************************************************************************
;SUBRUTINA PARA ESCRIBIR EN EEPROM
;*****************************************************************************************
wrEEP:
      movf   wrDAT,0         ;Data Memory Value

      banksel   EEADR
      movwf   EEDATA         ;Data to write

      banksel   ADCON0

      movf   wrADR,0         ;Address Memory

      banksel   EEADR
      movwf   EEADR         ;Address to write

      banksel   EECON1
      bcf      EECON1,EEPGD   ;Point to DATA memory
      bsf      EECON1,WREN      ;Enable writes
      movlw   0x55         ;
      movwf   EECON2         ;Write 55h
      movlw   0xAA         ;
      movwf   EECON2         ;Write AAh
      bsf      EECON1,WR      ;Set WR bit to begin write
      bcf      EECON1,WREN      ;Disable writes
Waitwr   btfsc   EECON1,WR
      goto   Waitwr
      banksel   ADCON0
      return

;*****************************************************************************************
;SUBRUTINA PARA ESCRIBIR EN EEPROM
;*****************************************************************************************
rdEEP:
   movf   rdADR,0         ;Data Memory
   banksel   EEADR
   movwf   EEADR         ;Address to read
   banksel   EECON1
   bsf      EECON1,RD      ;EE Read
   banksel   EEDATA
   movf   EEDATA,0       ;W = EEDATA
   banksel   ADCON0
   return

Ahora tengo un nuevo detalle para lo cual adjunto el archivo completo. Si hago varias lecturas (8 por ejemplo) me doy cuenta que los datos en las posiciones 3, 5 y 7 se repiten de las previas de cada una, es decir, la de la posición 3 es la misma de la 2 y así sucesivamente. No entiendo por qué pueda ser este efecto o qué fallo pueda tener en mi código, por eso recurro nuevamente a su ayuda.

Saludos

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: Memoria EEprom con PIC16F876A
« Respuesta #10 en: 18 de Diciembre de 2008, 14:40:09 »
Jajajaja.... :? :o :? :o

Cómo son las cosas a veces, me rio porque yo mismo me contesto..... resolví el problema revisando nuevamente mis secuencias a detalle y sucede que para las posiciones 3, 5 y 7 de memoria no mandaba a leer la eeprom, me faltaban esas lineas.... de cualquier forma pido una disculpa pero creo a todos nos puede pasar.....

Por otro lado algo que si no tengo idea de como hacer y quisiera me ayudaran es que como habia comentado anteriormente estoy leyendo el voltaje de una serie de baterias de 12vdc, las leo las guardo en la eeprom y las muestro en el display como en un listado, la pregunta es cómo borro esos datos si voy a iniciar la lectura de otra serie de baterias. Es decir, voy con un cliente que tiene 20 baterias en su equipo, realizo las lecturas y luego voy con otro cliente que tiene no se... por ejemplo 15 baterias, necesito borrar las lecturas anteriores, aunque tuviera igual 20 o más, se entiende que las nuevas lecturas se sobreescribirian a las previas pero preferiria poder borrar las lecturas que ya no necesito.

Reitero es un PIC16F876A con xtal de 8MHz

Saludos y gracias

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Memoria EEprom con PIC16F876A
« Respuesta #11 en: 19 de Diciembre de 2008, 00:03:59 »
puedes hacer una rutina para borrarlas.

Usando el FSR y el INDF.

de 0-FF

Lo que no recuerdo es si esto es valido para la EEPROM

Bueno igual pones un contador e inicias la secuencia de grabado digamos con FF o 00 cualquier dato que quieras hata la direccion que desees.


Si trabajas 20 lecturas pues de 0-19 ,etc..

Como un puntero.

Un Saludo!


 

anything