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.
en la eeprom 24c128 me quedaron almacenados los siguientes datos
*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.
* el siguiente es ese pedacito de la rutina que utilizo con sus subrutinas para lograr lo anterior. Muchas gracias por su tiempo !!

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
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