Comunicación entre pic y memoria

Me gustaría conseguir una rutina para poder comunicar una memoria EEPROM I2C como la 24LC16 con el PIC16F877, no comprendo muy bien la información que he conseguido hasta ahora.

3 respuestas

Respuesta
1
Ok, la rutina:
;**********************************************************************************************
; SUBRUTINA DE BIT START, MEMORIA E2
; (DATO EN BAJO MIENTRAS CLOCK EN ALTO)
;***************************************************************************
BSTART BSF PORTA,SDA
MOVLW B'00000000'
TRIS PORTA
BCF PORTA,SCL
GOTO $+1
GOTO $+1
GOTO $+1
BSF PORTA,SCL
GOTO $+1
GOTO $+1
BCF PORTA,SDA
GOTO $+1
GOTO $+1
BCF PORTA,SCL
GOTO $+1
GOTO $+1
RETLW 0
;****************************************************************************
; SUBRUTINA DE STOP
; (DATO EN ALTO MIENTRAS CLOCK EN ALTO)
;****************************************************************************
BSTOP BCF PORTA,SDA
MOVLW B'00000000'
TRIS PORTA
BCF PORTA,SDA
GOTO $+1
GOTO $+1
BSF PORTA,SCL
GOTO $+1
GOTO $+1
BSF PORTA,SDA
GOTO $+1
GOTO $+1
BCF PORTA,SCL
GOTO $+1
GOTO $+1
RETLW 0
;***************************************************************************
; BITOUT TOMA UN BIT DE DATO Y LO TRANSMITE
;***************************************************************************
BITOUT MOVLW B'00000000'
TRIS PORTA
BTFSS EEPROM,DO
GOTO BITLOW
BSF PORTA,SDA
GOTO CLKOUT
BITLOW BCF PORTA,SDA
CLKOUT BSF PORTA,SCL
GOTO $+1
GOTO $+1
GOTO $+1
BCF PORTA,SCL
RETLW 0
;**************************************************************************
; LA RUTINA BITIN LEE UN BIT QUE ENTREGA LA MEMORIA Y LO
; PONE EN UN REGISTRO
;**************************************************************************
BITIN BSF EEPROM,DI
MOVLW B'00000010'
TRIS PORTA
BSF PORTA,SCL
GOTO $+1
GOTO $+1
GOTO $+1
BTFSS PORTA,SDA
BCF EEPROM,DI
BCF PORTA,SCL
RETLW 0
;***************************************************************************
; SUBRUTINA DE TRANSMISION DE DATOS
; ESTA RUTINA TOMA UN BYTE GUARDADO EN DATAO Y LO TRANSMITE
; A LA MEMORIA EE.
; ENVIARA ADEMAS I BIT MAS DE CLOCK A LA MEMORIA PARA RECONOCIMIENTO
;***************************************************************************
TX MOVLW .8
MOVWF COUNT
TXLP BCF EEPROM,DO
BTFSC TXBUF,7 ; is bit out really low?
BSF EEPROM,DO ; no, set it high
CALL BITOUT
RLF TXBUF ; rotate txbuf left
DECFSZ COUNT,F ; 8 bits done?
GOTO TXLP ; no - go again
CALL BITIN ; read ack bit
RETLW 0
;***************************************************************************
;SUBRRUTINA ESCRIBIR
;***************************************************************************
ESCRIB BCF SLAVE,0
CALL BSTART
GOTO MASNO
Masno movf slave, w
MOVWF TXBUF
CALL TX
MOVF ADDR, W
MOVWF TXBUF
CALL TX
Movf datao, w
MOVWF TXBUF
CALL TX
CALL BSTOP
BCF PORTA,SDA
MOVLW .10
MOVWF PARAMEM
SAVE CALL DELAY2 ;10 MS MAS O MENOS
DECFSZ PARAMEM
GOTO SAVE
RETLW 0
;****************************************************************
; SUBRUTINA RECEPTORA DE DATOS
; ESTA RUTINA LEE UN BYTE DE LA EE Y LO COLOCA EN RXBUF
;****************************************************************
RX CLRF RXBUF ;SE AGREGA 23-5-2002
MOVLW .8 ; set # bits to 8
MOVWF COUNT
BCF STATUS, 0 ; make sure carry bit is low
RXLP RLF RXBUF ; rotate datai 1 bit left
CALL BITIN ; read a bit
BTFSC EEPROM,DI
BSF RXBUF,0 ; set bit 0 if necessary
DECFSZ COUNT ; 8 bits done?
GOTO RXLP ; no, do another
BSF EEPROM,DO
CALL BITOUT
RETLW 0
;***************************************************************************
;SUBRUTINA LEER 16K ;SE AGREGA 23-5-2002
LEER CALL BSTART
BCF SLAVE, 0
MOVF SLAVE, W
MOVWF TXBUF
CALL TX
MOVF ADDR, W
MOVWF TXBUF
CALL TX
CALL BSTART
BSF SLAVE,0
MOVF SLAVE,W
MOVWF TXBUF
CALL TX
CALL RX
BSF EEPROM,DO
CALL BITOUT
CALL BSTOP
BCF PORTA,SDA
BCF SLAVE,0
RETLW 0 ;RESULTADO DE LECTURA EN RXBUF
;***************************************************************************
;EQUUS DE EE
Di equ 7
Do equ 6
SCL EQU 0
Sda equ 1
;*************************
I no entiendes de memorias te puede resultar un tanto difícil interpretar todo esto. Suerte
Ok, muchas gracias, solo una pregunta... ¿cómo accedo a una dirección especifica de la memoria?.
Colocas en adres la dirección que te interesa leer y llamas a la rutina leer.
Para guardar pones el dato en DATAO y la dirección en adres. Luego llamas a ESCRIBE.
Eso es todo. Recuerda que slave debe tener 10100000 en su interior. Suerte
Respuesta
1
Tengo varias subrrutina para controlar memorias EEPROM, pero no se como enviártelas, de todas maneras puedes entrar en la página webb de Sagitron (que son los distribuidores de microchip en España) y las encontraras, si no es así puedes solictarselas directamente vía email
Respuesta
1
En la página de microchip (www.microchip.com) podrás encontrar una nota de aplicación que te explica todo el funcionamiento del i2c del PIC, claro que a lo mejor no lo encontraras ajustado al PIC que deseas pero como una forma general todos los demás funcionan igual y lo único que tendrás que hacer es ajustarlo al pic conque estarás trabando...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas