Sunteți pe pagina 1din 5

Apuntes Informtica/ Electrnica- Uso del TMR1 como temporizador

http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html[17/07/2014 8:30:15]

Men Principal
Inicio
Actualidad / Noticias
Por qu donar?
Registrarse
Enlaces Web
Foros
Siguenos en ...

ltimos Tutoriales
ndice Programacin
PIC en C
ndice prcticas PIC
C
Comandar un PIC
a travs de la voz
Contador de 0 a
10
Bluetooth HC-05
Acceso a datos en
tiempo real sin
parar MCU
Test GLCD
(KS0108)
Expansor de E/S
PCF8574
Secuencia de luces
Decodificador
Binario/Decimal
Uso del TMR0
como temporizador
Uso del TMR0
como contador
Interrupcin
externa por RB0
I ni c i o ndi c e pr c t i c as PI C C Uso del TMR1 c omo t empor i zador
Rec ur sos del PI C - Uso del TMR1 c omo Tempor i zador
Detalles
ltima actualizacin el Lunes, 25 Noviembre 2013
20:46
Escrito por Biblioman
Continuamos con el curso de C con CCS, esta vez con la utilizacin de un nuevo recurso, que todava
no habamos visto: el Timer1.
El Timer1 es un temporizador/contador ascendente parecido al TMR0, pero con algunas peculiaridades
que lo hacen muy interesante a la hora de incluir temporizaciones en nuestros programas.
La primera de ellas, es que se trata de un contador de 16 bits cuyo valor se almacena en dos registros
de 8 bits el TMR1H y el TMR1L, ambos registros se pueden leer y escribir su valor durante la ejecucin
del programa.
Cuando el Timer1 est habilitado, el valor de esos registros se incrementan desde 0000h a FFFFh y
una vez que llega a su mximo valor empieza otra vez desde 0 avisndonos de ello por medio de la
bandera TMR1F .
Si est activa la interrupcin por desbordamiento del Timer 1 al desbordarse el contador, el programa
entra en la funcin de tratamiento a la interrupcin por desbordamiento del Timer1.
El diagrama de bloques es el siguiente:


Algunas caractersticas de este Timer son las siguientes:
El Timer1 puede funcionar con un oscilador externo y trabajar a una frecuencia distinta a la del
oscilador principal del PIC.
Al igual que el TMR0 el Timer1 puede operar en dos modos: como temporizador y como
contador. El modo de funcionamiento est determinado por el tipo de reloj seleccionado (interno
-->temporizador, externo -->contador), lo configuramos por medio del bit TMR1CS del registro
TICON. Cuando est en modo contador su valor se incrementa en cada flanco de subida de la
seal de reloj externa.
El tiempo que se tarda en incrementarse el contador se le suele llamar paso, el paso del
contador depende de la frecuencia del oscilador y del prescaler seleccionado.
La frmula para determinar los tiempos del Timer1 cuando es utilizado como temporizador (Reloj
interno) es la siguiente:
El paso del contador vendr determinado por:

Paso_Contador= 4/Frecuencia Oscilacin.Prescaler

El Timer1 se puede habilitar o deshabilitar por medio del bit TMR1ON del registro T1CON.
Un dibujo con los bits de configuracin del registro TICON, lo tenis en la figura de abajo:

I ni c i o Ac t ual i dad / Not i c i as For os Cont ac t ar Ac er c a de .. Pr i vac i dad
Buscar
Apuntes Informtica/ Electrnica- Uso del TMR1 como temporizador
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html[17/07/2014 8:30:15]
Control motor CC
con la terminal
Control motor CC
con el
Hyperterminal
Interrupcin
cambio de estado
RB4-RB7
Comuicacin serie
asncrona entre
dos PICs con la
USART
Control teclado
4X4 con el
MM74C922
Memoria EEPROM
interna del PIC
Comunicacin serie
I2C entre PIC y
EEPROM 24LC256A
Uso del TMR1
como temporizador
Controlador
Domstico
Kit de desarrollo
PIC16F877A de
CCS
Controlador LCD
Serie
Comunicacin USB
PIC18F4550
utilizando la clase
CDC
BootLoader USB
Multiplataforma
Comandar un PIC
a travs de
Internet
Gobernar un
Microcontrolador
desde la
BeagleBoard-Xm
Empezando con las
libreras grficas
de Microchip
Implementacin de
una Mquina de
Estados Finita en
un PIC
Conexin
inalmbrica entre
dos
Microcontroladores
Comunicacin
USB-PIC con HID
Entrenadora para
PIC. Fenix V2.0
Control de
Mensajes SMS a
travs de un PIC
ndice Sistemas
Embebidos
ndice prcticas
Arduino
Curso PIC32

Vamos a ver un ejemplo sencillo (como siempre) de como utilizar el Timer1 como temporizador usando
el reloj interno del micro. El ejemplo consiste simplemente en hacer parpadear un led a un intervalo de
0.5 segundos, usando el Timer1 con la interrupcin por desbordamiento habilitada.
Para ello tenemos como siempre dos opciones, escribir nosotros todo el cdigo o ayudarnos por medio
del asistente que trae CCS. Cualquiera de las opciones es valida, ya que el cdigo es muy sencillo.
El que utilice el asistente, deber configurar primeramente el micro a utilizar y la frecuencia de reloj.
Yo voy ha utilizar el PIC16f877 y un cristal de 4MHz (el viejo amigo de batallas PIC16f84A no dispone
de este recurso).



Despus en el apartado timers habr que configurar los parmetros para el Timer1, como vamos a
trabajar con el Timer1 en modo Temporizador, en el tipo de reloj seleccionaremos Internal, despus
seleccionaremos una resolucin entre las cuatro disponibles, segn se muestra en la figura de abajo.

Apuntes Informtica/ Electrnica- Uso del TMR1 como temporizador
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html[17/07/2014 8:30:15]
SDCC (Small Device
C Compiler) en
Windows
Actualizar a Ubuntu
9.10 (Karmic Koala)
Programacin de
Microcontroladores
PIC en C con Ubuntu
utilizando el ICD2
Particiones y
sistemas de archivos
en Linux
Algunas razones para
probar Ubuntu
Instalacin de
Ubuntu 9.04 paso a
paso
Compilador PCW CCS
Compiladores C para
PIC
Programacin PIC en
C
X - 10
Comandos
Unix/Linux
Autmatas
Secuenciales Finitos
CAD Electrnico

La resolucin es el tiempo que tarda el contador en incrementar su valor, es decir, el paso del
contador. Este valor, como hemos dicho ya, depende del Preescaler seleccionado y de la frecuencia del
reloj principal. Por ejemplo, si seleccionamos la ltima opcin le estamos diciendo al asistente que
queremos un preescaler de 8 y como hemos seleccionado una frecuencia de 4MHz para el reloj
principal, el paso del contador ser igual a:

4/Frecuencia Oscilacin.Prescaler= 4/4MHz.8= 8u segundos.

El asistente tambin nos muestra el Overflow, que como hemos dicho tambin, es el tiempo que
tardar el contador en desbordarse. Suponiendo que carguemos el TMR1 con valor 0, que es como
viene por defecto, si aplicamos la formula obtendremos el valor de 524ms
(Desbordamiento_Timer1= 4/4MHz*8(65536-0)= 524 ms).

Como en vez de 524 ms, queremos obtener 500 ms. Sustituimos ese valor en la frmula y despejamos
el valor a cargar en el TMR1:


El valor de TMR1 que sale es de 3036 que en hexadecimal es: 0x0BDC
Por ltimo solo nos queda decirle al asistente que queremos utilizar la interrupcin por desbordamiento
del Timer 1, segn se muestra en la figura de abajo:



El cdigo de nuestro ejemplo quedar de la siguiente forma:

01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
#include <16F887.h>//Pic utilizado
//Palabra de configuracin de los fusibles.
#FUSES NOWDT, XT, NOPUT, NOMCLR, NOPROTECT, NOCPD, NOBROWNOUT, NOIESO, NOFCMEN, NOLVP, NODEBUG, NOWRT, BORV40
#use delay(clock=4000000)//Frecuencia del reloj principal
#bit RB7=0x06.7 //Identificador para el bit RB7

#int_TIMER1
void TIMER1_isr(void)//Funcin de interrupcin por desbordamiento TMR1
{
RB7=~RB7; //Togle RB7
set_timer1(0x0BDC);//carga del TMR1
Apuntes Informtica/ Electrnica- Uso del TMR1 como temporizador
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html[17/07/2014 8:30:15]
Licencia

Todo el contenido de
este sitio est bajo una
licencia de Creative
Commons

Siempre hay que limpiar un poco el cdigo que nos genera el asistente, de parmetros y opciones que
estn deshabilitadas y que no nos sirven para nada.
El circuito a montar en Proteus, ser el siguiente:



En el que se ha incluido una grfica digital para medir el intervalo de tiempo de parpadeo del diodo
LED.
Si hacemos un zoom sobre la grfica y aadimos un segundo cursor (Ctrl+c), podemos ver que el
intervalo es de 500 ms.




Coment ar i o del pr ogr ama:
El programa de lo sencillo que es, est ms que explicado con los comentarios hechos en el cdigo
fuente. Solo comentar las funciones que incluye CCS para el control del Timer1:

set_timer1(value); //Funcin para inicializar los registros TMR1H y TMR1L.
value=get_timer1; //Funcin para leer el valor del timer1
setup_timer_1 (parmetros);//configuracin del Timer1 por medio de parmetros. Los
parmetros pueden ser:
T1_DISABLED: deshabilita el Timer1, esto me permite un ahorro de energa en el PIC si no
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
}



void main()
{
set_tris_b(0b01111111); //configura RB7 como salida el resto como entrada
RB7=0;//Inicializo RB7
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//Setup timer: Reloj interno, preescaler= 8
enable_interrupts(INT_TIMER1);//Habilito interrupcin particular del TIMER1
enable_interrupts(GLOBAL);//Habilito interrupciones globales
set_timer1(0x0BDC);//Carga del TMR1
while(true);//Bucle infinito hasta interrupcin

}
Apuntes Informtica/ Electrnica- Uso del TMR1 como temporizador
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html[17/07/2014 8:30:15]
2007-2014 AquiHayapuntes.com
utilizo este recurso.
T1_INTERNAL: fuente de reloj, el principal. Modo temporizador.
T1_EXTERNAL: fuente de reloj externa. El timer funcionara como contador y como
condicin para empezar el contaje debe de producirse un flanco de bajada en la seal de
reloj, mira la figura de abajo:


Este pequeo detalle que parece poco importante, no lo es en el caso de que queramos contar de
manera precisa los pulsos de entrada.
T1_EXTERNAL_SYNC: con esto le digo al compilador que la seal de reloj externa se sincronice
con la seal de reloj principal. Como se ve en el diagrama de bloques la sincronizacin se
produce despus del preescaler, por lo que hasta despus del preescaler la seal sigue siendo
asncrona. Hay que tener en cuenta que cuando tenemos definido este parmetro si el PIC entra
en modo SLEEP el TIMER1 no se incrementar aunque este presente la seal de reloj externa.
T1_CLK_OUT: con este parmetro pongo a 1 el bit T1OSCEN, para habilitar el oscilador del
Timer1. Cuando tengo seleccionada la fuente de reloj externa y este parmetro a la vez, me
permite independizar el timer1 del oscilador principal, por lo que el timer1 seguir contando
aunque el PIC entre en modo SLEEP. La entrada de la seal de reloj ser por la patilla
RC0/T1OSO/TICK1 del PIC. Cuando este parmetro no est definido T1OSCEN toma el valor por
defecto que es 0, en este caso y siempre y cuando este definido el parmetro T1_EXTERNAL la
entrada de la seal de reloj externa ser por RC1/TlOSI/CCP2. Este modo se utiliza para poder
producir un reinicio del Timer1 a partir de cualquiera de los mdulos CCP1 o CCP2 del PIC.
T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8: constantes para seleccionar el
preescaler que queremos seleccionar.
Los parmetros seleccionados se colocan juntos separados por el smbolo |.
Ejemplos:
setup_timer_1 ( T1_DISABLED );
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
Fuent es de i nf or mac i n:

Data Sheet PIC16F87X
Manual CCS compiler
En el prximo artculo (sobre CCS), veremos como utilizar el timer1 como contador, utilizando un reloj
externo de 32.768Hz de frecuencia, y veremos si la precisin obtenida es suficiente para implementar
un reloj en tiempo real (RTC) de Horas, minutos y segundos.
Como siempre espero vuestros comentarios en el foro.
El .DSN de Proteus lo tenis aqu
Un Saludo y hasta pronto.

S-ar putea să vă placă și