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:
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:
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!