Está en la página 1de 10

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: Carlos Alberto Vidales Soto Fecha 21/03/2021

Matricula 1732937 Hora V1 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 asignará el valor del adc a los minutos y por último al ser el
contador de interrupciones el valor de 3 se asignará 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 la sensación de seguir viendo el objeto durante un tiempo muy corto, aun 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 seg después de que la 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 seg, 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 seg 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", por así decirlo, las lagunas entre las imágenes e imagina que está viendo un objeto en
movimiento continuo.
Este efecto de la persistencia se utiliza en el cinematógrafo, en donde se presenta una sucesión de
fotografías fijas (los cuadros) a una velocidad de 24 cuadros cada segundo. En la televisión también se
presenta una sucesión de imágenes fijas a razón de 25 a 30 cuadros p/seg.

 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 esto 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, por
ejemplo:
Al completarse la escritura de datos en una EEPROM.
Por desbordamiento del registro TMR0 al rebasar el valor 255 (FFh) a 0.
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.
Estando en el modo de reposo (SLEEP), un cambio de nivel en el pin RB0/INT.
Un cambio de nivel en uno de los pines RB4 a RB7 estando configurados como entrada.

 Funcionamiento del Convertidor analógico a digital de aproximaciones sucesivas: 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 (MSB), quedando el resto a cero, o sea, forma el valor 100 (para este ejemplo se
utilizarán sólo tres bits), que corresponde a la mitad de la máxima excursión de la tensión de entrad. 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 bascula 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 fuese menor que Vi, el registro no modifica el bit de más peso inmediatamente
inferior a 1, dejado 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 (LSB).

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
 Ilustre gráficamente de la mejor forma posible el fenómeno de persistencia de la visión.

El efecto se puede ver al estar girando la imagen a una cierta velocidad.

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

Diagrama de flujo principal

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

5K
VCC
5.0V

330Ω

 Implementación del circuito

POTENTIOMETER
R1
S1
Key = A

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
4.- 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.- Función displayNumber.


Línea 3.- Declaración de dígitos para los displays.
Línea 4. a 11.- Operación módulo para determinar la posición de los dígitos en base a su peso.
Línea 12.- Se almacenan los valores en setDisplay.
Línea 15.- Función setDisplay.
Línea 18. a 33.- Se concatena el dígito con su respectivo ánodo de modo que encenderá, cada digito lleva un
retardo de 1 ms. Los dígitos apagados son el 3 y 6 dentro de displayNumber y setDisplay.

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
1. void displayNumber(int numero)
2. {
3. int dig1,dig2,dig3,dig4,dig5,dig6,dig7,dig8;
4. dig1=numero%10;//Decenas de millones
5. dig2=(numero%100)/10;//Millones
6. dig3=(numero%1000)/100;//Centenas de miles
7. dig4=(numero%10000)/1000;//Decenas de miles
8. dig5=(numero%100000)/10000;//Miles
9. dig6=(numero%1000000)/100000;//Centenas
10. dig7=(numero%10000000)/1000000;//Decenas
11. dig8=(numero%100000000)/10000000;//Unidades
12. setDisplay(dig1,dig2,dig3,dig4,dig5,dig6,dig7,dig8);
13. }
14.
15. void setDisplay(int dig1, int dig2, int dig3, int dig4, int dig5, int dig6, int
16. dig7, int dig8)
17. {
18. GPIOD->ODR=numeros[dig1]+D1;
19. HAL_Delay(1);
20. GPIOD->ODR=numeros[dig2]+D2;
21. HAL_Delay(1);
22. //GPIOD->ODR=numeros[dig3]+D3;
23. //HAL_Delay(1);
24. GPIOD->ODR=numeros[dig4]+D4;
25. HAL_Delay(1);
26. GPIOD->ODR=numeros[dig5]+D5;
27. HAL_Delay(1);
28. //GPIOD->ODR=numeros[dig6]+D6;
29. //HAL_Delay(1);
30. GPIOD->ODR=numeros[dig7]+D7;
31. HAL_Delay(1);
32. GPIOD->ODR=numeros[dig8]+D8;
33. HAL_Delay(1);
34. }

 Proceso de interrupción y la subrutina de servicio de interrupción (Subrutina de servicio de


interrupción)

Línea 35.- Función de la interrupción.


Línea 37.- For para control de rebote.
Línea 38.- Condicional que determina si PA1 está siendo presionado.
Línea 40.- Incremento del contador.
Línea 41.- Condicional que determina si contador ha llegado al valor de 3.
Línea 43.- Al cumplirse la condición anterior, se regresa contador a 1 para volver a los segundos.
Línea 46.- Se cierra el llamado de la interrupción.

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
35. void EXTI1_IRQHandler(void)
36. {
37. for(int i=0; i<30000; i++);
38. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1))
39. {
40. counter=counter+1;
41. if(counter > 3)
42. {
43. counter = 1;
44. }
45. }
46. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
47. }

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

Línea 48.- Función EscribirTiempo.


Línea 50.- Switch para el contador.
Línea 52.- Caso 1.
Línea 53.- Utilizando el ADC, se convierte el valor en bits a segundos.
Línea 54.- Se escribe el valor en segundos en la función de tiempo.
Líneas 57. A 65.- Se repite el proceso anterior, pero para minutos y segundos.
Línea 67.- Default, es usado cuando no se selecciona ningún caso. En este caso no tiene ningún procedimiento.

48. void EscribirTiempo(void)


49. {
50. switch(counter)
51. {
52. case 1:
53. sTime1.Seconds = (adcValue*60/4096);
54. HAL_RTC_SetTime(&hrtc, &sTime1, RTC_FORMAT_BIN);
55. break;
56.
57. case 2:
58. sTime1.Minutes = (adcValue*60/4096);
59. HAL_RTC_SetTime(&hrtc, &sTime1, RTC_FORMAT_BIN);
60. break;
61.
62. case 3:
63. sTime1.Hours = (adcValue*24/4096);
64. HAL_RTC_SetTime(&hrtc, &sTime1, RTC_FORMAT_BIN);
65. break;
66.
67. default:
68. break;
69. }
70. }

REVISIÓN No.: 7
VIGENTE A PARTIR DE: 01 de Agosto del 2016
 Explique la o las llamadas a función presentes en el loop de control principal

Línea 71.- Loop de control.


Línea 73.- Función BitsADC. Extrae el valor en bits que se obtuvo en el ADC y lo almacena.
Línea 74.- Función EscribirTiempo. Escribe el parámetro de tiempo seleccionado y se le asigna su valor en base
al valor que tiene el ADC.
Línea 75.- Función LeerTiempo. Lee el valor que se tenga en la variable del reloj configurada y lo almacena en
la variable Time
Línea 76.- Función displayNumber. Imprime los números obtenidos de la variable tiempo y son mostrados en los
displays.

71. while (1)


72. {
73. BitsADC();
74. EscribirTiempo();
75. Time=LeerTiempo();
76. displayNumber(Time);
77. }

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

También podría gustarte