Autor Tema: Conectar una memoria 24LC512 con PIC 16F648  (Leído 2804 veces)

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

Desconectado gsc

  • PIC10
  • *
  • Mensajes: 10
Conectar una memoria 24LC512 con PIC 16F648
« en: 26 de Abril de 2009, 20:14:28 »
Hola a todos, tengo el siguiente problema, he armado un circuito que lee una memoria 24LC512 desde RB6 y RB7 de un PIC 16F648 y funcionó bien.
Luego arme otra placa mejor terminada (mas compacta) y no funciona la lectura.
Ya revisé todo el circuito, pero al usar un osciloscopio veo que el nivel de SDA es muy bajo (no le puse el pull-up como dice el fabricante). En el primer circuito los unos son de 0.7V y en el segundo estoy aprox. 0.5V o sea muy al limite, y el primero lo lee de casualidad.

Dicho esto, he probado un monton de valores de resisitencias para pull-up (porque aparentemente por lo que me he informado, este es el problema), pero al usarlas,  SDA se queda siempre en 1.

Quisiera saber si alguin tubo algun problema similar o me pueden decir donde me estoy equivocando.

Desde ya muchas gracias.
 

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Conectar una memoria 24LC512 con PIC 16F648
« Respuesta #1 en: 26 de Abril de 2009, 20:48:32 »
Bueno algo seguro que la conexión se hace de la siguiente manera:

Lleva si o si las resistencias, pero como lo conectas al puerto B del micro puedes habilitar las internas del mismo.
Después para ayudarte un poco mejor seria ideal que colocaras el código del programa, porque los hacer por software ya que este micro no trae el módulo MSSP para dicha comunicación.

No contesto mensajes privados, las consultas en el foro

Desconectado gsc

  • PIC10
  • *
  • Mensajes: 10
Re: Conectar una memoria 24LC512 con PIC 16F648
« Respuesta #2 en: 26 de Abril de 2009, 22:49:52 »
Gracias Suky por interesarte, bueno probe con las resistencias de 4K7 y otras que recomienda Microchip y ortas que probe y siempre pasa lo mismo, ahora fijandome bien lee solo los primeros 8 bytes con el valor C4 (ni idea porque).

EL codigo que uso y hasta ahora anda ok es este.

Lo raro es que si no le pongo la resistencia de pull-up en la primer placa anda ok, al instalarselo falla.

Realmene estoy desorientado.




                ;**********************************************************************************
   ; Rutina para leer secuencialmente x cantidad de datos
   ; de una memoria FLASH
   ;**********************************************************************************
   ;
   ;   CLOCK     Rb7   ---> SCL
   ;   data/addr Rb6   ---> SDA
   ;
   ;   dato a leer     ---> dato
   ;   address high    ---> addrh
   ;   address   low   ---> addrl
   ;
   ;**********************************************************************************
   ;Para leer un dato de una memoria FLASH 24C512 se debe tener
   ;en cuenta los soguientes pasos
   ;



read   bsf   status,5   ;bank 1
   movlw   b'00111111'   ;Seteo puerto A Rb6 -> SDA  Salida
   movwf   trisb      ;               Rb7 -> CLK  Salida
   bcf   status,5   ;bank 0

   ;-------------------------------
   ;Condicion de NOT BUSY - START

   bsf   ptob,7      ;Condicion NOT BUSY    (1)
   bsf   ptob,6      ;          (1)

   bcf   ptob,6      ;Condicion de START    (1->0)
   bcf   ptob,7      ;dato 1-0 mientras clk 1 (0)


   ;-------------------------------
   ;BYTE de CONTROL

   bsf   ptob,6      ;Control CODE 1010       (1)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;Control CODE 1010       (0)   
   call   pclock      ;Pulso de Clock

   bsf   ptob,6      ;Control CODE 1010       (1)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;Control CODE 1010       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;CONTROL BIT R/W (grabar)(0)   
   call   pclock      ;Pulso de Clock

   bsf   status,5   ;bank 1
   movlw   b'01111111'   ;Seteo Rb6 entrada
   movwf   trisb      ;
   bcf   status,5   ;bank 0

   call   pclock      ;Pulso de Clock

read12   movf   ptob,0      ;leo el puerto A y guardo lo leido en W
   andlw   b'01000000'   ;dejo pasar Rb6
   btfss   status,2   ;
   goto   read12      ;

   bsf   status,5   ;bank 1
   movlw   b'00111111'   ;Seteo Rb6 salida
   movwf   trisb      ;
   bcf   status,5   ;bank 0

   
   ;-------------------------------
   ;ENVIO de ADDRH

read1   movlw   8
   movwf   bitt
   
read11   rlf   addrh,1      ;rotar addrh izq por carry
   btfss   status,0   ;carry=1
   bcf   ptob,6      ;Axx            (0)   
   btfsc   status,0   ;carry=0
   bsf   ptob,6      ;Axx            (1)   

   call   pclock      ;Pulso de Clock
   
   decfsz   bitt,1
   goto   read11
   rlf   addrh,1      ;rotar addrh para dejarlo como estaba

   bsf   status,5   ;bank 1
   movlw   b'01111111'   ;Seteo Rb6 entrada
   movwf   trisb      
   bcf   status,5   ;bank 0

   call   pclock      ;Pulso de Clock

   movf   ptob,0      ;leo el puerto A y guardo lo leido en W
   andlw   b'01000000'   ;dejo pasar Rb6
   btfss   status,2
   goto   read1

   bsf   status,5   ;bank 1
   movlw   b'00111111'   ;Seteo Rb6 salida
   movwf   trisb      
   bcf   status,5   ;bank 0


   ;-------------------------------
   ;ENVIO de ADDRL

read2   movlw   8
   movwf   bitt
   
read22   rlf   addrl,1      ;rotar addrh izq por carry
   btfss   status,0   ;carry=1
   bcf   ptob,6      ;Ax            (0)   
   btfsc   status,0   ;carry=0
   bsf   ptob,6      ;Ax            (1)   

   call   pclock      ;Pulso de Clock
   
   decfsz   bitt,1
   goto   read22
   rlf   addrl,1      ;rotar addrl para dejarlo como estaba

   bsf   status,5   ;bank 1
   movlw   b'01111111'   ;Seteo Rb6 entrada
   movwf   trisb      
   bcf   status,5   ;bank 0

   call   pclock      ;Pulso de Clock para ACK

   movf   ptob,0      ;leo el puerto A y guardo lo leido en W
   andlw   b'01000000'   ;dejo pasar Rb6
   btfss   status,2
   goto   read2

   bsf   status,5   ;bank 1
   movlw   b'00111111'   ;Seteo Rb6 salida
   movwf   trisb      
   bcf   status,5   ;bank 0


   ;-------------------------------
   ;fin de posicion de address
   ;-------------------------------
   ;Condicion de NOT BUSY - START

   bsf   ptob,7      ;Condicion NOT BUSY    (1)
   bsf   ptob,6      ;          (1)

   bcf   ptob,6      ;Condicion de START    (1->0)
   bcf   ptob,7      ;dato 1-0 mientras clk 1 (0)


   ;-------------------------------
   ;BYTE de CONTROL

   bsf   ptob,6      ;Control CODE 1010       (1)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;Control CODE 1010       (0)   
   call   pclock      ;Pulso de Clock

   bsf   ptob,6      ;Control CODE 1010       (1)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;Control CODE 1010       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bcf   ptob,6      ;DEVICE SELECT 000       (0)   
   call   pclock      ;Pulso de Clock

   bsf   ptob,6      ;CONTROL BIT R/W (leer)  (1)   
   call   pclock      ;Pulso de Clock

   bsf   status,5   ;bank 1
   movlw   b'01111111'   ;Seteo Rb6 entrada
   movwf   trisb      
   bcf   status,5   ;bank 0

   call   pclock      ;Pulso de Clock para ACK

   movf   ptob,0      ;leo el puerto A y guardo lo leido en W
   andlw   b'01000000'   ;dejo pasar Rb6
   btfss   status,2
   goto   read

   bsf   status,5   ;bank 1
   movlw   b'00111111'   ;Seteo Rb6 salida
   movwf   trisb      
   bcf   status,5   ;bank 0


   return

   ;-------------------------------
   ;Recepcion de DATO


read3   bsf   status,5   ;bank 1
   movlw   b'01111111'   ;Seteo Rb6 entrada
   movwf   trisb      
   bcf   status,5   ;bank 0

   movlw   0
   movwf   dato

   ;---------------------------------------
   ;Captura del bit 7 de dato

   bsf   ptob,7      ;Pulso de CLOCK
   
   movf   ptob,0
   movwf   bitt

   btfss   bitt,6
   bcf   dato,7      ;si el dato recibido es 0 seteo el bit 7 en 0
   btfsc   bitt,6
   bsf   dato,7      ;si el dato recibido es 1 seteo el bit 7 en 1

   bcf   ptob,7      ;

   ;---------------------------------------
   ;Captura del bit 6 de dato

   bsf   ptob,7      ;Pulso de CLOCK

   movf   ptob,0
   movwf   bitt

    btfss   bitt,6      ;
   bcf   dato,6      ;si el dato recibido es 1 seteo el bit 6 en 1
   btfsc   bitt,6
   bsf   dato,6      ;si el dato recibido es 0 seteo el bit 6 en 0

   bcf   ptob,7      ;

   ;---------------------------------------
   ;Captura del bit 5 de dato

   bsf   ptob,7      ;Pulso de CLOCK

   movf   ptob,0
   movwf   bitt

   btfss   bitt,6      ;
   bcf   dato,5      ;si el dato recibido es 1 seteo el bit 5 en 1
   btfsc   bitt,6
   bsf   dato,5      ;si el dato recibido es 0 seteo el bit 5 en 0

   bcf   ptob,7      ;

   ;---------------------------------------
   ;Captura del bit 4 de dato

   bsf   ptob,7      ;Pulso de CLOCK

   movf   ptob,0
   movwf   bitt

   btfss   bitt,6      ;
   bcf   dato,4      ;si el dato recibido es 1 seteo el bit 4 en 1
   btfsc   bitt,6
   bsf   dato,4      ;si el dato recibido es 0 seteo el bit 4 en 0

   bcf   ptob,7      ;

   ;---------------------------------------
   ;Captura del bit 3 de dato

   bsf   ptob,7      ;Pulso de CLOCK

   movf   ptob,0
   movwf   bitt

   btfss   bitt,6      ;
   bcf   dato,3      ;si el dato recibido es 1 seteo el bit 3 en 1
   btfsc   bitt,6
   bsf   dato,3      ;si el dato recibido es 0 seteo el bit 3 en 0

   bcf   ptob,7      ;

   ;---------------------------------------
   ;Captura del bit 2 de dato

   bsf   ptob,7      ;Pulso de CLOCK

   movf   ptob,0
   movwf   bitt

   btfss   bitt,6      ;
   bcf   dato,2      ;si el dato recibido es 1 seteo el bit 2 en 1
   btfsc   bitt,6
   bsf   dato,2      ;si el dato recibido es 0 seteo el bit 2 en 0

   bcf   ptob,7      ;

   ;---------------------------------------
   ;Captura del bit 1 de dato

   bsf   ptob,7      ;Pulso de CLOCK

   movf   ptob,0
   movwf   bitt

   btfss   bitt,6      ;
   bcf   dato,1      ;si el dato recibido es 1 seteo el bit 1 en 1
   btfsc   bitt,6
   bsf   dato,1      ;si el dato recibido es 0 seteo el bit 1 en 0

   bcf   ptob,7      ;

   ;---------------------------------------
   ;Captura del bit 0 de dato

   bsf   ptob,7      ;Pulso de CLOCK

   movf   ptob,0
   movwf   bitt

   btfss   bitt,6      ;
   bcf   dato,0      ;si el dato recibido es 1 seteo el bit 1 en 1
   btfsc   bitt,6
   bsf   dato,0      ;si el dato recibido es 0 seteo el bit 1 en 0

   bcf   ptob,7      ;

   ;----------------------------------------

   bsf   status,5   ;bank 1
   movlw   b'00111111'   ;Seteo Rb6 salida
   movwf   trisb      
   bcf   status,5   ;bank 0
   

   return




   ;----------------------------------------
rdstop   ;Condicion de STOP para fin de lectura


   bcf   ptob,6      ;DATO en Low
   bsf   ptob,7      ;Condicion de STOP
   bsf   ptob,6      ;dato 0-1 mientras clk 1

   bcf   ptob,7      ;clock 0



   return


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Conectar una memoria 24LC512 con PIC 16F648
« Respuesta #3 en: 27 de Abril de 2009, 00:24:24 »
Estuve mirando el código y me parece complicado encontrarle algun error. Pero pasate por aquí, hay 2 rutinas para la comunicación i2c por software.
No contesto mensajes privados, las consultas en el foro

Desconectado gsc

  • PIC10
  • *
  • Mensajes: 10
Re: Conectar una memoria 24LC512 con PIC 16F648
« Respuesta #4 en: 27 de Abril de 2009, 22:08:32 »
Gracias Suky, voy a ver si encuentro algo.

Gracias