#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,bits=8)
#use fast_io(B)
#device adc=10 

const int escala = 1023;      // Escala del conversor ADC (10 bits)
const float v_max = 4.9;     // Voltaje máximo que entrega mi fuente

// 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 y al no ser parámetros de entrada ó entrada-salida como los de la cabecera,
//se produciría error al compilar
voltaje = (val*v_max)/escala;
}

void main()
{  int   valor;        //declaración de variables
   float voltaje;     //valor=(0 a 1023), voltaje=(0 a 4.9)volt.

   set_tris_b(0x00);    // Aquí declaro al PORTB como salida
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

output_low(PIN_B0);
printf("Presione cualquier tecla para empezar la conversión ADC");
getc();

while (1)
     {
      set_adc_channel(0);     // Seleccionamos el canal 0 (RA0)
      valor = read_adc();    // Capturamos señal analógica que entra por el canal AN0
      // Le mandamos el parámetro "valor" y nos devuelve "voltaje"
      calcula_voltaje(valor,voltaje);
      putc(voltaje);
      
      //prende y apaga el pin B0

      if ((PIN_B0)==1)          //puedo hacer esto..? B0 está como salida
         output_low(PIN_B0);
      else
         output_high(PIN_B0);

      delay_ms(400);
     }
}
