Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

Necesito ayuda - Haciendo un termometro digital

spunky_leeloo

Bovino maduro
Desde
5 Mar 2008
Mensajes
368
Que tal bakunos, necesito de su ayuda, estoy tratando de hacer un termometro digital con un pic16F873A, tengo el libro Microcontroladores PIC - Diseño practico de aplicaciones 2a parte de Jose María Angulo Usategui donde esta el codigo del ensambladro, mi problema es el circuito, no se como conectar mi LCD, es marca Tianma, modelo TM162AAA6-2. Tampoco se como conectar el sensor de temperatura, es un LM35. Navegando por la web encontre una conexion para el sensor pero necesito un LM336 y en mi ciudad no lo he podido encontrar, no lo venden en las electronicas que he visitado, necesito su ayuda urgente ya que es un proyecto de residencia profecional y la verdad no se mucho de microcontroladore, de antemano gracias. Les dejo la imagen del circuito del libro que les comento:



Saludos

=============================================================================

Hola bakunos, creo que me tarde un poquito en comentar mis resultados jejeje pero es que estaba por terminar la carrera y me estaba yendo mal en unas materias etc. pero lo prometido es deuda, al fin logre hacer mi termometro digital con el pic 16f877a, no con el ejemplo de mi libro pero de que funciona funciona, aki les subo las imagenes para que vean:

Esta es la imagen del circuito electrico, lo simule en el ISIS proteus

simulaciontermometropic.jpg


Aki tambien les dejo el codigo en ensamblador, este codigo no yo lo hice, aki les dejo la info del autor: Ing. Miguel Angel Piedra Angeles, http://www.cosasdeingenieria.com

;***********************************************************************************
; *
; programa: termometro.asm *
; *
; este programa muestra el funcionamiento del conversor analógico - digital que *
; contiene el pic16f877a. toma la señal analógica del sensor de temperatura y la *
; convierte a digital. una vez hecha la conversión la despliega en la pantalla lcd *
; dándonos como resultado la temperatura que hay en el ambiente. *
; *
; velocidad del reloj: 4mhz tipo de reloj: xt *
; perro guardián: deshabilitado protección del código: off *
; *
;***********************************************************************************

list p=16f877a
radix hex
include "p16f877a.inc" ;declaración de la librería

;*******************declaración de los bits de configuración*******************

__config _cp_off&_cpd_off&_lvp_off&_wdt_off&_xt_osc

;************************** declaración de registros **************************
cblock 0x20
num1,num2,num3

;******************************************************************************

pointer ;registros utilizados en
unidades,decenas ;binbcd y en la adquisición de
centenas,millares ;datos
datoh
unidadest,decenast
centenast,millarest
sample
shift
;******************************************************************************

promedio
contador
endc

cblock 0x70 ;se coloca a datol en una de las localidades de
datol ;memoria que están espejadas en banco0 y banco1
endc

;******************************************************************************

;****************declaración de los pines de control de la lcd*****************

#define rs portc,2
#define en portc,1

;******************************************************************************

;**************puerto donde estarán los pines de datos de la lcd***************

portlcd equ portd

;******************************************************************************

;******************************************************************************
;comandos de la pantalla

limpiar equ b'00000001' ;limpia toda la pantalla
renglon1 equ b'10000000' ;coloca en el renglón 1
renglon2 equ b'11000000' ;coloca en el renglón 2
dison equ b'00001100' ;enciende el display
home equ b'00000010' ;va a la dirección 0
shiftdl equ b'00011100' ;rota el lcd a la izquierda
shiftdr equ b'00011000' ;rota el lcd a la derecha
shiftcl equ b'00010100' ;rota el cursor a la izquierda
shiftcr equ b'00010000' ;rota el cursor a la derecha

;******************************************************************************

org 0x00 ;vector de reset
goto inicio ;salto al inicio del código

org 0x04 ;vector de interrupción

;*******************tablas de datos para la subrutina binbcd*******************

tablau ;tabla de unidades
movf pointer,w
addwf pcl,f
retlw d'2'
retlw d'6'
retlw d'8'
retlw d'4'
retlw d'2'
retlw d'6'
retlw d'8'
retlw d'4'
retlw d'2'
retlw d'1'

tablad ;tabla de decenas
movf pointer,w
addwf pcl,f
retlw d'1'
retlw d'5'
retlw d'2'
retlw d'6'
retlw d'3'
retlw d'1'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'

tablac ;tabla de centenas
movf pointer,w
addwf pcl,f
retlw d'5'
retlw d'2'
retlw d'1'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'
retlw d'0'

;******************************************************************************

inicio: bsf status,rp0 ;cambio a banco1

clrf trisd ;configuro todo portd como salida
bcf trisc,1 ;configuro portc,1 como salida(en)
bcf trisc,2 ;configuro portc,2 como salida(rs)

bcf status,rp0 ;cambio a banco0

clrf portd ;apago posible latchs en portd
clrf portc ;apago posible latchs en portc

call init_adqui ;llamo a la subrutina de configuración de
;el modulo adc
call initlcd ;llamo a la subrutina de inicialización
;de la pantalla lcd 16x2

start call d16x2 ;llamo a la subrutina que escribe el mensaje inicial

;****************************************
;codigo que hace que se ejecute el comando de rotación a la derecha 46 veces

movlw .46
movwf shift

vuelta call retardo
movlw shiftdr ;comando de rotación
call cmd

decfsz shift,f
goto vuelta

;****************************************

movlw limpiar ;comando de limpieza de pantalla
call cmd

opera movlw renglon1 ;comando para empezar a escribir a partir
call cmd ;de la primera dirección del renglon1

clrf promedio ;se limpia al registro promedio

call adqui ;se llama a la subrutina de adquisición de
;datos del adc
call binbcd ;llamo a la subrutina que convierte de binario
;a ascii

;****************************************

movf millares,w ;mando los datos adquiridos a la lcd
call dato

movf centenas,w
call dato

movf decenas,w
call dato

movf unidades,w
call dato

;****************************************

movlw b'11011111' ;dato para el símbolo de grado
call dato

movlw 'c' ;la c de celsius
call dato
goto opera ;regreso al inicio del programa principal

;**************************subrutina de los mensajes **************************

d16x2 movlw "p"
call dato

movlw "r"
call dato

movlw "o"
call dato

movlw "y"
call dato

movlw "e"
call dato

movlw "c"
call dato

movlw "t"
call dato

movlw "o"
call dato

movlw " "
call dato

movlw "p"
call dato

movlw "d"
call dato

movlw "m"
call dato

movlw renglon2
call cmd

movlw "t"
call dato

movlw "e"
call dato

movlw "r"
call dato

movlw "m"
call dato

movlw "o"
call dato

movlw "m"
call dato

movlw "e"
call dato

movlw "t"
call dato

movlw "r"
call dato

movlw "o"
call dato

movlw " "
call dato

movlw "a"
call dato

movlw "/"
call dato

movlw "d"
call dato

return

;**********************subrutina de adquisición del adc**********************

adqui: call sampletime ;retardo de adquisición
bsf adcon0,go ;inicia la conversión
btfsc adcon0,go ;ya se termino la conversión?
goto $-1 ;no? pregunta de nuevo
banksel adresh ;si, continua
movf adresh,w ;lee la parte más significativa
movwf datoh ;guárdalo en datoh
banksel adresl ;cambio a banco1
movf adresl,w ;lee la parte menos significativa
movwf datol ;guárdalo en datol
banksel portb ;cambio a banco0

bcf status,c ;borra el bit de acarreo
rrf datoh,f ;elimino el bit menos significativo
rrf datol,f ;para ocupar solo 9 bits
return

sampletime:

movlw .225
movwf sample

espera_s:

nop
nop
decfsz sample,f
goto espera_s
return


;***********************subrutina de inicialización lcd************************

initlcd:

movlw b'00110000' ;1
call cmd
movlw b'00110000' ;2
call cmd
movlw b'00110000' ;3
call cmd
movlw b'00111100' ;4
call cmd
movlw b'00001000' ;5
call cmd
movlw b'00000001' ;6
call cmd
movlw b'00000110' ;7
call cmd
movlw dison ;8
call cmd
movlw home
call cmd
return


;*****************subrutina que envía los caracteres a la lcd******************

dato movwf portlcd
bsf rs
nop
nop
nop
bsf en
call retardo5ms
bcf en
return

;******************subrutina que envía los comandos a la lcd*******************

cmd movwf portlcd
bcf rs
nop
nop
nop
bsf en
call retardo5ms
bcf en
return

;******************************************************************************

retardo5ms

movlw d'1'
movwf num3

otra25 movlw d'100'
movwf num2

otra15 movlw d'166'
movwf num1

otra5 decfsz num1,f
goto otra5

decfsz num2,f
goto otra15

decfsz num3,f
goto otra25
return

;******************************************************************************

retardo movlw d'3'
movwf num3

otra25a movlw d'200'
movwf num2

otra15a movlw d'166'
movwf num1

otra5a decfsz num1,f
goto otra5a

decfsz num2,f
goto otra15a

decfsz num3,f
goto otra25a
return

;******************subrutina de conversión de binario a ascii******************

binbcd clrf millares
clrf unidades
clrf decenas
clrf centenas
clrf pointer

otra btfss datoh,7
goto rota

call tablau
addwf unidades,f

call tablad
addwf decenas,f

call tablac
addwf centenas,f
;****************************************

movf unidades,w
sublw d'10'
btfss status,c
goto mayor
goto menor

mayor incf decenas,f
movlw d'10'
subwf unidades,f
goto dece

menor movlw d'10'
subwf unidades,w
btfss status,z
goto dece
goto mayor

;****************************************

dece movf decenas,w
sublw d'10'
btfss status,c
goto mayord
goto menord

mayord incf centenas,f
movlw d'10'
subwf decenas,f
goto cente

menord movlw d'10'
subwf decenas,w
btfss status,z
goto cente
goto mayord

;****************************************

cente movf centenas,w
sublw d'10'
btfss status,c
goto mayorc
goto menorc

mayorc incf millares,f
movlw d'10'
subwf centenas,f
goto milla

menorc movlw d'10'
subwf centenas,w
btfss status,z
goto milla
goto mayorc

;****************************************

milla movf millares,w
sublw d'10'
btfss status,c
goto mayorm
goto menorm

mayorm movlw d'10'
subwf millares,f
goto rota

menorm movlw d'10'
subwf millares,w
btfss status,z
goto rota
goto mayorm

;****************************************

rota rlf datol,f
rlf datoh,f
incf pointer,f
movf pointer,w
sublw d'10'
btfss status,z
goto otra

movlw 0x30
addwf unidades,f

movlw 0x30
addwf decenas,f

movlw 0x30
addwf centenas,f

movlw 0x30
addwf millares,f

return

;**********************subrutina de configuración del cad**********************
init_adqui:

bsf status,rp0
bsf trisa,0
clrf adcon1
bcf status,rp0
movlw b'11000001'
movwf adcon0
return

end ;final del programa
De nuevo les pido una disculpa y espero les sirva la info, saludos :)
 
Que onda, supongo que ya leíste las hojas de datos de los componentes.

en cuanto a la LCD:
1-GND
2-VCC
3-GND (es el contrarte donde 0 es el max, si quieres puedes probar con algunas resistencias para ver como te gusta mas)
4a14- depende de tu progamación y los puertos que estes utilizando
15-LED+ (si lo conectas a 5v se prende el led de la pantalla que generalmete es verde o azul, algunas personas les gusta y otras no, pruebalo)
16-LED- (para cerrar el circuito del LED)

para el sensor:
depende la version que uses (el mas comun es el encapsulado platico de tres pines)
VS-voltaje de alimentacion 5v
GND-GND
Vout-se conecta al ADC del PIC (creo que tu PIC tiene 5 canales para ADC) Vout varia respecto a la tmp (creo que 0.5mv/°C).

toda esta informacion esta mas detallada en las hojas de datos, espero que te sirva
 
mmmm ya veo q lo kieres hacer co el pic pero depronto hay forma de acondicionar al lm35 y la parte de la decodificacion la busque pero no la encontre entre mis polvorientos para este pic.....
 
Te puede servir este circuito, falta la parte de conversion de voltaje a display pero creo que esto es un inicio :)

hrh647.jpg
 
No es necesario el amplificador, recuerda que el adc tiene un voltaje de referencia

Es cierto que tiene un voltaje de referencia, pero muchas veces las variaciones pequeñas no son detectadas por el micro, razon por la cual es conveniente hacer un poco mas expresivas estas modificaciones, en especial tratandose de temperatura.
Esto tambien va a depender de cual es tu rango de trabajo (de que temp a que temp) y de ahi ves que es lo que mas te conviene, la verdad de conexiones no se mucho pero en programacion y micros me defiendo mas y, el adc del micro es muy berrinchudo y a veces requieres ser un poco mas fino con lo que le metes.
Por cierto, rola el libro :)
 
disculpen que tuve abandonado un poquito el tema, estuve muy ocupada en la escuela. Fijense que ya consegui el LM336 pero no he tenido chance de probar el circuito pero navegando un poquito en internet encontre un circuito donde no necesitas nada mas que unas cuantas resistencias y el LM35, descargue el rar que habia en la pagina donde esta la simulacion en el proteus y si funciona, el problema que tengo es que el codigo esta hecho con mikroc y en la escuela me lo piden en ensamblador y la verdad no se nada de programacion, me podrian decir si hay algun convertidor que funcione? este es el codigo:

unsigned char ch;
unsigned int adc_rd;
char *text,*text1;
long tlong;
int i,j;
void main() {
INTCON = 0;
Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0);
LCD_Cmd(LCD_CURSOR_OFF);
LCD_Cmd(LCD_CLEAR);
for(i=0;i<5;i++){
LCD_Cmd(LCD_CLEAR);
text = "INGENIERIA";
LCD_Out(1,i,text);
Delay_ms(100);
}
text1 = "ELECTRONICA";
LCD_Out(2,3,text1);
ADCON1 = 0x82;
TRISA = 0xFF;
Delay_ms(1000);
LCD_Cmd(LCD_CLEAR);

text = "Temperatura:";
for(j=16;j>0;j--){
LCD_Cmd(LCD_CLEAR);
LCD_Out(1,j,text);
Delay_ms(100);
}

while (1) {
adc_rd = ADC_read(2);

tlong = (long)adc_rd * 5000;
tlong = tlong / 1023 - 40;
ch = tlong / 1000;

if(ch==0)
LCD_Chr(2,6,' ');
else
LCD_Chr(2,6,48+ch);

ch = (tlong / 100) % 10;

LCD_Chr_CP(48+ch);
ch = (tlong / 10) % 10;
LCD_Chr_CP(48+ch);
LCD_Chr_CP('.');

ch = tlong % 10;
LCD_Chr_CP(48+ch);
LCD_Chr_CP('C');
Delay_ms(200);
}
}

muchas gracias por sus respuestas, prometo que si logro hacerlo funcionar posteo el proceso por si quieren hacer el proyecto ustedes, mil gracias, saludos
 
Es cierto que tiene un voltaje de referencia, pero muchas veces las variaciones pequeñas no son detectadas por el micro, razon por la cual es conveniente hacer un poco mas expresivas estas modificaciones, en especial tratandose de temperatura.
Esto tambien va a depender de cual es tu rango de trabajo (de que temp a que temp) y de ahi ves que es lo que mas te conviene, la verdad de conexiones no se mucho pero en programacion y micros me defiendo mas y, el adc del micro es muy berrinchudo y a veces requieres ser un poco mas fino con lo que le metes.
Por cierto, rola el libro :)

jejeje no tengo el libro en electronico pero ya lo he visto en alguna pagina de internet, pon el nombre en google y seguro lo encuentras, de hecho yo tengo la primera y segunda parte, la primera presenta informacion y ejemplos del pic16f84 y la segunda del pic16f873 que es basicamente lo mismo que el pic16f877, saludos
 
Volver
Arriba