LM35 + PIC programación en PIC C

#21
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

#22
...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);
}
 

Adjuntos

#23
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)
 
#24
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.
 
#27
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.
 
#28
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.
 
#29
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

Última edición:
#30
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?
 
#31
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.
 
Arriba