apuntes informática _ electrónica - uso del tmr1 como temporizador
TRANSCRIPT
![Page 1: Apuntes Informática _ Electrónica - Uso del TMR1 como temporizador](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9c9c550346d033aa6ec4/html5/thumbnails/1.jpg)
05/06/13 Apuntes Informática / Electrónica - Uso del TMR1 como temporizador
www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html 1/6
Menú Principal
Inicio
Registrarse
Enlaces Web
Foros
Actualidad / Noticias
¿Por qué donar?
Siguenos en ...
Últimos Tutoriales
Índice ProgramaciónPIC en C
Índice prácticas PICC
Secuencia de luces
DecodificadorBinario/Decimal
Uso del TMR0como temporizador
Uso del TMR0como contador
Interrupciónexterna por RB0
Control motor CCcon la terminal
Control motor CCcon elHyperterminal
Interrupcióncambio de estadoRB4-RB7
Comuicación serieasíncrona entredos PICs con la
Inicio Índice prácticas PIC C Uso del TMR1 como temporizador
Recursos del PIC - Uso del TMR1 como Temporizador
Detalles
Última actualización el Miércoles, 05 Septiembre2012 18:01Escrito por Biblioman
Continuamos con el curso de C con CCS, esta vez con la utilización de un nuevo recurso, que todavíano habíamos visto: el Timer1.
El Timer1 es un temporizador/contador ascendente parecido al TMR0, pero con algunas peculiaridadesque 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 registrosde 8 bits el TMR1H y el TMR1L, ambos registros se pueden leer y escribir su valor durante la ejecucióndel programa.
Cuando el Timer1 está habilitado, el valor de esos registros se incrementan desde 0000h a FFFFh y unavez que llega a su máximo valor empieza otra vez desde 0 avisándonos de ello por medio de la banderaTMR1F . Si está activa la interrupción por desbordamiento del Timer 1 al desbordarse el contador, el programaentra en la función de tratamiento a la interrupción por desbordamiento del Timer1.
El diagrama de bloques es el siguiente:
Algunas características de este Timer son las siguientes:
El Timer1 puede funcionar con un oscilador externo y trabajar a una frecuencia distinta a la deloscilador 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 registroTICON. Cuando está en modo contador su valor se incrementa en cada flanco de subida de laseñal de reloj externa.El tiempo que se tarda en incrementarse el contador se le suele llamar paso, el paso del contadordepende de la frecuencia del oscilador y del prescaler seleccionado.La fórmula para determinar los tiempos del Timer1 cuando es utilizado como temporizador (Relojinterno) es la siguiente:
El paso del contador vendrá determinado por:
Paso_Contador= 4/Frecuencia Oscilación.Prescaler
El Timer1 se puede habilitar o deshabilitar por medio del bit TMR1ON del registro T1CON.
Un dibujo con los bits de configuración del registro TICON, lo tenéis en la figura de abajo:
Inicio Contactar Foros Actualidad / Noticias Acerca de ..
![Page 2: Apuntes Informática _ Electrónica - Uso del TMR1 como temporizador](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9c9c550346d033aa6ec4/html5/thumbnails/2.jpg)
05/06/13 Apuntes Informática / Electrónica - Uso del TMR1 como temporizador
www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html 2/6
USART
Control teclado4X4 con elMM74C922
Memoria EEPROMinterna del PIC
Comunicación serieI2C entre PIC yEEPROM 24LC256A
Uso del TMR1como temporizador
ControladorDoméstico
Kit de desarrolloPIC16F877A deCCS
Controlador LCDSerie
Comunicación USBPIC18F4550utilizando la claseCDC
BootLoader USBMultiplataforma
Comandar un PIC através de Internet
Gobernar unMicrocontroladordesde laBeagleBoard-Xm
Empezando con laslibrerías gráficas deMicrochip
Implementación deuna Máquina deEstados Finita enun PIC
Conexióninalámbrica entredosMicrocontroladores
Comunicación USB-PIC con HID
Entrenadora paraPIC. Fenix V2.0
Control deMensajes SMS através de un PIC
Comandar un PIC através de la voz
Contador de 0 a 10
Bluetooth HC-05
Acceso a datos entiempo real sinparar MCU
Test GLCD(KS0108)
Expansor de E/SPCF8574
Curso PIC32
SDCC (Small DeviceC Compiler) enWindows
Actualizar a Ubuntu9.10 (Karmic Koala)
Programación deMicrocontroladoresPIC en C con Ubuntuutilizando el ICD2
Vamos a ver un ejemplo sencillo (como siempre) de como utilizar el Timer1 como temporizador usando elreloj interno del micro. El ejemplo consiste simplemente en hacer parpadear un led a un intervalo de 0.5segundos, usando el Timer1 con la interrupción por desbordamiento habilitada.
Para ello tenemos como siempre dos opciones, escribir nosotros todo el código o ayudarnos por mediodel asistente que trae CCS. Cualquiera de las opciones es valida, ya que el código es muy sencillo.
El que utilice el asistente, deberá configurar primeramente el micro a utilizar y la frecuencia de reloj. Yovoy ha utilizar el PIC16f877 y un cristal de 4MHz (el viejo amigo de batallas PIC16f84A no dispone deeste recurso).
Después en el apartado timers habrá que configurar los parámetros para el Timer1, como vamos atrabajar con el Timer1 en modo Temporizador, en el tipo de reloj seleccionaremos Internal, despuésseleccionaremos una resolución entre las cuatro disponibles, según se muestra en la figura de abajo.
![Page 3: Apuntes Informática _ Electrónica - Uso del TMR1 como temporizador](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9c9c550346d033aa6ec4/html5/thumbnails/3.jpg)
05/06/13 Apuntes Informática / Electrónica - Uso del TMR1 como temporizador
www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html 3/6
Particiones ysistemas de archivosen Linux
Algunas razones paraprobar Ubuntu
Instalación deUbuntu 9.04 paso apaso
Compilador PCW CCS
Compiladores C paraPIC
Programación PIC enC
X - 10
Comandos Unix/Linux
AutómatasSecuenciales Finitos
CAD Electrónico
Arduino y elcontrolador LCD serie
Chat
30 may 13, 08:43
Manuel: estoy
aprendoo!!
30 may 13, 08:42
Manuel: esta chevere
esta pagina
29 may 13, 01:36
jose: se puede sacar la
señal pw m en el micro
16f877a que no sea por
c2??
21 may 13, 19:21
Biblioman: Hola
Sc0rp10. Si es SPI hay un
ejemplo en el foro.
21 may 13, 19:15
LM: Hola, alguien tiene
algo de información sobre
los amplif icadores
operacionales del
pic16f690?
[The Dotif ier] actualizar
nombre
mensaje ok
ayuda · emoticonos · cbox
Licencia
Todo el contenido deeste sitio está bajo unalicencia de CreativeCommons
La resolución 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 delreloj principal. Por ejemplo, si seleccionamos la última opción le estamos diciendo al asistente quequeremos 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 Oscilación.Prescaler= 4/4MHz.8= 8u segundos.
El asistente también nos muestra el Overflow, que como hemos dicho también, es el tiempo que tardaráel contador en desbordarse. Suponiendo que carguemos el TMR1 con valor 0, que es como viene pordefecto, 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 fórmula y despejamos elvalor 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 interrupción por desbordamientodel Timer 1, según se muestra en la figura de abajo:
El código de nuestro ejemplo quedará de la siguiente forma:
01.02.03.
#include <16F887.h>//Pic utilizado//Palabra de configuración de los fusibles.#FUSES NOWDT, XT, NOPUT, NOMCLR, NOPROTECT, NOCPD, NOBROWNOUT, NOIESO, NOFCMEN, NOLVP,
![Page 4: Apuntes Informática _ Electrónica - Uso del TMR1 como temporizador](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9c9c550346d033aa6ec4/html5/thumbnails/4.jpg)
05/06/13 Apuntes Informática / Electrónica - Uso del TMR1 como temporizador
www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html 4/6
Siempre hay que limpiar un poco el código que nos genera el asistente, de parámetros y opciones queestán deshabilitadas y que no nos sirven para nada.
El circuito a montar en Proteus, será el siguiente:
En el que se ha incluido una gráfica digital para medir el intervalo de tiempo de parpadeo del diodo LED.
Si hacemos un zoom sobre la gráfica y añadimos un segundo cursor (Ctrl+c), podemos ver que elintervalo es de 500 ms.
04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.
NODEBUG, NOWRT, BORV40#use delay(clock=4000000)//Frecuencia del reloj principal#bit RB7=0x06.7 //Identificador para el bit RB7 #int_TIMER1void TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1 {RB7=~RB7; //Togle RB7set_timer1(0x0BDC);//carga del TMR1} void main(){set_tris_b(0b01111111); //configura RB7 como salida el resto como entradaRB7=0;//Inicializo RB7setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//Setup timer: Reloj interno, preescaler= 8enable_interrupts(INT_TIMER1);//Habilito interrupción particular del TIMER1enable_interrupts(GLOBAL);//Habilito interrupciones globalesset_timer1(0x0BDC);//Carga del TMR1while(true);//Bucle infinito hasta interrupción }
![Page 5: Apuntes Informática _ Electrónica - Uso del TMR1 como temporizador](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9c9c550346d033aa6ec4/html5/thumbnails/5.jpg)
05/06/13 Apuntes Informática / Electrónica - Uso del TMR1 como temporizador
www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html 5/6
Comentario del programa:
El programa de lo sencillo que es, está más que explicado con los comentarios hechos en el códigofuente. Solo comentar las funciones que incluye CCS para el control del Timer1:
set_timer1(value); //Función para inicializar los registros TMR1H y TMR1L.value=get_timer1; //Función para leer el valor del timer1setup_timer_1 (parámetros); //configuración del Timer1 por medio de parámetros. Losparámetros pueden ser:
T1_DISABLED: deshabilita el Timer1, esto me permite un ahorro de energía en el PIC si noutilizo este recurso.T1_INTERNAL: fuente de reloj, el principal. Modo temporizador.T1_EXTERNAL: fuente de reloj externa. El timer funcionara como contador y como condiciónpara empezar el contaje debe de producirse un flanco de bajada en la señal de reloj, mira lafigura de abajo:
Este pequeño detalle que parece poco importante, no lo es en el caso de que queramos contar demanera precisa los pulsos de entrada.
T1_EXTERNAL_SYNC: con esto le digo al compilador que la señal de reloj externa se sincronicecon la señal de reloj principal. Como se ve en el diagrama de bloques la sincronización se producedespués del preescaler, por lo que hasta después del preescaler la señal sigue siendo asíncrona.Hay que tener en cuenta que cuando tenemos definido este parámetro si el PIC entra en modoSLEEP el TIMER1 no se incrementará aunque este presente la señal de reloj externa.T1_CLK_OUT: con este parámetro pongo a 1 el bit T1OSCEN, para habilitar el oscilador del Timer1.Cuando tengo seleccionada la fuente de reloj externa y este parámetro a la vez, me permiteindependizar el timer1 del oscilador principal, por lo que el timer1 seguirá contando aunque el PICentre en modo SLEEP. La entrada de la señal de reloj será por la patilla RC0/T1OSO/TICK1 delPIC. Cuando este parámetro no está definido T1OSCEN toma el valor por defecto que es 0, eneste caso y siempre y cuando este definido el parámetro T1_EXTERNAL la entrada de la señal dereloj externa será por RC1/TlOSI/CCP2. Este modo se utiliza para poder producir un reinicio delTimer1 a partir de cualquiera de los módulos CCP1 o CCP2 del PIC.T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8: constantes para seleccionar elpreescaler que queremos seleccionar.
Los parámetros seleccionados se colocan juntos separados por el símbolo |.
Ejemplos:
setup_timer_1 ( T1_DISABLED ); setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 ); setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
![Page 6: Apuntes Informática _ Electrónica - Uso del TMR1 como temporizador](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9c9c550346d033aa6ec4/html5/thumbnails/6.jpg)
05/06/13 Apuntes Informática / Electrónica - Uso del TMR1 como temporizador
www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-temporizador.html 6/6
© 2007-2013 AquiHayapuntes.com
Fuentes de información:
Data Sheet PIC16F87XManual CCS compiler
En el próximo artículo (sobre CCS), veremos como utilizar el timer1 como contador, utilizando un relojexterno de 32.768Hz de frecuencia, y veremos si la precisión obtenida es suficiente para implementar unreloj en tiempo real (RTC) de Horas, minutos y segundos.
Como siempre espero vuestros comentarios en el foro.
El .DSN de Proteus lo tenéis aquí
Un Saludo y hasta pronto.