TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: overgeoo en 21 de Abril de 2006, 11:12:58
-
Wenas, a veri si me podeis echar una mano con este codigo q le estoy dando vueltas y vueltas y no veo en la tonteria en la q me he tenido q equivocar:
#include <18f2520.h>
#device adc=10
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 4000000)
#use standard_io(A)
void lectura_pt100(void);
void main(void)
{
set_tris_a(0xFF); //puerto A como entratada
setup_adc_ports(AN0); //ponemos el terminal A0 como entrada analogica
setup_adc(ADC_CLOCK_INTERNAL);
lectura_pt100();
}
void lectura_pt100(void)
{
float tension;
int valor;
set_adc_channel(0); //leemos del canal 0
valor = read_adc();
delay_us(10);
tension = ( (valor * 5 ) / 1023 ) ;
}
Pos este es el cogido, al simularo en proteus e intentar sacar el valor de tension por la lcd me da valor 0, muchas gracias por adelantado.
-
Mirando tu programa por encima....¿donde estan las funciones de manejo de la lcd?
Suerte!!! :wink:
-
Wenas, gracias por responder tan rapido, es q he puesto el codigo resumido jejej, pq es algo largo y por no liar he puesto solo la parte q me iba mal q es lo de leer del convertidor, lo de imprimir del lcd eso si me sale bien, aqui lo tienes con la parte de manejo de la lcd.
#include <18f2520.h>
#device adc=10
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 4000000)
#use standard_io(A)
void lectura_pt100(void);
void main(void)
{
set_tris_a(0xFF); //puerto A como entratada
setup_adc_ports(AN0); //ponemos el terminal A0 como entrada analogica
setup_adc(ADC_CLOCK_INTERNAL);
lectura_pt100();
}
void lectura_pt100(void)
{
float tension, resistencia;
int valor;
set_adc_channel(0);
valor = read_adc();
delay_us(10);
tension = ( (valor * 5 ) / 1023 ) ;
Resistencia = -4.36321 + (514.671*tension);
Temp_Agua = -8658.01* (-0.3908 + sqrt(0.152725 + 0.000231*(100 - Resistencia) ) );
impresion = 1; //para imprimir la nueva temperatura
lcd_putc("\f");
for ( ; ; )
{
printf( lcd_putc, "Tension = %.5f",tension );
lcd_gotoxy(1,1);
}
}
-
Bueno, en tu programa completo decirte que solamente lee el conversor una vez, deberias realizar un bucle repetitivo en el main, concretamente en la funcion que llama a la captura del conversor y su representacion, no realizar el bucle infinito en la funcion de la captura del conversor y su posterior representacion como tienes tu....
#include <18f2520.h>
#device adc=10
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 4000000)
#use standard_io(A)
void lectura_pt100(void);
void main(void)
{
set_tris_a(0xFF); //puerto A como entratada
setup_adc_ports(AN0); //ponemos el terminal A0 como entrada analogica
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
for(;;){ ///bucle...
lectura_pt100();
delay_ms(200); //cada 200ms realiza una lectura del conversor y muestra los nuevos datos por la lcd
} ///...infinito
}
void lectura_pt100(void)
{
float tension, resistencia;
int valor;
valor = read_adc();
delay_us(10);
tension = ( (valor * 5 ) / 1023 ) ;
Resistencia = -4.36321 + (514.671*tension);
Temp_Agua = -8658.01* (-0.3908 + sqrt(0.152725 + 0.000231*(100 - Resistencia) ) );
impresion = 1; //para imprimir la nueva temperatura
lcd_putc("\f");
printf( lcd_putc, "Tension = %.5f",tension );
}
No se si funcionara, ya que no me he metido a profundizar tu codigo...pero asi por lo menos realizas lecturas del conversor constantes...
Suerte!!! :wink:
-
Gracias por responder tan rapido de nuevo jejej, si si tienes razon ya se que esta mal y que solo leo una vez pero lo hize asi para hacer pruebas, lo que tenog hecho es lo siguiente en proteus tengo conectada a la linea A0 una entrada de tension constante de 3 voltios, y lo que queria hacer era leer esa tension con el A/D y mostrarla por el lcd, pero no se pq me saca como valor 0.0000, en el rar te adjunto el archivo de proteus, el codigo completo y el coff, veras q hay tres botones y demas, de eso olvidate nada mas darle al play ya me pongo a leer de la entrada A0 y me saca como valor 0.00000.
Weno muchas gracias vszener.
-
Lo primero dar las gracias a Vszener por sus respuestas :), el problema ya esta resuelto el error estaba en que ponia la resolucion del A/D a 10 bits y declaraba la variable valor que leia del adc como tipo int y claro en un int no entran los 1023 valores necesiarios y me empezaba a fallar el codigo, la solucion fue nada mas poner la variable valor como tipo long y ya funcion :D.
Y ahora tengo otro problema no logro poner la entrada A3 como voltaje de referencia para el A/D, alguien me puede echar una mano con eso?.
El codigo que tengo es el siguiente:
setup_adc_ports(AN0 | VSS_VREF );
Con esto lo que intento es poner AN0 como entrada analogica y poner la entrada AN3 como Vref high. Para probar el funcionamiento he hecho la sigueinte simulacion en proteus, en la que en AN0 conecto una fuente de DC a la que le pongo el valor que quiero y despues muestro esa tension por el lcd, pero como veis el funcionamiento no es el correcto, espero q me podias ayudar y de nuevo muchas gracias por adelantado a todos.
-
Me respondere a mi mismo pq acabo de arreglar el problema, como no era otra bobada como siempre jejej, el problema estaba en que no configuraba AN3 como una entrada analogica, en cuanto la he puesto como entrada analogica ya funciona a la perfeccion :D. Adjunto el codigo ya arreglado pro si a alguna os hace falta alguna vez. El circuito basicamente lo que hace es medir una tension de como maximo 0.5 voltios que le ponemos a la entrada AN0 a traves del generador de continua, el circuito es capaz de dar una precision de hasta tres decimales. Weno un saludo a todos.