TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: josegranada en 05 de Octubre de 2009, 11:15:55
-
quiero hacer un proyecto que tiene un termometro con un lm35 y una lcd, asi como un pic 16f877, me podrian decir que tengo que tensiones de referencia son las que tengo que poner para que me de la temperatura que tiene realmente el termometro.
gracias
y otra pregunta:
tengo este codigo:
#include "16f877.h"
#byte pb=6
#byte pa=5
#byte pc=7
#byte pd=8
#use delay(clock=4m) //OJOOOOO PONER ANTES ESTE COMANDO PARA EL LCD
#include "pantallaend.c"
void main ()
{
float cifra;
int16 lectura;
set_tris_d(0x00);
set_tris_a(0xFF);
///RECOJE EL VALOR LEDIO DEL ADC
///CODIGO PARA LEER LM35 USANDO VOLTAJE DE REFERENCIA DE 2.5 VOLT
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( RA0_ANALOG);
delay_us(10);
while(1)
{
lectura = read_adc();
delay_us(10);
cifra = (float)lectura;
cifra *= 0.244; ////por que Vref / 1024 = 0.00244 luego x 100
lcd_init();
printf(lcd_putc,"Termometro = %3.1f%cC ",cifra,233);///223 = signo de grados
delay_us(20);
}
}
me gustaria saber porque no me sale bien la temperatura, porque me sale en la lcd ermometro=3.4 y no si varia la temperatura en el termometro no me sale la nueva temperatura en la lcd, como puedo hacer para que se modifique esa temperatura y tambien para que salga bien lo de la lcd.
gracias a todos.
-
La escala que aplicas depende del circuito externo que hayas armado para el LM35. Porque para 150ºC cuanto tensión entregará el LM35 al PIC? Y para 0ºC?
Después en el código falta setear que entrada analógica medir (set_adc_channel(0)), lcd_init() va al inicio y no dentro del while y para mostrar el carácter de grados centígrados podes usar ß (Alt+225).
También junto con la configuración de fuses debes indicarle al compilador que utilizarás conversor AD del pic a 10 bits (#device adc=10)
Saludos!
-
gracias por la pronta respuesta, no se como medir para hacer la escala de la tension de referencia, asi como tampoco se para lo que sirve #device adc=10, y eso me da error.
sigue sin mostrarme el dato en la pantalla
-
este (http://www.todopic.com.ar/foros/index.php?topic=4587.0) hilo te puede ayudar un poco el #device adc=10 quiere decir que la conversion A/D será de 10bits
edit: qué es este include #include "pantallaend.c"
-
pues lo de "pantallaend.c" es que tengo situada la lcd en el puerto d y ese es el driver modificado.
me pueden explicar la funcion printf
alguien tiene el manual de ccs en español
-
Ayuda de CCS en español (http://www.4shared.com/file/111113641/5a2c63a2/Manual_Compilador_C_Para_PICs.html)
-
hola de nuevo, me gustaria saber si alguien me puede ayudar a hallar las tensiones de referencia que tengo que poner para mi circuito que adjunto a continuacion,
tambien les dejo el codigo para que me ayuden a resolver el porque no me salen las temperaturas que marca realmente el termometro, y si vario el termometro que se varie tambien en la lcd.
#include "16f877.h"
#device ADC=10
#byte pb=6
#byte pa=5
#byte pc=7
#byte pd=8
#use delay(clock=4m)
#include "pantallaend.c"
int16 lectura=0x00;
int grados_term1=0;
int16 lectura2=0x00;
int grados_term2=0;
void termometro1(void) // lectura del canal del primer termometro (interior)
{
//while(1)
//{
set_adc_channel(0);
delay_ms(1);
lectura=read_adc();
delay_ms(1);
grados_term1 = (int) ((lectura*391)/1000);
//}
lcd_putc( " T1= termometro1()");
}
void termometro2(void)// lectura del canal del segundo termometro termometro(exterior)
{
set_adc_channel(1);
delay_ms(1);
lectura2=read_adc();
delay_ms(1);
grados_term2 = (int) ((lectura2*391)/1000);
lcd_putc ("T");
}
void main ()
{
set_tris_d(0x00);
set_tris_a(0xFF);
lcd_init();
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( RA0_ANALOG);
termometro1();
termometro2();
}
gracias a todos por su ayuda
-
yo tambien estoy trabajando un termometro pero con una pt100 y me tiene barado la rutina de conversion de binario a bcd con 10 bits si me pueden ayudar les agradesco
-
yo tambien estoy trabajando un termometro pero con una pt100 y me tiene barado la rutina de conversion de binario a bcd con 10 bits si me pueden ayudar les agradesco
Yo estoy tratando de hacer un termometro con pic 16f88 y tengo hecha la rutina de bin a bcd. Es esta:
; 16-bit binary to BCD conversion
; pete griffiths 2007
; http://picprojects.org.uk/projects/pictips.htm
;
; These file register variables will
; need to be defined elsewhere.
; binH
; binL
; bcdH
; bcdM
; bcdL
; counter
; temp
;
; binH, binL contain the binary value to
; convert. Conversion process destroys contents.
; Result is in bcdH, bcdM, bcdL on return.
; Call _bin2bcd to perform conversion.
;
; Executes in 454 instructions
_bin2bcd
movf binL,W
movwf binL_TEMP;guardo el valor que convierto
movf binH,W
movwf binH_TEMP;guardo el valor que convierto
movlw d'16'
movwf counter
clrf bcdL
clrf bcdM
clrf bcdH
_repeat rlf binL,F
rlf binH,F
rlf bcdL,F
rlf bcdM,F
rlf bcdH,F
decfsz counter,F
goto _adjust
movf binL_TEMP,W;restauro lo que converti
movwf binL
movf binH_TEMP,W
movwf binH
return
_adjust movlw d'14'
subwf counter,W
skpnc
goto _repeat
movfw bcdL
addlw 0x33
movwf temp
movfw bcdL
btfsc temp,3
addlw 0x03
btfsc temp,7
addlw 0x30
movwf bcdL
movfw bcdM
addlw 0x33
movwf temp
movfw bcdM
btfsc temp,3
addlw 0x03
btfsc temp,7
addlw 0x30
movwf bcdM
goto _repeat
; we only need to do the test and add +3 for
; the low and middle bcd variables since the
; largest binary value is 0xFFFF which is
; 65535 decimal so the high bcd byte variable
; will never be greater than 6.
; We also skip the tests for the first two
; shifts.
-
Hola.
Aquí (http://www.todopic.com.ar/foros/index.php?topic=21738.msg169539#msg169539) hay una rutina para el manejo de display de 7 segmentos y pasar a bcd.
Aquí (http://www.todopic.com.ar/foros/index.php?topic=30199.msg254358#msg254358) esta el hard para conectar una termocupla y/o un LM35.
Saludos