Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

22/04/2009 #1


Cómo puedo saber si grabé un dato correctamente en la memoria eeprom externa?
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:
        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:
        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!
23/04/2009 #2


El concepto que hiciste apra saber si leiste el dato es correcto, el problema puede estar en el código pero Assembler es algo que personalmente detesto. Si lo hacés en C puede ser más facil.

De todas formas, la EE externa la podrías leer con el IC-proj y un programador JDM, también la podés escribir.

Eso puede que te ayude.

Salduos
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.