TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ekaminante en 05 de Abril de 2005, 14:40:00
-
amigos necesito sensar temperatura y mostrala en un lcd, alguno de ustedes me puede ayudar con un programa que realice la conversion A/D?. les agracezco.
-
///////////////////////////// DIRECTIVAS DE PREPROCESADO /////////////////////////////
#include <16F876.h> // Dispositivo a utilizar
#device adc=8 // Resolución de 8 bits para el conversor ADC
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT // Fusibles
#use delay(clock=10000000) // Velocidad del cristal
// Con la siguiente directiva,se optimiza código,ya que el compilador asume que en cada momento que accedemos al puerto B,
// este está configurado adecuadamente(como entrada ó como salida) para la acción que vamos a ejercer sobre él
// Si no añadimos esta directiva,cada vez que accedamos al puerto,el compilador generará código para
// asegurar que el puerto esté configurado como salida si lo que vamos a hacer es escribir en él y viceversa
#use fast_io(B)
////////////////////////////////////// GLOBALES //////////////////////////////////////
// Estos parámetros son visibles desde todo el código,por eso se les llama globales.
// Al ser constantes,lo más práctico es declararlas aquí.
const int escala = 255; // Escala del conversor ADC (8 bits)
const float v_max = 25.2; // Voltaje máximo que entrega mi fuente
////////////////////////////////////// RUTINAS ////////////////////////////////////////
// Como se observa en la cabecera,los nombres de los parámetros no tienen por qué ser iguales
// que los de la llamada ( calcula_voltaje(valor,voltaje) ),pero sí deben estar en el mismo
// orden.
// "voltaje",al ser de entrada-salida,debe llevar el símbolo "&" delante
void calcula_voltaje(int val,float &voltaje)
{
// "escala" y "v_max" son parámetros globales,por eso son visibles dentro
// de esta rutina(y en todo el código).Si no lo fueran,al no estar declarados dentro de ella ni
// ser parámetros de entrada ó entrada-salida como los de la cabecera,se produciría
// error al compilar
voltaje = (val*v_max)/escala;
}
/////////////////////////////////////// PRINCIPAL //////////////////////////////////////
void main()
{
int valor; // La declaración de variables SIEMPRE debe ir lo primero
float voltaje; //
set_tris_B(0b00000000); // Puerto B configurado como salida
port_b_pullups(FALSE); // Desactivamos pull-ups del puerto B
setup_adc_ports(RA0_RA1_RA3_ANALOG); //Configura A0,A1 y A3 como entradas analógicas y Vdd como voltaje de referencia
setup_adc(ADC_CLOCK_INTERNAL); // Reloj para el conversor
set_adc_channel(0); // Seleccionamos el canal 0 (RA0)
for(;;) // Bucle infinito,que se ejecuta de forma indefinida
{
valor = read_adc(); // Capturamos señal analógica que entra por el canal previamente seleccionado (RA0)
// Esta rutina tiene a "valor" como parámetro de entrada y a "voltaje" como parámetro de entrada-salida.
// "valor",al ser de entrada,podrá ser utilizado por la rutina pero NO podrá ser modificado.
// "voltaje",al ser de entrada-salida,si puede ser modificado dentro de la rutina
calcula_voltaje(valor,voltaje); // Le mandamos el parámetro "valor" y nos devuelve "voltaje"
delay_ms(10); // Retardo de un 10 ms
}
}
gfp :-)
-
gracias voy a intentarlo.