Está en la página 1de 9

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: DISEÑO DE SISTEMAS EMBEBIDOS
SEMESTRE: SEPTIMO
ACADEMIA: ELECTRONICA

Nombre: _DANIELA MICHELLE DAMIAN LANDAVERDE___Fecha_01_/__10__/2023

Matricula ____1884198_____Hora ___N1__ 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.

Reloj Programable utilizando Interrupciones Externas y Barrido 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.- Genere un contador de interrupciones.
4.- Utilizando el ADC, ajuste el rango de la conversión de 0-4095 a 0-60 para segundos y minutos, y de 0-
4095 a 0-24 para las horas. Al tener el contador de interrupciones el valor de 1 se asignará la lectura
correspondiente a los segundos, el valor de 2 asignara el valor del ADC a los minutos y por último al ser el
contador de interrupciones el valor de 3 se asignara el valor correspondiente del ADC a las horas.

Indicaciones para el reporte del Proyecto:

1.- Marco Teórico


Describir:
Persistencia de la visión: El ojo humano presenta un fenómeno muy interesante, el de la persistencia. Si en un
instante se coloca un objeto frente a los ojos y después de cierto intervalo se retira de repente, el ojo tiene una
sensación de seguir viendo el objeto durante un tiempo corto, aún cuando éste ya no se encuentre frente al ojo;
es decir, la visión del objeto persiste. Este fenómeno se debe, al parecer, a que al llegar la luz a la retina y
enviarse la correspondiente señal nerviosa al cerebro, lleva cierto tiempo para que la señal se procese, por así
decirlo. El cerebro retiene la impresión de iluminación durante un intervalo de alrededor de 0.1 segundos
después de que al fuente de luz se ha retirado. Este fenómeno implica lo siguiente:
REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Supóngase que ocurren dos sucesos alternadamente en un intervalo de tiempo menor a 0.1 segundos, el ojo
percibe el primer suceso, pero al ocurrir el segundo, el efecto del primero todavía persiste en el cerebro, por lo
que no se da cuenta de que el segundo suceso ocurrió. Este hecho se ha aplicado para crear ilusiones de
movimientos aparentes como el cinematógrafo y la televisión. La base de estas ilusiones reside en el hecho de
que si se presentan dos imágenes fijas separadas entre sí en por lo menos 0.1 segundos entonces el ojo tiene la
sensación de que ocurre movimiento. De hecho, cuando al sistema visual se le presenta rápidamente una serie
de imágenes fijas, éstas no se ven de manera discontinua; resulta que el cerebro “rellena”, las lagunas entre las
imágenes e imagina que está viendo un objeto en movimiento continuo.

Interrupciones en microcontroladores: Es una de las características de los microcontroladores, de las más


importantes que constituye la capacidad de sincronizar la ejecución de programas con acontecimientos externos;
es decir, cuando se produce una interrupción, el micro automáticamente deja lo que esta haciendo, va a la
dirección 04h de programa y ejecuta lo que encuentre a partir de allí hasta encontrarse con la instrucción
RETFIE que le hará abandonar la interrupción y volver al lugar donde se encontraba antes de producirse dicha
interrupción. Hemos de diferenciar entre dos tipos de interrupciones posibles:
1.- Mediante una acción interna: El desbordamiento de la pila (stack) por una operación indebida.
2.- Mediante una acción externa, la más útil. Al producirse un cambio del nivel en uno de sus pines por una
acción externa.

Funcionamiento del Convertidor analógico a digital de aproximaciones sucesiva:


Este tipo de convertidor es el más utilizado cuando se requieren velocidades de conversión entre medias y altas
del orden de algunos microsegundos a décimas de microsegundos.
El proceso de conversión para este tipo de convertidores se basa en la realización de comparaciones sucesivas
de manera descendente o ascendente, hasta que se encuentra la combinación que iguala la tensión entregada por
el D/A y la de entrada. Como el arranque parte siempre de cero, el registro de aproximaciones sucesivas
comienza poniendo a 1 el bit de más peso, quedando el resto a cero, o sea, forma el valor 100, que corresponde
a la mitad de la máxima excursión de la tensión de entrada. Este valor es transformado a señal analógica, que a
su vez se introduce en el comparador. Si esta señal es mayor que Vi, el comparador báscula dando lugar a una
señal que hace que el registro varíe su contenido, sustituyendo el 1 del bit de más peso por un 0 y colocando en
el bit de peso inmediatamente inferior un 1, quedando inalterado el resto de los bits (010). Por el contrario, si la
señal duese menor que Vi, el registro no modifica el bit de más peso inmediatamente inferior a 1, dejando a 0 el
resto de los bits (110).
Tanto en un caso como en otro, se efectúa una nueva conversión D/A y luego se modifica el registro con el
mismo criterio. El proceso se repite hasta alcanzar el bit de menos peso.

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

Diagrama de flujo primario

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Diagrama de flujo de la interrupción

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

4.- Evidencia gráfica

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
5.- Escriba y explique el código utilizado para los siguientes apartados

Escritura de un número y generación del barrido en los displays (describir displayNumber y setDisplay)
Línea 1. Indica el nombre del subprograma que se encarga de mostrar en los dos displays los números
decimales.
Línea 3. Declara las variables que se almacenarán el número correspondiente para cada dígito.
Línea 5. Se asignan a dig8 las unidades gracias al obtener el residuo que se obtiene del valor (value) dado como
argumento de la función. Este valor será nuestro número pseudo aleatorio.
Línea 6. Con una parecida, este módulo resultante se dividirá entre 10 para almacenar decenas en dig7.
Línea 7. En este punto el patrón nuevamente se repite, sin embargo, subiendo a bits de mayor peso. Se dividirá
entre 100 para almacenar centenas en dig6.
Línea 8. Se dividirá entre 1000 para almacenar Millares en dig5.
Línea 9. Se dividirá entre 10000 para almacenar Decenas de millar en dig4.
Línea 10. Se dividirá entre 100000 para almacenar Centenas de millar en dig3.
Línea 11. Se dividirá entre 1000000 para almacenar Millones en dig2.
Línea 12. Se dividirá entre 10000000 para almacenar Decenas de Millón en dig1.
Línea 14. Se invoca la función que asignará en los registros a cada uno de los dígitos de forma ordenada en los
displays. Para esto, es necesario pasar como argumentos cada dígito antes asignado a esta función.
Línea 18. Se concatena el dígito 1 con el ánodo correspondiente, es decir, las unidades con en su
correspondiente
posición (D8), que es al final del display.
Línea 19. Delay de 1 milisegundos.
Línea 20. Se concatenan las decenas D7.
Línea 21. Delay de 1 milisegundos.
Línea 22. Se concatenan las centenas D6.
Línea 23. Delay de 1 milisegundos.
Línea 24. Se concatenan los millares D5.
Línea 25. Delay de 1 milisegundos.
Línea 26. Se concatenan las decenas de millar D4.
Línea 27. Delay de 1 milisegundos.
Línea 28. Se concatenan las centenas de millar D3.
Línea 29. Delay de 1 milisegundos.
Línea 30. Se concatena el número que ocupa la posición en los millones a D2.
Línea 31. Delay de 1 milisegundos.
Línea 32. Se concatena el número que ocupa la posición en las decenas de millón a D1.
Línea 33. Delay de 1 milisegundos.
1. void displayNumber(int valor)
2. {
3. int dig1, dig2, dig3, dig4, dig5, dig6, dig7, dig8;
4.
5. dig8 = valor % 10;
6. dig7 = (valor %100) /10;
7. dig6 = (valor %1000) /100;
8. dig5 = (valor %10000) /1000;
9. dig4 = (valor %100000) /10000;
10. dig3 = (valor %1000000) /100000;
11. dig2 = (valor %10000000) /1000000;
12. dig1 = (valor %100000000) /10000000;
13.
REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
14. setDisplay(dig1,dig2,dig3,dig4,dig5,dig6,dig7,dig8);
15. }
16. void setDisplay(int dig1,int dig2,int dig3,int dig4,int dig5,int dig6,int
dig7,int dig8)
17. {
18. GPIOC -> ODR = D8 + numbers[dig8];
19. HAL_Delay(1);
20. GPIOC -> ODR = D7 + numbers[dig7];
21. HAL_Delay(1);
22. GPIOC -> ODR = D6 + numbers[dig6];
23. HAL_Delay(1);
24. GPIOC -> ODR = D5 + numbers[dig5];
25. HAL_Delay(1);
26. GPIOC -> ODR = D4 + numbers[dig4];
27. HAL_Delay(1);
28. GPIOC -> ODR = D3 + numbers[dig3];
29. HAL_Delay(1);
30. GPIOC -> ODR = D2 + numbers[dig2];
31. HAL_Delay(1);
32. GPIOC -> ODR = D1 + numbers[dig1];
33. HAL_Delay(1);
}
Proceso de interrupción y la subrutina de servicio de interrupción (Subrutina de servicio de interrupcion)
Línea 1. Indica el subprograma de interrupción externa antes mencionada.
Línea 3. Ciclo for de amortiguamiento.
Línea 6. Condicional que indica si el botón azul en PA13 es presionado.
Línea 8. Clock_selector actúa como contador para seleccionar el reloj donde se modificará el valor de la hora.
Línea 10. Si es mayor a 10, reiniciará su valor a 0. Este estado es neutral, ya que en esta opción se lleva a cabo
la acción de reloj.
Línea 13. Si lo anterior no se cumple, con Clock_selector navegaremos entre los relojes.
1. void EXTI15_10_IRQHandler(void)
{
3. for (int i = 0; i<3000;i++)
{
}
6. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_13))
{
8. if(Clock_selector >= 3)
{
10. Clock_selector = 0;
}
13. else{
Clock_selector = Clock_selector + 1;
}
}
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);

Conversión del valor adquirido mediante el adc a horas, minutos y segundos


Línea 1. La función GetTime Devuelve el valor numérico correspondiente a la hora para la fecha especificada
según la hora universal.
Línea 3. Función para obtener el valor decimal del ADC.
Línea 4. GetDate es usado para desbloquear los valores en los registros del calendario, es por eso que debe
ejecutarse primero que GetTime.
Línea 5. GetTime se usa para consultar el tiempo ya con los valores desbloqueados.
Línea 7. Clock_selector es usado en el switch para seleccionar desde segundos hasta horas en el reloj.
REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Línea 9. Caso 1 donde el valor obtenido en decimal por GetADCValue() es multiplicado por (60/4096) para
convertir ese valor de voltaje a segundos.
Línea 11. Configura ese valor a la hora.
Línea 14. Caso 2 donde el valor obtenido en decimal por GetADCValue() es multiplicado por (60/4096) para
convertir ese valor de voltaje a minutos.
Línea 15. Configura ese valor a la hora.
Línea 18. Caso 3 donde el valor obtenido en decimal por GetADCValue() es multiplicado por (24/4096) para
convertir ese valor de voltaje a horas.
Línea 19. Configura ese valor a la hora.
Línea 24. Se asigna a la variable Time la conjunción de las horas. Nótese que las multiplicaciones en esta
asignación son con el objeto de posicionarlos en los displays, así, las horas se multiplican por 1x106 para que
ocupen los puestos en 1x107 y 1x108 que son los bits más significativos. Algo similar se hace con los minutos y
por último, los segundos se dejan ocupan los bits más livianos.
Línea 25. Finalmente, mandamos a la variable Tiempo a la función displayNumber() para que se muestre en los
displays.
1. int GetTime (void)
3. GetADCValue();
4. HAL_RTC_GetDate(&hrtc,&sTime,RTC_FORMAT_BIN);
5. HAL_RTC_GetTime(&hrtc,&sTime,RTC_FORMAT_BIN);

7. switch(Clock_selector)
{
9. case 1:
10. sTime.Seconds = ADCValue * 0.0146484375;
11. HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
12. break;
13. case 2:
14. sTime.Minutes = ADCValue * 0.0146484375;
15. HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
16. break;
17. case 3:
18. sTime.Hours = ADCValue * 0.005859375;
19. HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
20. break;
21. default:
22. break;
23. }
24. Tiempo = sTime.Hours*(1000000)+sTime.Minutes*(1000)+sTime.Seconds;
25. displayNumber(Tiempo);
}
}

Explique la o las llamadas a función presentes en el loop de control principal


Línea 1. Es la función propia realizada para esta actividad. Muestra los 8 dígitos de un número en los displays
mediante el barrido.
Línea 2. Se encarga de configurar qué digito y en qué posición se mostrará en el barrido un número en los
displays.
Línea 3. Convierte el valor ADC a número decimal.
1. void displayNumber(int value);
2. void setDisplay(int dig1,int dig2,int dig3,int dig4,int dig5,int dig6,int dig7,int
dig8)
3. void GetADCValue(void)

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
Explique el apartado While
Linea 1. Es el inicio del ciclo while
Linea 3. Devuelve el valor numérico correspondiente a la hora para la fecha especificada según la hora
universal
Linea 4. Finalmente, mandamos a la variable Tiempo a la función displayNumber() para que se muestre en los
displays.

1. while (1)
2. {
3. Tiempo = GetTime();
4. displayNumber(Tiempo);
5. }
Explique la o las llamadas a función presentes en el loop de control principal

Línea 1. Es la función propia realizada para esta actividad. Muestra los 8 dígitos de un número en los displays
mediante el barrido.
Línea 2. Se encarga de configurar qué digito y en qué posición se mostrará en el barrido un número en los
displays.
Línea 3. Convierte el valor ADC a número decimal.

1. void displayNumber(int value);


2. void setDisplay(int dig1,int dig2,int dig3,int dig4,int dig5,int dig6,int dig7,int
dig8);
3. void GetADCValue(void);
4. int GetTime(void);

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

También podría gustarte