	<sect1 id="timer0" xreflabel="timer0">
		<title>M&oacute;dulo TIMER0</title>
		<para>Autor: Santiago Gonzalez</para>
		<para>Correo: santigoro en gmail.com</para>
		<para>Aqu&iacute; se muestran las funciones para trabajar con el TIMER0 de los PIC16F.
		</para>

		<sect2 id="timer0init" xreflabel="timer0_init">
		<title>timer0_init</title>
		<para>Inicializa TIMER0 con reloj interno (modo timer) o externo (modo counter).</para>

		<screen>
	void timer0_init(unsigned char intern_extern);
		</screen>
		<para>
		intern_extern Establece si se usa reloj interno 
		o reloj/est&iacute;mulo externo (modo counter).
		</para>
		<screen>
	TIMER_INTERN	:Usa reloj interno.
	COUNTER_EXTERN	:Usa reloj/est&iacute;mulo externo (modo counter)

	timer0_init(TIMER_INTERN);
		</screen>
		<para>
		Pone a 0 la cuenta del timer0 y borra flag de interrupciones.
		El contador se incrementa en cada ciclo de intrucciones (Freq.Osc. / 4)
		si no se usa el prescaler.
		</para>
		</sect2>


		<sect2 id="timer0setedge" xreflabel="timer0_set_edge">
		<title>timer0_set_edge</title>
		<para>Establece si el incremento de contador se produce 
		en el flanco de subida o en el flanco de bajada (modo counter).</para>
		<screen>
	void timer0_set_edge(unsigned char set_risfal);
		</screen>
		<para>
		Pone a 0 la cuenta del timer0 y borra flag de interrupciones
		El contador se incrementa en cada subida o bajada en el pin RA4 
		si no se usa prescaler.
		</para>
		<para>
		set_risfal Establece si el incremento de contador se produce 
		en el flanco de subida o en el flanco de bajada.
		</para>
		<para>Las posibles opciones son: </para>
		<screen>
	 RIS_EDGE  
	 FAL_EDGE  
		</screen>
		<para>
		Donde RIS_EDGE establece incremento de contador en flanco de subida (rising) 
		y FAL_EDGE en flanco de bajada (falling).
		</para>
		<screen>
	timer0_set_edge(FAL_EDGE);
		</screen>

		</sect2>


		<sect2 id="timer0setprescaler" xreflabel="timer0_set_prescaler">
		<title>timer0_set_prescaler</title>
		<para>
		Asigna prescaler a timer0 (esto anula el uso de prescaler en watchdog)
		y establece el valor del prescaler.
		</para>
		<screen>
	void timer0_set_prescaler(unsigned char set_presc);
		</screen>
		<para>set_presc Establece el valor del prescaler.</para>
		<para>Las posibles opciones son: </para>
		<screen>
			// Frecuencia de ciclo de instrucciones
	T0_PRESC_DIV_2	// (FOSC/4) del PIC dividido entre 2
	T0_PRESC_DIV_4	// (FOSC/4) del PIC dividido entre 4
	T0_PRESC_DIV_8	
	T0_PRESC_DIV_16	
	T0_PRESC_DIV_32	
	T0_PRESC_DIV_64	
	T0_PRESC_DIV_128	
	T0_PRESC_DIV_256	
	T0_PRESC_OFF	// asignado a wathdog
		</screen>
		<para>
		Cualquier operaci&oacute;n de escritura en el registro TMR0 automaticamente
		pone a 0 el contador del prescaler, aunque mantiene su configuraci&oacute;n.
		</para>
		</sect2>


		<sect2 id="timer0write" xreflabel="timer0_write">
		<title>timer0_write</title>
		<para>Establece (escribe a TMR0) el valor del contador TMR0.</para>
		<screen>
	void timer0_write(unsigned char set_count);
		</screen>
		<para>set_count Establece el valor del contador TMR0.</para>
		</sect2>


		<sect2 id="timer0read" xreflabel="timer0_read">
		<title>timer0_read</title>
		<para>Lee el valor del contador TMR0.</para>
		<screen>
	#define timer0_read()		TMR0
		</screen>
		</sect2>

		<sect2 id="ejemplotimer0" xreflabel="Ejemplo TIMER0">
		<title>Ejemplo M&oacute;dulo TIMER0</title>
		<para> para compilar necesitas los siguientes comandos </para>
		<para>
		<screen>
Ejemplo de compilacion : ./compila.sh ej_timer0.c 16f877a
		</screen>
		</para>
		<para> ej_timer0.c </para>
		<screen>
/*
Ejemplo de utilizaci&oacute;n de las funciones del m&oacute;dulo TIMER0.
v&aacute;lido para la familia 16f87Xa,
En este ejemplo se utiliza el timer0 como contador, 
conectar un pulsador entre RA4 y 0V 
y una resistencia pull-up de unos 5 Kohm entre RA4 y Vdd (+5v),
conectar un led u otra salida a RB7.
RB7 se pondr&aacute; en estado alto (Vdd) cuando se pulse 4 veces.
*/

#include &lt;pic/p16f877a.h>
#include &lt;timer0.h>

int main(void) 
{	
	TRISAbits.TRISA4 = 1;
	TRISBbits.TRISB7 = 0;
	PORTBbits.RB7 = 0;

	timer0_init(COUNTER_EXTERN);	// Inicia timer0 modo contador (reloj o 
					// est&iacute;mulo externo en RA4)

	timer0_set_edge(FAL_EDGE);	// Establece incremento de contador en flanco de bajada

	timer0_set_prescaler(PRESC_DIV_2);	// Establece prescaler en frecuencia 
						// de instrucciones / 2

	while (timer0_read() &lt; 2);	// Espera aqui mientras la cuenta del timer &lt; 2

	PORTBbits.RB7 = 1;
}

		</screen>
	</sect1>
