Módulo TIMER0

Autor: Santiago Gonzalez

Correo: santigoro en gmail.com

Aqui se muestran las funciones para trabajar con el TIMER0 de los PIC16F87X.

timer0_init

Inicializa TIMER0 con reloj interno (modo timer) o externo (modo counter).

	void timer0_init(unsigned char intern_extern);
		

intern_extern Establece si se usa reloj interno o reloj/estímulo externo (modo counter).

	TIMER_INTERN	:Usa reloj interno.
	COUNTER_EXTERN	:Usa reloj/estímulo externo (modo counter)

	timer0_init(TIMER_INTERN);
		

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.

timer0_set_edge

Establece si el incremento de contador se produce en el flanco de subida o en el flanco de bajada (modo counter).

	void timer0_set_edge(unsigned char set_risfal);
		

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.

set_risfal Establece si el incremento de contador se produce en el flanco de subida o en el flanco de bajada.

Las posibles opciones son:

	 RIS_EDGE  
	 FAL_EDGE  
		

Donde RIS_EDGE establece incremento de contador en flanco de subida (rising) y FAL_EDGE en flanco de bajada (falling).

	timer0_set_edge(FAL_EDGE);
		

timer0_set_prescaler

Asigna prescaler a timer0 (esto anula el uso de prescaler en watchdog) y establece el valor del prescaler.

	void timer0_set_prescaler(unsigned char set_presc);
		

set_presc Establece el valor del prescaler.

Las posibles opciones son:

			// Frecuencia de ciclo de instrucciones
	PRESC_DIV_2	// (FOSC/4) del PIC dividido entre 2
	PRESC_DIV_4	// (FOSC/4) del PIC dividido entre 4
	PRESC_DIV_8	
	PRESC_DIV_16	
	PRESC_DIV_32	
	PRESC_DIV_64	
	PRESC_DIV_128	
	PRESC_DIV_256	
	PRESC_OFF	// asignado a wathdog
		

Cualquier operación de escritura en el registro TMR0 automaticamente pone a 0 el contador del prescaler, aunque mantiene su configuración.

timer0_write

Establece (escribe a TMR0) el valor del contador TMR0.

	void timer0_write(unsigned char set_count);
		

set_count Establece el valor del contador TMR0.

timer0_read

Lee el valor del contador TMR0.

	#define timer0_read()		TMR0
		

Ejemplo Módulo TIMER0

para compilar necesitas los siguientes comandos

Ejemplo de compilacion : ./compila.sh ej_timer0.c 16f877a
		

ej_timer0.c

/*
Ejemplo de utilización de las funciones del módulo TIMER0.
vá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á en estado alto (Vdd) cuando se pulse 4 veces.
*/

#include <pic/p16f877a.h>
#include <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í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() < 2);	// Espera aqui mientras la cuenta del timer < 2

	PORTBbits.RB7 = 1;
}