fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Medicion Temperatura y Humedad con 16F876

10 Respuestas
3 Usuarios
0 Reactions
3,369 Visitas
chapter
Respuestas: 6
Topic starter
(@chapter)
Active Member
Registrado: hace 18 años

Hola, buenas tardes.

Soy nuevo por aqui y ya traigo mi primera duda 😳 .

Necesito realizar un programa para un PIC 16F876 que adquiere datos de dos sensores, uno de temperatura (TMP 01 de Analog Devices) y uno de humedad (HIH 4000 de Honeywell) y los refleja en la pantalla LCD.

El problema es que no se como ni por donde empezar.

Alguien me puede orientar?

Un saludo

Responder
9 respuestas
_jm_
Respuestas: 961
 JM
(@_jm_)
Prominent Member
Registrado: hace 19 años

Pues empieza preguntando las dudas que tengas, http://www.todopic.com.ar/foros/ ete foro es para pics, aqui te resolveran cualquier duda ademas de que el foro esta lleno de codigo.

Responder
chapter
Respuestas: 6
Topic starter
(@chapter)
Active Member
Registrado: hace 18 años

Vale, empiezo por la electronica, las temperaturas a medir serian de entre un rango de 0 y 50 ºC y la humedad realitva entre 0 y 100% entonces he acondicionado la señal con ampops que me deja lo siguiente: por cada ºC incrementa 0,1V siendo 0V para 0 ºC y 5V para 50 ºC, para la humedad a 0% le corresponden 0V y a 100% le corresponde 5V lo que me da una variacion de 0.05V por cada unidad.
Eso seria correcto o deberian tener ambos sensores el mismo incremento por unidad?

Un saludo

Responder
_jm_
Respuestas: 961
 JM
(@_jm_)
Prominent Member
Registrado: hace 19 años

pues tendras ke usar los adc ke llevan los pics si no kieres usar un adc externo, leer los datos y escribirlos en el lcd, no tienen ke tener incrementos iguales cada sensor, tu lees el valor de cada uno y luego lo conviertes a la medida real.

Mira código en el foro ke te dije ke habra para lcd y los adc, en el libro anterior no viene la parte de los adc pero si ejemplos y código para el cld, además de explicarte lo básico del pic. Si puedes echale un ojo, en algunas bibliotecas suelen tenerlo, aunque en internet seguro ke encuentras programas similares ya ke es algo común. Saludos

Responder
chapter
Respuestas: 6
Topic starter
(@chapter)
Active Member
Registrado: hace 18 años

En base a un programa similar que he encontrado he hecho esto, me gustaría si fuera posible que alguien le echara un vistazo. Según he visto debería variar el acondicionamiento para tener 10mV de incremento y conseguir así un incremento de 10 mV por bit, lo que me daría una resolucion de 8 bits, con una Vref+ de 2.56V.

Bueno aquí va el código:

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 PORTB, 1 ;Habilitación del LCD
#define LCDRS PORTB, 0 ;Selección de modo del LCD
#define LCDBUS PORTC ;bus del LCD
org 0x0
goto INICIO

;**************************************************************************************
;*Mensajes 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 conversión
;************************************************************************************
TERMOMETRO ;capturamos y ponemos el valor del sensor
call CANAL_0 ;Capturamos el valor del sensor1
movlw b'10000011' ;posición 3 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 0xC3 ; ;posición 3 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 conversión del Canal 0 al Canal3
;
********************************************
;canal0,inicia CONVERSIÓN,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 adquisición de 20us
movwf tiempo1
decfsz tiempo1,1
goto $-1
bsf ADCON0,2 ;inicia conversión
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>>
LIMPIA_LCD
movlw 0x01
goto CONTROL
;<<Inicio>>
LINEA1_LCD
movlw b'10000000' ;Posiciona el cursor en la 1ra. linea segun la addres ram DB7=1
goto CONTROL
;<<Inicio>>
LINEA2_LCD
movlw 0xC0
goto CONTROL
;<<Subrutina>>
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
;
**********************************************
mensaje1
clrf apun ;inicializa puntero
otra1
call letrero1 ;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
mensaje2
clrf apun ;inicializa puntero
otra2
call letrero2 ;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
;------------------------------------------

Responder
_jm_
Respuestas: 961
 JM
(@_jm_)
Prominent Member
Registrado: hace 19 años

preguntalo en el foro de todopic que ahi le dan bastante al asm y hay bastante gente

Responder
Página 2 / 2
Compartir: