• Lunes 23 de Diciembre de 2024, 17:00

Autor Tema:  Pic 16f84, Bus I2c  (Leído 4333 veces)

crbrs

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Pic 16f84, Bus I2c
« en: Jueves 29 de Diciembre de 2005, 01:10 »
0
Buenas.
He estado trabajando con un bus I2C entre el pic16f84 y una memoria 24LC16B de microchip, las rutinas que expongo a continuación las he cogido del foro en otra discusión, y mirandolas creían que estaban bien, pero no me funciona. A ver si le pueden echar un vistazo y decidme lo que opinan. Gracias.

Veo.. que nadie opina, weno, si tienen algunas rutinas sobre este tema, con memorias de este estilo, acepto ayuda. Muchas gracias.

Código: Text
  1.  
  2.   LIST P=PIC16C84, R=HEX
  3.   INCLUDE pic16f84.inc
  4.   LIST
  5.  
  6. ;pines
  7. #define SDA PORTB,4
  8. #define SDATRIS TRISB,4
  9. #define SCL PORTB,5
  10. #define SCLTRIS TRISB,5
  11.  
  12. ;variables en RAM
  13.   ORG    0C
  14.  
  15. CNT RES 1    ;CNT ... contador para la TX/RX de bytes!
  16. CNT1 RES 1    ;CNT1 ... contador
  17. cont2 RES 1    ;cont2 ... contador para la rutina de 5ms
  18. cont3 RES 1    ;cont3 ... contador para la rutina de 5ms
  19. ADDRESS RES 1    ;ADDRESS ... dirección donde se Lee/Escribe los datos
  20. DATO RES 1    ;DATO ... dato donde se lee/escribe
  21. I2CBUF RES 1    ;I2CBUF ...  buffer para enviar o recibir el dato
  22. I2CDI RES 1    ;I2CDI ... Dato de entrada (bit)
  23. I2CDO RES 1    ;I2CDO ... Dato de salida (bit)
  24. I2CACKF RES 1    ;I2CACKF ... Registro de ACK
  25. ;fin de variables en RAM
  26.  
  27.   ORG 0
  28.   GOTO INI
  29.  
  30. ;******************************************************************************
  31. ;  RUTINAS DE COMUNICACION SERIE (MODULO I2C)
  32. ;******************************************************************************
  33. ;
  34. ; GENERA START BIT
  35. ;
  36. START_I2C
  37.   BSF   STATUS,RP0; selecciona banco1
  38.   BCF  SDATRIS  ; SDA salida
  39.   BCF  SCLTRIS  ; SCL salida
  40.   BCF  STATUS,RP0; selecciono banco0
  41.   BSF    SDA
  42.   BCF    SCL    ; bajo clock
  43.   NOP        ;
  44.   BSF    SCL    ; subo clock
  45.   GOTO    $+1    ;
  46.   GOTO    $+1    ;
  47.   GOTO    $+1    ;
  48.   NOP        ;
  49.   BCF    SDA    ; bajo datos
  50.   GOTO    $+1    ;
  51.   GOTO    $+1    ;
  52.   GOTO    $+1    ;
  53.   NOP        ;
  54.   BCF    SCL    ; y bajo clock para generar start bit
  55.   GOTO    $+1    ;
  56.   GOTO    $+1    ;
  57.   RETURN      ;
  58. ;
  59. ; GENERA STOP BIT
  60. ;
  61. STOP_I2C
  62.   BSF   STATUS,RP0; selecciona banco1
  63.   BCF  SDATRIS  ; SDA salida
  64.   BCF  SCLTRIS  ; SCL salida
  65.   BCF  STATUS,RP0; selecciono banco0
  66.   BCF    SDA    ; bajo datos
  67.   GOTO    $+1    ;
  68.   GOTO    $+1    ;
  69.   BSF    SCL    ; subo clock
  70.   GOTO    $+1    ;
  71.   GOTO    $+1    ;
  72.   BSF    SDA    ; subo datos
  73.   GOTO    $+1    ;
  74.   GOTO    $+1    ;
  75.   BCF    SCL    ; bajo clock
  76.   GOTO    $+1    ;
  77.   GOTO    $+1    ;
  78.   RETURN      ; y retorno
  79. ;
  80. ; ENVIA UN BIT POR SDA
  81. ;
  82. BITOUT_I2C
  83.   BSF   STATUS,RP0; selecciona banco1
  84.   BCF  SDATRIS  ; SDA salida
  85.   BCF  SCLTRIS  ; SCL salida
  86.   BCF  STATUS,RP0; selecciono banco0
  87.   BTFSS    I2CDO,7  ; enviar un 1 ?
  88.   GOTO    I2CBLO  ; no, envio un 0...
  89.   BSF    SDA    ; pongo SDA en 1
  90.   GOTO    CLKOUT    ;
  91. I2CBLO
  92.   BCF    SDA    ; pongo SDA en 0
  93. CLKOUT
  94.   BSF    SCL    ; y clockeo
  95.   GOTO    $+1    ;
  96.   GOTO    $+1    ;
  97.   GOTO    $+1    ;
  98.   BCF    SCL    ;
  99.   RETURN      ; y salgo
  100. ;
  101. ; RECIBE UN BIT POR SDA
  102. ;
  103. BITIN_I2C
  104.   BSF    I2CDI,7  ; asumo que llega un 1
  105.   BSF   STATUS,RP0; selecciona banco1
  106.   BSF  SDATRIS  ; SDA entrada
  107.   BCF  SCLTRIS  ; SCL salida
  108.   BCF  STATUS,RP0; selecciono banco0
  109.   BSF    SCL    ; subo clock
  110.   GOTO    $+1    ;
  111.   GOTO    $+1    ;
  112.   GOTO    $+1    ;
  113.   BTFSS    SDA    ; recibio un 1 ?
  114.   BCF    I2CDI,7  ; no, es 0
  115.   BCF    SCL    ; bajo clock
  116.   RETURN      ; y salgo
  117. ;
  118. ; RUTINA DE TRANSMISION POR I2C
  119. ;
  120. I2C_TX
  121.   MOVLW    d'8'    ; son 8 bits a contar
  122.   MOVWF    CNT    ;
  123. I2C_TXLP
  124.   BCF    I2CDO,7  ; asumo que sale un 0
  125.   BTFSC    I2CBUF,7; sacar un 0 ?
  126.   BSF    I2CDO,7  ; no, sale un 1...
  127.   CALL    BITOUT_I2C; envio bit
  128.   RLF    I2CBUF,F; acomodo para sacar proximo bit
  129.   DECFSZ  CNT,F    ; salieron los 8 ?
  130.   GOTO    I2C_TXLP; no, continuo sacando...
  131.   CALL    BITIN_I2C; leo bit de acknowledge
  132.   BCF    I2CACKF,7  ; asumo que es 0
  133.   BTFSC    I2CDI,7  ; es 0 ?
  134.   BSF    I2CACKF,7  ; no, envio un 1
  135.   RETURN      ; y salgo
  136. ;
  137. ; RUTINA DE RECEPCION POR I2C
  138. ;
  139. I2C_RX
  140.   CLRF    I2CBUF  ; borro buffer
  141.   MOVLW    d'8'    ; son 8 bits a leer
  142.   MOVWF    CNT    ;
  143.   BCF    STATUS,C  ; borro flag de carry
  144. I2C_RXLP
  145.   RLF    I2CBUF,F; roto un bit a la izquierda
  146.   CALL    BITIN_I2C; y leo bit enviado
  147.   BTFSC    I2CDI,7  ; llego un 0 ?
  148.   BSF    I2CBUF,0; no, escribo un 1 en el buffer
  149.   DECFSZ  CNT,F    ; llegaron los 8 bits ?
  150.   GOTO    I2C_RXLP; no, sigo reciviendo...
  151.   BCF    I2CDO,7  ;
  152.   BTFSC    I2CACKF,7  ;
  153.   BSF    I2CDO,7  ;
  154.   CALL    BITOUT_I2C; envio bit de acknowledge
  155.   RETURN      ; y salgo
  156. ;
  157. ; LECTURA DE LA MEMORIA 24Cxx
  158. ;
  159. RD24CXX
  160.   CALL    START_I2C; envio condicion de start
  161.   MOVLW    0A0    ; traigo direccion de esclavo
  162.   MOVWF    I2CBUF  ; y cargo en buffer
  163.   CALL    I2C_TX  ; direcciono memoria
  164.   MOVFW    ADDRESS  ; traigo direccion a leer
  165.   MOVWF    I2CBUF  ;
  166.   CALL    I2C_TX  ; y envio a memoria
  167.   CALL    START_I2C; envio condicion de start
  168.   MOVLW    0A1  ; direcciono memoria para lectura
  169.   MOVWF    I2CBUF  ; cargo en buffer
  170.   CALL    I2C_TX  ; y envio
  171.   BCF    I2CACKF,7  ; preparo para acknowledge en 0
  172.   CALL    I2C_RX  ; y leo byte direccionado
  173.   CALL    STOP_I2C; genero condicion de stop
  174.   MOVFW    I2CBUF  ; cargo dato leido en
  175.   MOVWF    DATO    ; registro de datos de memoria
  176.   RETURN      ; y salgo
  177. ;
  178. ; ESCRITURA DE LA MEMORIA 24Cxx
  179. ;
  180. WR24CXX
  181.   CALL    START_I2C; genero bit de start
  182.   MOVLW    0A0    ; cargo direccion del esclavo
  183.   MOVWF    I2CBUF  ; en buffer
  184.   CALL    I2C_TX  ; envio...
  185.   MOVFW    ADDRESS  ; cargo direccion a escribir
  186.   MOVWF    I2CBUF  ; en buffer
  187.   CALL    I2C_TX  ; envio...
  188.   MOVFW    DATO    ; cargo dato a escribir
  189.   MOVWF    I2CBUF  ; en buffer
  190.   CALL    I2C_TX  ; envio...
  191.   CALL    STOP_I2C; genero bit de stop
  192.   MOVLW    d'60'    ;
  193.   MOVWF    CNT1    ;
  194. WR24POLL
  195.   CALL    START_I2C;
  196.   MOVLW    ADDRESS  ;
  197.   MOVWF    I2CBUF  ;
  198.   CALL    I2C_TX  ;
  199.   BTFSS    SDA    ;
  200.   GOTO    WR24P_EXIT;
  201.   DECFSZ  CNT1,F  ;
  202.   GOTO    WR24POLL;
  203.   RETLW    0xFF    ;
  204. WR24P_EXIT
  205.  
  206.   CALL DEL5MS; espero 10 mseg para dar tiempo a memoria
  207.   CALL DEL5MS
  208.  
  209.   RETLW    0x00    ; y salgo
  210. ;
  211. ; Retardo de 5MS
  212. ;
  213. DEL5MS  MOVLW     d'6'    ; 1 set numero de repeticion  (B)
  214.         MOVWF     cont2    ; 1 |
  215. PLoop1  MOVLW     d'207'  ; 1 set numero de repeticion  (A)
  216.         MOVWF     cont3    ; 1 |
  217. PLoop2  CLRWDT            ; 1 clear watchdog
  218.         DECFSZ    cont3, 1; 1 + (1) es el tiempo 0  ? (A)
  219.         GOTO      PLoop2  ; 2 no, loop
  220.         DECFSZ    cont2, 1; 1 + (1) es el tiempo 0  ? (B)
  221.         GOTO      PLoop1  ; 2 no, loop
  222. PDelL1  GOTO      PDelL2  ; 2 ciclos delay
  223. PDelL2  CLRWDT            ; 1 ciclo delay
  224.         RETURN            ; 2+2 Fin.
  225. ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*;
  226. ;
  227. ; RUTINA QUE MUESTRA EN EL PUERTO B
  228. ;
  229. MOSTRAR
  230.   BSF   STATUS,RP0; selecciona banco1
  231.   CLRF  PORTB  ; SDA entrada
  232.   BCF  STATUS,RP0; selecciono banco0
  233.   MOVFW  DATO
  234.   MOVWF   PORTB
  235.   RETURN  
  236. ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*;
  237. ;
  238. ; PRINCIPAL
  239. ;
  240. INI  
  241.   MOVLW   47  ;
  242.   MOVWF   DATO  ;inicializamos las variables del dato a meter y
  243.   MOVLW   05   ;también la dirección inicial
  244.   MOVWF   ADDRESS  ;
  245.   CALL   WR24CXX
  246.   CALL   RD24CXX
  247.   CALL  MOSTRAR
  248.   GOTO  $
  249.   END;
  250.  
  251.  
  252.  

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Pic 16f84, Bus I2c
« Respuesta #1 en: Viernes 30 de Diciembre de 2005, 16:15 »
0
Si me hago un lugar rebizo la rutina.. mientras consulto.. no has probado con estas que publique hace tiempo?

http://foros.solocodigo.com/index.php?showtopic=16531

Saludos :)
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

crbrs

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Re: Pic 16f84, Bus I2c
« Respuesta #2 en: Sábado 31 de Diciembre de 2005, 14:50 »
0
Weno, si las abia visto, pero no me puse a analizarlas, ya que habia trabajado con estas que expuse. Pero weno, me pondre con ellas, a ver si salen, porque ya llevo par de dias pa lante y pa tras con eso, y no veo el fallo, pero weno.
Gracias por la ayuda, si puedes echale un vistazo. Muchas gracias.
Saludos.

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Pic 16f84, Bus I2c
« Respuesta #3 en: Sábado 31 de Diciembre de 2005, 15:02 »
0
Cita de: "crbrs"
Weno, si las abia visto, pero no me puse a analizarlas, ya que habia trabajado con estas que expuse. Pero weno, me pondre con ellas, a ver si salen, porque ya llevo par de dias pa lante y pa tras con eso, y no veo el fallo, pero weno.
Gracias por la ayuda, si puedes echale un vistazo. Muchas gracias.
Saludos.
BIEn :) .. me interesaria que me especifiques un poco mas sobre el problema.. que es lo que no funciona?.. puedes grabar la memoria?, puedes leerla?, no hace ni una ni otra?.. talves el problema no sea el codigo, puede ser problema de hard o bien de direccionamiento a la memoria, de una 24C04 a una 24C16 varia un poco el codigo para el acceso y la grabacion o lectura de datos, voy a hecharle un ojo al codigo y aver que resulta. Saludos y Feliz Año Nuevo!! :beer:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

crbrs

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Re: Pic 16f84, Bus I2c
« Respuesta #4 en: Sábado 31 de Diciembre de 2005, 17:09 »
0
Citar
BIEn  .. me interesaria que me especifiques un poco mas sobre el problema.. que es lo que no funciona?.. puedes grabar la memoria?, puedes leerla?, no hace ni una ni otra?.. talves el problema no sea el codigo, puede ser problema de hard o bien de direccionamiento a la memoria, de una 24C04 a una 24C16 varia un poco el codigo para el acceso y la grabacion o lectura de datos, voy a hecharle un ojo al codigo y aver que resulta. Saludos y Feliz Año Nuevo!! 

Weno.. el hardware, creo q lo tngo bien, t adjunto una imagen al respecto.
He visto los datasheets de las dos memorias, y respecto a soft creo q no cambian mucho, pero weno, a lo mjor ai esta el fallo, mi inmadurez sobre el tema puede q m delate :).
Mira, .. yo no se si escibe bien, ni tmpc si lee bien, como lo puedo saber?... Yo lo que he exo también es acerme un LOG de los ACK haber si son reconocidos, y existen 6 (3 de escritura y otros 3 de lectura) y los 6 m los da como validos, por eso m extraña.
Otra cosa, me han dixo unos compañeros que a lo neceisto resistencias de pull-ups, por si es drenador abierto la salida, no tngo muxa idea. Podria ser eso tmb. No lo se.
Yo sigo aqui dandole caña, a ver...
Muxas gracias por colaborar, m sentia marginado... jajaja
Saludos. Felices Fiestas.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Pic 16f84, Bus I2c
« Respuesta #5 en: Domingo 1 de Enero de 2006, 08:47 »
0
Hola crbrs! En los módulos I2C, ya sean maestro o esclavo, la linea SDA es siempre drenador abierto. Si a esta línea no se le conecta una R de pull-up (una resistencia entre SDA y VCC), la comunicación no funciona debidamente. En este caso, todo lo que escribas a la memoria funcionará correctamente, pero cuando quieras leerla, lo más seguro es que solo leas ceros (por eso no recibes el bit de NO ACK) ;)
Según el Data Sheet de la 24C02, esta R se aconseja de 10K para bus a 100 KHz o de 2K para 400 KHz. Personalmente, con 10K me funciona muy bien en ambas configuraciones.

Saludos, y buen año a todos :hola: !

crbrs

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Re: Pic 16f84, Bus I2c
« Respuesta #6 en: Domingo 1 de Enero de 2006, 19:04 »
0
Citar
Escrito el 1/01/2006, 08:47 AM
  Hola crbrs! En los módulos I2C, ya sean maestro o esclavo, la linea SDA es siempre drenador abierto. Si a esta línea no se le conecta una R de pull-up (una resistencia entre SDA y VCC), la comunicación no funciona debidamente. En este caso, todo lo que escribas a la memoria funcionará correctamente, pero cuando quieras leerla, lo más seguro es que solo leas ceros (por eso no recibes el bit de NO ACK) 
Según el Data Sheet de la 24C02, esta R se aconseja de 10K para bus a 100 KHz o de 2K para 400 KHz. Personalmente, con 10K me funciona muy bien en ambas configuraciones.

Saludos, y buen año a todos  ! 

Pff.. no sabes cuanto t lo agradezco, ya funciona. MUCHISIMAS GRACIAS. Es verdad que lo pone el datasheet, m había leido too el protocolo menos eso.
Gracias también a Jonathan, por intervenir.
Año nuevo.. vida nueva.. jajaja. Que paseis buen año. Hasta otra ;)