Autor Tema: Ejemplo de utilizacion del Modulo I2C del 16F877a  (Leído 42731 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #60 en: 23 de Enero de 2009, 15:16:21 »
Hola. No es una suma..es una AND. No se si te referías a eso. Si miras en el datasheet, verás que para saber si el bus está en estado IDLE todos los bits: 0,1,2,3 y 4 del registro SSPCON2 deben estar en bajo. Por eso se hace una AND que filtra los bits 7,6 y 5.

Cita del datasheet:

Citar
Note: For bits ACKEN, RCEN, PEN, RSEN, SEN: If the I2C module is not in the IDLE mode, this bit may not be set (no spooling), and the SSPBUF may not be written (or writes to the SSPBUF are disabled).

Con respecto a la configuración E/S de los pines, no te preocupes. El uC los administra y configura según corresponda.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #61 en: 24 de Enero de 2009, 07:10:31 »
 :mrgreen: :mrgreen: hola y gracias Bruno :-/ :-/
creo que ya ta, la rutina que vuelca 255bytes en la eeprom. ahora solo me falta al verres, copiar el pad en la eeprom y la forma de seleccionar entre varias posiciones, donde guardar diferentes configuraciones de los potes y botones. a seguir currando¡¡

Código: ASM
  1. CONFIG_IIC              MACRO
  2.                 BANKSEL SSPCON
  3.                 MOVLW   B'00101000'                     ;7----> WCOL    0=NO HAY COLISION
  4.                                                                         ;                               1=SE HA ESCRITO SSPBUF MIENTRAS SE HACIA UNA TRANSMISION       
  5.                                                                         ;6----> SSPOV   0=NO HAY OVERFLOW
  6.                                                                         ;                               1=UN BYTE SE HA RECIBIDO SIN LEER EL ANTERIOR   dEBE SER BORRADO POR SOFT                      
  7.                                                                         ;5----> SSPEN   1=HABILITA EL I2C Y LOS PINES SDA SCL
  8.                                                                         ;4----> CKP     0=MANTIENE EL RELOJ EN ESTADO BAJO
  9.                                                                         ;                               1=HABILITA EL RELOJ
  10.                                                                         ;3-0--> SSPM3-0 1000=MAESTRO reloj=f_osc/4*(sspadd+1)
  11.                 banksel SSPADD
  12.                 movlw   b'00001011'             ;.11 para 400khz @ 20 mhz
  13.                 movwf   SSPADD                  ;400 khz @ 20 mhz
  14.                 ENDM
Código: ASM
  1. IIC_BUS                 MACRO
  2. BULK_PATCH_IIC
  3.                 CALL    DEMORA_20MS
  4.                 CALL    RECARGA2
  5.                 BTFSC   DATO
  6.                 RETURN
  7.                 bcf             INTCON,GIE              ;DESACTIVAMOS LAS INTERRUPCIONES
  8.                 CALL    RESET_DIRECCION ;APUNTA AL PAD 00, HABRA QUE BUSCAR LA FORMA DE SELECIONAR ENTRE VARIOS CADA 255 BYTES
  9. IIC_MEMO_READ
  10.                 BANKSEL SSPCON
  11.                 CALL    IIC_START               ;ENVIA LA CONDICION DE START
  12.                 MOVLW   B'10100001'             ;CONTROL BYTE--> |STARTBIT|1|0|1|0|A2|A1|A0|1 AUNQUE EN EL MANUAL ESTA A 0 PARA R/W |ACK<---este lo devuelve el esclavo|
  13.                 CALL    IIC_ENVIA               ;Y SE LO ENVIA A LA EEPROM                                                                     
  14.                 CALL    IIC_ADRESS              ;MANDA DIRH,ESPERA ACK,MANDA DIRL, ESPERA ACK = |0|0|0|0|0|0|0|0|ACK|0|0|0|0|0|0|0|0|ACK|_DATO_8BITS_|ACK|_DATO_8BITS_|ACK|
  15. SIGUE_READ
  16.                 BANKSEL SSPCON
  17.                 BSF             SSPCON, CKP             ;INICIA EL RELOJ
  18.                 BANKSEL SSPCON2
  19.                 BSF     SSPCON2,RCEN    ;activa la recepcion
  20.                 BTFSC   SSPCON2,RCEN    ;ESPERA A TERMINAR LA RECEPCION
  21.                 GOTO    $-1
  22.                 BTFSS   SSPSTAT,BF      ;dato disponible en SSPBUF para ser leido?
  23.             GOTO    $-1                 ;no, esperar
  24.                 CALL    IIC_SEND_ACK    ;DEVUELVE EL ACK PARA QUE SEA VALIDO
  25.                 BANKSEL SSPCON
  26.                 BCF             SSPCON, CKP             ;Y APAGA EL RELOJ
  27.                 BANKSEL DIRL
  28.                 INCFSZ  DIRL,F                  ;UNA VEZ LLEGA DE 255-0 SALE DE LA RUTINA
  29.                 GOTO    GUARDA_PADS
  30.                 CALL    IIC_STOP
  31.                 BSF             INTCON,GIE
  32.  
  33. IIC_STOP       
  34.                 BANKSEL SSPCON2
  35.                 BSF             SSPCON, CKP             ;INICIA EL RELOJ
  36.                 BSF             SSPCON2,PEN             ;INICIA EL ESTADO STOP EN SDA SCL
  37.                 BTFSC   SSPCON2,PEN
  38.                 GOTO    $-1                             ;ESPERA A QUE TERMINE
  39.                 BANKSEL SSPCON
  40.                 BCF             SSPCON, CKP             ;Y APAGA EL RELOJ
  41.                 RETURN
  42.                                        
  43. IIC_SEND_NACK
  44.                 BANKSEL SSPCON2
  45.                 BSF     SSPCON2,ACKDT   ;A UNO PARA NO-ACK
  46.                 BSF     SSPCON2,ACKEN   ;CON ESTO ACTIVAMOS LA SECUENCIA DE ACKDT(ANTERIOR)
  47.                 BTFSC   SSPCON2,ACKEN
  48.                 GOTO    $-1                             ;Y ESPERAMOS A QUE LA TERMINE
  49.                 RETURN                                  ;VUELVE
  50.  
  51. IIC_SEND_ACK
  52.                 BANKSEL SSPCON2
  53.                 BCF     SSPCON2,ACKDT   ;A CERO PARA ACK
  54.                 BSF     SSPCON2,ACKEN   ;CON ESTO ACTIVAMOS LA SECUENCIA DE ACKDT(ANTERIOR)
  55.                 BTFSC   SSPCON2,ACKEN
  56.                 GOTO    $-1                             ;Y ESPERAMOS A QUE LA TERMINE
  57.                 RETURN                                  ;VUELVE
  58.  
  59. GUARDA_PADS
  60.                 BANKSEL SSPBUF
  61.                 MOVF    SSPBUF,W
  62.                 BANKSEL REG_MUESTRA
  63.                 MOVWF   REG_MUESTRA
  64.                 CALL    ESCRITURA_EEPROM_IIC    ;Y GUARDA EL DATO EN LA EEPROM
  65.                 GOTO    SIGUE_READ
  66.  
  67. IIC_IDLE
  68.                 BANKSEL SSPSTAT
  69.                 BTFSC   SSPSTAT,R_W
  70.                 GOTO    $-1
  71.                 movf    SSPCON2,w ; POR QUE SE HACE ESTO SI POR UN CASUAL LA PRIMERA VEZ NO SE PONE A UNO Z A LA SIGUIENTE TAMPOCO
  72.                 andlw   0x1F
  73.                 btfss   STATUS,Z
  74.                 goto    $-3
  75.  
  76.                 RETURN
  77.  
  78. ESCRITURA_EEPROM_IIC
  79.                 BANKSEL DIRL
  80.                 MOVF    DIRL,W                  ;Data Memory
  81.                 BANKSEL EEADR
  82.                 MOVWF   EEADR                   ;Address to write
  83.                 CLRW
  84.                 ADDWF   EEADR,F                 ;DE ESTA FORMA SE COMIENZA A CONTAR DESDE EL REGISTRO DE POTES
  85.                 GOTO    CONTINUA_ESCRITURA     
  86.                
  87. IIC_ADRESS
  88.                 BANKSEL DIRH
  89.         ;       MOVF    DIRH,W
  90.                 clrw
  91.                 CALL    IIC_ENVIA
  92.                 BANKSEL DIRL
  93.         ;       MOVF    DIRL,W
  94.                 clrw
  95.                 CALL    IIC_ENVIA
  96.                 RETURN
  97. IIC_ENVIA
  98.                 CALL    IIC_IDLE                ;ESERA A QUE TERMINE LA ULTIMA TRANSMISION
  99.                 BANKSEL SSPBUF                 
  100.                 MOVWF   SSPBUF                  ;CARGA EL DATO EN SSPBUFF
  101.                 BSF             SSPCON, CKP             ;NO HABRIA QUE ACTIVAR AQUÍ EL RELOJ PARA QUE EMPIEZE A ENVIAR
  102.                 BANKSEL SSPSTAT                
  103.                 btfsc   SSPSTAT,R_W      ;esperar a que termine el envio
  104.                 goto    $-1
  105.  
  106.                 btfss   SSPCON2,ACKSTAT   ;checkear ack
  107.                 GOTO    NO_ACK 
  108. SALE_NCK
  109.                 BANKSEL PIR1
  110.                 btfss   PIR1,SSPIF      ;esperar finalizacion del noveno clock
  111.                 goto    $-1
  112.  
  113.                 bcf      PIR1,SSPIF             ;BAJA LA BANDERA
  114.                 BCF             SSPCON, CKP             ;Y TRAS TERMINAR DE RRECONOCER EL ACK APAGAR EL RELOJ
  115.                 RETURN
  116. NO_ACK
  117.                 BANKSEL DIRL
  118.                 MOVLW   .255
  119.                 MOVWF   DIRL
  120.                 goto    SALE_NCK                                ;ESTO OBLIGA A SALIR DE LA RUTINA AL SOBREPASAR LOS 255
  121. RESET_DIRECCION
  122.                 BANKSEL DIRH                    ;CARGAMOS EN LOS REGISTROS DE DIRECCION A LA QUE QUEREMOS ACCEDER
  123.                 CLRF    DIRH                    ;DE MOMENTO DIRECCION 00
  124.                 CLRF    DIRL
  125.                 RETURN         
  126.  
  127. IIC_START
  128.                 CALL    IIC_IDLE
  129.                 BANKSEL SSPCON2
  130.                 BSF             SSPCON, CKP             ;PRIMERO INICIA EL RELOJ
  131.                 BSF             SSPCON2, SEN    ;INICIA START
  132.                 BTFSC   SSPCON2,SEN             ;
  133.                 GOTO    $-1                             ;ESPERA A QUE TERMINE
  134.                 BANKSEL PIR1
  135.                 BTFSS   PIR1,SSPIF              ;ESPERA A LA BANDERA POR INTRRUPCION
  136.                 GOTO    $-1
  137.                 BCF             PIR1,SSPIF              ;Y LA BAJA
  138.                 BCF             SSPCON, CKP             ;Y APAGA EL RELOJ
  139.                 RETURN
  140.                 ENDM
  141.         ;------------------------------------------

un saludo y gracias

Desconectado ivanovic

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #62 en: 17 de Mayo de 2013, 10:46:33 »
Hey que tal, muy útil la explicación de tu programa!! Una enorme pregunta, ¿tendrás la simulación de esto en proteus? Gracias Un saludo!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #63 en: 23 de Mayo de 2013, 01:50:50 »
Hola!

Lamentablemente no tengo la simulación, pero no debería ser dificil de hacerla!

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado inventor1967

  • PIC10
  • *
  • Mensajes: 16
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #64 en: 09 de Julio de 2013, 03:17:37 »
Hola Cordial Saludo soy nuevo en el foro
Estoy tratando de controlar una 24c512 con un 18f4550 y no ha sido posible alguien lo ha logrado?
por favor si alguien logra encontrar donde estoy fallando le Agradeceré, adjunto la parte del código.
Código: [Seleccionar]
LEER MOVLW 0X01
CALL COMLC ;borra la patalla lcd
CALL INIVAR ;iniciar las varables
CALL INI2C ;para inicializar el puerto i2c
NLEER BCF PIR1,3
BSF SSPCON2,SEN ;CONDICION DE ARANQUE

BTFSS PIR1,SSPIF
GOTO NLEER


BCF PIR1,SSPIF
MOVLW 0XA1 ;Direccion de la memoria con la para leer
MOVWF DATOF,1 ;regeistro para almacenar lo que se enviara
CALL TRANSMT



MOVF DIREC2,W
MOVWF DATOF
CALL TRANSMT

MOVF UG,W
MOVWF DATOF
CALL TRANSMT


BSF SSPCON2,RCEN ;activa recepcion
YLLE BTFSC SSPCON2,RCEN
GOTO YLLE
MOVF SSPBUF,W
CALL ENCAJA ;llama subrrutina para visualizar en la lcd



MOVLW 0X35
CPFSEQ UG
GOTO NLEERE


YP NOP
GOTO YP
NLEERE INCF UG,1
MOVF UG,W
CALL CARLC
GOTO NLEER
;********************************************************
; *
;RUTINA PARA ENVIAR DIRECCIONES Y DATOS A LA MEM *
; *
;********************************************************
TRANSMT

MOVF DATOF,W
MOVWF SSPBUF
FTRA BTFSS PIR1,SSPIF
GOTO FTRA



SREC BTFSC SSPCON2,ACKSTAT
GOTO SREC

RETURN

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
; rutina para inicializar variables
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INIVAR
MOVLW 0X00
MOVWF DIREC2
MOVLW 0X30
CLRF UG
MOVWF DIREC1,1
MOVLW 0X47
MOVWF M


;>>>>>>>>>>>>>>>>>>>>>>>
;
; rutina para inicializar el puerto
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

INI2C CLRF LATB
CLRF TRISB

CLRF SSPSTAT
BSF SSPSTAT,SMP
BSF SSPCON1,SSPM3
BSF SSPCON1,SSPEN

MOVLW 0X31

MOVWF SSPADD

MOVLW 0X28
MOVWF SSPCON1

CLRF SSPCON2

BSF TRISB,0
BSF TRISB,1
RETURN

;<><><<><>><>>>>>>>>>>><<<<<><<<>

Desconectado lucas0214

  • PIC10
  • *
  • Mensajes: 5
Re: Ejemplo de utilizacion del Modulo I2C del 16F877a
« Respuesta #65 en: 30 de Octubre de 2013, 21:18:01 »
Buen día, como andan veo que hace tiempo que no se sigue esta conversación pero estoy renegando con una 24c16 que no puedo grabar bien, y mi primer duda con respecto al programa subido es porque utilizan DIRH y DIRL para direccionar la memoria, que según lo leido en la hoja de datos solo se envia una byte para ubicarse en la posición de la memoria a leer/escribir

Desde ya muchas gracias por el aporte de siempre!!!!