Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

04/08/2014 #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
06/08/2014 #22

Avatar de Saint_

...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);
}
08/08/2014 #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
09/08/2014 #24

Avatar de Saint_

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.
09/08/2014 #25


Y tendria que reacomodar el trisa y porta del programa me imagino o seria problema del pic?
10/08/2014 #26

Avatar de Saint_

mejo prueba usando otro canal del adc por ejemplo el an2
13/08/2014 #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.
13/08/2014 #28

Avatar de Saint_

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.
13/08/2014 #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
Imágenes Adjuntas
Tipo de Archivo: jpg pry2.jpg (78,9 KB (Kilobytes), 22 visitas)
Archivos Adjuntos
Tipo de Archivo: txt pry2.txt (624 Bytes, 19 visitas)
13/08/2014 #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?
14/08/2014 #31

Avatar de Saint_

Hola, respecto del codigo.
AleSergi dijo: Ver Mensaje
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.
AleSergi dijo: Ver Mensaje
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.
AleSergi dijo: Ver Mensaje
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.
AleSergi dijo: Ver Mensaje
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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.