QUE TAL, HACE TIEMPO QUE ANDO PROGRAMANDO PICS Y NO HALLABA LA MANERA DE COMENZAR CON I2C, QUE ERA LO QUE ME FALTABA PARA MASOMENOS TENER MÁS HERRAMIENTAS PARA FUTUROS PROYECTOS
LE HECHE UN VISTAZO A ESTE TEMA:
http://www.todopic.com.ar/foros/index.php?topic=5979.20 QUE ME PARECIO EXCELENTE PARA INICIAR, A PESAR DE QUE AÚN NO ESTA COMPRENDIDO AL 100% REALICE UNA PEQUEÑA MODIFICACIÓN AL PROGRAMA QUE COMPARTIO GROUNDMAN Y EL RESULTADO FUE ESTE:
LIST P=16F876
#include "p16F876.INC"
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF ;&_WRT_ENABLE_OFF
ERRORLEVEL -302
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; CONSTANTES:
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CLOCK D'0'
#define STROBE D'2'
#define SCL D'3'
#define SDA D'4'
#define OK D'0'
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; MACROS
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2 MACRO
BSF STATUS,RP1
BCF STATUS,RP0
ENDM
BANK3 MACRO
BSF STATUS,RP1
BSF STATUS,RP0
ENDM
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CBLOCK 0X020
DATH
DATL
DATO
FLAG
CUENTA
CONTA0
CONTA1
ENDC
DATASSP EQU 0x70
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ORG 0X00
GOTO INICIO_CONF
ORG 0X04
RETURN
ORG 0X20
INICIO_CONF
BANK0
BSF STATUS,RP0
MOVLW 0x06 ;PINS DEL PUERTO A Y PUERTO E TODOS DIGITALES.
MOVWF ADCON1
CLRF TRISA
CLRF TRISB
MOVLW B'00011000'
MOVWF TRISC
BANK0
CLRF PORTA
CLRF PORTB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CALL I2C_INI
PRINCIPAL
CALL WRITEI2C_SHT
CALL DEMORA ;dar 10ms a que termine la escritura
CALL DEMORA ;dar 10ms a que termine la escritura
CALL DEMORA ;dar 10ms a que termine la escritura
CALL DEMORA ;dar 10ms a que termine la escritura
LOOP
CALL READI2CBYTE
BTFSS FLAG,0
GOTO ERRORCOM
movlw .1 ;escritura y lectura OK. encender RA0, mostrar dato leido en PuertoB y loop eterno
movwf PORTA
movf DATO,w
movwf PORTB
NOP
CALL DEMORA ;dar 10ms a que termine la escritura
CALL DEMORA
BCF PORTA,0
CALL DEMORA
CALL DEMORA
GOTO PRINCIPAL
ERRORCOM; ERROR DE COMPROBACIÓN, SI EXISTE ERROR SE ENCIENDE RA0 Y RA1 CON UN BLUFE INFINITO
MOVLW .3
MOVWF PORTA
NOP
GOTO $-1
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEMORA
MOVLW .55
MOVWF CONTA0
RET1
MOVLW .181
MOVWF CONTA1
RET2
NOP
NOP
DECFSZ CONTA1,F
GOTO RET2
DECFSZ CONTA0,F
GOTO RET1
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_INI
BANK1
BSF TRISC,3
BSF TRISC,4
MOVLW B'00001011'; SE CARGA UN VALOR DE 11 PARA ALCANZAR 400KHZ DE VELOCIDAD A 20 MHZ
MOVWF SSPADD
CLRF SSPSTAT
BANK0
MOVLW B'00101000' ; BIT7= BIT DE COLISION EN ESCRITURA BIT6= BIT DE RECEPCION DE NUEVO BYTE. EN TRANSMISION NO IMPORTA
MOVWF SSPCON ; BIT5= BIT DE HABILITACIÓN DEL MÓDULO I2C/SPI BIT4= BIT DE SELECCION DE POLARIDAD DEL RELOJ, EN MODO MAESTRO NO IMPORTA
;B3-B0 BITS DE SELECCION DE USO DEL PUERTO, 1000 I2C MAESTRO CON RELOJ ACTIVO OSCILADOR Y SSPADD
CLRF PIR1
CALL I2C_IDLE
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_IDLE
BANK1
BTFSC SSPSTAT,R_W
GOTO $-1
MOVF SSPCON2,W
ANDLW 0X1F
BTFSS STATUS,Z
GOTO $-3
BANK0
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_Start
CALL I2C_IDLE
BANK1
BSF SSPCON2,SEN
BTFSC SSPCON2,SEN
GOTO $-1
BANK0
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_RESTART
BANK1
BSF SSPCON2,RSEN
BTFSC SSPCON2,RSEN
GOTO $-1
BANK0
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_Read
CALL I2C_IDLE
BANK1
BSF SSPCON2,RCEN
BTFSC SSPCON2,RCEN
GOTO $-1
BTFSS SSPSTAT,BF
GOTO $-1
BANK0
MOVF SSPBUF,W
MOVWF DATO
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_WRITE
BCF FLAG,0; INICIALIZAMOS FLAG COMO ERROR
CALL I2C_IDLE
MOVF DATO,W; MOVEMOS DATO A BUFFER I2C
MOVWF SSPBUF
BANK1
BTFSC SSPSTAT,R_W ; ESPERAMOS QUE TERMINE EL ENVÍO
GOTO $-1
BTFSS SSPCON2,ACKSTAT; VERIFICAMOS RECIBIR AL ACK
GOTO OKACK
BSF SSPCON2,PEN; ERROR ACK ENVÍA STOP
BANK0
RETURN
OKACK
BANK0
BTFSS PIR1,SSPIF; ESPERAMOS LA FINALIZACIÓN DEL NOVENO CLOCK
GOTO $-1
BCF PIR1,SSPIF
BSF FLAG,0; VOLVEMOS LA BANDERA CON 1= OK
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_SENDACK
BANK1
BCF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
BANK0
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_SENDNACK
BANK1
BSF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
BANK0
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
I2C_Stop
BANK1
BSF SSPCON2,PEN
BANK0
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;WriteI2CByte
;DIRH<1:0> ;paginas de la eeprom en las cuales grabar
;DIRL ;direccion baja de la posicion de eeprom en las cuales grabar
;DATASSP ;dato a grabar
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
WRITEI2C_SHT; RUTINA DE INICIALIZACIÓN DE LA MEMORIA EEPROM
CALL I2C_Start;enviar START, esperar a que se libere el BUS
MOVLW B'10000000';INDENTIFICADOR SHT21
MOVWF DATO
CALL I2C_WRITE
BTFSS FLAG,OK
RETURN
MOVLW B'11111110'; RESET POR PROGRAMACIÓN
MOVWF DATO
CALL I2C_WRITE
BTFSS FLAG,OK
RETURN
CALL I2C_Stop
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
READI2CBYTE
CALL I2C_Start
MOVLW B'10000000'; IDENTIFICADOR DEL SENSOR
MOVWF DATO
CALL I2C_WRITE
BTFSS FLAG,OK
RETURN
MOVLW B'11110011';COMANDO PARA TEMPERATURA
MOVWF DATO
CALL I2C_WRITE
BTFSS FLAG,OK
RETURN
CALL I2C_RESTART
CALL DEMORA
; CALL I2C_Start
MOVLW B'10000001'
MOVWF DATO
CALL I2C_WRITE
BTFSS FLAG,OK
RETURN
CALL DEMORA
CALL I2C_Read
MOVWF DATL
CALL I2C_SENDACK
CALL I2C_Read
MOVWF DATH
CALL I2C_SENDNACK
CALL I2C_Stop
RETURN; FLAG =1 OK!
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CURRENTI2CREAD
CALL I2C_Start
MOVLW B'10100001'
MOVWF DATO
CALL I2C_WRITE
BTFSS FLAG,OK
RETURN
CALL I2C_Read
CALL I2C_SENDNACK
CALL I2C_Stop
RETURN
;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
END
EL CUAL REALIZA UNA LECTURA CONTINUA DE LA TEMPERATURA.... ESPERO QUE LES SIRVA ANEXA VIENE UNA SIMULACIÓN EN PROTEUS
SALUDOS DESDE MEXICO