LM35 + PIC programación en PIC C

hola, buenas tardes, yo también tengo un problema en el termómetro que estoy haciendo, uso un PIC16F819, un 7448, dos displays de catodo comun y el sensor de temperatura LM35DZ, el lenguaje de programación es ccs, el programa ya lo hice y en ccs no marca ningun error, pero en el momneto de probarlo en placa fenolica solo se muestran leds encendidos y al aumentar o disminuir la tempratura del sensor no hay cambio en la salida del pic, que parte del programa puede estar mal y como deberia de estar conectado realmente en la placa fenolica??, abajo estan los archivos adjuntos.... y muchas gracias y saludos
 

Adjuntos

  • termometro.jpg
    termometro.jpg
    80.4 KB · Visitas: 31
  • proyecto.txt
    999 bytes · Visitas: 15
...aqui algunas correcciones.
Código:
#include <16f819.h>
#fuses   NOBROWNOUT
#device  adc=10
#use     delay(internal=4MHz)
int valor,temp,digito1,digito2;
void main()
{
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0);
   setup_oscillator(OSC_4MHz);
   set_tris_b(0x00);
   set_tris_a(0x01);
   set_adc_channel(0);
   delay_us(10);
   output_b(0);
   do{
        valor= read_adc(); 
        temp=valor*0.488;
        digito1=temp/10;
        digito2=temp-10*digito1;
        output_b(0b00000000|digito1);
        output_b(0b00010000|digito1);
        delay_ms(5);
        output_b(0b00000000|digito1);
        output_b(0b00000000|digito2);
        output_b(0b00100000|digito2);
        delay_ms(5);
        output_b(0b00000000|digito2);  
     }while (TRUE);
}
newattachment.php
 

Adjuntos

  • Sin título.jpg
    Sin título.jpg
    41.1 KB · Visitas: 31
gracias Saint_ me sirvio mucho, en proteus funciona de maravilla, muchas gracias. Solo que me sale un problema menor, es el caso del LM35, el sensor si mide correctamente la temperatura, antes de conectarlo al AN0 del pic muestra correctamente el voltaje, al conectarlo sube a 2.37V a veces hasta 3V, mire el datasheet y conecte el la salida con un condensador de 1µF y una resitencia de 100Ω, ahi relice pruebas de ensayo y error, pero estos arreglos no me funcionan, ya que el adc del pic16f819 los toma como si fuesen los 2.37V o los 3V, que se podria relizar en estos casos???

gracias por la info de nuevo Saint (y)
 
hola Eduado Mota, ten en cuenta que el an0 del pic es un pin de entrada, antes de conectar el LM35 mide el voltaje que existe en el an0..., debería marcar 0 o un valor similar. Si marca un valor (ejemplo 1.2v) esto indicaría que ese pin se encuentra en mal estado.
 
ya probe con cada uno de los canales, en el programa si queria la an0 escribia set_tris_a (0x01); si es an1 era set_tris_a (0x02); an3 era set_tris_a(0x04); y asi sucesivamente, pero en la salida de los dos display me salia el mismo numero en cada una de las configuraciones osea en portb era 0xC1 y 0x42 y casualmente mido los voltajes de salida en cada configuracion de los canales y todos me marcan 3.68V y 0.04V aquellos que no estan habilitados alguien sabe que se puede hacer en estos casos y saludos a todos.
 
pues de la forma en que se presentan las cosas da la impresion que estas dañadas las entradas analogicas, que tal si subes otra ves el prorama que tiene echo y tambien el esquema tal cual armaste el circuito.
 
asi tengo el circuito en mi protoboard y tambien tengo asi el programa, lo modifique aunque tambien probe con el programa original y el resultado es el mismo
 

Adjuntos

  • pry2.txt
    624 bytes · Visitas: 22
  • pry2.jpg
    pry2.jpg
    78.9 KB · Visitas: 26
Última edición:
Eduardo, vos mismo te esforzas en que no te ayuden.... en estos casos debes subir TODOS los archivos de la simulación, unica forma que los interezados en ayudarte puedan experimentar que sucede. Haces dar la impresion que ni la simulación querés compartir.
En ese código que has subido, elimina los
set_tris_b(0x00);
set_tris_a(0x02);
porque el compilador solo se ocupa de configurar esas cuestiones según se requiera.

Aqui
temp=valor*0.488;
mezclas zanahorias con papas, Todos los valores deben ser int, tenes uno decimal.

digito1=temp/10;
digito2=temp-10*digito1;
existe el operador % que facilita las cosas.

output_b(0b00010000|digito1);
output_b(0b00100000|digito2);
aqui no entiendo que pretendes hacer...
basta con sumarlos.
y obvio tenes que considerar de hacer conversion de tipo (casting),
el compilador podria confundirse, mejor no dejar nada al azar.

Has pensado en emplear la referencia del pic digamos en 1,5v para aumentar la presicion de la lectura?
 
Hola, respecto del codigo.
En ese código que has subido, elimina los
set_tris_b(0x00);
set_tris_a(0x02);
porque el compilador solo se ocupa de configurar esas cuestiones según se requiera.
Respecto del código. Es cierto lo que dice AleSergi, si no se usa la directiva #use fast_io no es necesario usar las instrucciones set_tris_x(); ya que el compilador internamente se ocupa de efectuar las convertir los puertos de entrada a salida o viceversa según la necesidad.
Aquí
temp=valor*0.488;
mezclas zanahorias con papas, Todos los valores deben ser int, tenes uno decimal.
temp=valor*0.488, donde:
temp es tipo entero
valor es tipo entero. Tenemos que: valor*0.488 da como resultado un tipo flotante (la conversión es implícita)
al asignar ese resultado (flotante) a una variable tipo entro solo trasfiere la parte entera del valor y la parte decimal es desechada y también es una conversión implícita. También podría haberse escrito como:
temp=(int)(valor/0.488); o también como: temp=(int)((float)(valor)/0.488); pero el resultado sería el mismo.
digito1=temp/10;
digito2=temp-10*digito1;
existe el operador % que facilita las cosas.
Es cierto sería más fácil hacer: digito2=temp%10; ya que con esta operación se obtiene el residuo de la división.
output_b(0b00010000|digito1);
output_b(0b00100000|digito2);
aqui no entiendo que pretendes hacer...
basta con sumarlos.
0b00010000|digito1 tiene por objeto enviar digito1 en el nible inferior y a su vez "encender" el display correspondiente a digito1, para digito2 es el mismo caso.
Para este caso da lo mismo hacer 0b00010000|digito1 (suma lógica) que 0b00010000+digito1(suma aritmética), el resultado es el mismo.

Respecto del esquema.

Veo que el pin MCLR del pic está al aire y como en los #fuses no está especificado si se puede usar como pin de entrada o salida entonces tienes que conectar ese pin a +5v.

Es obvio y en proteus no muestra los pìnes de alimentación de los circuitos digitales (porque se supone que están alimentados) pero te convienen revisar que existan los +5v en el pin de +vdd y los 0v en el pin de vss del pic "uno nunca sabe pero ese detalle suele causar problemas".

Un error que veo en el esquema es los resistores, estos están mal, los resistores deben ir en serie a la base del transistor, el modo en que tienes conectados los resistores podría causar que se dañen los pines de salida del pic.
 
hola buenas noches

Estoy realizando un termómetro con SENSOR LM35-RANGO(-55 hasta 150°C) y que cuando este en el rango de -55 a -1 se prenda un led verde , cuando este en el rango de 0 a 1 se prenda un led rojo y que cuando este en un rango de 20 a 35 prenda un led amarillo. adjunto el código esta escrito en mplab y adjunto el circuito en proteus 8.17.
Me podrian ayudar en que parte del programa y como puedo realizar que cada led realice la funcion.
 

Adjuntos

  • TERMOMETRO.zip
    29 KB · Visitas: 8
  • THERMOMETER.zip
    18.5 KB · Visitas: 3
Última edición:
Hola, buenas tardes. ¿Me podrían ayudar?
Cuando lo simulo sí funciona pero cuando lo armo en el proto board no funciona.
No sé qué esté mal. No sé si pudieran ayudarme.
M
uchas gracias, saludos.
 

Adjuntos

  • Thermometer.7z
    77.7 KB · Visitas: 2
Supongo que deben ser los fuses de la palabra de configuración.
Si eso que conectas son LED, ya deben haberse quemado.

Mira la modificación del programa adjunto.
PD: Si no puedes abrir la simulación es porque la modifiqué con una versión superior de Proteus.
De igual forma usé PBPX 3.0.8.1

Palabra de configuración recomendada:
Para PBP 2.X:
Código:
@ Device INTRC_OSC_NOCLKOUT,WDT_OFF,PWRT_ON,LVP_OFF
Para PBP 3.X:
Código:
#Config
    __CONFIG _FOSC_INTOSCIO & _WDT_OFF & _PWRTE_ON & _LVP_OFF
#EndConfig

16F819 Fuses.jpg
 

Adjuntos

  • Temperatura.rar
    23.9 KB · Visitas: 10
hola muchas gracias estaba como le puedo hacer para que tenga estos rangos de 0 °C a 2°C, 3°C a 5°C y de 20°C a 40 °C nada mas.
me ayudarias explicarme como le puedo realizar.

gracias saludos
 
Atrás
Arriba