Autor Tema: PIC16F876 + SHT21  (Leído 2883 veces)

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

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
PIC16F876 + SHT21
« 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  :-/ :-/

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: PIC16F876 + SHT21
« Respuesta #1 en: 28 de Enero de 2014, 17:16:21 »
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
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re: PIC16F876 + SHT21
« Respuesta #2 en: 29 de Enero de 2014, 01:53:52 »
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