Módulo TIMER0 Autor: Santiago Gonzalez Correo: santigoro en gmail.com Aquí se muestran las funciones para trabajar con el TIMER0 de los PIC16F. 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 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 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; }