Está en la página 1de 11

IT-8-ACM-03-R02

UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN


FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

TIPO DE EXAMEN: MEDIO CURSO ENERO JUNIO


MATERIA: MICROCONTROLADORES
SEMESTRE: SEXTO
ACADEMIA: ELECTRONICA

Nombre: _______Héctor Emiliano Magaña Calderon____________________________Fecha_01___/__10__/2021

Matricula _______1872615___________Hora __V4_____ Salón _____7215____ Tiempo: Inicio ______ Final ______

INSTRUCCIONES:

a) Lea cuidadosamente este examen y resuelva los problemas propuestos en las hojas anexas, encierre los resultados en un
rectángulo, no despegue las hojas. Favor de dejar su celular apagado y dentro de su mochila.
b) Es un examen individual a libro cerrado, no está permitido el uso de notas, apuntes, calculadoras.
c) No se arriesgue, será considerado como copia, ver el examen de su compañero o el uso de notas.
d) Confirme los resultados obtenidos, de un ingeniero esperan que proporcione resultados correctos y soluciones concretas.
e) Concéntrese en su examen, tiene 2 horas 30 minutos para resolverlo.

RTC en displays

Utilizando dos displays de 4 dígitos de ánodo común se generará un barrido generando persistencia visual en
los displays. Para ello se utilizará un CI 74238 para controlar el ánodo que enciende cada digito y un CI 7447
para generar el número que se escribirá en cada digito. Para lograr el funcionamiento adecuado siga las
siguientes instrucciones:
1.- Desarrolle el código necesario para enviar un número y su correspondiente señal de activación en el lugar
que le corresponda del display.
2.- Genere el efecto de persistencia visual de forma simultánea en los 8 dígitos del display, considerando un
digito apagado entre horas, minutos y segundos.
3.- Utilice el video del funcionamiento del RTC para programar la hora de la clase utilizando los parámetros
para las horas, minutos y segundos.

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Indicaciones para el reporte del Proyecto:

1.- Marco Teórico


Describir:
Persistencia de la visión

La persistencia de la visión también llamada persistencia retiniana fue conocida como un fenómeno visual el
cual fue descubierto por el médico, físico y matemático Peter Mark Roget, el demostraría que esta sería como
una imagen permanece en la retina humana por un promedio de una décima de segunda más, antes de que esta
desaparezca por completo de nuestra visión.

Esto hace que veamos la realidad como una serie de secuencias ininterrumpidas y no como una sucesión de
imágenes estáticas e independientes.

Como nuestra retina viene siendo una parte muy sensible del ojo muy sensible a los estímulos luminosos,
retiene las imágenes durante una fracción de segundo antes de que estas desaparezcan por completo y sean
sustituidos por otras.

Posteriormente, el cine aprovechará la persistencia retiniana para generar la ilusión de movimiento proyectando
imágenes a 24 fotogramas por segundo. Las imágenes se organizan de forma que parece una secuencia
continua. Aunque existen teorías neurofísicas que no lo conciben como la explicación definitiva, es considerada
como una de las más importantes.

Un ilustración grafica clara de este fenómeno es el traumatropo era un disco de cartón que giraba sobre su eje
por medio de cuerdas que estaban amarradas a sus extremos. Las dos caras del disco tenían imágenes distintas
pero complementarias. Por lo regular los dibujos que se empleaban por lo general en este tipo de juguetes eran
de animales.
Para lograr la ilusión de movimiento se tenían que jalar las cuerdas del taumatropo con los dedos. Lo cual hacia
girar al disco y debido a la velocidad de las vueltas se creaba la ilusión de que ambas imágenes estaban juntas.

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Interrupciones en microcontroladores

Las interrupciones vienen siendo ya sea recursos o también mecanismos que están en el microcontrolador
siendo estos una serie de repuestas a varios eventos que sufra el elemento, permitiendo ya sea suspender
temporalmente el programa principal, ejecutar una subrutina de servicio de interrupción (ISR); una vez
terminada dicha subrutina, se reanuda la ejecución del programa principal.

Las interrupciones se generan cuando dispositivos periféricos conectados a la tarjeta electrónica solicitan enviar
información al microcontrolador, esto puede ser de manera asíncrona. También el proceso de interrupción se
puede generar de manera periódica, es decir por medio de una señal digital (por ejemplo de un milisegundo de
periodo) conectada a un pin específico del microcontrolador (INT0 o INT1) se puede atender tareas
determinadas como adquisición de datos, monitoreo de sensores, cálculos numéricos, envió de comando al
robot, etc.

Las interrupciones representan un atributo importante para todo sistema empotrado que le permite atender
procesos del mundo exterior sin descuidar actividades relevantes en la ejecución del programa del usuario.

2.- Algoritmo

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
3.- Diagrama Eléctrico

4.- Conteste cada uno de los siguientes puntos:

Configuración de periféricos.

Mis periféricos están configurados con 7 salidas en los pines C, una entrada para el RCC y su respectiva salida
en los puertos PH0 y PH1 respectivamente. Mis puertos del PC0 al PC3 están conectados al CI 7447 y del PC4
al PC6 al 74HC238.

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Escriba los prototipos de las funciones que el usuario agrego o utilizo.
Linea 21 RTC_HandleTypeDef hrtc;
Linea 23 void msDelay(uint16_t msTime);
Linea 24 void setDisplay(int dig1, int dig2, int dig3, int dig4, int dig5, int dig6, int dig7, int dig8);
Linea 25 void displayNumber(int count);
Linea 26 void GetTime(void);

Escriba las llamadas a función utilizadas o invocadas dentro del ciclo while o de alguna de las funciones que de
el se derivan.

Linea 48 displayNumber(Hora clase);


Linea 49 setDisplay(int dig1, int dig2, int dig3, int dig4, int dig5, int dig6, int dig7, int dig8);
Linea 50 msDelay(uint16_t msTime);
Linea 51 GetTime();
Linea 52 HAL_RTC_GetTime(&hrtc,&sTime1,RTC_FORMAT_BCD);
Linea 53 displayNumber(Hora clase);

Describa el funcionamiento de las funciones que generan la escritura de un número y generación del barrido en
los displays.

Linea 73. void DisplayNumber(int count)


Linea 74. {
Linea 75. int dig1, dig2, dig3, dig4, dig5, dig6, dig7, dig8;
Linea 76. dig1=count%10;
Linea 77. dig2=(count%100)/10;
Linea 78. dig3=(count%1000)/100;
Linea 79. dig4=(count%10000)/1000;
Linea 80. dig5=(count%100000)/10000;
Linea 81. dig6=(count%1000000)/100000;
Linea 82. dig7=(count%10000000)/1000000;
Linea 83. dig8=(count%100000000)/10000000;
Linea 84. setDisplay(dig1,dig2,dig3,dig4,dig5,dig6,dig7,dig8);
Linea 85. }

Línea 73.- Se declara la función DisplayNumber junto con la variable count ya almacenada.
Linea 75.- Se declara las 8 variables que la función utilizara para encender los segmentos de cada display.
Linea 76.- Se define el digito de unidad de la variable count en dig1
Linea 77.- Se define el digito de unidad de la variable count en dig2
Linea 78.- Se define el digito de unidad de la variable count en dig3
Linea 79.- Se define el digito de unidad de la variable count en dig4
Linea 80.- Se define el digito de unidad de la variable count en dig5
Linea 81.- Se define el digito de unidad de la variable count en dig6
Linea 82.- Se define el digito de unidad de la variable count en dig7
Linea 83.- Se define el digito de unidad de la variable count en dig8
Linea 84.- Se llama a la función setDisplay almacenando las variables previamente definidas dentro

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Linea 87 void setDisplay(int dig1, int dig2, int dig3, int dig4, int dig5, int dig6, int dig7, int dig8)
Linea 88 {
Linea 89 GPIOC->ODR=numeros[dig1]+D1;
Linea 90 msDelay(1);
Linea 91 GPIOC->ODR=numeros[dig2]+D2;
Linea 92 msDelay(1);
Linea 93 //GPIOC->ODR=numeros[dig3]+D3;
Linea 94 //msDelay(1);
Linea 95 GPIOC->ODR=numeros[dig4]+D4;
Linea 96 msDelay(1);
Linea 97 GPIOC->ODR=numeros[dig5]+D5;
Linea 98 msDelay(1);
Linea 99 //GPIOC->ODR=numeros[dig6]+D6;
Linea 100 //msDelay(1);
Linea 101 GPIOC->ODR=numeros[dig7]+D7;
Linea 102 msDelay(1);
Linea 103 GPIOC->ODR=numeros[dig8]+D8;
Linea 104 msDelay(1);
Linea 10 }

Línea 87.- Función setDisplay almacenando las variables previamente definidas en la función DisplayNumber.
Línea 89.- Se define la salida de GPIOC esta será igual a la posición de la variable ya definida números, esta
variable está haciendo indicada por dig1 y se coloca en la posición D1
Línea 90.-Es llamada la función msDelay y esta se declara con un valor de 1 ya declarado.
Línea 91.- Se define la salida de GPIOC esta será igual a la posición de la variable ya definida números, esta
variable está haciendo indicada por dig2 y se coloca en la posición D2
Línea 92.-Es llamada la función msDelay y esta se declara con un valor de 1 ya declarado
Línea 93.- Se define la salida de GPIOC esta será igual a la posición de la variable ya definida números, esta
variable está haciendo indicada por dig3 y se coloca en la posición D3
Línea 94.-Es llamada la función msDelay y esta se declara con un valor de 1 ya declarado
Línea 95.- Se define la salida de GPIOC esta será igual a la posición de la variable ya definida números, esta
variable está haciendo indicada por dig4 y se coloca en la posición D4
Línea 96.-Es llamada la función msDelay y esta se declara con un valor de 1 ya declarado
Línea 97.- Se define la salida de GPIOC esta será igual a la posición de la variable ya definida números, esta
variable está haciendo indicada por dig5 y se coloca en la posición D5
Línea 98.-Es llamada la función msDelay y esta se declara con un valor de 1 ya declarado
Línea 99.- Se define la salida de GPIOC esta será igual a la posición de la variable ya definida números, esta
variable está haciendo indicada por dig6 y se coloca en la posición D6
Línea 100.-Es llamada la función msDelay y esta se declara con un valor de 1 ya declarado
Línea 101.- Se define la salida de GPIOC esta será igual a la posición de la variable ya definida números, esta
variable está haciendo indicada por dig7 y se coloca en la posición D7
Línea 102.-Es llamada la función msDelay y esta se declara con un valor de 1 ya declarado
Línea 103.- Se define la salida de GPIOC esta será igual a la posición de la variable ya definida números, esta
variable está haciendo indicada por dig8 y se coloca en la posición D8
Línea 104.-Es llamada la función msDelay y esta se declara con un valor de 1 ya declarado

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Describa el funcionamiento de las funciones utilizadas para establecer el tiempo.
Linea 163 hrtc.Instance = RTC;
Linea 164 hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
Linea 165 hrtc.Init.AsynchPrediv = 127;
Linea 166 hrtc.Init.SynchPrediv = 255;
Linea 167 hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
Linea 168 hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
Linea 169 hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
Linea 170 if (HAL_RTC_Init(&hrtc) != HAL_OK)
Linea 171 {
Linea 172 Error_Handler();
Linea 173 }
Linea 174
Linea 175 /* USER CODE BEGIN Check_RTC_BKUP */
Linea 176
Linea 177 /* USER CODE END Check_RTC_BKUP */
Linea 178
Linea 179 /** Initialize RTC and set the Time and Date */
Linea 180 sTime.Hours = 0x18;
Linea 181 sTime.Minutes = 0x13;
Linea 182 sTime.Seconds = 0x0;
Linea 183 sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
Linea 184 sTime.StoreOperation = RTC_STOREOPERATION_RESET;
Linea 185 if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
Linea 186 {
Linea 187 Error_Handler();
Linea 188 }
Linea 189 sDate.WeekDay = RTC_WEEKDAY_MONDAY;
Linea 190 sDate.Month = RTC_MONTH_SEPTEMBER;
Linea 191 sDate.Date = 0x1;
Linea 192 sDate.Year = 0x0;
Linea 193
Linea 194 if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
Linea 195 {
Linea 196 Error_Handler();
Linea 197 }

Esta parte de la programación aunque no esté dentro del loop principal ni declarada como función en el
prototipo es importante abarcar ya que esta funciona como el establecimiento del tiempo que le
programamos antes de declarar los puertos de salida.

Línea 163 se define nuestra función RTC que es nuestro reloj de tiempo real o REAL TIME CLOCK
Línea 164 en este apartado declaramos nuestro formato del reloj para medir el tiempo en 24 horas
Línea 180 establecemos la hora para la programación del reloj la cual fue en las 18 horas
Línea 181 establecemos los minutos para la programación del reloj la cual empezara a los 13 minutos
Línea 182 establecemos los segundos para la programación el reloj teniendo una forma de 0 segundos para un
comienzo simple.
Línea 183 este apartado aclara las horas las cuales mostrara el display en momentos en que no haya ahorro de
luz pero no lo hemos definido.
Línea 185 si no se completa el comando HAL_RTC_SetTime debe de entrar obligatoriamente al comando if

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Describa el funcionamiento de las funciones utilizadas para leer el tiempo.
Línea 55 void GetTime(void)
Línea 56 {
Línea 57 RTC_DateTypeDef sDate1;
Línea 58 RTC_TimeTypeDef sTime1;
Línea 59 HAL_RTC_GetTime(&hrtc,&sTime1,RTC_FORMAT_BCD);
Línea 60 HAL_RTC_GetDate(&hrtc,&sDate1,RTC_FORMAT_BCD);
Línea 61 dhou=(sTime1.Hours/16)*10000000;
Línea 62 hou=(sTime1.Hours%16)*1000000;
Línea 63 dmin=(sTime1.Minutes/16)*10000;
Línea 64 min=(sTime1.Minutes%16)*1000;
Línea 65 dsec=(sTime1.Seconds/16)*10;
Línea 66 sec=(sTime1.Seconds%16);
Línea 67 Horaclase=(dhou+hou+dmin+min+dsec+sec);
Línea 68 }

Línea 55. Declaramos la función GetTIME en la que en este apartado no tiene ningún valor guardado en su
programación por ahora
Línea 57. Con nuestra variable sDate1 vendrá siendo una variable que se almacenara en el tiempo, debemos
de programarla con gran importancia en la misma función donde esta se extraerá junto con los dígitos de
horas, minutos y segundos, de otra manera esta no funcionara como queremos.
Línea 58. La variable sTime1 tendrá la misma función que la sDate1 y mismas precauciones en la
programación.
Línea 59. Obtendremos la hora exacta en la que nuestro RTC operara y se guardara en la estructura del
apartado &sTime1
Línea 60 Obtendremos la fecha exacta en la que nuestro RTC operara y se guardara en la estructura del
apartado &sTDate1
Línea 61. Se declaran los dígitos de las horas ya declaradas con antelación
Línea 62. Se declaran los dígitos de las decenas de horas ya declaradas con antelación
Línea 63. Se declaran los dígitos de los minutos ya declaradas con antelación
Línea 64. Se declaran los dígitos de las decenas de minutos ya declaradas con antelación
Línea 65. Se declaran los dígitos de los segundos ya declarados con antelación
Línea 66. Se declaran los dígitos de las decenas de segundos ya declaradas con antelación
Línea 67. Se declara la última variable la cual será los dígitos mostrados en el display a la hora de la operación
al sumar cada una de las variables de los dígitos de las horas en una sola.

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Describa el funcionamiento del loop de control principal.
Línea 48 while (1)
Línea 49 {
Línea 50 GetTime();
Línea 51 displayNumber(Horaclase);
Línea 52 }
Línea 53 }

Nuestra programación para el loop principal viene siendo una muy sencilla siendo tan solo dos funciones que
estarán en un bucle

Línea 48 declaramos la variable while la cual comenzara a dar una programación en un bucle sin fin
Línea 50 obtenemos la llamada de la función GetTime que nos dará la hora y esta estará almacenada en la
variable que ya hemos nombrado con anterioridad al sumas todas las variables que nos mostraran los dígitos
siendo Horaclase
Línea 51 hacemos la llamada a la función displayNumber que está siendo almacenada dentro de la variable
Horaclase para de una vez demostrarlo en el display

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016

También podría gustarte