Autor Tema: manejo de Eeprom 16f84a  (Leído 2847 veces)

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

Desconectado evolutionzxb

  • PIC10
  • *
  • Mensajes: 7
manejo de Eeprom 16f84a
« en: 26 de Octubre de 2005, 18:09:00 »
hola amigos tengo unas cuantas preguntas que hacer

1. como le hago para manejar la Eeprom del 16f84 (quiero checar si en la posicion 0X00) osea en el Byte 0 de la Eeprom hay un 0xFF

la Eeprom la llendo de la siguiente manera

org   2100

DE  0xFF,0xAA,0XAA,0xAA,0xAA,0xAA,0xAA,0xAA
DE  0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB

ahora en este ejemplo en el Byte 0 de la Eprom tengo FF y lo que quiero hacer es que cuando en la posicion del Byte 0 de la Eeprom haiga FF del Byte 16 al Byte 64 se llene de FF

ahora solo se hacerlo de la siguiente manera y es como estar haciendolo manual muchas veces por eso quiero que me ayuden con una rutina tipo while o de bucle en c para llenar la Eeprom

asi es como lo se hacer:

   MOVLW    0xFF            
   MOVWF   EEDATA          ;se carga EEDATA
   MOVLW   0x16              ;se carga la direcion
   MOVWF   EEADR            ;EEADR apunta a la dir 0x16
   CALL       Eeprom          ;rutina

   MOVLW    0xFF            
   MOVWF   EEDATA          ;EEDATA= 0xFF
   INCF   EEADR            ;incremento (16+1)
   CALL   Eeprom          ;rutina  

Eeprom  bsf     ESTADO,RP0      ; Guarda el bit en la eeprom
        bsf     EECON1,WREN
        movlw   0x55
        movwf   EECON2
        movlw   0xAA
        movwf   EECON2
        bsf     EECON1,WR
Wcomp   btfss   EECON1,EEIF     ; Espera a que finalize la operacion de
        goto    Wcomp           ; esritura
        bcf     EECON1,EEIF    
        bcf     EECON1,WREN
        bcf     ESTADO,RP0      ;Bank 0
        return

en este ejemplo solo lleno los campos 16 y 17 de le Eeprom los pongo a FF esa rutina seria demasiado larga si quiero llenar desde el 16 al 64 por eso les digo que como lo hago para meterla a un bucle n veces para que llene la Eeprom
?
???????????????


Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: manejo de Eeprom 16f84a
« Respuesta #1 en: 26 de Octubre de 2005, 22:35:00 »
Escrito originalmente por evolutionzxb
hola amigos tengo unas cuantas preguntas que hacer

1. como le hago para manejar la Eeprom del 16f84 (quiero checar si en la posicion 0X00) osea en el Byte 0 de la Eeprom hay un 0xFF

la Eeprom la llendo de la siguiente manera

org   2100

DE  0xFF,0xAA,0XAA,0xAA,0xAA,0xAA,0xAA,0xAA
DE  0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB

ahora en este ejemplo en el Byte 0 de la Eprom tengo FF y lo que quiero hacer es que cuando en la posicion del Byte 0 de la Eeprom haiga FF del Byte 16 al Byte 64 se llene de FF

ahora solo se hacerlo de la siguiente manera y es como estar haciendolo manual muchas veces por eso quiero que me ayuden con una rutina tipo while o de bucle en c para llenar la Eeprom

asi es como lo se hacer:

   MOVLW    0xFF            
   MOVWF   EEDATA          ;se carga EEDATA
   MOVLW   0x16              ;se carga la direcion
   MOVWF   EEADR            ;EEADR apunta a la dir 0x16
   CALL       Eeprom          ;rutina

   MOVLW    0xFF            
   MOVWF   EEDATA          ;EEDATA= 0xFF
   INCF   EEADR            ;incremento (16+1)
   CALL   Eeprom          ;rutina  

Eeprom  bsf     ESTADO,RP0      ; Guarda el bit en la eeprom
        bsf     EECON1,WREN
        movlw   0x55
        movwf   EECON2
        movlw   0xAA
        movwf   EECON2
        bsf     EECON1,WR
Wcomp   btfss   EECON1,EEIF     ; Espera a que finalize la operacion de
        goto    Wcomp           ; esritura
        bcf     EECON1,EEIF    
        bcf     EECON1,WREN
        bcf     ESTADO,RP0      ;Bank 0
        return

en este ejemplo solo lleno los campos 16 y 17 de le Eeprom los pongo a FF esa rutina seria demasiado larga si quiero llenar desde el 16 al 64 por eso les digo que como lo hago para meterla a un bucle n veces para que llene la Eeprom
?
???????????????




Un bucle en C tipo while o loop hara exactamente lo mismo, la cuestion es que a ti t falta codigo en esta rutina:

Codigo:

   MOVLW    0xFF            
   MOVWF   EEDATA          ;se carga EEDATA
   MOVLW   0x16              ;se carga la direcion
   MOVWF   EEADR            ;EEADR apunta a la dir 0x16
next_b   CALL       Eeprom          ;rutina
   incf   eeadr, f   ;incrementa la direccion
   movf   eeadr, w   ;verifica si la direccion llego a 64
   xorlw   .64
   btfss   status, z   ;EEADR = 64??
   goto   next_b      ;NO: Continua con el sig byte
   return         ;SI: Sale de la rutina





la parte en negrita es la parte q necesitas agregar a tu codigo, este bloque solo es necesario una vez por lo que tu programa lucira:

Codigo:

   MOVLW   0xFF            
   MOVWF   EEDATA          ;se carga EEDATA
   MOVLW   0x16              ;se carga la direcion
   MOVWF   EEADR            ;EEADR apunta a la dir 0x16
next_b   CALL   Eeprom          ;rutina
   incf   eeadr, f   ;incrementa la direccion
   movf   eeadr, w   ;verifica si la direccion llego a 64
   xorlw   .64
   btfss   status, z   ;EEADR = 64??
   goto   next_b      ;NO: Continua con el sig byte
   return         ;SI: Sale de la rutina

Eeprom  bsf     ESTADO,RP0      ; Guarda el bit en la eeprom
        bsf     EECON1,WREN
        movlw   0x55
        movwf   EECON2
        movlw   0xAA
        movwf   EECON2
        bsf     EECON1,WR
Wcomp   btfss   EECON1,EEIF     ; Espera a que finalize la operacion de
        goto    Wcomp           ; esritura
        bcf     EECON1,EEIF    
        bcf     EECON1,WREN
        bcf     ESTADO,RP0      ;Bank 0
        return


Desconectado evolutionzxb

  • PIC10
  • *
  • Mensajes: 7
RE: manejo de Eeprom 16f84a
« Respuesta #2 en: 27 de Octubre de 2005, 08:20:00 »
Excelent tu apoyo fenix_jn deveres que te lo agradesco

ahora tengo una duda mas ya que no se mucho de micros es que necesito comparar el primer Byte osea la direccion 0x00 de la EEprom

en caso de que sea 0xEE entonces ejecutar la rutina de llenar la eeprom de 0xFF pero si la direccion 0x00 tiene un valor diferente a 0xEE entonces ejecutar otra rutina que en vez de que llene la Eeprom de 0xFF la llene de 0x00

lo quiero hacer en asm ya que no maejo c para micros seria un estilo IF en C

IF (Direccion 0x00 = 0xEE)
Ejecutar rutina que llena Eeprom de 0xFF
ELSE
ejecutar rutina que llena la Eeprom de 0x00

espero explicarme y de antemano gracias por tu excelente aporte fenix_jn la verdad que personas como tu hacen estos foros lo que sun un gran y excelente foro THANKYOU

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: manejo de Eeprom 16f84a
« Respuesta #3 en: 27 de Octubre de 2005, 12:49:00 »
bueno lo q podemos hacer es cargar el registro eedata con el dato q necesitemos y ejecutar la rutina de esta forma:

1) Leemos el dato en la posicion 00h
2) Si el dato es =EEh entonces el nuevo dato es FFh sino 00h
3) Ejecutar rutina de escritura

Resumiendo iria asi:

Codigo:

comp_e   movf   eedata, w
   xorlw   0xeeh
   btfss   status, z
   goto   noigual
   movlw   0xff
   goto   ee_fill
noigual   movlw   0x00h
ee_fill   MOVWF   EEDATA ;se carga EEDATA
   MOVLW   0x16 ;se carga la direcion
   MOVWF   EEADR ;EEADR apunta a la dir 0x16
next_b   CALL   Eeprom ;rutina
   incf   eeadr, f ;incrementa la direccion
   movf   eeadr, w ;verifica si la direccion llego a 64
   xorlw   .64
   btfss   status, z ;EEADR = 64??
   goto   next_b ;NO: Continua con el sig byte
   return       ;SI: Sale de la rutina
Eeprom   bsf   ESTADO,RP0 ; Guarda el bit en la eeprom
   bsf   EECON1,WREN
   movlw   0x55
   movwf   EECON2
   movlw   0xAA
   movwf   EECON2
   bsf   EECON1,WR
Wcomp   btfss   EECON1,EEIF ; Espera a que finalize la operacion de
   goto   Wcomp ; esritura
   bcf   EECON1,EEIF
   bcf   EECON1,WREN
   bcf   ESTADO,RP0 ;Bank 0
   return



Esta rutina asume que ya has leido la memoria eeprom y el dato recien leido esta en eedata, lo q hace entonces es cargar el dato actual de eedata en w, luego escribe 0x00h en eedata, entonces se compara el registro W con 0xeeh, si el dato diferente entonces se sale de la rutina con el dato 0x00h listo en eedata, si es igual entonces se escribe 0xffh en eedata y sale de la rutina.

Uniendo