Módulo timer - PIC18F4550
MÓDULO TIMER DEL MICROCONTROLADOR PIC 18F4550
Christian Felipe Pardo Puentes
e-mail: integrante1@institución (quitar hipervínculo)
Johan Steven Briceño Pulido
e-mail: integrante2@institución (quitar hipervínculo)
Kevin Alberto Mendieta Beleño
kamendietab@[Link]
para cada desbordamiento del TMR0 a través de los bits
RESUMEN: Continuaremos mirando los periféricos TMR0IE y TMR0IF del registro INTCON.
a los que se tiene acceso al utilizar el microcontrolador
PIC18F4550, en este caso analizaremos el temporizador 2 PROCEDIMIENTO
integrado en este, donde encontraremos un módulo
timer al que podremos controlar por medio de comandos
Este laboratorio consta de 4 ítems, cada uno de estos
cono el TIMER-0 encontrado en el “data sheet” de
se elaboró en programas independientes pero un mismo
nuestro microcontrolador, se utilizará el simulador de
circuito.
circuitos Proteus 8, la interfaz de programación MPLAB
Los cuatro puntos realizados en este laboratorio son:
X IDE y el compilador XC8.
1. Cronometro en donde por medio de un display
se observará este conteo en minutos, segundos
ABSTRACT: We will continue looking at the y décimas de segundos.
peripherals to which we have access when using the
2. Contador de personas poniendo de contexto un
PIC18F4550 microcontroller, in this case we will analyze
centro comercial, en donde se podrá controlar
the timer integrated in it, where we will find a timer
la cantidad de personas que estén allí, llegado
module that we can control by means of commands like
el caso de superar la cantidad de personas, se
the TIMER-0 found in the “data sheet” From our
encenderá un led como señal de alarma.
microcontroller, the Proteus 8 circuit collector, the
3. Visualización de dos señales, donde el periodo
MPLAB X IDE programming interface and the XC8
de estas dos es de 100ms y, una de estas con
compiler will be used.
un ciclo útil de 50%, y la con un 80%.
4. Simulación de un semáforo donde dos
semáforos se encontrarán en su
funcionamiento normal (luz roja y amarilla se
PALABRAS CLAVE: alternan durante un segundo cada una),
cuando el usuario oprima un botón se debe
encender la luz roja durante 15s y de inmediato
TEMPORIZADOR: Un temporizador es un aparato vuelve a su funcionamiento habitual.
con el que podemos regular la conexión o desconexión A continuación, se describirá de forma detallada cada
de un circuito eléctrico después de que se ha punto con su respectivo montaje y programa.
programado un tiempo.
2.1 CRONOMETRO
1 INTRODUCCIÓN
2.1.1 MONTAJE
El timer0 puede operar como temporizador o
contador, este modo se selecciona a través del bit T0CS Para este montaje se utilizó primordialmente el
del registro T0CON. En el modo temporizado, el conteo PIC18F4550, igualmente se necesitó un display 7
del registro TMR0 se incrementa de forma ascendente a segmentos multiplexado de 6 dígitos ánodo común y un
cada ciclo de reloj interno hasta su valor máximo de 255 decodificador de binario a BCD (74ls47).
(0xFF), en este preciso instante el registro se desborda y
se reinicia a 0. Sin embargo, en el modo contador el En el puerto D del PIC en los 4 pines menos
incremento se realiza a través de un flanco ascendente significativos (RD0 al RD3) se conectó en serie el
o descendente del pin RA4/T0CKI, el flanco está decodificador 74ls 47 y las 8 salidas de este van en serie
determinado por el bit T0SE del registro T0CON. al display 7 segmentos el pin A del decodificador esta
También, se puede seleccionar un prescaler en cada conectado al pin A del display, esto se hace con cada
modo del TIMER0 para poder realizar el incremento pin hasta llegar al G. El pin DP del display se conecta al
cada 1, 2, 3, 4, ciclos de reloj, todo esto depende del Pin RC6 del puerto C este pin se utilizará para poder
valor de los bits PSA y T0PS [2;0] del registro T0CON. visualizar el punto decimal, en la parte derecha del
Por último, se puede habilitar un evento de interrupción display tenemos 6 pines estos pines se utilizarán para
poder activar cada uno de los dígitos por ejemplo si
queremos encender el primer digito de la izquierda se le
1
Módulo timer - PIC18F4550
.
asignara +5v al pin 1, esto pasa con cada pin de este interrupción del TIMER0, la bandera de esto la
dispositivo. inicializamos en 0 y por ultimo activamos las
Como se mencionó anteriormente el display utilizado interrupciones de periféricos y las goléales. (Figura 2).
es un multiplexado, esto quiere decir que cada de sus
segmentos están conectados internamente de tal
manera que al exterior solo aparecen los
correspondientes a los 7 segmentos más el común de
cada uno de los dígitos que lo componen. El ánodo
común de cada digito (2,3,4,5,6) este cableado a los
pines RC7, RC1, RC2, RC4 y RC5 del puerto C del PIC
según corresponde. Esto es para poder encender el
digito que se quiere utilizar, de este display se utilizaron
solamente 5 dígitos. A continuación, se podrá observar
el montaje (Figura 1).
Figura 1. Montaje cronometro.
2.1.1 PROGRAMA.
En este programa lo primero que se hace declarar 2
funciones, estas no nos retornarán ningún valor y Figura 2. Funciones de configuración.
tampoco tendrán ninguna entrada, el nombre de la
primera función es conf_pto en esta función lo que se Seguido de esto tenemos la función principal main en
hará es declarar los puertos que se van a utilizar, la esta lo primero que se hacer es llamar las 2 funciones
segunda función se le asigno el nombre de conf_timer mencionadas anteriormente, el registro TMR0 se carga
en esta lo que se hará es configurar los TIMER a utilizar, con el valor 65496 esto valor se hayo por medio de la
después de esto declaramos las variables globales siguiente formula:
deseg, seg y min las cuales más adelante se explicaran.
En la función conf_pto primero se declara mediante el
ADCON1 los pines análogos digitales, en este programa
vamos a utilizar estos pines todos como digitales para
esto se le asigna el valor en binario 1111, luego de esto Figura 3. Formula registro TMRx.
tenemos declarados los puertos C y D como salida y
estos se inicializan en 0 esto para que estos puertos no En la figura anterior podemos observar la formula
tengan ningún valor al inicializar el programa y esto no del timer en este caso como utilizamos una
nos cause algún problema en la ejecución. resolución de 16 bits el máximo conteo será de
65536 esto se halla mediante la formula 2^16-1, el
En la función conf_timer primero desactivamos las tiempo de conteo se basa en el tiempo que se va
interrupciones globales esto se hace para descartar demorar en que el registro TMR0 llegue a
posibles interrupciones falsas. Para este programa desbordarse o al completar su registro con el valor
utilizamos solamente el TIMER0 para poder configurar 65536 en esta caso queremos que esto pase cada
este se utilizo el registro T0CON y mediante cada bits se 10ms, el tiempo de instrucción es de 1us y el
configura lo que se desea, el primero bit que se prescaler utilizado fue de 256, remplazando estos
configura es el T0CS, este se iguala a 0 esto para valores en la formula nos da el valor ya mencionado
indicarle al PIC que este TIMER se va utilizar como anteriormente 65496.
temporizador, por medio del bit PSA activamos el
prescaler y en los bits T0PS se configura el prescaler en Luego de esto declaramos las variables enteras
256, luego de esto en el bit T08BIT indicamos que se res y mod donde se hará la descomposición del
quiere trabajar con la resolución de 16 bits y se inicializa numero para poder visualizarlo en el display, dentro
el conteo del TIMER, finalmente activamos la del bucle infinito o while (1) la variable res lo que
2
Módulo timer - PIC18F4550
.
hará es dividir el conteo de decimas entre segundo
entre 10 y esto almacenara el valor entero es decir si
deseg es igual a 15 res va ser igual a 1,5 y esta
como es entero almacenara el 1, luego de esto
tenemos la variable mod esta igualmente dividirá la
variable deseg en 10 pero esta almacenara el
residuo tomando el ejemplo anterior mod almacenara
el 5 y de esta manera descomponemos el número de
dos dígitos.
Luego de esto lo que se hace es la multiplexación Figura 5. Función principal 2.
para poder observar varios dígitos en el display para
hacer esto lo que primero se hace igualar el puerto Por último en este programa se tiene la función de
donde tenemos conectados los ánodos común a 0, interrupción esta tiene el nombre de temp lo que se
luego imprimimos la variable que se quiere observar tiene en esta interrupción es un condicional if el cual
en este caso imprimimos en el puerto D la variable consta de que si la bandera de interrupción del
res, después se activa el display se quiere activar y TMR0 es igual a 1 o se esté timer se desborde la
esto se hace duran un tiempo de 5 ms, esto lo que variable deseg aumentara una unidad esto pasara
hace es prender y apagar rápidamente el display a cada 10ms si deseg es igual a 50 la variable seg
una velocidad que nuestro ojo no puede observar y aumentara uno esta variable corresponde a los
nos da la visualización de que todos los display segundo y la variable deseg retornara a 0 y si la
estarán encendidos a la vez, esto se hace con cada variable deseg es igual a 59 la variable min
variable que se quiere imprimir y con cada display aumentara 1 y seg retornara a 0, por ultimo se carga
que se quiere encender. nuevamente el resgistro TMR0 con el valor
anteriormente calculado y la bandera de interrupción
se borra.
Figura 6. Función de interrupción.
2.2 CONTADOR DE PERSONAS.
2.2.1 MONTAJE.
Para este montaje se utilizaron 2 palancas lógicas y
igualmente el punto anterior el display 7 segmentos
multiplexado de 6 dígitos y el decodificador 74ls47, la
palancas lógicas están conectadas al pin RA4 y RC0 se
colocan en estos pines ya que estos corresponden a la
lectura de flancos del TIMER0 y TIMER1 y tenemos un
diodo led conectado al pin RB1 este pin nos indicara
cuando el conteo de personas supera el numero 30 e
igual que el punto anterior el display y el decodificador
están conectados de la misma forma.
Figura 4. Función principal 1.
3
Módulo timer - PIC18F4550
.
En la función principal main primero se llaman las
funciones mencionadas anteriormente y se declaran las
variables enteras ent, sal, total, res y mod, dentro del
while (1) se iguala la variable ent al registro de TMR0 y
la variable sal TMR1, esto quiere decir que el TMRO va
hacer el conteo de entrada y el TMR1 el conteo de
salida, la variable total será igual al conteo de personas
de entrada (ent) menos el conteo de las personas de
salida (sal) y esta variable total se descomponerla por
medio del módulo así como se menciono en el punto
anterior e igualmente se hace la multiplexación para que
los dígitos aparezcan en los display 3 y 4, y por ultimo
tenemos un condicional if, si total es igual o mayor a 30
Figura 7. Montaje contador. en el pin RB1 sacara un 1 lógico y si no este mandara un
0 lógico.
2.2.2 PROGRAMA
Igual que el ítem anterior primero se declaran las
funciones a utilizar, en la función conf_ptos lo que se
hace es declarar los pines análogo digitales para que
trabajen en digital y los puertos B,C y D se declaran
como salida y estos se inicializan en 0, en la función
conf_timer se deshabilita las interrupciones globales, en
este caso vamos a utilizar 2 TIMER, primero se
configura el TIMER0 este lo configuramos para que
trabaje como contador por medio de flancos de bajada y
el prescaler se deshabilita, se selecciona la resolución
de 16 bits y se inicializa el conteo de este TIMER esta
configuración se hacer por medio de los bits y el registro
que se mencionó en el anterior programa, para el
TIMER1 se configura mediante el registro T1CON,
mediante el bit RD16 se menciona que trabaje con una
resolución de 16 bits, con el bit T1CKPS se selecciona el
prescaler a una escala 1:1, en el bit TMR1CS se indica
que trabaje como contador y por ultimo se inicializa el
conteo de este.
Figura 8. Función principal
2.3 SEÑALES CUADRADAS.
2.3.1 MONTAJE
Aquí únicamente se hará uso de dos pines del puerto B
(RB3 y RB4) los cuales darán una señal, y esta se va a
observar por medio de un osciloscopio (Ver figura 9).
Figura 8. Funciones de configuración.
4
Módulo timer - PIC18F4550
.
el timer para usarlo como temporizador, se activa el
prescaler y se configura en 256, también se modifica
para trabajarlo con 16 bits, luego de esta configuración
se inicializa, se pone la bandera en cero y se activan las
interrupciones (Ver figura 11).
Figura 11. Función de configuración timer0 (señal 80%).
Para el programa del 80% del ciclo útil se configuró el
timer 1, y de igual manera como ya se vio anteriormente
la configuración, en este caso también se trabajará con
16 bits pero en la configuración de la escala del
prescaler, será de 1:2, luego se toma este timer como
contador y como final, se inicializa el conteo del mismo
(Ver figura 12).
2.3.2 PROGRAMA
Como primera parte de este programa, se declaran
dos funciones, una de estas para la configuración del
puerto, y la otra para la configuración del time, Cabe
aclarar que para cada señal se hizo un programa
diferente, pero basándose en lo mismo.
En la configuración de los puertos, como se usará el
puerto B, primeramente, se debe hacer uso del registro
PCFG y luego configurarlo para que estos pines queden
digitales, luego de esto, se pondrán estos pines como
salidas y en un estado inicial cero (Ver figura 10).
Figura 12. Función de configuración timer1 (señal 50%).
Como siguiente se tiene la funcíon main, que para las
dos señales se uso igual pero con un valor de TMRX
diferente, para la señal de 50% se uso TRM0= 53036 y
para la de 80% TMR1= 25536; estos valores se calculan
con la formula que se mostró en un principio del informe.
En esta función primero se llaman las funciones de
Figura 10. Funciones de configuración. configuración, las del timer y las de puerto. Luego se
declaran los valores TMRX para cada programa ya
Sabiendo que se hizo uso de dos programas, para el mostrados,y por ultimo, dentro de un bucle while se pone
programa que mostrara un ciclo útil de 50%, se hizo uso un condicional “if” de: si el contador es igual a 1, el pin
del timer 0, en esta función de su configuración y como declarado para cada señal quedará en estado 1, cabe
ya se ha visto en los programas anteriores, inicialmente
se desactivan las interrupciones globales, y se configura
5
Módulo timer - PIC18F4550
.
aclarar que existe una variable flotante llamada cont 2.4 SEMAFORO.
inicializada en 1.
Por último las interrupciones:
Para la señal de 50% se creo una interrupción donde
2.4.1 MONTAJE
como primera parte en un condicional: si el flag de la
interrupción de timer está prendido, el pin que se está En este último ítem se usaron 4 leds cada uno de estos
manejando queda en cero y el contador aumenta 1, esto conectados su lado positivo a cada pin correspondiente,
quiere decir que el contador aumenta a 3. en este caso RD4, RD5, RD6 y RD7 llamados SA1, SA2,
Despues en otra condicional: si el contador es igual a SB1 y SB2 correspondientes y su otro lado conectado a
3, este quedara como cont=1, todo esto con un TMR0 de tierra. Por otro lado, también se utiliza un pulsador
53036; y al final se pone la bandera en 0 (Ver figura 13) conectado al pin RB2 con una resistencia de 10k, y al
Y para la señal de 80% primero se pone el pin en 0, otro lado del pulsador se alimenta este pulsador.
despues declarar TMR1= 55536 para que primero tome
este conteo de tiempo y luego se aumenta el contador
en 1, aquí de nuevo ponemos un condicional: si
contador es igual a 4; el contador quedará de nuevo en
1 y en este condicional el TMR1= 25536 para tomar el
tiempo diferente al TMR1=55536 y de nuevo la bandera
en 0 (Ver figura 14).
Figura 13. Interrupción señal 50%.
Figura 14. Montaje semáforo.
2.4.2 PROGRAMA.
Igual que en los puntos anteriores en este programa
lo que primero se hace es declarar las funciones que se
van a utilizar, en la función conf_ptos se configuran los
12 pines análogos digitales en digital se declara el
puerto B como entrada y el D como salida y este se
inicializa en 0, en la función conf_timer lo que primero se
hace es desactivar las interrupciones globales, luego de
esto se configura el TIMER1 este se configura mediante
el registro y los bits ya mencionados anteriormente, este
Figura 14. Interrupción señal 80%. se configura con una resolución de 16 bits con un
prescaler de 1:8, se con configura como temporizador y
se inicializa la temporización, luego de esto se configura
la interrupción de este TIMER, se activa la interrupción y
la bandera de este se desactiva, mediante el registro
PIER2 se configura, la interrupción del TIMER3 este mas
adelante se configurara, igualmente se activa las
interrupciones y se desactiva la bandera, mediante el
registro INTCON3 configuramos la interrupción externa
de flancos del pin RB2, se activa esta interrupción, la
bandera se inicializa en 0 y se configura la interrupción
6
Módulo timer - PIC18F4550
.
con flancos de subida y por ultimo se activa las
interrupciones de periféricos y las interrupciones
globales (Figura 15.)
Figura 16. Funciones principal semáforo.
Por último en este programa tenemos la función de
interrupción dentro de esta interrupción lo que primero
tenemos es un condicional el cual nos indica que si el
pin RB2 recibe un 1 o si esta recibe un flanco de subida
los pines RD4 y RD6 estarán encendidos durante 15
segundos este tiempo se hace por medio de un delay,
luego de que pase este conteo la bandera de
interrupción del pin INT2 se pone en 0 o se desactiva,
Figura 15. Funciones de configuración. pero si esta interrupción no se activa esto quiere decir
que el TIMER1 se desbordo, al pasar esto se ejecuta el
Dentro de la función principal main se llaman las “else” dentro de este lo que primero tenemos es volver a
funciones anteriormente mencionadas y se carga el cargar el TMR0 con el valor anteriormente calculado y la
registro TIMER1 con el valor de 3036, este valor se bandera de interrupción de este se retorna a 0
calcula con la formula descrita en el primer punto, como manualmente, luego lo que se hace es configurar el
utilizamos un resolución de 16 bits el máximo conteo TIMER3, este se configura con la resolución de 16 bits,
será de 65536, el tiempo de conteo es 500ms lo que un prescaler de 8 se configura como temporizador y se
equivale medio segundo y el prescale de 8 operando carga el TMR3 con el mismo valor de TMR1 es decir con
esto nos da el valor de 3036, dentro del while (1), 3036y si el TIMER3 se desborda la bandera de este
tenemos un condicional if el cual nos indica que si el pasa uno y tenemos un condicional que si esto pasa
modulo de cont divido entre 2 es igual a 0 los pines RD5 TMR3 se carga nuevamente con el valor ya mencionado
y RD7 serán encendidos y los pines RD4 y RD6 , la bandera de este se desactiva y cont aumentara uno.
estarán apagados pero si esta condición no se cumple (Figura 17).
será la viceversa es decir los pines RD5 y RD7 se
apagaran y los otros se encenderán, la variable cont
aumentara cada segundo este conteo lo hará el TIMER1
y el TIMER3 mas adelante observaremos este conteo y
por último en la función principal ponemos el return
(Figura 16).
7
Módulo timer - PIC18F4550
.
Figura 20. Funcionamiento cronometro segundos, milisegundos.
Figura 21. Funcionamiento cronometro milisegundos.
Figura 17. Funciones interrupción semáforo.
3.2 CONTADOR DE PERSONAS.
Como el TIMER1 y el TIMER3 no alcanzan a contar
de 1 segundo lo que se hizo fue que cuando el TMR1 Tan pronto se inicia la simulación los display 3 y 4 se
cuente 500ms o medio segundo automáticamente el encenderán con el valor 0 y el PIC esperando que
TMR3 se activa y cuente el otro medio segundo y la alguno de los dos pines RA4 o RC0 reciban algún
variable cont aumente y de esta manera tenemos el flanco, esto se hará por medio de las LOGICTOGGLE
conteo de 1 seg. cuando se presiona por primera vez la palanca de la
izquierda esta pasara de 0 a 1 y el conteo aumentara de
3. FUNCIONAMIENTO CIRCUITOS. uno en uno pero si la palanca de la derecha se presiona
y cambia de 0 a 1 al conteo se le restara uno, cuando el
conteo llegue a 30 o es mayor que 30 un led rojo se
3.1 CRONOMETRO. encenderá como alarma para indicarle a las personas
que el máximo de personas esta superado y si este baja
Este Circuito funciona cuando se inicializa la de 30 el led se apagara. (Figura 22 y 23).
simulación, desde este momento el programa comienza
a correr y cuando las decimas de segundo lleguen a
59ms aumentara un segundo y las decimas de segundo
retornara a 0 y cuando seg llegue a 50 los minutos
aumentaran 1 y esto pasa de manera indefinida hasta
que se pare el compilador, estos valores se visualizan
en display 7 segmentos multiplexado, anteriormente se
explico el funcionamiento de este, los minutos, segundo
y décimas de segundo se diferencian por el punto
decimal (Figura 18,19,20).
Figura 22. Funcionamiento contador, menor que 30.
Figura 18. Funcionamiento cronometro minutos, segundo,
milisegundos.
8
Módulo timer - PIC18F4550
.
.
Figura 23. Funcionamiento contador, mayor que 30.
Figura 25. Señal cuadrada ciclo útil 80%.
3.3 SEÑALES CUADRADAS. 3.3 SEMAFORO.
Cuando se inicia la simulación en el osciloscopio se El funcionamiento de este consta que cuando se
puede observar la señal cuadrada con el 50% de ciclo empieza la simulación primero encenderán los leds
útil esto quiere decir que del periodo que es de 100ms amarillos por un segundo con los rojos apagados
50 ms segundo la señal estará en nivel alto y los otros pasado este segundo se encenderán los rojos y los
50ms esta en bajo, en cambio la otra señal tiene un ciclo amarillos se apagaran por un segundo esto pasara de
útil de 80% es decir que 80 ms estará en nivel alto y los forma indefinida hasta que el pulsador se presione
otros 20ms estará en nivel bajo, las frecuencias de estas cuando esto pase se encenderá el led rojo durante 15
señales serán de 10Hz y estas se visualizaran hasta que segundos y al terminar este tiempo los leds retomaran
se pare la simulación (Figuras 24 y 25). su secuencia principal hasta que el pulsador se presione
nuevamente (Figuras 26 y 27).
Figura 26. Semáforo leds amarillos.
Figura 24. Señal cuadrada ciclo útil 50%.
Figura 27. Semáforo leds rojos.
4. CONCLUSIONES.
• Por medio del módulo TIMER se pueden
realizar conteos o temporización sin necesidad
de ocupar líneas del programa principal y así
tener la posibilidad de ejecutar otras acciones,
por el contrario, con el delay tenemos que
esperar que pase el tiempo programado para
ejecutar otra acción.
9
Módulo timer - PIC18F4550
.
• El TIMER es un temporizador/contador
ascendente de 8 o 16 bits, cuando trabaja con
el reloj del PIC se le suele llama temporizador y
cundo los pulsos los recibe de una fuente
externa a través uno de los pines se le llama
contador.
• El TIMER es utilizado para obtener tiempos
muy precisos, en este caso el TIMER del PIC
funciona con el reloj del sistema; pero también
puede ser utilizado para realizar conteos, por lo
que también se le llama contador, en este caso
no aumenta su valor de uno en uno en cada
ciclo de trabajo, sino que lo hará mediante el
flanco de subida o el flanco de bajada de
alguna señal que llegue a un pin específico del
PIC.
• Un TIMER es un registro que aumenta su valor
en una unidad con cada 4 ciclos de reloj al cual
se encuentre funcionando el PIC, en ese caso
el oscilador es de 4MHz, entonces el ciclo de
trabajo del microcontrolador PIC será de 1us,
por lo que el TIMER PIC aumentará su valor de
uno en uno en cada microsegundo.
5. ANEXOS
[Link]
10