Autor Tema: Medir Temperatura y Humedad con 16f876  (Leído 2988 veces)

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

Desconectado Chapter

  • PIC10
  • *
  • Mensajes: 1
Medir Temperatura y Humedad con 16f876
« en: 09 de Agosto de 2007, 10:12:46 »
Hola, buenas tardes.

Estoy realizando un pequeño programa con un 16f876 que adquiere datos de dos sensores analogicos, uno de temperatura y otro de humedad, ambos tienen un incremento de 10 mV por ºC o 1% de humedad, los valores medidos debe mostrarlos en un display LCD 16x2 conectado al puerto B del pic. La Vref+ es de 2,56 V. Creo que el programa es correcto, pero no dispongo aun de la pantalla LCD por lo que no puedo probarlo, de todas formas al ser mi primer programa me gustaria que alguien le hechara un vistazo y me dijera si está todo correcto.

Código: [Seleccionar]
;**************************************************************************************
;*Autor: David Suárez García
;*cristal:4Mhz     
;*Temperatura y Humedad que se muestran en LCD16X2
;***************************************************************************************
list p=16F876
Include "p16f876.inc"
__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_OFF & _XT_OSC & _LVP_OFF
;<<--usadas para eeprom
ADDRES equ 70H
VALUE equ 71H
uni equ 0x20 ;Usados para manejar los datos a mostrar en display
dec equ 0x21
cen equ 0x22
tiempo1 equ 0x23 ;Usados para temporizar
tiempo2 equ 0x24
apun equ 0x25 ;Usado para apuntar la letra a colocar en el LCD
dato equ 0x26
#define CARRY STATUS, 0 ;Bit de acarreo
#define CERO STATUS, 2 ;bandera indicador de resultado cero
#define LCDE PORTA,  3 ;Habilitación del LCD
#define LCDRS PORTA,  1 ;Selección de modo del LCD
#define LCDBUS PORTB ;bus del LCD
org 0x0
goto INICIO


;**************************************************************************************
;*Letreros a mostrar en el LCD
;***************************************************************************************

mensaje1
MOVF apun,W ;carga apuntador en W
ADDWF PCL,1 ;Salta W instrucciones adelante
retlw "T"
retlw "E"
retlw "M"
retlw "P"
retlw ":"
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw b'11011111' ;Simbolo de º
retlw "C"
retlw "$"
mensaje2
MOVF apun,W ;carga apuntador en W
ADDWF PCL,1 ;Salta W instrucciones adelante
retlw "H"
retlw "U"
retlw "M"
retlw "E"
retlw ":"
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw " "
retlw "%"
retlw "$"


;**************************************************************************************
;*INICIAMOS
;***************************************************************************************
INICIO
bsf 3,5 ;banco1
movlw b'11111111'
movwf TRISA         ;puerto A como entradas
movlw b'00000011' ;6HSB en ADRESH, AN0 a AN5 analogicos con RA3 Vref+
movwf ADCON1
clrf TRISB
clrf TRISC
bcf 3,5 ;banco0

call INICIALIZA_LCD ;Inicializamos el LCD 16X2
;mensaje de TEMP:     ºC
call LINEA1_LCD
call mensaje1
;mensaje de HUME:      %
call LINEA2_LCD
call mensaje2


;**************************************************************************************
;*Rutina que coloca en la pantalla del LCD los resultados de la conversion
;***************************************************************************************
TERMOMETRO ;capturamos y ponemos el valor del sensor
call CANAL_0 ;Capturamos el valor del sensor1
movlw b'10000110' ;posicion 6 de linea 1
call CONTROL ;
movfw cen ;ponemos las centenas en el LCD
call DATO
movfw dec ;ponemos las decenas en el LCD
call DATO
movfw uni ;ponemos las unidades en el LCD
call DATO
;vemos el canal 2
call CANAL_2 ;Capturamos el valor del sensor3
movlw 0xC6 ; ;posicion 6 de linea 2
call CONTROL ;
movfw cen ;ponemos las centenas en el LCD
call DATO
movfw dec ;ponemos las decenas en el LCD
call DATO
movfw uni ;ponemos las unidades en el LCD
call DATO

goto TERMOMETRO


;**************************************************
;Subrutinas de conversion del Canal 0 al Canal3
;**************************************************
;fosc/8,canal0,inicia CONVERSION,enciende el modulo
CANAL_0
movlw b'01000001'
goto canal
CANAL_2
movlw b'01010001'
goto canal
CANAL_3
movlw b'01011001'
goto canal
canal
movwf ADCON0
movlw d'7' ;con el 7 logramos el tiempo de adquisicion de 20us
movwf tiempo1
decfsz tiempo1,1
goto $-1
bsf ADCON0,2 ;inicia conversion
btfsc ADCON0, 2;Espera que termine de convertir
goto $ -1
movfw ADRESH
movwf dato
call DECIMAL ;convertimos los 10bits del adc a ascii
return


;**************************************************
;Subrutina de conversion Binario a ASCII
;convierte los 8bits del ADC en ASCII para ser enviados por
;el puerto SERIE y/o LCD separados en unidades, decenas, centenas
;**************************************************
DECIMAL
movfw dato
movwf uni ;Convierte el dato presente en W en UNI, DEC y CEN
clrf dec
clrf cen
movlw d'100' ;Determina la cant. de centenas
centena
subwf uni, 1
btfss CARRY
goto cien
incf cen, 1
goto centena
cien
addwf uni, 1
movlw d'10' ;Determina la cant. de decenas
decena
subwf uni, 1
btfss CARRY
goto diez
incf dec, 1
goto decena
diez
addwf uni, 1 ;Uni queda con la cant. de unidades (sin decenas ni centenas)
movlw 0x30 ;Le suma 30h a los valores de UNI, DEC, CEN y MIL para que queden en ASCII
addwf uni, 1
addwf dec, 1
addwf cen, 1
return


;**************************************************
;*Subrutinas para display LCD16X2 compatible con hitachi
;* a 8bits
;**************************************************
INICIALIZA_LCD
movlw b'00111000' ;Comunicación con el LCD a ocho bits - Dos líneas de texto
call CONTROL
movlw b'00000110' ;Mensaje estático, se desplaza el cursor hacia la derecha
call CONTROL
movlw b'00001100' ;Enciende el display - Oculta el cursor - Caracter fijo
call CONTROL
movlw b'00000001' ;Limpia la pantalla y pone cursor en posición inicial
call CONTROL
return
;<<---limpa todo el LCD---->>
LIMPIA_LCD
movlw 0x01
goto CONTROL
;<<---Inicio de la Primera linea posicion 00 de la DDRAM---->>
LINEA1_LCD
movlw b'10000000' ;Posiciona el cursor en la 1ra. linea segun la addres ram DB7=1
goto CONTROL
;<<---Inicio de la Segunda Linea posicion 40 de la DDRAM---->>
LINEA2_LCD
movlw 0xC0
goto CONTROL
;<<---Subrutina que pone en el bus el dato o control---->>
CONTROL
bcf LCDRS ;Pone en bajo la línea de modo del LCD (Control)
goto ENVIAR ;Se saltea la sig. línea
DATO
bsf LCDRS ;Pone en alto la línea de modo del LCD (Dato)
ENVIAR
movwf LCDBUS ;Coloca el dato o control a enviar en el bus del LCD
bsf LCDE ;Habilita el LCD
movlw d'15'
call DEMORA ;Demora 15ms
bcf LCDE ;Deshabilita el LCD
return


;*************************************************
;*Subrutina de retardo mediante ciclos de instruccion
;*************************************************
DEMORA
movwf tiempo2 ;Demora tantos milisegundos como valor en w
TOP2
movlw d'110'
movwf tiempo1
TOP1
nop
nop
nop
nop
nop
nop
decfsz tiempo1, 1
goto TOP1
decfsz tiempo2, 1
goto TOP2
return


;*************************************************
;Mensajes;utilizando direccionamiento INDEXADO
;barremos las tablas al inicio de este programa
;*************************************************
mensaje_1
clrf apun ;inicializa puntero
otra1
call mensaje1 ;obtiene el siguiente carácter apuntado
movwf dato ;lo guarda en dato
sublw "$" ;Compara con el signo "$"
btfsc CERO ;es fin de mensaje?
return ;si es, retorna
movfw dato ;ponemos la letra en W
call DATO ;si no es "$" envía el dato
incf apun,1 ;apunta al siguiente carácter
goto otra1 ;repite
return
mensaje_2
clrf apun ;inicializa puntero
otra2
call mensaje2 ;obtiene el siguiente carácter apuntado
movwf dato ;lo guarda en dato
sublw "$" ;Compara con el signo "$"
btfsc CERO ;es fin de mensaje?
return ;si es, retorna
movfw dato ;ponemos la letra en W
call DATO ;si no es "$" envía el dato
incf apun,1 ;apunta al siguiente carácter
goto otra2 ;repite
return

;------------------------------------------
end
;------------------------------------------



Gracias y Un saludo



 

anything