Autor Tema: Codigo EEPROM no funciona  (Leído 2155 veces)

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

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Codigo EEPROM no funciona
« en: 25 de Agosto de 2011, 12:45:52 »
Este pequeño codigo deberia escribir el dato 0xff en la posicion 1 de la EEPROM para luego leer dicha posicon y llevar el dato al PORTB. en la simulacion de proteus tendrian que ponerse a 1 todas las salidas pero fallan dos de ellas.

Código: [Seleccionar]
; Memoria EEPROM
;
; ******************************************************
list p=16f886
include "p16f886.INC"
#define Fosc 4000000
; ******************************************************
; *******************************************************************************
__config _CONFIG1, _LVP_OFF&_PWRTE_OFF&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF
__config _CONFIG2, _WRT_OFF&_BOR40V
; *******************************************************************************
; *******************************************************************************
org 0x2100 ; primera posición de memoria de la EEPROM
de 0xff   ; la directiva "de" graba el valor 0xff en la primera
; posición de la EEPROM despues del ensamblado. La utili
; zamos para saber que la primera vez que se graba el
; dispositivo,se encuentra el valor 0xff en la primera
; posición de memoria.
; *******************************************************************************
; *******************************************************************************
org 0x00
goto inicio
org 0x05
; *******************************************************************************

; *******************************************************************************
; rutina para grabar un byte en la EEPROM de datos. La dirección está contenida
; en EEADR y el dato se encuentra en EEDAT
WRITE_EEPROM bsf STATUS,RP0
bsf STATUS,RP1 ;  banco 3
bcf EECON1,EEPGD ; Acceso a EEPROM.Bit EEPGD = 0
bsf EECON1,WREN ; Habilitación de escritura. Bit WREN = 1
bcf INTCON,GIE ; Deshabilitar interrupciones
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2     ; Secuencia de escritura dada por Microchip
bsf EECON1,WR    ; Inicio del ciclo de escritura
esperar btfsc EECON1,WR  ; Fin de escritura ?
goto esperar
bcf EECON1,WREN  ; escritura deshabilitada. Bit WREN = 0
bcf PIR2,EEIF    ; Flag de fin de escritura. Borrado por software
bcf STATUS,RP0
bcf STATUS,RP1 ; Banco 0
bsf INTCON,GIE
return  
; ********************************************************************************
; *******************************************************************************
; rutina para leer un byte en la EEPROM de datos. La dirección a leer está
; contenida en EEADR y el dato aparecerá en EEDAT
READ_EEPROM    bsf STATUS,RP0
bsf STATUS,RP1 ;  banco 3
bcf EECON1,EEPGD ; Acceso a EEPROM.Bit EEPGD = 0
bsf EECON1,RD ; Habilitación de lectura. Bit RD = 1
bcf STATUS,RP0
bcf STATUS,RP1 ; Banco 0
return  
; ********************************************************************************
; *******************************************************************************
; Programa principal.Se escribe el dato 0xff en la EEPROM y seguidamente se lee
; para mandarlo al puerto B
inicio   bcf STATUS,RP0
bcf STATUS,RP1 ; Banco 0
bsf STATUS,RP0
bsf STATUS,RP1 ; Banco 3
clrf ANSEL ; PORTA I/O digitales
clrf ANSELH ; PORTB I/O digitales
bcf STATUS,RP1 ; Banco 1
clrf TRISB
clrf TRISA
            bcf STATUS,RP0 ; Banco 0
clrf PORTA ; Init PORTA
clrf PORTB ; Init PORTB
bcf STATUS,RP0
bsf STATUS,RP1 ; Banco 2
principal movlw 0x01
movwf EEADR  ;Direccion 1 de la EEPROM
            movlw 0xFF ; Dato a escribir en la EEPROM
movwf EEDAT ; lo llevamos al registro EEDAT
call WRITE_EEPROM
call READ_EEPROM ; leemos el byte de la EEPROM
movf EEDAT,W
movwf PORTB
goto principal
end

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Codigo EEPROM no funciona
« Respuesta #1 en: 30 de Agosto de 2011, 18:54:50 »
No se si este sea el problema, pero deberias esperar que el bit "RD" se ponga a 0 (indica que finalizo la lectura).

Por otro lado cuidado con este codigo en un PIC real, ya que en un bucle infinito estas escribiendo todo el rato en la eeprom, y esta tiene una vida de escritura/borrado limitada, en el 16f84a eran 1millon de escrituras, en este no se. Por lo que en pocas horas de funcionamiento del pic ya habirias agotado esta celda de memoria.

Un saludo

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Codigo EEPROM no funciona
« Respuesta #2 en: 31 de Agosto de 2011, 12:09:57 »
No se si este sea el problema, pero deberias esperar que el bit "RD" se ponga a 0 (indica que finalizo la lectura).

Por otro lado cuidado con este codigo en un PIC real, ya que en un bucle infinito estas escribiendo todo el rato en la eeprom, y esta tiene una vida de escritura/borrado limitada, en el 16f84a eran 1millon de escrituras, en este no se. Por lo que en pocas horas de funcionamiento del pic ya habirias agotado esta celda de memoria.

Un saludo

Cierto, gracias por el consejo. no me habia dado cuenta del bucle infinito. Lo que intentaba hacer es probar que el codigo funcionaba correctamente. 

Una pregunta. Existe flag que indique la finalizacion de lectura?. Creo recordar que el manual no decia nada.

Desconectado om@r

  • PIC12
  • **
  • Mensajes: 86
Re: Codigo EEPROM no funciona
« Respuesta #3 en: 31 de Agosto de 2011, 18:59:16 »
Hola a Todos ,lo que veo en tu codigo es que tenes rutinas en diferentes bancos :shock:
fijate esto ,cuando terminas de programar los puertos te quedas en el banco2
luego cargas 01H al registro EEADR y FFH a EEDAT estos registros estan en el banco2  :shock:
luego llamas a la rutina de escritura que esta en el banco0  :shock: lo mismo que la rutina de lectura :shock:
creo que esto no se pueda hacer en la linea 16F :shock:
Tambien no veo como recuperas el dato leido? porque cuando salis de las rutinas de escritura y
lectura volves al banco0  :shock: y el registro EEDAT esta en el banco2  :shock:
Yo no programe este pic  :shock: pero mire un poco el datasheet y vi que al menos la rutina de lectura no funcionaria
bien :shock:
Saludos!
 

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Codigo EEPROM no funciona
« Respuesta #4 en: 01 de Septiembre de 2011, 09:08:17 »
Hola:

Gracias a todos por responder. Ya funciona!!!   :-/  :-/  :-/

Código: [Seleccionar]
; Memoria EEPROM
;
; ******************************************************
list p=16f886
include "p16f886.INC"
#define Fosc 4000000
; ******************************************************
; *******************************************************************************
__config _CONFIG1, _LVP_OFF&_PWRTE_OFF&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF
__config _CONFIG2, _WRT_OFF&_BOR40V
; *******************************************************************************
; *******************************************************************************
org 0x2100 ; primera posición de memoria de la EEPROM
de 0xff   ; la directiva "de" graba el valor 0xff en la primera
; posición de la EEPROM despues del ensamblado. La utili
; zamos para saber que la primera vez que se graba el
; dispositivo,se encuentra el valor 0xff en la primera
; posición de memoria.
; *******************************************************************************
cblock 0x20
Del_1  
Del_2  
endc
tiempo equ .250
; *******************************************************************************
org 0x00
goto inicio
org 0x05
; *******************************************************************************

; *******************************************************************************
; rutina para grabar un byte en la EEPROM de datos. La dirección está contenida
; en EEADR y el dato se encuentra en EEDAT
WRITE_EEPROM
bsf STATUS,RP0
bsf STATUS,RP1
bcf EECON1,EEPGD ; Acceso a EEPROM.Bit EEPGD = 0
bsf EECON1,WREN ; Habilitación de escritura. Bit WREN = 1
bcf INTCON,GIE ; Deshabilitar interrupciones
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2     ; Secuencia de escritura dada por Microchip
bsf EECON1,WR    ; Inicio del ciclo de escritura
esperar btfsc EECON1,WR  ; Fin de escritura ?
goto esperar
bcf EECON1,WREN  ; escritura deshabilitada. Bit WREN = 0
bcf PIR2,EEIF    ; Flag de fin de escritura. Borrado por software
bcf STATUS,RP0
bcf STATUS,RP1 ; Banco 0
bsf INTCON,GIE
return  
; ********************************************************************************
; *******************************************************************************
; rutina para leer un byte en la EEPROM de datos. La dirección a leer está
; contenida en EEADR y el dato aparecerá en EEDAT
READ_EEPROM        bsf STATUS,RP0
bsf STATUS,RP1 ;  banco 3
bcf EECON1,EEPGD ; Acceso a EEPROM.Bit EEPGD = 0
bsf EECON1,RD ; Habilitación de lectura. Bit RD = 1
movf EEDATA,W ; Movemos el dato a W
bcf STATUS,RP0
       bsf STATUS,RP1 ; Banco 2
return  
; ********************************************************************************


; *******************************************************************************
; rutina de Delay 1 mSeg       ; Tiempo total = (4*248)+7=0.999mS
DELAY1M                movlw .249       ; cargamos .249 en W (1us)
movwf Del_1 ; Movemos a Del_1 (1us)
Delay_1 nop   ; No operar (1us)
decfsz Del_1,1 ; Decrementa en 1 Del_1 (1us)
goto Delay_1 ; 2uS
return  
; ********************************************************************************


; *******************************************************************************
; Programa principal.Se escribe el dato 0x05 en la EEPROM y seguidamente se lee
; para mandarlo al puerto B
inicio          bcf STATUS,RP0
bcf STATUS,RP1 ; Banco 0
bsf STATUS,RP0
bsf STATUS,RP1 ; Banco 3
clrf ANSEL ; PORTA I/O digitales
clrf ANSELH ; PORTB I/O digitales
bcf STATUS,RP1 ; Banco 1
clrf TRISB
clrf TRISA
                        bcf STATUS,RP0 ; Banco 0
clrf PORTA ; Init PORTA
clrf PORTB ; Init PORTB
bcf STATUS,RP0
bsf STATUS,RP1 ; Banco 2
principal
banksel EEADR
movlw 0x01
movwf EEADR  ;Direccion 1 de la EEPROM
                        movlw 0xFF ; Dato a escribir en la EEPROM
movwf EEDAT ; lo llevamos al registro EEDAT
call WRITE_EEPROM
banksel EEADR
call READ_EEPROM ; leemos el byte de la EEPROM
movf EEDAT,W
movwf PORTB
movlw tiempo
movwf Del_2
loop        call DELAY1M
decfsz Del_2,1
goto loop
goto principal
end
« Última modificación: 01 de Septiembre de 2011, 09:12:06 por aitorsp »

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Codigo EEPROM no funciona
« Respuesta #5 en: 01 de Septiembre de 2011, 10:51:42 »
Me alegro que solucionaras el problema, sobre tu pregunta de si existe algun flag que indique la finalización de lectura es el que te comenté anteriormente, el "RD" (Read Control Bit) lo pones a "1" cuando quieres empezar la lectura y automaticamente se pone a "0" cuando esta ha finalizado. Ahi tienes el flag.

Un saludo.