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.
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...
- Anónimoahora mismo
2 respuestas más de otros expertos
Respuesta de jlcava
1
1
jlcava, Más de 10 añosdesarrollando equipos electrónicos con...
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
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