Está en la página 1de 9

PRÁCTICA 2, RELOJ DIGITAL CON LCD BASADO EN TIMERS

Resumen: Construimos un reloj digital con hora ajustable utilizando un PIC18f4550 y una LCD. El programa cargado en el pic fue realizado en el lenguaje C utilizando el compilador CCS, y nuestro código se basa en el uso de las interrupciones, específicamente utilizamos el timer1 y sus características para obtener la funcionalidad del reloj. Para poder ajustar la hora en nuestro reloj incluimos tres push buttons; un botón que habilita el ajuste, un botón que permite ajustar los minutos y el último botón que permite ajustar las horas. La hora y el menú de ajuste son mostrados en la LCD, obteniendo finalmente un reloj preciso y fácil de usar para cualquier usuario.

Introducción

En este reporte presentamos la metodología que utilizamos para construir nuestro reloj digital, abarcando desde la parte de programación hasta la parte de montaje del circuito. Es importante resaltar que asumimos que el lector tiene nociones básicas de programación en lenguaje C, uso de interrupciones y circuitos electrónicos.

El objetivo principal de la práctica es utilizar el microcontrolador PIC18F4550 para construir un reloj digital ajustable, realizando un código en lenguaje C basado en el uso de interrupciones y usando una LCD para mostrar la hora del reloj.

Para facilitar la comprensión de la práctica presentamos en la siguiente sección una serie de conceptos básicos que serán de utilidad para el lector.

Marco Teórico

que serán de utilidad para el lector. Marco Teórico Microcontrolador Es un circuito integrado que en

Microcontrolador

Es un circuito integrado que en su interior contiene una unidad central de procesamiento (CPU), unidades de

1

memoria (RAM y ROM), puertos de entrada y salida y periféricos.

Este circuito integrado programable, es capaz de ejecutar las órdenes grabadas en su memoria. Las órdenes a ejecutar se pueden describir en un código creado en diferentes lenguajes de programación compatibles con el microcontrolador.

de programación compatibles con el microcontrolador. PIC18F4550 El PIC18F4550 pertenece a la familia de

PIC18F4550

El PIC18F4550 pertenece a la familia de microcontroladores PIC18 de Microchip. Es un microcontrolador de 8 bits de bajo costo que tiene prestaciones media/altas que lo hacen apto para aplicaciones industriales.

que tiene prestaciones media/altas que lo hacen apto para aplicaciones industriales. Fig 1 PIC18F4550 Lenguaje Ensamblador

Fig 1 PIC18F4550

Lenguaje Ensamblador

Es un lenguaje de programación de bajo nivel, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador. Este es el lenguaje utilizado para crear el código utilizado en nuestra práctica.

para crear el código utilizado en nuestra práctica. Compilador CCS Un compilador es un software que

Compilador CCS

Un compilador es un software que nos va

a permitir crear nuestro código con el cual programaremos nuestro PIC18F4550.

CCS desarrolló el primer compilador de C

para microcontroladores Microchip hace más de 20 años. Entre las características importantes de este compilador se encuentra la posibilidad de definir, configurar y gestionar fácilmente las

interrupciones

Lenguaje Cconfigurar y gestionar fácilmente las interrupciones Es también conocido como “Lenguaje de programa de

Es también conocido como “Lenguaje de programa de sistemas”. El lenguaje C es del tipo lenguaje estructurado como son Pascal, Fortran y Basic. Al ser un lenguaje estructurado se considera como un lenguaje de alto nivel. Para simplificar el funcionamiento del lenguaje C tiene incluidas librerías de funciones que pueden ser incluidas haciendo referencia la librería que las incluye.

La programación en C tiene una gran facilidad para escribir códigos compactos

y sencillos a la vez.

para escribir códigos compactos y sencillos a la vez. Interrupciones Una interrupción detiene la ejecución de

Interrupciones

Una interrupción detiene la ejecución de un programa y pasa a la rutina de servicio del evento que provoca la interrupción.

2

Esta es otra forma de ver lo que pasa con las interrupciones:

Cuando estamos trabajando en la computadora y repentina mente suena nuestro celular, en ese momento dejamos la computadora y atendemos la llamada de nuestro celular, al terminar la llamada continuamos trabajando en la computadora.

la llamada continuamos trabajando en la computadora. Timer1 El PIC18F4550 cuenta con cuatro timers; timer0,

Timer1

El PIC18F4550 cuenta con cuatro timers; timer0, timer1, timer2 y timer3. El timer0 es de bits, y los otros tres son de 16 bits. Para esta práctica utilizamos el timer1.

El Timer1 es un temporizador/contador ascendente parecido al TMR0, con algunas peculiaridades que lo hacen muy interesante a la hora de incluir temporizadores en nuestros programas. Como ya lo mencionamos, el timer1 se trata de un contador de 16 bits cuyo valor se almacena en dos registros de 8 bits el TMT1H y el TMR1L, ambos registros se pueden leer y escribir su valor durante la ejecución 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 máximo valor empieza desde 0 avisándonos de ello por medio de la bandera TMR1F.

Si

está

activa

la

interrupción

por

desbordamiento

del

Timer

1

al

el programa

entra en la función de tratamiento a la

desbordarse

el contador,

interrupción

por

desbordamiento

del

Timer1.

Como características del Timer1 podemos destacar las siguientes:

o Puede funcionar con un oscilador externo y trabajar a una frecuencia distinta a la del oscilador principal del PIC.

o

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 (si se usa reloj interno funcionara como temporizador, si se usa reloj externo funcionará como contador).

o

El tiempo que se tarda en incrementarse el contador se suele llamar paso, el piso del contador depende de la frecuencia del oscilador y el preescalar seleccionado.

o

La fórmula para determinar los tiempos del Timer1 cuando es utilizado como temporizador (reloj interno) es la siguiente:

1 =

65536 − [tiempo que queremos/(

4

Frecuencia Oscilador )]

(1.0)

Para configurar el timer1 se deben utilizar una serie de instrucciones, estas instrucciones serán explicadas más adelante en la realización del programa.

Proteus 8.1explicadas más adelante en la realización del programa. Es una herramienta de software que permite la

Es una herramienta de software que permite la simulación de circuitos electrónicos con microcontroladores.

Programador K150de circuitos electrónicos con microcontroladores. Es un programador de PIC’S de bajo costo. Sirve para

Es un programador de PIC’S de bajo costo. Sirve para cargar nuestro código en el PIC18F4550. Fue utilizado junto con el software microbrn.

3

PIC18F4550. Fue utilizado junto con el software microbrn. 3 Fig 2 Programador de PIC K150 LCD

Fig 2 Programador de PIC K150

con el software microbrn. 3 Fig 2 Programador de PIC K150 LCD 16x2 La pantalla de

LCD 16x2

La pantalla de cristal líquido o LCD (por sus siglas en inglés: Liquid Crystal Display) es un dispositivo electrónico micro controlado de visualización gráfica para la presentación de caracteres, símbolos y números. Dispone de 2 filas y 16 caracteres en cada fila y cada carácter

dispone de una matriz de 5x7 puntos (pixeles).

carácter dispone de una matriz de 5x7 puntos (pixeles). Fig 3 LCD Desarrollo Para la construcción

Fig 3 LCD

Desarrollo

Para la construcción de nuestro reloj seguimos la siguiente metodología:

1.-Realizamos el código en lenguaje C utilizando el compilador CCS.

2.-Creamos el circuito el Proteus y una vez teniendo nuestro código realizamos la simulación.

la

3.-Comprobando el circuito

simulación construimos el circuito en

físico.

en

Como

primera

parte

realizamos

la

programación

para

nuestro

reloj.

El

código

utilizado

lo

mostramos

a

continuación:

código utilizado lo mostramos a continuación: Fig 4 Cabecera de nuestro código En la cabecera nosotros

Fig 4 Cabecera de nuestro código

En la cabecera nosotros designamos el

PIC que utilizamos, los nombres de nuestras variables y el puerto que utilizamos para comunicarnos con la LCD.

Para asignar el valor que debemos cargar

a nuestro timer1 debemos usar la

ecuación (1.1). Como un segundo es un tiempo demasiado grande en el mundo de

los microcontroladores, usaremos un tiempo múltiplo de 1 segundo, en este

caso, queremos obtener una interrupción

de 10 ms. El valor que debemos cargarle

al Timer será igual a:

4

65536 − [0.01 seg/( 24MHz )]=

5536

(1.1)

En la cabecera designamos un valor de

48MHz y en la fórmula utilizamos una frecuencia de 24MHz. Esto se debe a que más adelante configuraremos el timer para dividir la frecuencia entre dos.

4

el timer para dividir la frecuencia entre dos. 4 Fig 5 Interrupción del timer1 El valor

Fig 5 Interrupción del timer1

El

valor

de

5536

lo

convertimos a

hexadecimal

para

cargarlo

en

la

instrucción set_timer.

esta parte del código

designamos lo que hará nuestro timer. Aquí con ayuda de los if, creamos las condiciones de funcionamiento para nuestro reloj.

Así

que

en

Es importante destacar que incluimos un contador que estará contando hasta 100 para obtener un segundo con los 10ms de

la interrupción del timer.

A continuación vamos a escribir nuestro

void main, que será nuestro código principal.

nuestro void main, que será nuestro código principal. Fig 6 Configuración de nuestro timer En esta

Fig 6 Configuración de nuestro timer

En esta parte también habilitamos el uso de nuestra LCD, a incluimos el mensaje principal que se mostrará, es este caso es “RELOJ DIGITAL”.

Fig 7 Condición while En la condición while (en español significa mientras) incluimos lo que

Fig 7 Condición while

En la condición while (en español significa mientras) incluimos lo que nuestro programa estará haciendo mientras se ejecuta nuestra interrupción. Como se puede apreciar en esta sección incluimos las condiciones que nos van a permitir ajustar la hora del reloj mientras el botón SET se mantenga presionado.

del reloj mientras el botón SET se mantenga presionado. Fig 8 Parte final del programa Por

Fig 8 Parte final del programa

Por ultimo mostramos la hora en la lcd con la instrucción printf. Y procedemos a compilar nuestro código.

Una vez que compilamos con éxito nuestro código, continuamos con la práctica creando el circuito en Proteus para realizar nuestra simulación. El circuito que utilizamos se muestra a continuación.

5

El circuito que utilizamos se muestra a continuación. 5 Fig 9 Circuito y simulación La simulación

Fig 9 Circuito y simulación

La simulación que realizamos nos mostró un buen funcionamiento de nuestro programa y de nuestro circuito, así que continuamos con la práctica realizando nuestro circuito en físico.

Para poder incluir nuestro PIC18F4550 en el circuito en físico primero debemos cargarle nuestro programa. Esto lo hicimos utilizando la tarjeta programadora K150 y el software microbrn.

Con el programa cargado armamos el circuito en físico quedando como se muestra a continuación.

en físico quedando como se muestra a continuación. Fig 10 Circuito en físico del reloj digital

Fig 10 Circuito en físico del reloj digital

Con el circuito correctamente armado solo nos queda simplemente alimentar el circuito y probarlo.

El circuito debe alimentarse con 5 volts y es importante asegurarse que las conexiones del pic sean las correctas para evitar que éste se queme.

Cuando alimentamos el circuito el reloj comienza con los segundos, minutos y horas en ceros, entonces ajustamos el reloj con la hora actual de ese momento.

Para ajustar la hora dejamos presionado el botón de ajuste y nos aparecerá el siguiente mensaje en la LCD:

de ajuste y nos aparecerá el siguiente mensaje en la LCD: Fig 11 Menú de configuración

Fig 11 Menú de configuración

En este menú pudimos modificar la hora, utilizando los otros dos push buttons de minutos y horas hasta lograr introducir los números de la hora correcta.

hasta lograr introducir los números de la hora correcta. Fig 12 Ajustando hora actual Cuando introducimos

Fig 12 Ajustando hora actual

Cuando introducimos la hora adecuada solo hace falta dejar de presionar el botón de ajuste para terminarla configuración del reloj.

botón de ajuste para terminarla configuración del reloj. Fig 13 Reloj correctamente configurado Obteniendo así un

Fig 13 Reloj correctamente configurado

Obteniendo así un reloj preciso correctamente configurado. El paso de la configuración se puede repetir las veces que sea necesario.

Análisis

Como se puede observar en las últimas tres imágenes, logramos construir un reloj digital fácil de configurar y con una precisión que permite dar la hora correcta.

Esa precisión que obtuvimos fue gracias a la correcta configuración de nuestro timer1. Obtener un tiempo de 10ms fue de gran importancia para a partir de ese tiempo conseguir el cambio de segundo a segundo

Esos 10 ms logramos comprobarlos observándolos con el osciloscopio. Observamos una onda cuadrada con un periodo de 20 ms, pero esta onda tenía un ciclo de trabajo del 50% por lo que la duración del tiempo que se mantenía en alto era de 10 ms.

De esta manera comprobamos que el valor que obtuvimos de la ecuación (1.1) y que cargamos en el temporizador, nos serviría para construir nuestro reloj digital.

Para agregar a nuestro reloj la posibilidad de configurar la hora, fue necesario primero detener todas las interrupciones

6

de nuestro programa. Al principio no lo hicimos por lo que cuando queríamos configurar la hora, observamos que los minutos y las horas se iban incrementando aun cuando no presionábamos ningún botón. Además agregamos una línea en nuestro código que pone en ceros a los segundos cuando terminamos de configurar la hora, lo que se debe tomar en cuenta a la hora de ajustarla.

Conclusiones

El uso de interrupciones

programación de microcontroladores es

común y ofrece una gran cantidad de aplicaciones.

la

en

El código que realizamos para ésta práctica se simplificó en gran medida al utilizar el timer1 y sus características.

Tuvimos la oportunidad de realizar una prueba con nuestro reloj. Lo comparamos con un reloj que produce un sonido cada vez que la aguja de los segundos cambia de posición. Esta prueba fue realizada prácticamente por error, pero nos dimos cuenta que los segundos de nuestro reloj cambiaban cada vez que se escuchaba el sonido del cambio de segundo del otro reloj.

El resultado final fue satisfactorio ya que obtuvimos un reloj funcional, tal como cualquier reloj convencional.

7

Cuestionario

1. ¿Qué es una interrupción?

Una interrupción detiene la ejecución de un programa y pasa a la rutina de servicio del evento que provoca la interrupción. Dicha interrupción ocurrirá cada cierto tiempo dependiendo del valor que tenga cargado en su configuración.

2. Calcule el valor que se debe cargar al timer1 para obtener una interrupción de 5ms a partir de la ecuación (1.1), tomando en cuenta una Frecuencia de Oscilación de 24 MHz. El valor deberá darse en número hexadecimal.

= 65536 − [tiempo que queremos/(

4

Frecuencia Oscilador )]

= 65536 − [0.005/(

4

24MHz )]

= 65536 − 30000

= 35,536

Ahora lo convertiremos a hexadecimal utilizando una calculadora que realiza esta función.

35,536 decimal = 8AD0

Este deberá ser el valor que cargaremos en el Timer1.

8

Bibliografía

2. http://www.aquihayapuntes.com/indice-practicas-pic-en-c/uso-del-tmr1-como-

temporizador.html, 12 de octubre de 2014.

9