Autor Tema: Problemas comunicacion 24lc04b pic 16f873a (solucionado)  (Leído 5471 veces)

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

Desconectado zerc79

  • PIC10
  • *
  • Mensajes: 43
Problemas comunicacion 24lc04b pic 16f873a (solucionado)
« en: 01 de Junio de 2009, 08:56:33 »
Hola a todos....
Soy nuevo en lo de la comunicacion I2C en la cual estoy trabajando y me resulta imposible poder guardar registros en una memoria externa..
la idea es la toma de temperaturas con LC35 atraves del DAC del 873a, el problema me resulta cuando quiero llevar un registro de datos por que al tratar de grabarlos con rutinas que he encontrado (de lo cual les agradesco por la colaboracion escrita en los foros) no los graba y al correrlos en simulacion del proteus me dice que estoy grabando en la eeprom del pic y las direcciones son incorrectas....

Les agradezco la colaboracion y ayuda.. la verdad de tanto darle vueltas y vueltas no doy con el detalle.... :? :?

Pdta: Les pido el favor que si ven detalles malucos o que se puedan resumir en el codigo me lo hagan saber ya que aveces hay formas mas simples de hacer las cosas pero no las encontramos a la mano o por falta de experiencia las ignoramos... cualquier consejo o critica constructiva es bien recibida.

Gracias....
« Última modificación: 20 de Junio de 2009, 10:51:45 por zerc79 »
No hay ninguna cosa seria que no se pueda decir con una sonrisa

Desconectado marvicdigital

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 311
Re: Problemas comunicacion eeprom 24lc04b pic 16f873a
« Respuesta #1 en: 01 de Junio de 2009, 23:21:24 »
Hola a todos....
Soy nuevo en lo de la comunicacion I2C en la cual estoy trabajando y me resulta imposible poder guardar registros en una memoria externa..
la idea es la toma de temperaturas con LC35 atraves del DAC del 873a, el problema me resulta cuando quiero llevar un registro de datos por que al tratar de grabarlos con rutinas que he encontrado (de lo cual les agradesco por la colaboracion escrita en los foros) no los graba y al correrlos en simulacion del proteus me dice que estoy grabando en la eeprom del pic y las direcciones son incorrectas....

Les agradezco la colaboracion y ayuda.. la verdad de tanto darle vueltas y vueltas no doy con el detalle.... :? :?

Pdta: Les pido el favor que si ven detalles malucos o que se puedan resumir en el codigo me lo hagan saber ya que aveces hay formas mas simples de hacer las cosas pero no las encontramos a la mano o por falta de experiencia las ignoramos... cualquier consejo o critica constructiva es bien recibida.

Gracias....

Bueno, mira yo use el módulo de cominicaciones de el pic 16F877 d ela misma familia del 873, y use una memoria I2C la 24LC256..aca te pongo el enlace espero te sirva de ejemplo la rutina.
Rutina I2C

Saludos

Desconectado zerc79

  • PIC10
  • *
  • Mensajes: 43
Re: Problemas comunicacion eeprom 24lc04b pic 16f873a
« Respuesta #2 en: 02 de Junio de 2009, 08:10:44 »
Citar

Bueno, mira yo use el módulo de cominicaciones de el pic 16F877 d ela misma familia del 873, y use una memoria I2C la 24LC256..aca te pongo el enlace espero te sirva de ejemplo la rutina.
Rutina I2C

Saludos


Ok vaoy a revisar te agradezco y te cuento luego
« Última modificación: 08 de Junio de 2009, 12:07:14 por zerc79 »
No hay ninguna cosa seria que no se pueda decir con una sonrisa

Desconectado zerc79

  • PIC10
  • *
  • Mensajes: 43
Re: Problemas comunicacion eeprom 24lc04b pic 16f873a
« Respuesta #3 en: 08 de Junio de 2009, 16:13:22 »
Bueno, mira yo use el módulo de cominicaciones de el pic 16F877 d ela misma familia del 873, y use una memoria I2C la 24LC256..aca te pongo el enlace espero te sirva de ejemplo la rutina.
Rutina I2C

Saludos


Hola
Gracias por las rutinas pero tengo varios inquietudes y quiero aclarar a ver si encuentro la falla
1. La configuracion con solo una vez correrla al inicio del programa es suficiente o se necesita que cada vez que se solicite el procedimiento I2C.
2. El envio del dato lo guardo En W y luego lo envio con un "TRANSMITIR_DATO_I2C"
3. Al realizar el cambio de lectura a escritura o viceversa es necesario realizar un stop
4.Para la lectura de la eeprom debo establecer la direccion y luego solicitar la lectura del dispositivo que leo.
5. El byte FLAGEE tu lo utilizas para necesidades especifias de tu programa y no influye en nada mas del  resto del programa.. verdad... :shock: :shock:
No hay ninguna cosa seria que no se pueda decir con una sonrisa

Desconectado zerc79

  • PIC10
  • *
  • Mensajes: 43
Re: Problemas comunicacion eeprom 24lc04b pic 16f873a
« Respuesta #4 en: 08 de Junio de 2009, 22:02:15 »
El problema se presenta cuando envio los datos con la rutina TRANSMITIR_DATO_I2C el bit de SPCON2,ackstat se pasa a 1, se que se origina por el no reconocimiento del esclavo pero no entiendo el por que.. le inclui rutina de 20ms para descartar procesos de lectura o transferencia de datos pero aun sigue el error...

les agradezco cualquier ayuda

dual.rar
No hay ninguna cosa seria que no se pueda decir con una sonrisa

Desconectado zerc79

  • PIC10
  • *
  • Mensajes: 43
Re: Problemas comunicacion eeprom 24lc04b pic 16f873a
« Respuesta #5 en: 09 de Junio de 2009, 08:42:50 »
El problema se presenta cuando envio los datos con la rutina TRANSMITIR_DATO_I2C el bit de SPCON2,ackstat se pasa a 1, se que se origina por el no reconocimiento del esclavo pero no entiendo el por que.. le inclui rutina de 20ms para descartar procesos de lectura o transferencia de datos pero aun sigue el error...

les agradezco cualquier ayuda

dual.rar


GRACIAS A TODOS MUY AMABLES POR SI COLABORACION Y PACIENCIA..   :mrgreen: :mrgreen:
. EN VERDAD GRACIAS.... :-/ :-/ :-

Ya encontre la falla, el detalle estaba en proteus, al conectar la eeprom le colocaba resistencias de 10K simulando el pullup, pero en el sistema tiene resistencias que actuan como PULLUP, las cambie instalandole de estas ultimas y la pesadilla se acabo....son de esas cosas que buscando otras te encuentras con las soluciones menos pensadas.....

Tengo otras dudas y cosas que quiero hacer primero por mi mismo si no les encuentro solucion les pedire consejo...

nuevamente GRACIAS Y MIL GRACIAS...
MARVICDIGITAL tu librerias del p... a la perfeccion  ..
No hay ninguna cosa seria que no se pueda decir con una sonrisa

Desconectado zerc79

  • PIC10
  • *
  • Mensajes: 43
Problemas comunicacion 24lc04b pic 16f873a (solucionado)
« Respuesta #6 en: 23 de Junio de 2009, 09:48:15 »
Hola Nuevamente a todos...
Despues de haber recibido su valiosa ayuda quiero compartir con todos las rutinas de I2C  que utilice en base a las de marvicdigital que me fueron de mucha ayuda pero el detalle que se me presento es que queria leer en forma independiente a la que escribia... no se si no se podia o no le halle el pumm... pero como no pude me puse a la tarea de entender linea por linea y con ayudas de otras rutinas les comparto estas rutinas

las utilice con un 16f873A y 24lc04

Código: ASM
  1. CONFIG_TRANSMISION_I2C
  2.         call            b1                      ; SELECIONO LA PAGINA 1 DE LA MEMORIA
  3.         BSF             TRISC,4
  4.         BSF             TRISC,3
  5.         MOVLW   0x02                    ; mueve 2 a W
  6.         MOVWF     SSPADD                ; TRANSMISION SERA DE 333 KHZ
  7.         call            b0                              ; SELECIONO LA PAGINA 0 DE LA MEMORIA
  8.         BCF             PIR1,SSPIF
  9.         MOVLW   B'00101000'             ; PERMITE LA CONFIGURACION SERIE DE LOS PINES SDA Y SCL.
  10.         MOVWF   SSPCON
  11.         GOTO    VOLVER
  12.  
  13. BIT_START_I2C
  14.         call    b1                              ;BANCO 1
  15.         BSF             SSPCON2,SEN             ;START ACTIVADO
  16.         call    b0                              ;BANCO 0
  17.         BTFSS   PIR1,SSPIF
  18.         GOTO    $-1
  19.         BCF             PIR1,SSPIF
  20.         GOTO    VOLVER
  21.  
  22.  
  23. TRANSMITIR_DATO_I2C
  24.         MOVWF   SSPBUF                  ;CARGAR DATO EN BUFFER I2C
  25.         call    b0                              ;BANCO 0
  26.         CALL    R20MS
  27.         BCF             PIR1,SSPIF
  28.         CALL    b1     
  29.         BTFSS   SSPCON2,ACKSTAT ; Si el esclavo pone ACKSTAT = 0 la transmision es correcta,
  30.                                                         ; Si no hay respuesta del esclavo enviamos STOP.
  31.         GOTO    Trans_correcta
  32.         call    TIC
  33.         GOTO    BIT_STOP_I2C
  34.  
  35. Trans_correcta
  36.         call    b0                              ; Seleciono la pagina 0 de la memoria
  37.         GOTO    VOLVER
  38.  
  39. RECIBIR_DATO_I2C
  40.         call    b1                              ;BANCO 1
  41.         BSF             SSPCON2,RCEN    ;ACTIVAR MODO LECTURA
  42.         CALL    b0     
  43.         BTFSS   PIR1,SSPIF
  44.         GOTO    $-1
  45.         BCF             PIR1,SSPIF
  46.         MOVF    SSPBUF,W                ; Dato recibido en el registro SSPBUF
  47.         movwf   buffer                  ; Mueve dato a buffer
  48.         CALL    b1                              ; Seleciono la pagina 1 de la memoria
  49.         BSF             SSPCON2,ACKDT   ; Pone el maestro el bit de reconocimiento de que ha llegado el Dato.
  50.         BSF             SSPCON2,ACKEN   ; Permito que el bit de reconocimiento este activo.
  51.         CALL    b0                              ; Seleciono la pagina 0 de la memoria
  52.         BTFSS   PIR1,SSPIF
  53.         GOTO    $-1
  54.         BCF             PIR1,SSPIF
  55.         GOTO    VOLVER
  56.  
  57.  
  58. BIT_STOP_I2C
  59.         CALL    b1                              ; Seleciono la pagina 1 de la memoria
  60.         BSF             SSPCON2,PEN
  61.         CALL    b0                              ; Seleciono la pagina 0 de la memoria
  62.         BTFSS   PIR1,SSPIF
  63.         GOTO    $-1
  64.         BCF             PIR1,SSPIF
  65.         GOTO    VOLVER
  66.  
  67. TIC     BSF             PORTC,7
  68.         CALL    R500MS
  69.         BCF             PORTC,7
  70.         GOTO    VOLVER
  71.  
  72. RESTART_I2C
  73.         CALL    b1
  74.         BSF             SSPCON2,RSEN
  75.         CALL    b0
  76.         BTFSS   PIR1,SSPIF
  77.         GOTO    $-1
  78.         BCF             PIR1,SSPIF
  79.  
  80. VOLVER
  81.         RETURN

y explico:

los llamados "call bx" son rutinas que empleo adicionales para ubicarme en el banco que quiero trabajar (se que se puede hacer solo modificando uno de los bits en el reg STATUS pero lo hago para no perderme, "por novato")

La variable "buffer" la utilizo para trasladar el valor que quiero leer en las rutinas o para escribir en la memoria.

La rutina TIC sirve para encender un led en el puerto C para indicar que esta leyendo (informacion visual)

Llamado a rutina de escritura

Código: ASM
  1. BCF             INTCON,7                                ; GIE – Global interrupt DISABLE (1=habilitado)
  2.  
  3.         call    CONFIG_TRANSMISION_I2C
  4.         CALL    BIT_START_I2C
  5.         MOVLW   B'10100000'                             ;Establece la dir de la eeprom B0=0=escritura
  6.         CALL    TRANSMITIR_DATO_I2C
  7.         movf    IC2DIR,0                                    ; IC2DIR: Variable que posee direccion de la eeprom en la cual se grabara
  8.         CALL    TRANSMITIR_DATO_I2C
  9.         MOVF    buffer,0                              ; buffer : Variable que posee dato a escribir
  10.         CALL    TRANSMITIR_DATO_I2C
  11.         call    BIT_STOP_I2C
  12.  
  13. ; DESBLOQUEA INTERRUPCIONES*****************************
  14.         BSF             INTCON,7                                ; GIE – Global interrupt enable (1=habilitado)


Llamado a rutina de lectura

Código: ASM
  1. ; BLOQUEA INTERRUPCIONES*****************************
  2.         BCF             INTCON,7                                ; GIE – Global interrupt DISABLE (1=habilitado)
  3.  
  4.         call    CONFIG_TRANSMISION_I2C
  5.         CALL    BIT_START_I2C
  6.         MOVLW   B'10100010'                     ;1010: standar para la eeprom
  7.                                                                 ; 001: Indica que es en el bank 1 (000=Bank 0)
  8.                                                                 ; B0=0=ESCRITURA (1=LECTURA)
  9.         CALL    TRANSMITIR_DATO_I2C
  10.         movf    IC2DIR_LECTURA,0                    ; IC2DIR_LECTURA : Posee la direccion de la eeprom que se va a leer
  11.         CALL    TRANSMITIR_DATO_I2C
  12.  
  13.         CALL    RESTART_I2C
  14.  
  15.         MOVLW   B'10100011'                             ;Establece la dir de la eeprom B0=1=LECTURA
  16.         CALL    TRANSMITIR_DATO_I2C
  17.         CALL    RECIBIR_DATO_I2C
  18.         MOVF    buffer,0
  19.         call    BIT_STOP_I2C
  20.         CALL    TIC
  21.  
  22. ; DESBLOQUEA INTERRUPCIONES*****************************
  23.         BSF             INTCON,7                                ; GIE – Global interrupt enable (1=habilitado)

Espero que les sirva .....

Saludos :mrgreen:
No hay ninguna cosa seria que no se pueda decir con una sonrisa

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas comunicacion 24lc04b pic 16f873a (solucionado)
« Respuesta #7 en: 15 de Febrero de 2010, 00:07:26 »
Hola zerc79.
Gracias por compartir tu rutina.

Un consejo, si tienes miedo de perderte o seleccionar mal, lo que puedes hacer es utilizar una directiva del MPASM, es banksel

Su utilización es más que segura y te olvidas de que bit ajustar del registro STATUS.
Por ejemplo, tu estás en un banco x y necesitas trabajar con el registro TRISx, entonces lo utilizas así:

       BANKSEL      TRISC    ;selecciona el banco correspondiente al banco de TRISC, en este caso banco 0
       CLRF         TRISC    ;o lo que necesites modificar.


Saludos.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.