TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Pinolillo16 en 27 de Enero de 2014, 02:21:36
-
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 :lol: :lol: :lol: 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 :-/ :-/
-
esta muy bien tener un programa de referencia para el uso de este sensor.supongo que tambien lees la humedad.porque si solo lo usas para la temperatura.
veo mejor usar el DS18B20 que es mas barato,puedes poner en paralelo creo que hasta 128 sensores y a una distancia del maestro de hasta 1km.
yo tengo la libreria casi terminada.y tengo un ejemplo aqui: http://www.todopic.com.ar/foros/index.php?topic=24397.60
-
GRACIAS GROUNDMAN, COMO SIEMPRE SORPRENDES Y AYUDAS MUCHO, EFECTIVAMENTE LA IDEA ES UTILIZAR HUMEDAD TAMBIEN PERO QUISE COMPARTIRLO PORQUE ES MI PRIMER PROGRAMA CON I2C JAJAJ ALGO BASICO PARA TI, APROVECHANDO TENDRAS ALGUN EJEMPLO PARA EL DHT11? YA QUE HACE TIEMPO QUISE UTILIZARLO PERO NO PUDE. SALUDOS