;************************************************* www.x-robotics.com ******* ; PROGRAMA : X-Hygrometer.asm ; Funcion : Lectura de humedad relativa del ambiente utilizando ; un sensor integrado SHT11 de www.sensirion.com ; ; ;--------------------------------------------------------------------------- ; Revision : 1.00 Fecha: 6/1/2005 Programa para : PIC16F876 ; CPU Clock : 4 MHz Tiempo instruccion : 1uS ; WDT : OFF Tipo de reloj : XT ; Code Prot : OFF cfg USART rs232 ; none ; Autor : Daniel C. Martin -> ionitron@x-robotics.com <- ;************************************************* www.x-robotics.com ******* processor 16F876 LIST P=16F876 ;Se indica el modo de procesador INCLUDE ;se incluye la definicion de los ;registros internos __config 3D31 PDel0 EQU 0x21 PDel1 EQU 0x22 PDel2 EQU 0x23 BUFFER EQU 0x24 INNER EQU 0x25 ;delay variable mS OUTER EQU 0x26 ;delay variable mS Digito EQU 0x27 ASCII_H EQU 0x31 ASCII_M EQU 0x32 ASCII_L EQU 0x33 HEXADECIMAL EQU 0x34 ;---------------------------------------------------------------------------- org 0x00 ;vector de inicio goto INICIO org 0x05 ;despues del vector de interrupcion tbl_hygro addwf PCL,f ;tabla con contenido de rotulo constante dt "Humedad:", 0 ;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>> ;---------------------------------------------------------------------------- INICIO bcf STATUS,RP0 ;banco 0 _-_-_-_-_-_-_-_-_-_-_-_-_-_- bcf STATUS,RP1 clrf PORTA ;Limpia latches puerto clrf PORTB ;Limpia latches puerto clrf PORTC ;Limpia latches puerto bsf STATUS,RP0 ;banco 1 _-_-_-_-_-_-_-_-_-_-_-_-_-_- movlw 0x06 ;Puerto A en modo digital movwf ADCON1 clrf TRISA ;PortA como entrada clrf TRISB ;PortB como salida clrf TRISC ;PortC como salida bcf STATUS,RP0 ;banco 0 _-_-_-_-_-_-_-_-_-_-_-_-_-_- clrf PORTA ;Limpia latches puerto clrf PORTB ;Limpia latches puerto clrf PORTC ;Limpia latches puerto clrf Wdata movlw 0x00 movwf RXmsb movwf RXlsb ;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' START call LCD_INI ;Inicia LCD (CFG puertos...) START_1 movlw b'00000001' ;Borrar LCD y Home call LCD_REG movlw b'00000110' ; call LCD_REG movlw b'00001100' ;LCD On, cursor Off,Parpadeo Off call LCD_REG movlw 0x80 ;Direccion caracter call LCD_REG banner1 movf Digito,w ;W=Digito call tbl_hygro ;Coge el caracter iorlw 0x00 ;Compara btfsc STATUS,2 ;Es el ultimo? goto setsens ;Si call LCD_DATOS ;Visualiza caracter incf Digito,f ;Incrementa numero de Digito goto banner1 ;Vuelve a escribir ;terminada inicializacion de lcd y muestra primeros datos setsens ;bsf PORTB,7 call sht11_Set8bits ;bcf PORTB,7 ;############################################################################### bucle call PDelay ;retardo de 2 segundos ;Lee sensor y retorna medidas call sht11_Humedad ;muestrea la medida RXmsb:RXlsb ;mostrar en lcd!************************************************************ inLCD movf RH,w ;muestra la humedad relativa por LCD call Hex_Ascii bcf STATUS,RP0 ;banco 0 bcf STATUS,RP1 movlw 0x89 ;Direccion caracter call LCD_REG bcf STATUS,Z ; movf ASCII_H,W ;sobreescribe el dato xorlw 0x30 ;Comprueba si es cero a la izquierda btfss STATUS,Z goto nocero1 movlw 0x20 ;espacio blanco CALL LCD_DATOS ;Visualiza caracter goto nocero2 nocero1 movf ASCII_H,W ;==================================== CALL LCD_DATOS ;Visualiza caracter bcf STATUS,Z ; movf ASCII_H,W ;sobreescribe el dato xorlw 0x30 ;Comprueba si es cero a la izquierda btfss STATUS,Z goto nocero2 movlw 0x20 ;espacio blanco CALL LCD_DATOS ;Visualiza caracter nocero2 movf ASCII_M,W ;==================================== CALL LCD_DATOS ;Visualiza caracter movf ASCII_L,W ;==================================== CALL LCD_DATOS ;Visualiza caracter movlw '%' CALL LCD_DATOS ;Visualiza caracter ;===================================================================== clrf PORTB goto bucle ;salta la rutina ;########################################################################### ;########################################################################### del_1ms movlw d'199' ;delay 1mS movwf INNER in_lp nop nop decfsz INNER,F goto in_lp return delay movwf OUTER ;vueltas de 1mS out_lp call del_1ms decfsz OUTER,F goto out_lp return ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() Hex_Ascii ;cargar en W el dato hex. ; ;MOVLW .254 MOVWF HEXADECIMAL clrf ASCII_H ;Para BCD D'0' clrf ASCII_M ;Para BCD D'0' clrf ASCII_L ;Para BCD D'0' ; Centenas ; movlw D'100' ;D'100' --> W subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ? goto Decenas ;Si movwf HEXADECIMAL ;Salva el resto incf ASCII_H,F ;Incrementa el contador de centenas BCD goto Centenas ;Vuelve por otros D'100' ; Decenas ; movlw D'10' ;D'10' --> W subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ? goto Unidades ;Si movwf HEXADECIMAL ;Salva el resto incf ASCII_M,F ;Incrementa el contador de decenas BCD goto Decenas ;Vuelve por otros D'10' ; Unidades ; movf HEXADECIMAL,W ;El resto pertenece movwf ASCII_L ;a las unidades BCD clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL ; Bcd_A_Ascii ; movlw H'30' ;H'30' --> W iorwf ASCII_L,F ;Convierte de BCD a ASCII iorwf ASCII_M,F ;Convierte de BCD a ASCII ; movf ASCII_H,F ;ASCII_H --> F btfsc STATUS,Z ;? ASCII_H es D'00' ? goto Espacio ;Si movlw H'30' ;H'30' --> W iorwf ASCII_H,F ;Convierte de BCD a ASCII return ;Retorna ; Espacio ; movlw '0' ;A' ' --> W movwf ASCII_H ;A' ' --> ASCII_H ;movwf ASCII_M ;A' ' --> ASCII_H ;movwf ASCII_L ;A' ' --> ASCII_H return ;Retorna ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;########################################################################### ;=========================================================================== ;--------------------- RUTINAS LCD 2x16 uControlado------------------------- ;=========================================================================== ;########################################################################### LCD_E BSF PORTA,2 ;Activa señal E NOP NOP NOP ;Espera 1uS BCF PORTA,2 ;Desactiva señal E RETURN LCD_BUSY BSF PORTA,1 ;Pone el LCD en modo lectura BSF STATUS,RP0 ;Selecciona el Banco 1 MOVLW 0xFF MOVWF TRISB ;Puerta B act£a de entrada BCF STATUS,RP0 ;Selecciona el Banco 0 BSF PORTA,2 ;Activa el LCD (Señal E) NOP L_BUSY BTFSC PORTB,7 ;Chequea el bit BUSY GOTO L_BUSY ;Est a "1" (Ocupado) BCF PORTA,2 ;Desactiva el LCD (Se¤al E) BSF STATUS,RP0 ;Selecciona el Banco 1 CLRF TRISB ;Puerta B actua como salida BCF STATUS,RP0 ;Selecciona el Banco 0 BCF PORTA,1 ;Pone el LCD en modo escritura RETURN LCD_REG BCF PORTA,0 ;Desactiva RS (Modo instruccion) MOVWF PORTB ;Saca el codigo de instruccion CALL LCD_BUSY ;Espera a que se libere el LCD GOTO LCD_E ;Genera pulso en señal E LCD_DATOS BCF PORTA,0 ;Desactiva RS (Modo instrucci¢n) MOVWF PORTB ;Valor ASCII a sacar por PORTB CALL LCD_BUSY ;Espera a que se libere el LCD BSF PORTA,0 ;Activa RS (Modo dato) GOTO LCD_E ;Genera pulso en señal E LCD_INI MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. RETURN ;**************************************************************************** ;DELAY_5MS genera una temporizacion de 5mS necesario para la secuencia de ;inicio del LCD DELAY_5MS movlw .6 ; 1 set number of repetitions (B) movwf PDel0 ; 1 | PLoop1 movlw .207 ; 1 set number of repetitions (A) movwf PDel1 ; 1 | PLoop2 nop ; 1 clear watchdog decfsz PDel1, 1 ; 1 + (1) is the time over? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) is the time over? (B) goto PLoop1 ; 2 no, loop PDelL1 goto PDelL2 ; 2 cycles delay PDelL2 nop ; 1 cycle delay return ; 2+2 Done ;########################################################################### ;------------------------------------------------------------- ; Description: Waits 2000000 cycles 2 segundos ;------------------------------------------------------------- PDelay movlw .167 ; 1 set number of repetitions (C) movwf PDel0 ; 1 | PLoop0s movlw .41 ; 1 set number of repetitions (B) movwf PDel1 ; 1 | PLoop1s movlw .72 ; 1 set number of repetitions (A) movwf PDel2 ; 1 | PLoop2s nop ; 1 clear watchdog decfsz PDel2, 1 ; 1 + (1) is the time over? (A) goto PLoop2s ; 2 no, loop decfsz PDel1, 1 ; 1 + (1) is the time over? (B) goto PLoop1s ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) is the time over? (C) goto PLoop0s ; 2 no, loop PDelL1s goto PDelL2s ; 2 cycles delay PDelL2s nop ; 1 cycle delay return ; 2+2 Done ;------------------------------------------------------------- INCLUDE ;rutinas sensor humedad SHT11 END