TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: leocaceres 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.
- Tienes que ingresar para ver archivos adjuntos - - Tienes que ingresar para ver archivos adjuntos -
en la eeprom 24c128 me quedaron almacenados los siguientes datos
- Tienes que ingresar para ver archivos adjuntos -
*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.
- Tienes que ingresar para ver archivos adjuntos -
* 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
-
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.
-
Hola ! gracias por la respuesta.. no se si entendi bien tu pregunta, pero en este tramo de programa envio el ACK
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)
- Tienes que ingresar para ver archivos adjuntos -
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.
-
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
-
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.