Programación Específica > Microcontroladores

 Pic 16f84, Bus I2c

(1/2) > >>

crbrs:
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 ---   LIST P=PIC16C84, R=HEX  INCLUDE pic16f84.inc  LIST ;pines#define SDA PORTB,4#define SDATRIS TRISB,4#define SCL PORTB,5#define SCLTRIS TRISB,5 ;variables en RAM  ORG    0C CNT RES 1    ;CNT ... contador para la TX/RX de bytes!CNT1 RES 1    ;CNT1 ... contadorcont2 RES 1    ;cont2 ... contador para la rutina de 5mscont3 RES 1    ;cont3 ... contador para la rutina de 5msADDRESS RES 1    ;ADDRESS ... dirección donde se Lee/Escribe los datosDATO RES 1    ;DATO ... dato donde se lee/escribeI2CBUF RES 1    ;I2CBUF ...  buffer para enviar o recibir el datoI2CDI RES 1    ;I2CDI ... Dato de entrada (bit)I2CDO RES 1    ;I2CDO ... Dato de salida (bit)I2CACKF RES 1    ;I2CACKF ... Registro de ACK;fin de variables en RAM   ORG 0  GOTO INI ;******************************************************************************;  RUTINAS DE COMUNICACION SERIE (MODULO I2C);******************************************************************************;; GENERA START BIT;START_I2C  BSF   STATUS,RP0; selecciona banco1  BCF  SDATRIS  ; SDA salida  BCF  SCLTRIS  ; SCL salida  BCF  STATUS,RP0; selecciono banco0  BSF    SDA  BCF    SCL    ; bajo clock  NOP        ;   BSF    SCL    ; subo clock  GOTO    $+1    ;   GOTO    $+1    ;   GOTO    $+1    ;   NOP        ;   BCF    SDA    ; bajo datos  GOTO    $+1    ;   GOTO    $+1    ;   GOTO    $+1    ;   NOP        ;   BCF    SCL    ; y bajo clock para generar start bit  GOTO    $+1    ;   GOTO    $+1    ;   RETURN      ; ;; GENERA STOP BIT;STOP_I2C  BSF   STATUS,RP0; selecciona banco1  BCF  SDATRIS  ; SDA salida  BCF  SCLTRIS  ; SCL salida  BCF  STATUS,RP0; selecciono banco0  BCF    SDA    ; bajo datos  GOTO    $+1    ;   GOTO    $+1    ;   BSF    SCL    ; subo clock  GOTO    $+1    ;   GOTO    $+1    ;   BSF    SDA    ; subo datos  GOTO    $+1    ;   GOTO    $+1    ;   BCF    SCL    ; bajo clock  GOTO    $+1    ;   GOTO    $+1    ;   RETURN      ; y retorno;; ENVIA UN BIT POR SDA;BITOUT_I2C  BSF   STATUS,RP0; selecciona banco1  BCF  SDATRIS  ; SDA salida  BCF  SCLTRIS  ; SCL salida  BCF  STATUS,RP0; selecciono banco0  BTFSS    I2CDO,7  ; enviar un 1 ?  GOTO    I2CBLO  ; no, envio un 0...  BSF    SDA    ; pongo SDA en 1  GOTO    CLKOUT    ; I2CBLO  BCF    SDA    ; pongo SDA en 0CLKOUT  BSF    SCL    ; y clockeo  GOTO    $+1    ;   GOTO    $+1    ;   GOTO    $+1    ;   BCF    SCL    ;   RETURN      ; y salgo;; RECIBE UN BIT POR SDA;BITIN_I2C  BSF    I2CDI,7  ; asumo que llega un 1  BSF   STATUS,RP0; selecciona banco1  BSF  SDATRIS  ; SDA entrada  BCF  SCLTRIS  ; SCL salida  BCF  STATUS,RP0; selecciono banco0  BSF    SCL    ; subo clock  GOTO    $+1    ;   GOTO    $+1    ;   GOTO    $+1    ;   BTFSS    SDA    ; recibio un 1 ?  BCF    I2CDI,7  ; no, es 0  BCF    SCL    ; bajo clock  RETURN      ; y salgo;; RUTINA DE TRANSMISION POR I2C;I2C_TX  MOVLW    d'8'    ; son 8 bits a contar  MOVWF    CNT    ; I2C_TXLP  BCF    I2CDO,7  ; asumo que sale un 0  BTFSC    I2CBUF,7; sacar un 0 ?  BSF    I2CDO,7  ; no, sale un 1...  CALL    BITOUT_I2C; envio bit  RLF    I2CBUF,F; acomodo para sacar proximo bit  DECFSZ  CNT,F    ; salieron los 8 ?  GOTO    I2C_TXLP; no, continuo sacando...  CALL    BITIN_I2C; leo bit de acknowledge  BCF    I2CACKF,7  ; asumo que es 0  BTFSC    I2CDI,7  ; es 0 ?  BSF    I2CACKF,7  ; no, envio un 1  RETURN      ; y salgo;; RUTINA DE RECEPCION POR I2C;I2C_RX  CLRF    I2CBUF  ; borro buffer  MOVLW    d'8'    ; son 8 bits a leer  MOVWF    CNT    ;   BCF    STATUS,C  ; borro flag de carryI2C_RXLP  RLF    I2CBUF,F; roto un bit a la izquierda  CALL    BITIN_I2C; y leo bit enviado  BTFSC    I2CDI,7  ; llego un 0 ?  BSF    I2CBUF,0; no, escribo un 1 en el buffer  DECFSZ  CNT,F    ; llegaron los 8 bits ?  GOTO    I2C_RXLP; no, sigo reciviendo...  BCF    I2CDO,7  ;   BTFSC    I2CACKF,7  ;   BSF    I2CDO,7  ;   CALL    BITOUT_I2C; envio bit de acknowledge  RETURN      ; y salgo;; LECTURA DE LA MEMORIA 24Cxx;RD24CXX  CALL    START_I2C; envio condicion de start  MOVLW    0A0    ; traigo direccion de esclavo  MOVWF    I2CBUF  ; y cargo en buffer  CALL    I2C_TX  ; direcciono memoria  MOVFW    ADDRESS  ; traigo direccion a leer  MOVWF    I2CBUF  ;   CALL    I2C_TX  ; y envio a memoria  CALL    START_I2C; envio condicion de start  MOVLW    0A1  ; direcciono memoria para lectura  MOVWF    I2CBUF  ; cargo en buffer  CALL    I2C_TX  ; y envio  BCF    I2CACKF,7  ; preparo para acknowledge en 0  CALL    I2C_RX  ; y leo byte direccionado  CALL    STOP_I2C; genero condicion de stop  MOVFW    I2CBUF  ; cargo dato leido en  MOVWF    DATO    ; registro de datos de memoria  RETURN      ; y salgo;; ESCRITURA DE LA MEMORIA 24Cxx;WR24CXX  CALL    START_I2C; genero bit de start  MOVLW    0A0    ; cargo direccion del esclavo  MOVWF    I2CBUF  ; en buffer  CALL    I2C_TX  ; envio...  MOVFW    ADDRESS  ; cargo direccion a escribir  MOVWF    I2CBUF  ; en buffer  CALL    I2C_TX  ; envio...  MOVFW    DATO    ; cargo dato a escribir  MOVWF    I2CBUF  ; en buffer  CALL    I2C_TX  ; envio...  CALL    STOP_I2C; genero bit de stop  MOVLW    d'60'    ;   MOVWF    CNT1    ; WR24POLL  CALL    START_I2C;   MOVLW    ADDRESS  ;   MOVWF    I2CBUF  ;   CALL    I2C_TX  ;   BTFSS    SDA    ;   GOTO    WR24P_EXIT;   DECFSZ  CNT1,F  ;   GOTO    WR24POLL;   RETLW    0xFF    ; WR24P_EXIT   CALL DEL5MS; espero 10 mseg para dar tiempo a memoria  CALL DEL5MS   RETLW    0x00    ; y salgo;; Retardo de 5MS;DEL5MS  MOVLW     d'6'    ; 1 set numero de repeticion  (B)        MOVWF     cont2    ; 1 |PLoop1  MOVLW     d'207'  ; 1 set numero de repeticion  (A)        MOVWF     cont3    ; 1 |PLoop2  CLRWDT            ; 1 clear watchdog        DECFSZ    cont3, 1; 1 + (1) es el tiempo 0  ? (A)        GOTO      PLoop2  ; 2 no, loop        DECFSZ    cont2, 1; 1 + (1) es el tiempo 0  ? (B)        GOTO      PLoop1  ; 2 no, loopPDelL1  GOTO      PDelL2  ; 2 ciclos delayPDelL2  CLRWDT            ; 1 ciclo delay        RETURN            ; 2+2 Fin.;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*;;; RUTINA QUE MUESTRA EN EL PUERTO B;MOSTRAR  BSF   STATUS,RP0; selecciona banco1  CLRF  PORTB  ; SDA entrada  BCF  STATUS,RP0; selecciono banco0  MOVFW  DATO  MOVWF   PORTB  RETURN  ;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*;;; PRINCIPAL;INI    MOVLW   47  ;  MOVWF   DATO  ;inicializamos las variables del dato a meter y  MOVLW   05   ;también la dirección inicial  MOVWF   ADDRESS  ;  CALL   WR24CXX  CALL   RD24CXX  CALL  MOSTRAR  GOTO  $  END;   

© Jonathan ©:
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 :)

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.

© Jonathan ©:

--- 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.
--- Fin de la cita ---
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:

crbrs:

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

--- Fin de la cita ---

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.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa