	<sect1 id="adc" xreflabel="adc">
		<title>M&oacute;dulo ADC</title>
		<para>Autor: Santiago Gonzalez</para>
		<para>Correo: santigoro en gmail.com</para>
		<para>
			Entender la conversi&oacute;n Anal&oacute;gico-Digital: 
			<ulink url="http://es.wikipedia.org/wiki/Conversion_analogica-digital">aqui</ulink>
		</para>
		<para>Aqu&iacute; se muestran las funciones para trabajar con el modulo ADC 10 bits Interno de los PIC16F87X.
		</para>
		<sect2 id="adcinit" xreflabel="adc_init">
		<title>adc_init</title>
		<para>
		Inicia el m&oacute;dulo ADC con la confiraci&oacute;n establecida 
		en los parametros de entrada: frecuencia de oscilador y configuraci&oacute;n de entradas.
		El m&oacute;dulo ADC quedar&aacute; configurado y listo para usar, pero ser&aacute; activado hasta 
		que se habra un canal para evitar consumo innecesario de corriente.</para>
		<screen>
	void adc_init(unsigned char set_fosc, unsigned char set_channel);
		</screen>
		<para>set_fosc Establece la frecuencia de adc.</para>
		<para>Las posibles opcines son: </para>
		<screen>
	FRECUENCIA DE OSCILADOR ADC:

	FOSC_DIV_2	// Frecuencia de oscilador del PIC / 2
	FOSC_DIV_4	
	FOSC_DIV_8	
	FOSC_DIV_16	
	FOSC_DIV_32	
	FOSC_DIV_64	
	FOSC_RC	// Oscilador interno del m&oacute;dulo ADC
		</screen>
		<para>
		set_channel Define que pines se usar&aacute;n como entradas anal&oacute;gicas
		o como Vref externa.
		Cuando solo se define un pin como voltaje de referencia, este ser&aacute; Vref+, 
		referencia positiva y estar&aacute; en RA3, cuando se definen dos entradas como Vref
		la positiva ser&aacute; RA3 y la negativa RA2.</para>
		<para>Las posibles opcines son: </para>
		<screen>
	CONFIGURACION DE ENTRADAS Y Vref(PCFG en ADCON1) 
	
	A8_R0		// 8 entradas Anal&oacute;gicas y 0 como Vref (Vref+ = Vdd , Vref- = Ground)
	A7_R1		// 7 entradas anal&oacute;gicas y Vref+ en AN3
	A5_R0		 
	A4_R1	
	A3_R0	
	A2_R1	
	A0_R0	
	A6_R2		// 6 entradas Anal&oacute;gicas, Vref+ en AN3 y Vref- en AN2
	A6_R0
	A5_R1	
	A4_R2	
	A3_R2	
	A2_R2
	A1_R0	
	A1_R2	
		</screen>
		<para>
		Consultar el Datasheet del pic utilizado para ver canales diponibles,
		no se deben inicializar canales no implementados en el modelo de pic a usar,
		por ejemplo, el pic16f876a solo tiene 5 canales ADC, nunca usar A6_R0 en este pic.
		</para>
		</sect2>


		<sect2 id="adcsetchannel" xreflabel="adc_set_channel">
		<title>adc_set_channel</title>
		<para>Establece configuraci&oacute;n de pines de entrada ADC y Vref</para>
		<screen>
	void adc_set_channel(unsigned char set_channel);
		</screen>
		<para>
		set_channel Define que pines se usar&aacute;n como entradas anal&oacute;gicas
		o como Vref externa.
		Cuando solo se define un pin como voltaje de referencia, este ser&aacute; Vref+, 
		referencia positiva y estar&aacute; en RA3, cuando se definen dos entradas como Vref
		la positiva ser&aacute; RA3 y la negativa RA2.</para>
		<para>Las posibles opcines son las mismas que en adc_init: A2_R1 , etc. </para>
		</sect2>


		<sect2 id="adcopen" xreflabel="adc_open">
		<title>adc_open</title>
		<para>Abre canal seleccionado y activa m&oacute;dulo ADC</para>
		<screen>
	void adc_open(unsigned char channel);
		</screen>
		<para>channel Establece el canal ADC a leer</para>
		<para>Las posibles opciones son: </para>
		<para>
		<screen>
	CHANNEL_0  
	CHANNEL_1  
	CHANNEL_2  
	CHANNEL_3  
	CHANNEL_4  
	CHANNEL_5  
	CHANNEL_6  
	CHANNEL_7 
		</screen>
		</para>
		</sect2>


		<sect2 id="adcread" xreflabel="adc_read">
		<title>adc_read</title>
		<para>Lee un canal previamente abierto</para>
		<screen>
	unsigned int adc_read(void);
		</screen>
		</sect2>


		<sect2 id="adcclose" xreflabel="adc_close">
		<title>adc_close</title>
		<para>Cierra m&oacute;dulo ADC.</para>
		<screen>
	void adc_close(void);
		</screen>
		<para>
		La configuraci&oacute;n queda tal como se inicializ&oacute; la &uacute;ltima vez,
		se puede volver a activar el m&oacute;dulo ADC mediante adc_open(channel), 
		sin ejecutar adc_init()
		</para>
		</sect2>


		<sect2 id="ejemploadc" xreflabel="Ejemplo ADC">
		<title>Ejemplo de M&oacute;dulo ADC</title>
		<para> para compilar necesitas los siguientes comandos </para>
		<para>
		<screen>
Ejemplo de compilacion : ./compila.sh ej_adc_87Xa.c 16f877a
		</screen>
		</para>
		<para> ej_adc_87Xa.c </para>
		<screen>
/*
Ejemplo de utilizaci&oacute;n de las funciones del m&oacute;dulo ADC.
v&aacute;lido para la familia 16f87Xa,
Se utiliza el canal 0, 
conectar los voltajes a convertir a RA0,
conectar un led u otra salida a RB7.
RB7 se pondr&aacute; en estado alto (Vdd) cuando la tensi&oacute;n en RA0 sea mayor que 1/2 Vdd.
*/
#include &lt;pic/p16f877a.h>
#include &lt;adc.h>

int main(void) 
{	
	TRISAbits.TRISA0 = 1;			// A0 como entrada
	TRISBbits.TRISB7 = 0;			// B7 como salida

	adc_init( FOSC_DIV_32, A1_R0);		// Inicializa m&oacute;dulo ADC
	adc_open(CHANNEL_0);			// Abre canal 0 ADC

	while (1)
	{	
		if (adc_read() > 512 )
			PORTBbits.RB7 = 1;	// Enciende led
		else
			PORTBbits.RB7 = 0;	// Apaga led
	}	
}
	</sect1>
