'****************************************************************
'* Name : SHT11_ASM.BAS *
'* Author : Miguel Angel Meza Campos *
'* Notice : Copyright (c) 2016 *
'* : All Rights Reserved *
'* Date : 10/16/2016 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
DEFINE LCD_DREG PORTB
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 6
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 7
DEFINE LCD_BITS 8
DEFINE LCD_LINES 2
DEFINE OSC 20
' ------------------------------------------------------------------------------
' Descripción del programa
' ------------------------------------------------------------------------------
'
' Este programa demuestra la interface hacia el SHT11 y muestra el raw data
' ------------------------------------------------------------------------------
' I/O Definiciones
' ------------------------------------------------------------------------------
ShtData VAR PORTA.1 ' bi-directional data
Clock VAR PORTA.2
ASM
ShtData equ 1
Clock equ 2
ENDASM
' ------------------------------------------------------------------------------
' Constantes
' ------------------------------------------------------------------------------
ShtTemp CON %00000011 ' read temperature
ShtHumi CON %00000101 ' read humidity
' ------------------------------------------------------------------------------
' Variables
' ------------------------------------------------------------------------------
sincbit VAR BYTE
CMData VAR BYTE
soRH VAR WORD
soT VAR WORD
RXmsb VAR BYTE
RXlsb VAR BYTE
' ------------------------------------------------------------------------------
' Inicialización
' ------------------------------------------------------------------------------
Initialize:
ADCON1=6 'Configura el puerto A y E como digital
PORTA.1=1
PORTA.2=0
TRISA = %00000000 'Configura puerto A1 como entrada y A2 como salida
CALL SHT_Connection_Reset 'Realiza un reset de la conexión con el sensor
PAUSE 500
Main:
LCDOUT $FE,1 'Limpia la LCD y coloca cursor en posicion 0
LCDOUT " SHT1x Demo"
lcdout $fe,$c0 'Mueve el cursor al inicio de la segunda linea
LCDOUT "----------------"
PAUSE 2000
Main2:
CMData=ShtTemp 'Prepara el valor del comando para leer la temperatura
CALL SHT11_CMD 'Ejecuta comando de lectura de temperatura
CALL adqtime 'Espera a que el sensor termine la lectura de la temperatura
CALL read_datos 'Lee los datos de la temperatura del sensor
soT.HIGHBYTE=RXmsb 'Preparao los datos leidos (byte alto)
soT.LOWBYTE=RXlsb 'Byte bajo
LCDOUT $FE,1 'Limpia la LCD y colocal cursor en posicion 0
LCDOUT " Raw Data Temp:"
LCDOUT $FE,$C0 'Mueve el cursor al inicio de la segunda linea
LCDOUT DEC soT,"dec "
LCDOUT HEX soT,"hex"
PAUSE 2000 'Espera 2 segundos antes de leer la humedad
CMData=ShtHumi 'Prepara el valor del comando para leer la Humedad
CALL SHT11_CMD 'Ejecuta comando de lectura de Humedad
CALL adqtime 'Espera a que el sensor termine la lectura de la humedad
CALL read_datos 'Lee los datos de la humedad del sensor
soRH.HIGHBYTE=RXmsb 'Preparo los datos leidos (Byte alto)
soRH.LOWBYTE=RXlsb 'Byte bajo
LCDOUT $FE,1 'Limpia la LCD y colocal cursor en posicion 0
LCDOUT "Raw Data Humedad"
LCDOUT $FE,$C0 'Mueve el cursor al inicio de la segunda linea
LCDOUT DEC soRH,"dec "
LCDOUT HEX soRH,"hex"
PAUSE 2000
GOTO Main2
' ------------------------------------------------------------------------------
' Subroutines
' ------------------------------------------------------------------------------
' connection reset: 9 clock cyles with ShtData high, then start sequence
'
asm
_SHT_Connection_Reset
MOVLW .9
MOVWF _sincbit
bsf PORTA,ShtData ;Esto es igual a bsf PORTA,1
clock_pulse:
bsf PORTA,Clock ;Esto es lo mismo que bsf PORTA,2. Genera flanco de subida en el Clock
nop
nop
bcf PORTA,Clock ;Esto es lo mismo que bcf PORTA,2. Genera flanco de bajada en el Clock
nop
nop
decfsz _sincbit,f
GOTO clock_pulse
transmission_start
bsf PORTA,Clock ;Genera un flanco de subida en el Clock
nop
nop
bcf PORTA,ShtData ;Baja el nivel del pin de datos
nop
nop
bcf PORTA,Clock ;Genera un flanco de bajada en el Clock
nop
nop
bsf PORTA,Clock ;Genera un flanco de subida en el Clock
nop
nop
bsf PORTA,ShtData ;Sube el nivel del pin de datos
nop
nop
bcf PORTA,Clock ;Genera flanco de baja en el clock
RETURN
ENDASM
;///////////////////////////////////////////////////////////////////////////
;--------------------- Manda comando AL SHT11 ------------------------------
asm
_SHT11_CMD
movwf _CMData ;guarda el comando en variable
CALL transmission_start
bcf STATUS,C ;borra carry
clrf _sincbit
cont_send
rlf _CMData,F ;rota a la izquierda, bit alto en carry
btfsc STATUS,C ;comprueba si es 1 o 0
GOTO uno
cero
GOTO $+1
GOTO $+1
bsf PORTA,2 ;SCK rising edge _-
GOTO $+1
GOTO $+1
bcf PORTA,2 ;SCK falling edge -_
GOTO sht11_compTX ;salta
uno
GOTO $+1
GOTO $+1
bsf PORTA,2 ;SCK rising edge _-
GOTO $+1
GOTO $+1
bcf PORTA,2 ;SCK falling edge -_
;Comprobacion para 8 rotaciones, una por bit del comando.
sht11_compTX
movlw 0x07 ;comprobacion 8 bits
subwf _sincbit,W ;Compara
btfsc STATUS,Z ;Es el ultimo?
GOTO SHT_waitACK
incf _sincbit,f ;Incrementa numero de sincbit
GOTO cont_send ;Vuelve a escribir
;///////////////////////////////////////////////////////////////////////////
;---------------- Espera la llegada de ACK desde el sensor -----------------
SHT_waitACK
bsf STATUS,5 ;banco 1
bsf TRISA
,1 ;pone
DATA port
,0 como entrada
bcf STATUS,5 ;banco 0
GOTO $+1
GOTO $+1
GOTO $+1
ACKrx
bsf PORTA,2 ;SCK rising edge
GOTO $+1
GOTO $+1
btfsc PORTA
,1 ;comprueba
DATA RETLW .1
bcf PORTA,2 ;SCK falling edge
retlw .0
ENDASM
;ack desde SHT11 detectado y llegada de datos
ASM
_adqtime
btfsc PORTA
,1 ;comprueba
DATA GOTO _adqtime ;NO, bucle
RETURN
ENDASM
;///////////////////////////////////////////////////////////////////////////
;------------- LECTURA DE DATOS DESDE EL SHT11 (Byte alto) ----------------------
ASM
_read_datos
movlw 0x08
MOVWF _sincbit
high_byte rlf _RXmsb,F
bcf _RXmsb,0
bsf PORTA,2 ;SCK rising edge
btfsc PORTA,1
bsf _RXmsb,0
bcf PORTA,2 ;SCK falling edge
decfsz _sincbit,F
GOTO high_byte
bsf STATUS,5 ; register page 1
bcf TRISA,1 ; SHT11_DATA es salida
bcf STATUS,5 ; register page 0
bcf PORTA,1 ;Coloca el bit de ACK
nop
bsf PORTA,2 ;SCK rising edge
GOTO $+1
GOTO $+1
bcf PORTA,2 ;SCK falling edge
GOTO $+1
GOTO $+1
bsf STATUS,5 ; register page 1
bsf TRISA,1 ; SHT11_DATA es entrada
bcf STATUS,5 ; register page 0
movlw 0X08
movwf _sincbit
low_byte rlf _RXlsb,F
bcf _RXlsb,0
bsf PORTA,2
btfsc PORTA,1
bsf _RXlsb,0
bcf PORTA,2
decfsz _sincbit,F
GOTO low_byte
bsf STATUS,5 ; register page 1
bCf TRISA,1 ; SHT11_DATA es salida
bcf STATUS,5 ; register page
bSf PORTA,1 ;Coloca bit de NACK
nop
bsf PORTA,2 ;SCK rising edge
GOTO $+1
GOTO $+1
bcf PORTA,2 ;SCK falling edge
GOTO $+1
GOTO $+1
RETURN
ENDASM