Pièce jointe « capitulo1j.sgml »
Téléchargement <sect1 id="timer1" xreflabel="timer1">
<title>Módulo timer1</title>
<para>Autor: Santiago Gonzalez</para>
<para>Correo: santigoro en gmail.com</para>
<para>Aquí se muestran las funciones para trabajar con el timer1 de los PIC16F.
</para>
<sect2 id="timer1init" xreflabel="timer1_init">
<title>timer1_init</title>
<para>
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.
</para>
<screen>
void timer1_init(unsigned char set_mode);
</screen>
<para>
set_mode Establece el modo de funcionamiento.
</para>
<screen>
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);
</screen>
<para>
Pone a 0 la cuenta del timer1 y borra flag de interrupciones.
</para>
</sect2>
<sect2 id="timer1enable" xreflabel="timer1_enable">
<title>timer1_enable</title>
<para>Habilita (inicia la cuenta) el timer1.</para>
<screen>
#define timer1_enable() T1CONbits.TMR1ON = 1
</screen>
<para>
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.
</para>
</sect2>
<sect2 id="timer1disable" xreflabel="timer1_disable">
<title>timer1_disable</title>
<para>Deshabilita (para la cuenta) el timer1.</para>
<screen>
#define timer1_disable() T1CONbits.TMR1ON = 0
</screen>
</sect2>
<sect2 id="timer1oscenable" xreflabel="timer1_osc_enable">
<title>timer1_osc_enable</title>
<para>Habilita el uso de oscilador externo, conectado entre T1OSO y T1OSI.</para>
<screen>
#define timer1_osc_enable() T1CONbits.T1OSCEN = 1
</screen>
<para>
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.
</para>
</sect2>
<sect2 id="timer1oscdisable" xreflabel="timer1_osc_disable">
<title>timer1_osc_disable</title>
<para>Deshabilita el uso de oscilador externo.</para>
<screen>
#define timer1_osc_disable() T1CONbits.T1OSCEN = 0
</screen>
<para>
En este caso se toma el flanco de subida de la señal en T1OSO.
</para>
</sect2>
<sect2 id="timer1setprescaler" xreflabel="timer1_set_prescaler">
<title>timer1_set_prescaler</title>
<para>
Establece el valor del prescaler.
</para>
<screen>
void timer1_set_prescaler(unsigned char set_presc);
</screen>
<para>set_presc Establece el valor del prescaler.</para>
<para>Las posibles opciones son: </para>
<screen>
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
</screen>
<para>
Cualquier operación de escritura en el registro TMR1L ó TMR1H automaticamente
pone a 0 el contador del prescaler, aunque mantiene su configuración.
</para>
</sect2>
<sect2 id="timer1write" xreflabel="timer1_write">
<title>timer1_write</title>
<para>Establece (escribe a TMR1L y TMR1H) el valor del contador del timer1.</para>
<screen>
void timer1_write(unsigned int set_count);
</screen>
<para>set_count Establece el valor del contador del timer1.</para>
</sect2>
<sect2 id="timer1read" xreflabel="timer1_read">
<title>timer1_read</title>
<para>Lee el valor del contador del timer1.</para>
<screen>
unsigned int timer1_read(void);
</screen>
<para>Devuelve un valor de tipo int (16 bites).</para>
</sect2>
<sect2 id="ejemplotimer1" xreflabel="Ejemplo timer1">
<title>Ejemplo Módulo timer1</title>
<para> para compilar necesitas los siguientes comandos </para>
<para>
<screen>
Ejemplo de compilacion : ./compila.sh ej_timer1.c 16f877a
</screen>
</para>
<para> ej_timer1.c </para>
<screen>
/**
* \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;
}
</screen>
</sect1>Fichiers joints
Pour vous référer aux pièces jointes d'une page, utilisez attachment:filename, comme indiqué ci-dessous dans la liste de fichiers. N'utilisez pas l'URL du lien [get], car elle peut changer et donc être facilement cassée.Vous n'êtes pas autorisé à joindre un fichier à cette page.

