Autor Tema: Cómo puedo saber si grabé un dato correctamente en la memoria eeprom externa?  (Leído 2144 veces)

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

Desconectado maikel986

  • PIC10
  • *
  • Mensajes: 3
Hola a tod@s!

Mi problema es el siguiente:

Tengo un PIC16F88 y una memoria eeprom externa (25LC160B). La comunicación entre ambos CI´s la realizo mediante SPI,conectando las patillas correspondientes según indica el fabricante.

Lo que intento hacer es guardar datos de 8 bits en la eeprom externa. Para comprobar si se ha guardado el dato en la eeprom externa, hice otro código en el que se lee la posición 0x00 de la eeprom externa y el valor se guarda en la posición 0x00 de la memoria eeprom interna del PIC. Al hacer todo esto, leo la eeprom interna del PIC pero no hay ningún valor! Cúal es el problema? Ya no sé si el que está mal es el código para guardar el dato en la eeprom externa o está mal el código para leer la eeprom externa y guardar el valor en el pic.

El código de la rutina para guardar el dato en la eeprom externa es este:

Código: [Seleccionar]
LIST P=16F88
   RADIX HEX
   INCLUDE <P16F88.INC>

VALOR             EQU  0x26
DIRECCIONH   EQU   0x27
DIRECCIONL   EQU   0x28
DATO      EQU   0x29
RECIBIDO    EQU   0x30
AUX         EQU   0x31
CS         EQU   5


   ORG 0x00

INICIO

        movlw      0x25
        movwf      VALOR           

        clrf           DIRECCIONH
        clrf           DIRECCIONL   ; Ponemos a 0 la variable de dirección de la EEPROM.

; Configuramos puertas del PIC
   bcf      STATUS,RP0   ; Seleccionamos  banco 0.
   bcf      STATUS,RP1   
   clrf           PORTA      ; Inicializamos PORTA a 0.
   clrf           PORTB      ; Inicializamos PORTB a 0.
        bsf      STATUS,RP0   ; Seleccionamos  banco 1.
        movlw   0xCB      ; Configuramos RB2, RB4 y RB5 como salidas,
   movwf   TRISB      ; el resto como entradas.
        bcf      STATUS,RP0   ; Seleccionamos  banco 0.


; Rutina para gardar  valores en la EEPROM externa.
GUARDAR
   
   bcf      STATUS,RP0      ;  banco0
   bcf      STATUS,RP1
   clrf           PORTB         ; Inicializamos PORTB a 0.
   bsf      PORTB,CS      ; CS#=1
   clrf           SSPCON
   movlw   0x31
   movwf   SSPCON      ; configuramos el modo SPI
   
; Enviar instrucción WREN

   bcf      PORTB,CS
   movlw   0X06
   movwf   DATO
   call            ENVIO
   bsf      PORTB,CS
   
; Escribir registro EEPROM

   bcf            PORTB,CS
   movlw    0x01
   movwf   DATO
   call            ENVIO
   movlw   0x00
   movwf   DATO
   call           ENVIO
   bsf            PORTB,CS
   
; Esperamos 5ms

   call           ESPERAR
   
; Enviar instrucción WREN

   bcf      PORTB,CS
   movlw   0X06
   movwf   DATO
   call            ENVIO
   bsf      PORTB,CS

; Enviar secuencia de escritura (WRITE)

   bcf      PORTB,CS
   movlw   0x02
   movwf   DATO   
   call            ENVIO

; Envio de direccion de memoria para guardar DATO
   movf            DIRECCIONH,W
   movwf    DATO
   call            ENVIO
   movf            DIRECCIONL,W
   movwf    DATO
   call            ENVIO

; Envio del dato
   movf           VALOR,W
   movwf   DATO   
   call           ENVIO
   bsf      PORTB,CS      ; EL VALOR TENDRIA QUE ESTAR GUARDADO!

return


; Subrutinas de ENVIO e ESPERAR
ENVIO

   movf    DATO,W
   movwf   SSPBUF
Salto5
   bsf      STATUS,RP0
   btfss           SSPSTAT,BF
    goto    Salto5
   bcf      STATUS,RP0
   movf           SSPBUF,W
   movwf   RECIBIDO
   retlw   0

; 128us x 40 = 50 ms
ESPERAR
   
   movlw   0x28         ; 40 decimal
   movwf   AUX   
dec1
   decfsz   AUX,1
    goto   dec1
   retlw   0

END

El código para leer la eeprom externa y guardar el valor en el pic es este:

Código: [Seleccionar]
        LIST P=16F88
   RADIX HEX
   INCLUDE <P16F88.INC>


DIRECCIONH   EQU   0x27
DIRECCIONL   EQU   0x28
DATO      EQU   0x29
RECIBIDO           EQU   0x30
AUX         EQU   0x31
CS         EQU   5

   ORG 0x00

INICIO

        clrf           DIRECCIONH
        clrf           DIRECCIONL   ; Ponemos a 0 la variable de dirección de la EEPROM.

; Configuramos puertas del PIC
   bcf      STATUS,RP0   ; Seleccionamos  banco 0.
   bcf      STATUS,RP1   
   clrf           PORTA      ; Inicializamos PORTA a 0.
   clrf           PORTB      ; Inicializamos PORTB a 0.
        bsf      STATUS,RP0   ; Seleccionamos  banco 1.
        movlw   0xCB      ; Configuramos RB2, RB4 y RB5 como salidas,
   movwf   TRISB      ; el resto como entradas.
        bcf      STATUS,RP0   ; Seleccionamos  banco 0.

LEER

   bcf      STATUS,RP0      ; elegir banco0
   bcf      STATUS,RP1
   clrf           PORTB         ; Inicializamos PORTB a 0.
   bsf      PORTB,CS           ; CS#=1
   bcf      INTCON,7          ; deshabilitar flag interrupción general
   bcf            INTCON,6
   clrf           SSPCON
   movlw   0x31

   movwf   SSPCON         ; configuramos o modo SPI
   
; Enviar instrucción WREN

   bcf      PORTB,CS
   movlw   0X06
   movwf   DATO
   call            ENVIO
   bsf      PORTB,CS
   
; Escribir  registro da EEPROM

   bcf    PORTB,CS
   movlw    0x01
   movwf   DATO
   call            ENVIO
   movlw   0x00
   movwf   DATO
   call           ENVIO
   bsf            PORTB,CS
   
; Esperamos 5ms

   call         ESPERAR

; Enviar secuencia de lectura (READ)

   bcf      PORTB,CS
   movlw   0x03
   movwf   DATO   
   call            ENVIO

; Envio de direccion de memoria para leer DATO
   movf    DIRECCIONH,W
   movwf    DATO
   call           ENVIO
   movf     DIRECCIONL,W
   movwf   DATO
   call           ENVIO
   call      ENVIO
   bsf        PORTB,CS      ; valor de Tª recibido!

; Enviar valor para la eeprom interna.

   bsf      STATUS,RP0
   bsf      STATUS,RP1    ; Selección del banco 3
   btfsc           EECON1,WR    ; Wait for write
   goto   $-1                  ; to complete

   bcf      STATUS,RP1   
   bcf      STATUS,RP0   ; Selección del banco 0
   movf           DIRECCIONL,W ; Copiar dirección en W

   bsf      STATUS,RP1   ; Selección del banco 2
   movwf   EEADR

   bcf      STATUS,RP1   
   bcf      STATUS,RP0   ; Selección del banco 0
   movf           RECIBIDO,W

   bsf      STATUS,RP1   ; Selección del banco 2
   movwf   EEDATA

   bsf      STATUS,RP0   ; Selección del banco 3
   bcf             EECON1,EEPGD
   bsf             EECON1,WREN ; Enable writes

   bcf      INTCON,GIE   ; Deshabilitar INTs
   movlw    0x55
   movwf    EECON2           ; Write 55h
   movlw    0xAA                ;
   movwf    EECON2           ; Write AAh
   bsf            EECON1,WR
   bsf      INTCON,GIE   ; Habilitar INTs
   bcf            EECON1,WREN ; Disable writes
   
   goto    LEER

; Subrutinas de ENVIO e ESPERAR
ENVIO

   movf    DATO,W
   movwf   SSPBUF
Salto5
   bsf      STATUS,RP0
   btfss           SSPSTAT,BF
    goto    Salto5
   bcf      STATUS,RP0
   movf           SSPBUF,W
   movwf   RECIBIDO
   retlw   0

; 128us x 40 = 50 ms
ESPERAR
   
   movlw   0x28         ; 40 decimal
   movwf   AUX   
dec1
   decfsz   AUX,1
    goto   dec1
   retlw   0


   END

Alguién me puede ayudar? Sabeis donde está el error?
Hay otra manera más fácil de comprobar si se ha guardado el dato en la eeprom externa?

Un saludo y gracias anticipadas!

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Prueba por separado ambas rutinas, una vez que cada una funcione bien por separado unelas. Usa leds en los pines del pic que no uses y ahi muestra los datos leidos de la memoria, te sirve tanto para la interna como la externa, hazlo a razón de 2seg. por dato para que puedas leer bien el dato.

Javicho.

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Hay un return al final del comando enviar direcciones y datos que no fue llamado de ningun lado?.  Al final de este comando te falta poner la pausa de 5ms para que le de tiempo a grabar.
Si eso mírate unos post que puse "ejemplo utilizacion 25LC256"
http://www.todopic.com.ar/foros/index.php?topic=24218.0
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"