Autor Tema: comunicacion i2c con eeprom 24LC018  (Leído 1763 veces)

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

Desconectado Trino

  • PIC10
  • *
  • Mensajes: 45
comunicacion i2c con eeprom 24LC018
« en: 21 de Marzo de 2007, 13:52:50 »
Hola a todos, estoy intentanco comunicar por I2C el pic 18f45j10 con una memoria eeprom externa (24LC018). Estoy realizando un programa muy simple en el que mediante dos interruptores decido si escribir un byte o leerlo y lo muestro por el puerto B. Ya tengo el programa hecho pero no se si lo que falla es o la lectura o la escritura, aqui os paso el programa:


         LIST P=PIC18F45J10
       include   <p18F45J10.inc>

config DEBUG   = OFF
config XINST   = OFF
config STVREN  = ON          ; Stack Overflow/Underflow Reset = encendido       
config WDTEN   = OFF         ; Watchdog apagado
config CP0     = OFF         ; Code protection deshabilitados       
config FCMEN   = OFF         ; fail safe clock monitor
config IESO    = OFF
config FOSC2   = ON
config FOSC    = HS          ; Osc section bits
config WDTPS   = 1
config CCP2MX  = DEFAULT


VARIA      EQU   0x01
DATO_EEP      EQU 0x02
ESCRIB_BYTE      EQU 0x03

         org      0000H
         goto    INICIO
         ORG    0100H

      
INICIO
         MOVLW   B'00000000'
         MOVWF   OSCCON ,0
         MOVLW   B'00000000'
         MOVWF   OSCTUNE ,0

         movlw    b'01000111'   ;configuracion del TMR0 Preescaler 1:256
         movwf   T0CON,0

                  
         MOVLW   B'00000011'      ;CONFIG COMO I2C_RD0,RD1
         MOVWF   TRISD,0
         CLRF   TRISB,0
         MOVLW   B'00000011'
         MOVWF   TRISA,0
         MOVLW   0X0F
         MOVWF   ADCON1

                                                MOVLW   B'00101000'      
         MOVWF   SSP2CON1,0    ;ACTIVAR MODO I2C

         MOVLW   B'10000000'      ;DATOS SE MUESTRAN AL FINAL DEL PERIODO
         MOVWF   SSP2STAT,0         
         MOVLW   .9
         MOVWF   SSP2ADD,0       ;VELOCIDAD ESTANDAR 100KH

         
         CLRF   PORTB,0
         CLRF   PORTA,0
         CLRF   DATO_EEP,0         ;CONTADOR INICIA EN CERO
COMP
         BTFSC   PORTA,0,0
         GOTO   COMP

         BTFSC   PORTA,1,0
         GOTO   LEER
         GOTO   ESCRIBIR


LEER
                                   CALL   START      ;CONDICION DE INICIO
         
         MOVLW   B'10100000'   ;Direccion de la eeprom el bit 0 a 1 indica que voy a leer
         CALL   SEND      ;ENVIA DIRECCION
         MOVLW   B'00000001'           ;DIRECCION DE LA EEPROM DONDE VOY A LEER O ESCRIBIR
         CALL   SEND      ;ENVIO DIRECCION.
         CALL   STOP
         call   RSTART
         MOVLW   B'10100001'   ;Direccion de la eeprom el bit 0 a 1 indica que voy a leer
         CALL   SEND      ;ENVIA DIRECCION
         CALL   RECIBIR
         CALL   STOP
                                                MOVF   DATO_EEP,W,0
         MOVWF   LATB,0
         GOTO   COMP


ESCRIBIR

                                   CALL   START                   ;CONDICION DE INICIO
         MOVLW   B'10100000'   ;Direccion de la eeprom el bit 0 a 0 indica que voy a escribir
         CALL   SEND      ;ENVIA DIRECCION
         MOVLW   B'00000001'        ;DIRECCION DE LA EEPROM DONDE VOY A LEER O ESCRIBIR
         CALL   SEND      ;ENVIO DIRECCION.
         CALL   Retardo
         MOVLW   B'10101010'   ;VALOR DEL DATO QUE VOY A GUARDAR EN LA EEPROM
         CALL   SEND         ;ENVIO DATO A GUARDAR.
         CALL   Retardo
         CALL   STOP
         GOTO   COMP



;SUBRUTINA QUE GENERA LA CONDICION DE INICIO

START      BCF   PIR3,7,0         ;CLAREA BANDERA I2C      
      BSF   SSP2CON2,0,0      ;ENVIA BIT DE INICIO
START_W      BTFSS   PIR3,7,0         ;TERMINO LA CONDICION DE INICIO
      GOTO   START_W   
      RETURN



;SUBRUTINA PARA REPETIR LA CONDICION DE INICIO

RSTART      BCF   PIR3,7,0         ;CLAREA BANDERA I2C
      BSF   SSP2CON2,1,0      ;ENVIA BIT DE INICIO

RSTART_W   BTFSS   PIR3,7,0         ;TERMINO LA CONDICION DE INICIO
      GOTO   START_W   
      RETURN


;SUBRUTINA PARA ENVIAR LA DIRECCION O DATOS A LOS MICROCONTROLADORES ESCLAVOS

SEND      BCF   PIR3,7,0                   ;CLAREA BANDERA
      MOVWF   SSP2BUF,0      ;CARGA VALOR A ENVIAR POR EL BUS
      BCF   SSP2STAT,BF,0
SEND_W      BTFSS   PIR3,7,0      ;TERMINO EL ENVIO
      GOTO   SEND_W
      RETURN      


;SUBRUTINA PARA ENVIAR LA DIRECCION O DATOS A LOS MICROCONTROLADORES ESCLAVOS

RECIBIR      BCF   PIR3,7,0      ;CLAREA BANDERA
      BSF   SSP2CON2,RCEN,0   ;Iniciamos la lectura activando este bit
      CALL   Retardo
RECIB_W      
      BTFSS   PIR3,7,0      ;TERMINO EL ENVIO
      GOTO   RECIB_W
      BCF   PIR3,7,0      ;CLAREA BANDERA

      bcf   SSP2CON2,ACKDT,0   ; Cargamos 0 en ACKDT para sacarlo luego
      bsf   SSP2CON2,ACKEN,0   ; Iniciamos la secuencia con ACKEN=1
      CALL   Retardo

G_ACKEN
      btfsc   SSP2CON2,ACKEN,0
      goto   G_ACKEN
      movf   SSP2BUF,W,0
      MOVWF   DATO_EEP,0
      RETURN      



;SUBRUTINA QUE GENERA LA CONDICION DE PARADA

STOP      BCF   PIR3,7,0         ;CLAREA BANDERA I2C
      BSF   SSP2CON2,2,0      ;ENVIA CONDICION DE PARADA
      CLRF   PORTB,0
STOP_W      BTFSS   PIR3,7,0         ;TERMINO CONDICION DE PARADA
      GOTO   STOP_W   
      RETURN      


;SUBRUTINA DE RETARDO PARA ENVIAR EL SIGUIENTE DATO
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;**************************************************************************************************
; Retardo DE 32 ms
;**************************************************************************************************
Retardo

      BSF   T0CON,TMR0ON,0
      clrf   TMR0L,0         ; Ponemos a 0 el Timer0
      bcf   INTCON,TMR0IF,0


Explora      btfss   INTCON,TMR0IF,0      ; Comprobamos si el bit 7 de T0=1, salta=1
      goto   Explora         ; Es 0, salta a explora
      decfsz   VARIA,f,0         ; T0=1 por tanto decrementamos VARIA, salta=0
      goto   Retardo         ; VARIA nos es 0 por tanto salta a Retardo
      BCF    T0CON,TMR0ON,0
      return

;**************************************************************************************************
; RETARDO DE 1 s
;**************************************************************************************************
RETARDO1
      movlw   .32   ; Veces que se repite la rutina de 32ms
      movwf   VARIA,0   ; Cargamos un valor en la variable VARIA
      call   Retardo
      return   


                     END



;Muchas gracias por su tiempo


 

anything