Universidad Tecnológica de Valles Centrales de
Oaxaca
PRÁCTICA: RELOJ DIGITAL
ALUMNOS:
OLIVER ABRAHAM SOSA MARTÍNEZ
JOSE ALBERTO GARCIA VALENCIA
EMILIO ESTEFAN ARREDONDO HINOSTROSA
DOCENTE:
ING. OSMAR JASSIEL MACHUCA HERRADA
QUINTO CUATRIMESTRE
MICROCONTROLADORES
3 de mayo del 2025
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 1
Índice
1. Introduccion 2
2. Desarrollo 3
2.1. Descripcion del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2. Lista de materiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3. Diagrama Electronico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4. Cálculos realizados para la configuración de los timers . . . . . . . . . . . 6
3. Codigo Fuente 8
3.1. Librerias y Variables Globales . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2. Configuracion de Pines y Temporizadores . . . . . . . . . . . . . . . . . . 9
3.3. Interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4. Funcion Principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4. Resultados 18
5. Conclusiones 20
Índice de figuras
1. Diagrama del sistema implementado . . . . . . . . . . . . . . . . . . . . 5
2. Evidencia del funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . 18
3. TSegunda evidencia del funcionamiento . . . . . . . . . . . . . . . . . . . 19
4. Evidencia de la simulacion del funcionamiento . . . . . . . . . . . . . . . 19
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 2
1. Introduccion
Desarrolle un código para el ATMega328P para realizar un reloj, el ajuste del tiempo
se debe hacer con un solo botón. Al mantener presionado el botón 3 segundos el AT-
Mega328P te permitirá configurar los segundos, al mantener presionando por 3 segundos
nuevamentes podrá configurar los minutos y por último al mantener presionado por 3
segundos nuevamente podrá aumentar el contador de horas, el cual será en formato de
24.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 3
2. Desarrollo
2.1. Descripcion del proyecto
Este proyecto consistió en la creación de un reloj digital con el microcontrolador
ATmega328P, utilizando seis displays de 7 segmentos para mostrar la hora en formato
HH:MM:SS. Los displays se controlan mediante multiplexado: el puerto D se encarga de
los segmentos y el puerto C de activar cada display individualmente. Se usó un solo botón
conectado al pin PB5 para permitir al usuario modificar la hora. Al presionar el botón, el
usuario puede ajustar segundos, minutos u horas, cambiando de modo con una pulsación
larga y aumentando valores con pulsaciones cortas.
Para que todo esto funcione correctamente, se utilizaron tres temporizadores del mi-
crocontrolador. El Timer0 se encargó del multiplexado de los displays, es decir, de alternar
cuál display está activo en cada momento. El Timer1 fue configurado para generar una
interrupción cada segundo, lo que permite incrementar los segundos y, con el manejo ade-
cuado, los minutos y horas. Por otro lado, el Timer2 detectó cuánto tiempo se mantiene
presionado el botón, lo que permitió cambiar entre los distintos modos de edición.
El armado del circuito se realizó conectando los displays y el botón a los pines corres-
pondientes del microcontrolador, montado en una protoboard o PCB con cables organi-
zados y alimentación de 5V. El resultado es un reloj digital funcional, preciso y completa-
mente interactivo, ideal para ver a gran escala la comprension de el uso de interrupciones,
timers y manejo de entradas/salidas digitales con microcontroladores.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 4
2.2. Lista de materiales
Microcontrolador ATmega328P
6 Displays de 7 segmentos catodo comun
1 Botón de dos terminales
Resistencias 1K
Transistores 2n222
Protoboard o PCB para montaje
Cables Dupont o conexiones soldadas
Fuente de alimentación de 5V
Programador Usb Usbasp Usbisp Isp Asp Avr Atmel Atmega
Cristay 16Mhz
2 capacitores de 22 pF.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 5
2.3. Diagrama Electronico
Figura 1: Diagrama del sistema implementado
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 6
2.4. Cálculos realizados para la configuración de los timers
Para lograr una correcta operación del reloj digital utilizando el microcontrolador
ATmega328P, fue necesario configurar adecuadamente tres temporizadores: el Timer0,
Timer1 y Timer2. A continuación se presentan los cálculos realizados para cada uno de
ellos, considerando una frecuencia de reloj del sistema de 16 MHz.
Timer0 – Multiplexado de displays
El Timer0 se configuró para operar en modo normal con un prescaler de 1024. Se
deseaba una interrupción cada aproximadamente 5 ms para alternar entre los seis displays,
generando un refresco continuo sin parpadeos.
(256 − T CN T 0) · P rescaler
T =
fclk
Sustituyendo los valores:
(256 − 177) · 1024 79 · 1024
T = 6
= ≈ 0,00505s = 5,05ms
16 × 10 16, 000, 000
Por lo tanto, se cargó el registro TCNT0 con el valor 177 para generar una interrupción
cada 5 ms.
Timer1 – Incremento del reloj cada segundo
El Timer1 se configuró en modo CTC (Clear Timer on Compare Match) con un
prescaler de 1024, con el objetivo de generar una interrupción cada 1 segundo. Para ello,
se calculó el valor necesario en el registro de comparación OCR1A.
fclk 16 × 106
OCR1A = −1= − 1 = 15625 − 1 = 15624
P rescaler 1024
Sin embargo, en el código se utilizó directamente OCR1A = 15625, lo cual mantiene una
frecuencia cercana a 1 Hz y cumple correctamente con la función deseada de actualizar
los segundos.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 7
Timer2 – Detección de pulsación larga
El Timer2 también fue configurado en modo CTC, con un prescaler de 1024, para de-
tectar cuándo el botón se mantiene presionado durante un perı́odo de tiempo prolongado
(aproximadamente 3 segundos). El valor de comparación utilizado fue:
OCR2A = 195
La fórmula para el perı́odo de la interrupción es:
(OCR2A + 1) · P rescaler (195 + 1) · 1024 200, 704
T = = 6
= ≈ 0,0125s = 12,5ms
fclk 16 × 10 16, 000, 000
Cada vez que se genera esta interrupción, se incrementa un contador interno. Cuando
dicho contador alcanza aproximadamente 160 (correspondientes a unos 3 segundos), se
cambia el modo de edición del reloj.
Estos cálculos permitieron garantizar la correcta operación del sistema de tiempo,
brindando un control preciso del reloj digital y una experiencia fluida de interacción para
el usuario.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 8
3. Codigo Fuente
A continuacion, se presenta el codigo del reloj, dividido en secciones para su explica-
cion detallada.
3.1. Librerias y Variables Globales
Listing 1: Librerias y variables globales
1 # include < avr / io .h >
2 # include < avr / interrupt .h >
3
4 uint8_t indice_display = 0;
5 uint8_t segundos [2] = {0 , 0};
6 uint8_t minutos [2] = {0 , 0};
7 uint8_t horas [2] = {0 , 0};
8 uint8_t e st a d o_ m o di f i ca c i on = 0;
9 uint8_t boton_presionado = 0;
10 uint16_t contador_tiempo = 0;
11
12 const uint8_t mapa_segmentos [10] = {0 x3F , 0 x06 , 0 x5B , 0 x4F , 0 x66 , 0 x6D ,
0 x7D , 0 x07 , 0 x7F , 0 x6F };
Lo principal es la inclusión de las librerı́as para la programación de microcontroladores
AVR: < avr/io.h > y < avr/interrupt.h >. Las cuales perimeten la manipulacion de los
registros de entrada y salidas y la habilitacion de las interrupciones
La declaracion de las variables para el manejo del reloj y la interacción con el usuario
son las siuientes; La variable indice display se utiliza para la multiplexación de los dı́gitos
en el display . Las matrices segundos[2], minutos[2] y horas[2] almacenan las unidades
y decenas de cada componente del tiempo. La variable estado modificacion controla el
modo de funcionamiento del reloj, mientras que boton presionado y contador tiempo se
emplean para detectar y medir la duración de las pulsaciones. Array mapa segmentos
define los valores hexadecimales para activar los segmentos del display y representar los
números del 0 al 9.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 9
La definicion de la variable array mapa segmentos,es crucial para la representación
de los números en el display. Cada elemento del array corresponde a un número del 0 al
9, y su valor hexadecimal indica qué segmentos del display deben activarse para mostrar
dicho nú[Link] valores son utilizados posteriormente en el código para encender los
segmentos correspondientes en el display y mostrar la hora correcta.
3.2. Configuracion de Pines y Temporizadores
Listing 2: Configuracion de pines y temporizadores
1 void configurar_pines () {
2 DDRC = 0 x3F ;
3 DDRD = 0 x7F ;
4 PORTB |= (1 << PB5 ) ;
5 PCICR |= (1 << PCIE0 ) ;
6 PCMSK0 |= (1 << PCINT5 ) ;
7 }
La función configurar pines() se encarga de establecer la configuración inicial de los
pines del microcontrolador AVR. Primero, se configuran los puertos C (PC0-PC5) y D
(PD0-PD6) como salidas mediante los registros DDRC y DDRD, respectivamente. Esto
permite controlar la activación de los displays y enviar los datos de los números a mostrar.
Finalmente, se configura una interrupción de cambio de pin (Pin Change Interrupt) en
el botón PB5. Esto permite que el microcontrolador detecte cuando el botón es presionado
y ejecute la rutina de servicio de interrupción (ISR) correspondiente.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 10
Listing 3: Configuracion de pines y temporizadores
1
2 void con figur ar_tim er0 () {
3 TCCR0A = 0 x00 ;
4 TCCR0B = (1 << CS02 ) | (1 << CS00 ) ;
5 TCNT0 = 177;
6 TIMSK0 = (1 << TOIE0 ) ;
7 }
La función configura el Timer 0 del microcontrolador AVR en modo de desbordamiento
para el multiplexado del display de 7 segmentos. TCCR0A se establece en modo normal,
TCCR0B configura un prescaler de 1024, y TCNT0 inicia la cuenta en 177, resultando
en una interrupción cada 5 ms. TIMSK0 habilita la interrupción por desbordamiento
del Timer 0, ejecutando una rutina que cambia el dı́gito del display. Esta configuración
genera una interrupción cada 5 ms, permitiendo cambiar entre los 6 dı́gitos del reloj 33
veces por segundo, evitando el parpadeo visible.
Listing 4: Configuracion de pines y temporizadores
1 void con figur ar_tim er1 () {
2 TCCR1B |= (1 << WGM12 ) | (1 << CS12 ) | (1 << CS10 ) ;
3 OCR1A = 15625;
4 TIMSK1 |= (1 << OCIE1A ) ;
5 }
La función configura el Timer 1 del microcontrolador AVR en modo CTC (Clear Timer
on Compare Match) para generar interrupciones precisas cada segundo. TCCR1B se con-
figura para el modo CTC y un prescaler de 1024, reduciendo la frecuencia del reloj a
15,625 Hz. OCR1A se establece en 15625, lo que provoca que el Timer 1 genere una inte-
rrupción cada segundo. TIMSK1 habilita la interrupción de comparación de coincidencia,
ejecutando la rutina ISR(TIMER1 COMPA vect) que incrementa los segundos, minutos
y horas del reloj.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 11
Listing 5: Configuracion de pines y temporizadores
1 void con figur ar_tim er2 () {
2 TCCR2A = (1 << WGM21 ) ;
3 TCCR2B = (1 << CS22 ) | (1 << CS21 ) | (1 << CS20 ) ;
4 OCR2A = 195;
5 TIMSK2 = (1 << OCIE2A ) ;
6 }
La función configurar timer2() ajusta el Timer 2 del microcontrolador AVR en modo CTC
con un prescaler de 1024, generando una interrupción cada 12.48 ms. Esta interrupción,
habilitada mediante TIMSK2, ejecuta una rutina que verifica si el botón está presionado,
incrementando un contador de tiempo. Si el botón se mantiene presionado lo suficiente,
se cambia el modo de ajuste del reloj; de lo contrario, se actualizan los valores del reloj.
Esta configuración permite detectar la duración de la pulsación del botón para controlar
el modo de edición del reloj.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 12
3.3. Interrupciones
Listing 6: Interrupciones del sistema
1 ISR ( TIMER0_OVF_vect ) {
2 TCNT0 = 177;
3 PORTC = 0 x00 ;
4 uint8_t * digitos ;
5
6 if ( indice_display < 2) digitos = segundos ;
7 else if ( indice_display < 4) digitos = minutos ;
8 else digitos = horas ;
9
10 uint8_t display_activo = indice_display % 2;
11 PORTD = mapa_segmentos [ digitos [ display_activo ]];
12
13 if ( e st a d o_ m o di f i ca c i on == 0) {
14 PORTC = (1 << indice_display ) ;
15 } else {
16 static uint8_t parpadeo = 0;
17 parpadeo ++;
18 if ( parpadeo >= 50) {
19 parpadeo = 0;
20 } else if ( parpadeo < 25) {
21 PORTC = (1 << indice_display ) ;
22 }
23 }
24
25 indice_display ++;
26 if ( indice_display >= 6) {
27 indice_display = 0;
28 }
29 }
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 13
Esta interrupción, activada por el desbordamiento del Timer 0, controla el multiplexa-
do del display de 7 segmentos para mostrar la hora. Reinicia el contador del Timer, apaga
momentáneamente los displays para evitar interferencias visuales, y luego selecciona el
par de dı́gitos (segundos, minutos u horas) a mostrar según el valor de indice display. De-
termina si se muestra la unidad o la decena del par seleccionado y enciende los segmentos
correspondientes en el display. Si el reloj está en modo de edición, el dı́gito seleccionado
parpadea; de lo contrario, se muestra de forma continua. Finalmente, incrementa indice
display para pasar al siguiente dı́gito y repite el proceso cı́clicamente, asegurando que
todos los dı́gitos se muestren correctamente y sin parpadeo visible.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 14
Listing 7: Interrupciones del sistema
1 ISR ( PCINT0_vect ) {
2 if (!( PINB & (1 << PB5 ) ) ) {
3 if (! boton_presionado ) {
4 boton_presionado = 1;
5 contador_tiempo = 0;
6 uint8_t * digitos ;
7 if ( es t a d o_ m o di f i ca c i on == 1) digitos = segundos ;
8 else if ( e st a d o_ m o di f i ca c i on == 2) digitos = minutos ;
9 else if ( e st a d o_ m o di f i ca c i on == 3) digitos = horas ;
10 else return ;
11 // Incrementar el valor actual
12 digitos [1]++;
13 if ( digitos [1] > 9) {
14 digitos [1] = 0;
15 digitos [0]++;
16 }
17
18 // R e s t r i c c i n de valores
19 if ( es t a d o_ m o di f i ca c i on == 1 && digitos [0] > 5) { //
Segundos
20 digitos [0] = 0;
21 } else if ( e s t ad o _ mo d i fi c a ci o n == 2 && digitos [0] > 5)
{ // Minutos
22 digitos [0] = 0;
23 } else if ( e s t ad o _ mo d i fi c a ci o n == 3) { // Horas
24 if ( digitos [0] > 2 || ( digitos [0] == 2 && digitos [1] >
3) ) {
25 digitos [0] = 0;
26 digitos [1] = 0;
27 }
28 }
29 }
30 } else {
31 boton_presionado = 0;
32 }
33 }
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 15
La interrupción PCINT0vect se activa al cambiar el estado del botón PB5, permitiendo
ajustar la hora en modo edición. Primero, verifica si el botón está presionado y si no se
habı́a registrado previamente, evitando rebotes. Luego, marca el botón como presionado
y reinicia un contador de tiempo. Según el modo de edición, selecciona los dı́gitos a
modificar (segundos, minutos u horas) y los incrementa, aplicando lı́mites para cada
unidad de tiempo. Finalmente, registra cuando el botón es liberado, permitiendo futuras
pulsaciones. Esta rutina asegura la correcta detección de pulsaciones y la modificación
precisa de la hora en modo edición.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 16
Listing 8: Interrupciones del sistema
1 ISR ( T IMER2_ COMPA_ vect ) {
2 if ( boton_presionado ) {
3 contador_tiempo ++;
4 if ( contador_tiempo >= 150) {
5 contador_tiempo = 0;
6 e s ta d o _m o d if i c ac i o n ++;
7 if ( es t a d o_ m o di f i ca c i on > 3) e st a d o_ m o di f i ca c i on = 0;
8 }
9 }
10 }
11 ISR ( T IMER1_ COMPA_ vect ) {
12 if ( e st a d o_ m o di f i ca c i on == 0) {
13 segundos [1]++;
14 if ( segundos [1] > 9) {
15 segundos [1] = 0;
16 segundos [0]++;
17 if ( segundos [0] > 5) {
18 segundos [0] = 0;
19 minutos [1]++;
20 if ( minutos [1] > 9) {
21 minutos [1] = 0;
22 minutos [0]++;
23 if ( minutos [0] > 5) {
24 minutos [0] = 0;
25 horas [1]++;
26 if ( horas [1] > 9) {
27 horas [1] = 0;
28 horas [0]++;
29 }
30 if ( horas [0] > 2 || ( horas [0] == 2 && horas [1]
> 3) ) {
31 horas [0] = 0;
32 horas [1] = 0;
33 }
34 } } } } }}
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 17
Las interrupciones TIMER2 COMPA vect y TIMER1 COMPA vect gestionan as-
pectos distintos del reloj. TIMER2 COMPA vect controla el tiempo de pulsación del
botón y cambia los modos de edición, mientras que TIMER1 COMPA vect incrementa
automáticamente el tiempo cada segundo en modo normal.
La interrupción TIMER2 COMPA vect se activa periódicamente y verifica si el botón
está presionado. Si lo está, incrementa un contador de tiempo. Cuando el contador alcanza
un valor predefinido, cambia el modo de edición entre normal, segundos, minutos y horas.
Por otro lado, la interrupción TIMER1 COMPA vect se ejecuta cada segundo y, si
el reloj está en modo normal, incrementa los segundos. Cuando los segundos alcanzan
60, incrementa los minutos, y cuando los minutos alcanzan 60, incrementa las horas. Las
horas se ajustan para mantener el formato de 24 horas.
3.4. Funcion Principal
Listing 9: Funcion principal del programa
1 int main ( void ) {
2 configurar_pines () ;
3 conf igurar _time r0 () ;
4 conf igurar _time r1 () ;
5 conf igurar _time r2 () ;
6 sei () ;
7 while (1) {}
8 }
La funcion principal inicializa los perifericos y deja que el programa se ejecute indefi-
nidamente.
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 18
4. Resultados
En general, se obtuvieron resultados bastante satisfactorios que nos permitieron eje-
cutar la práctica de manera eficiente y sin contratiempos. Durante el desarrollo de la
actividad, pudimos comprobar el correcto funcionamiento de los procedimientos esta-
blecidos, lo que nos permitió validar tanto la teorı́a como su aplicación en un entorno
práctico.
Además, se observaron ciertos aspectos que podrı́an mejorarse en futuras ejecuciones,
como la optimización de algunos parámetros o la consideración de condiciones adicionales
que podrı́an influir en los resultados. Sin embargo, a pesar de estos pequeños detalles,
el objetivo principal de la práctica se logró con éxito, proporcionando un aprendizaje
significativo y reforzando los conocimientos adquiridos en clase.
Figura 2: Evidencia del funcionamiento
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 19
Figura 3: TSegunda evidencia del funcionamiento
Figura 4: Evidencia de la simulacion del funcionamiento
Universidad Tecnológica de Valles Centrales de Oaxaca
Microcontroladores 20
5. Conclusiones
Jose Alberto
La implementación del reloj digital permitió aplicar conceptos teóricos de manera
práctica, reforzando el conocimiento sobre programación a bajo nivel en sistemas em-
bebidos. El uso de variables segmentadas para las unidades y decenas facilitó el control
del formato de 24 horas, y el sistema de edición mediante un solo botón demostró ser
funcional, aunque susceptible de perfeccionamiento. Se recomienda integrar un segundo
botón para una interacción más eficiente y precisa.
Oliver Abraham
A través de esta práctica se logró comprobar el comportamiento de los periféricos
internos del microcontrolador, en particular los temporizadores y el manejo de interrup-
ciones externas. Se alcanzaron los objetivos propuestos, logrando un control efectivo del
tiempo y una interfaz funcional para modificarlo. Como mejora futura, se sugiere optimi-
zar la lógica del parpadeo durante la edición y considerar una interfaz más intuitiva para
el usuario.
Emilio Estefan
El proyecto desarrollado permitió validar satisfactoriamente el funcionamiento de un
reloj digital basado en microcontroladores AVR, utilizando interrupciones, temporizado-
res y multiplexado para gestionar tanto la visualización como el ajuste de la hora. La
correcta ejecución del programa evidenció que la lógica implementada cumple con los
requisitos establecidos, permitiendo una operación fluida y precisa del sistema.