Autor Tema: DUDA EN LECTURA DE EEPROM 24C128  (Leído 3310 veces)

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

Desconectado leocaceres

  • PIC10
  • *
  • Mensajes: 4
DUDA EN LECTURA DE EEPROM 24C128
« en: 22 de Agosto de 2018, 20:17:58 »
Buenos dias a todos !

Tengo duda en el modo que lee mi memoria externa el PIC16F873. Les explico lo que me pasa, espero ser claro a ver si me pueden ayudar.

*Los datos que tengo almacenados en mi memoria 24c128 no puedo lograr leerlos correctamente. Me lee los cuatro primeros bytes y después hace como un bucle repetitivo y vuelve a la posicion cero de memoria.
*La intención es leer los datos de la memoria y enviarlos por USART al exterior.
*La escritura la hace bien, en este caso leo datos ingresados de un GPS y los almaceno en la memoria como muestro en la figura.


* proteus.jpg
(85.21 kB, 560x504 - visto 880 veces)

* proteus.jpg
(85.21 kB, 560x504 - visto 880 veces)



en la eeprom 24c128 me quedaron almacenados los siguientes datos


* eeprom.jpg
(124.48 kB, 535x301 - visto 550 veces)


*Con la rutina que les muestro intento leer las primeras diez posiciones ($GPRMC,123 ) sacarlas por intermedio de la USART  de forma serial pero visualizo las primeras cuatro en forma repetitiva como se ve en el grafico.


* virtual tester.jpg
(8.27 kB, 499x99 - visto 524 veces)



* el siguiente es ese pedacito de la rutina que utilizo con sus subrutinas para lograr lo anterior.  Muchas gracias por su tiempo !! :)

Código: [Seleccionar]
salto3
         call inicializoI2C   ; configuro los registros de I2C 
         call inicializoUSART_TX
     

         clrf dir_eeprom
         clrf dir_eepromh
         clrf dato_serie
         clrf contador4
         clrf contador           
       

;COMIENZO LA LECTURA DE MEMORIA
BUCLELECTURA
         movlw 0x0a
         movwf contador
         call DEMORA
         call bitstartI2C
         movlw 0xa0
         movwf dato_serie
         call enviodatoI2C
         movf dir_eepromh,w
         movwf dato_serie
         call enviodatoI2C
         movf dir_eeprom,w
         movwf dato_serie
         call enviodatoI2C
         call bitrestartI2C
         movlw 0xa1
         movwf dato_serie
         call enviodatoI2C

         goto $+2       ; SALTA PARA QUE NO HAGA ACKNOWLEDGE LA PRIMERA VEZ
         call i2c_sendack
         call recibodatoI2C
         call transmisionUSART
         decfsz contador,f
         goto $-4       ; LECTURA DEL SIGUIENTE DATO CON ACKNOWLEDGE
         call i2c_sendnack
         call bitstopI2C
         call DEMORA     

          nop
          goto $-1

Código: [Seleccionar]
i2c_sendack

   bsf      STATUS,RP0      ;banco 1
   bcf       SSPCON2,ACKDT
   bsf       SSPCON2,ACKEN
   bcf      STATUS,RP0      ;banco 0
   return

i2c_sendnack

   bsf      STATUS,RP0      ;banco 1
   bsf       SSPCON2,ACKDT
   bsf       SSPCON2,ACKEN
   bcf      STATUS,RP0      ;banco 0
   return

enviodatoI2C
     call esperaI2C
   
     movf  dato_serie,w         ;mover DATO a W
     movwf SSPBUF         ;cargar dato en buffer I2C
     bsf   STATUS,RP0      ;banco 1
     btfsc SSPSTAT,R_W      ;esperar a que termine el envio
     goto  $-1

     btfsc SSPCON2,ACKSTAT    ;checkear ack
     goto  $-1   
 
     bcf  STATUS,RP0      ;banco 0
    ; btfss      PIR1,SSPIF      ;esperar finalizacion del noveno clock
    ; goto      $-1

     bcf      PIR1,SSPIF
     
     return

esperaI2C
     bsf STATUS,RP0  ; BANCO 1
next1
     movlw b'00011111'
     andwf SSPCON2,w
     btfss STATUS,Z
     goto next1
     movlw b'00000100'
     andwf SSPSTAT,w
     btfss STATUS,Z
     goto next1
     bcf STATUS,RP0  ; BANCO 0
     return

inicializoI2C
     bsf STATUS,RP0
     movlw 0x09
     movwf SSPADD  ;  SSPADD = (FXTAL/4/I2Cspeed)-1   
     movlw 0x80;80
     movwf SSPSTAT ; SLEW RATE CONTROL desabilitado
     bcf STATUS,RP0 ; BANCO 0
     movlw 0x28;28
     movwf SSPCON   ;SELECCIONA Y ABILITA I2C EN MODO MAESTRO   
   
     return

recibodatoI2C
    call   esperaI2C   
    bsf    STATUS,RP0      ;banco 1   
    bsf    SSPCON2,RCEN      ;activar modo lectura
    btfsc  SSPCON2,RCEN      ;termino la recepcion?
    goto  $-1         ;no, esperar

    btfss  SSPSTAT,BF      ;dato disponible en SSPBUF para ser leidos?
    goto  $-1         ;no, esperar

    bcf    STATUS,RP0      ;banco 0
    movf   SSPBUF,W
    movwf  dato_serie
    bcf      PIR1,SSPIF
    return

;ENVIO bitREstart****************************************
bitrestartI2C

          bsf      STATUS,RP0      ;banco 1
          bsf       SSPCON2,RSEN
          btfsc       SSPCON2,RSEN
          goto       $-1

          bcf      STATUS,RP0      ;banco 0   
          return

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

   ;   bitstop**************************
bitstopI2C
         bsf STATUS,RP0  ;BANCO 1
         bsf SSPCON2,PEN ;ENVIA BIT DE STOP
         bcf STATUS,RP0  ;BANCO 0
 
         btfss PIR1,SSPIF ;ESPERA QUE TERMINE
         goto $-1
         bcf PIR1,SSPIF ;LIMPIA LA BANDERA

        return

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;   bitstart**************************
bitstartI2C
         bsf STATUS,RP0  ;BANCO 1
         bsf SSPCON2,SEN ;ENVIA BIT DE START
         bcf STATUS,RP0  ;BANCO 0
 
         btfss PIR1,SSPIF ;ESPERA QUE TERMINE
         goto $-1
         bcf PIR1,SSPIF ;LIMPIA LA BANDERA
         return

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DUDA EN LECTURA DE EEPROM 24C128
« Respuesta #1 en: 02 de Septiembre de 2018, 11:16:37 »
Disculpa la demora, lo unico que no veo es donde estas enviando el ACK hacia la memoria cuando recibis datos. Pero otra cosa no parece estar mal.

Desconectado leocaceres

  • PIC10
  • *
  • Mensajes: 4
Re:DUDA EN LECTURA DE EEPROM 24C128
« Respuesta #2 en: 02 de Septiembre de 2018, 17:15:08 »
Hola ! gracias por la respuesta.. no se si entendi bien tu pregunta, pero en este tramo de programa envio el ACK
Código: [Seleccionar]
         call i2c_sendack   ;AQUI ENVIO EL ACKNOWLEDGE
         call recibodatoI2C
         call transmisionUSART
         decfsz contador,f
         goto $-4       ; LECTURA DEL SIGUIENTE DATO CON ACKNOWLEDGE

De todas maneras te comento lo que me ocurrió...

En el esquemático del Proteus cambie la memoria que tenia como veras en el gráfico de FM24C128F , por una un poquito mas grande  FM24C256F . A pesar de que ambas memorias se direccionan  con bancos de 64k, cuando lo simulé con la memoria de 256 anduvo perfectamente. En el gráfico te muestro como saco los datos a la velocidad en baudios que yo le programaba. (tiene una falla en el segundo dato pero ya me encargare de encontrar el problema)


* virtual tester2.jpg
(34.85 kB, 524x304 - visto 522 veces)


Si bien ahora anda, me deja con la duda el motivo de porque se comportaba como lo hacia con la memoria de 24c128.
Tengo mi sospechas que sea algo del simulador de Proteus, es por eso que ahora estoy haciendo el PCB real para probarlo con las dos memorias a ver como se comporta. Para mi deberia andar con la de 128 sin problemas.


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:DUDA EN LECTURA DE EEPROM 24C128
« Respuesta #3 en: 02 de Septiembre de 2018, 17:32:55 »
Que tal leocaceres,

Algo que me ha pasado a mí con el proteus es que las resistencias de pull-up que usas para el bus I2C las tienes que definir como digitales en lugar de analógicas. Y en otras ocasiones el modelo de simulación del proteus tenia problemas, así que no te confíes tanto en la simulación.

Elreypic

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DUDA EN LECTURA DE EEPROM 24C128
« Respuesta #4 en: 02 de Septiembre de 2018, 20:27:42 »
Hola ! gracias por la respuesta.. no se si entendi bien tu pregunta, pero en este tramo de programa envio el ACK

Si perdon, me perdi.. lo vi y luego me centre sobre las subrutinas de lectura, pero no veia nada raro, y me olvide por completo el ACK.

Y respecto a el tema del simulador, al menos yo aprendí a no tocarlo nunca mas, directamente procedi a desinstalarlo, ya que una ves que no lo tuve me di cuenta que estaba muy perdido, o cuando hay cosas que no podes simular.. Creas una dependencia con el simulador, y que como ves puede fallar.