Módulo timer1 Autor: Santiago Gonzalez Correo: santigoro en gmail.com Aquí se muestran las funciones para trabajar con el timer1 de los PIC16F. timer1_init Inicializa timer1 con reloj interno (modo timer) o externo (modo counter). El modo counter puede ser sincronizado con el reloj del pic o asíncrono. void timer1_init(unsigned char set_mode); set_mode Establece el modo de funcionamiento. TIMER_INTERN :Usa reloj interno. COUNTER_SYNC :Usa reloj/estímulo externo (modo counter), síncrono. COUNTER_ASYNC :Usa reloj/estímulo externo (modo counter), asíncrono. timer1_init(TIMER_INTERN); Pone a 0 la cuenta del timer1 y borra flag de interrupciones. timer1_enable Habilita (inicia la cuenta) el timer1. #define timer1_enable() T1CONbits.TMR1ON = 1 En modo timer el contador se incrementa en cada ciclo de intrucciones (Fosc./4) si no se usa el prescaler. En modo COUNTER el incremento se produce en el flanco de subida de la señal de referencia. timer1_disable Deshabilita (para la cuenta) el timer1. #define timer1_disable() T1CONbits.TMR1ON = 0 timer1_osc_enable Habilita el uso de oscilador externo, conectado entre T1OSO y T1OSI. #define timer1_osc_enable() T1CONbits.T1OSCEN = 1 Los pines T1OSO y T1OSI son configurados como entradas, ingnorando la configuración de TRIS de esos pines. Se toma el flanco de subida de la señal en T1OSI. timer1_osc_disable Deshabilita el uso de oscilador externo. #define timer1_osc_disable() T1CONbits.T1OSCEN = 0 En este caso se toma el flanco de subida de la señal en T1OSO. timer1_set_prescaler Establece el valor del prescaler. void timer1_set_prescaler(unsigned char set_presc); set_presc Establece el valor del prescaler. Las posibles opciones son: T1_PRESC_DIV_1 // Frecuencia de ciclo de instrucciones (FOSC/4) T1_PRESC_DIV_2 // (FOSC/4) del PIC dividido entre 2 T1_PRESC_DIV_4 // (FOSC/4) del PIC dividido entre 4 T1_PRESC_DIV_8 Cualquier operación de escritura en el registro TMR1L ó TMR1H automaticamente pone a 0 el contador del prescaler, aunque mantiene su configuración. timer1_write Establece (escribe a TMR1L y TMR1H) el valor del contador del timer1. void timer1_write(unsigned int set_count); set_count Establece el valor del contador del timer1. timer1_read Lee el valor del contador del timer1. unsigned int timer1_read(void); Devuelve un valor de tipo int (16 bites). Ejemplo Módulo timer1 para compilar necesitas los siguientes comandos Ejemplo de compilacion : ./compila.sh ej_timer1.c 16f877a ej_timer1.c /** * \file * \brief Ejemplo para trabajar con timer1.h * \author Santiago Gonzalez * \date Enero-2009 * \version v0.01 * \par Leeme: * Diagrama Esquematico: PIC_GCC_LIBRARY_PATH/schematics/pdf/ * Ejemplo de compilacion : ./compila.sh ej_timer1 16f877a . * Ejemplo de utilización de las funciones del módulo TIMER1. * válido para la familia 16f, * En este ejemplo se utiliza el timer1 junto con un contador por software, * para hacer un led parpadeante que varía en velocidad: * conectar un led u otra salida a RB7. * El led parpadeará en ráfagas de 10, acelerando su velocidad en cada ráfaga, * a 4 velocidades distintas, correspondientes a los 4 posibles valores del prescaler. */ #include <pic/p16f877a.h> #include <timer1.h> void parpadeo() // Rutina que hace 10 parpadeos de led { unsigned char contador = 0; while ( contador < 10 ) { while (timer1_read() < 32767) // mitad del tiempo encendido PORTBbits.RB7 = 1; while (timer1_read() > 32767) // mitad del tiempo apagado PORTBbits.RB7 = 0; contador++; } } int main(void) { TRISBbits.TRISB7 = 0; // RB7 como salida PORTBbits.RB7 = 0; timer1_init(TIMER_SYNC); // Inicia timer1 modo timer bucle: timer1_set_prescaler(T1_PRESC_DIV_8); // Establece prescaler en frecuencia de instrucciones / 8 timer1_enable(); // Inicia la cuenta parpadeo(); // LLama a la rutina que hace 10 parpadeos timer1_disable(); // Para el timer1 timer1_write(0); // Pone timer1 a 0 timer1_set_prescaler(T1_PRESC_DIV_4); // Establece prescaler en frecuencia de instrucciones / 4 timer1_enable(); parpadeo(); timer1_disable(); timer1_write(0); timer1_set_prescaler(T1_PRESC_DIV_2); // Establece prescaler en frecuencia de instrucciones / 2 timer1_enable(); parpadeo(); timer1_disable(); timer1_write(0); timer1_set_prescaler(T1_PRESC_DIV_1); // Establece prescaler en frecuencia de instrucciones / 1 timer1_enable(); parpadeo(); timer1_disable(); timer1_write(0); goto bucle; }