├── .gitattributes ├── .github └── DISCLAIMER.md_signed.csig ├── .gitignore ├── .spelling_dictionary.dic ├── DISCLAIMER.md ├── DISCLAIMER.md_signed.csig ├── LICENSE ├── README.md └── Soluciones ├── 10 ├── .fotos_enunciado_10 │ ├── 10-1.png │ └── 10-2.png ├── 10.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── convertir_punto.s └── main.c ├── 11 ├── .fotos_enunciado_11 │ ├── 11-1.png │ └── 11-2.png ├── 11.pdf ├── README.md ├── RSI_lector.s ├── SOLUTION.md ├── alternativa_1 │ ├── README.md │ ├── RSI_lector.s │ ├── SOLUTION.md │ ├── main.c │ └── normalizar_tiempos.s ├── main.c └── normalizar_tiempos.s ├── 12 ├── .fotos_enunciado_12 │ ├── 12-1.png │ ├── 12-2.png │ └── 12-3.png ├── 12.pdf ├── README.md ├── RSI_Ping.s ├── SOLUTION.md ├── calcular_distancia.s └── main.c ├── 13 ├── .fotos_enunciado_13 │ ├── 13-1.png │ ├── 13-2.png │ └── 13-3.png ├── 13.pdf ├── README.md └── SOLUTION.md ├── 14 ├── .fotos_enunciado_14 │ ├── 14-1.png │ ├── 14-2.png │ └── 14-3.png ├── 14.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── descodificar_tecla.s └── main.c ├── 15 ├── .fotos_enunciado_15 │ ├── 15-1.png │ ├── 15-2.png │ └── 15-3.png ├── 15.pdf ├── README.md └── SOLUTION.md ├── 16 ├── .fotos_enunciado_16 │ ├── 16-1.png │ ├── 16-2.png │ ├── 16-3.png │ └── 16-4.png ├── 16.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── main.c └── transferir_radio.s ├── 17 ├── .fotos_enunciado_17 │ ├── 17-1.png │ ├── 17-2.png │ └── 17-3.png ├── 17.pdf ├── README.md ├── RSI_sensor.s ├── RSI_timer0.s ├── SOLUTION.md └── main.c ├── 18 ├── .fotos_enunciado_18 │ ├── 18-1.png │ ├── 18-2.png │ ├── 18-3.png │ └── 18-4.png ├── 18.pdf ├── README.md └── SOLUTION.md ├── 19 ├── .fotos_enunciado_19 │ ├── 19-1.png │ ├── 19-2.png │ └── 19-3.png ├── 19.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── inicializar_timer0_01.s └── main.c ├── 20 ├── .fotos_enunciado_20 │ ├── 20-1.png │ ├── 20-2.png │ ├── 20-3.png │ └── 20-4.png ├── 20.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── intr_main.s └── main.c ├── 21 ├── .fotos_enunciado_21 │ ├── 21-1.png │ ├── 21-2.png │ ├── 21-3.png │ └── 21-4.png ├── 21.pdf ├── README.md └── SOLUTION.md ├── 22 ├── .fotos_enunciado_22 │ ├── 22-1.png │ ├── 22-2.png │ ├── 22-3.png │ └── 22-4.png ├── 22.pdf ├── README.md ├── RSI_ascensor.s ├── SOLUTION.md ├── main.c └── siguiente_movimiento.s ├── 23 ├── .fotos_enunciado_23 │ ├── 23-1.png │ ├── 23-2.png │ ├── 23-3.png │ └── 23-4.png ├── 23.pdf ├── README.md ├── RSI_timer0.s ├── RSI_timer1.s ├── SOLUTION.md └── main.c ├── 24 ├── .fotos_enunciado_24 │ ├── 24-1.png │ ├── 24-2.png │ ├── 24-3.png │ └── 24-4.png ├── 24.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── main.c └── siguiente_palabra.s ├── 25 ├── .fotos_enunciado_25 │ ├── 25-1.png │ ├── 25-2.png │ ├── 25-3.png │ └── 25-4.png ├── 25.pdf ├── README.md ├── RSI_timer1.s ├── RSI_timer2.s ├── SOLUTION.md └── main.c ├── 26 ├── .fotos_enunciado_26 │ ├── 26-1.png │ ├── 26-2.png │ ├── 26-3.png │ └── 26-4.png ├── 26.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md └── main.c ├── 27 ├── .fotos_enunciado_27 │ ├── 27-1.png │ ├── 27-2.png │ ├── 27-3.png │ └── 27-4.png ├── 27.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── alternativa_1 │ ├── README.md │ ├── RSI_timer0.s │ ├── SOLUTION.md │ └── main.c └── main.c ├── 28 ├── .fotos_enunciado_28 │ ├── 28-1.png │ ├── 28-2.png │ ├── 28-3.png │ └── 28-4.png ├── 28.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md └── main.c ├── 29 ├── .fotos_enunciado_29 │ ├── 29-1.png │ ├── 29-2.png │ ├── 29-3.png │ └── 29-4.png ├── 29.pdf ├── README.md └── SOLUTION.md ├── 30 ├── .fotos_enunciado_30 │ ├── 30-1.png │ ├── 30-2.png │ └── 30-3.png ├── 30.pdf ├── README.md └── SOLUTION.md ├── 31 ├── .fotos_enunciado_31 │ ├── 31-1.png │ ├── 31-2.png │ ├── 31-3.png │ └── 31-4.png ├── 31.pdf ├── README.md └── SOLUTION.md ├── 32 ├── .fotos_enunciado_32 │ ├── 32-1.png │ ├── 32-2.png │ └── 32-3.png ├── 32.pdf ├── README.md └── SOLUTION.md ├── 33 ├── .fotos_enunciado_33 │ ├── 33-1.png │ ├── 33-2.png │ ├── 33-3.png │ └── 33-4.png ├── 33.pdf ├── README.md └── SOLUTION.md ├── 34 ├── .fotos_enunciado_34 │ ├── 34-1.png │ ├── 34-2.png │ ├── 34-3.png │ ├── 34-4.png │ └── 34-5.png ├── 34.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md └── main.c ├── 35 ├── .fotos_enunciado_35 │ ├── 35-1.png │ ├── 35-2.png │ └── 35-3.png ├── 35.pdf ├── README.md ├── RSI_VBlank.s ├── SOLUTION.md ├── activar_beat.md └── main.c ├── 36 ├── .fotos_enunciado_36 │ ├── 36-1.png │ ├── 36-2.png │ ├── 36-3.png │ └── 36-4.png ├── 36.pdf ├── README.md ├── RSI_timer1.s ├── SOLUTION.md └── main.c ├── 37 ├── .fotos_enunciado_37 │ ├── 37-1.png │ ├── 37-2.png │ ├── 37-3.png │ └── 37-4.png ├── 37.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md └── main.c ├── 38 ├── .fotos_enunciado_38 │ ├── 38-1.png │ ├── 38-2.png │ ├── 38-3.png │ └── 38-4.png ├── 38.pdf ├── README.md ├── RSI_sensor.s ├── SOLUTION.md ├── capture_digit.s └── main.c ├── 39 ├── .fotos_enunciado_39 │ ├── 39-1.png │ ├── 39-2.png │ ├── 39-3.png │ └── 39-4.png ├── 39.pdf ├── README.md └── SOLUTION.md ├── 01 ├── .fotos_enunciado_01 │ ├── 01-1.png │ └── 01-2.png ├── 01.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── capturar_tiempo.s └── main.c ├── 02 ├── .fotos_enunciado_02 │ ├── 02-1.png │ ├── 02-2.png │ └── 02-3.png ├── 02.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── convertir_aceleracion.s └── main.c ├── 03 ├── .fotos_enunciado_03 │ ├── 03-1.png │ └── 03-2.png ├── 03.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── alternativa_1 │ ├── README.md │ ├── RSI_timer0.s │ ├── SOLUTION.md │ ├── generar_vibracion.s │ └── main.c ├── generar_vibracion.s └── main.c ├── 04 ├── .fotos_enunciado_04 │ ├── 04-1.png │ ├── 04-2.png │ └── 04-3.png ├── 04.pdf ├── README.md └── SOLUTION.md ├── 05 ├── .fotos_enunciado_05 │ ├── 05-1.png │ └── 05-2.png ├── 05.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── activar_nota.s ├── alternativa_1 │ ├── README.md │ ├── RSI_timer0.s │ ├── SOLUTION.md │ ├── activar_nota.s │ └── main.c └── main.c ├── 06 ├── .fotos_enunciado_06 │ ├── 06-1.png │ └── 06-2.png ├── 06.pdf ├── README.md └── SOLUTION.md ├── 07 ├── .fotos_enunciado_07 │ ├── 07-1.png │ ├── 07-2.png │ └── 07-3.png ├── 07.pdf ├── README.md └── SOLUTION.md ├── 08 ├── .fotos_enunciado_08 │ ├── 08-1.png │ ├── 08-2.png │ ├── 08-3.png │ └── 08-4.png ├── 08.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── insertar_string.s ├── insertar_strings.s └── main.c └── 09 ├── .fotos_enunciado_09 ├── 09-1.png └── 09-2.png ├── 09.pdf ├── README.md ├── RSI_timer0.s ├── SOLUTION.md ├── detectar_sentido.s └── main.c /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pdf 2 | 3 | -------------------------------------------------------------------------------- /.github/DISCLAIMER.md_signed.csig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/.github/DISCLAIMER.md_signed.csig -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | .idea 54 | 55 | 56 | -------------------------------------------------------------------------------- /.spelling_dictionary.dic: -------------------------------------------------------------------------------- 1 | strb 2 | Virgili 3 | i 4 | Arey -------------------------------------------------------------------------------- /DISCLAIMER.md_signed.csig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/DISCLAIMER.md_signed.csig -------------------------------------------------------------------------------- /Soluciones/01/.fotos_enunciado_01/01-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/01/.fotos_enunciado_01/01-1.png -------------------------------------------------------------------------------- /Soluciones/01/.fotos_enunciado_01/01-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/01/.fotos_enunciado_01/01-2.png -------------------------------------------------------------------------------- /Soluciones/01/01.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/01/01.pdf -------------------------------------------------------------------------------- /Soluciones/01/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-09-28 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/01/.fotos_enunciado_01/01-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/01/.fotos_enunciado_01/01-2.png) 13 | -------------------------------------------------------------------------------- /Soluciones/01/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | push{r0, r1, lr} 6 | 7 | ldr r0, =signal 8 | mov r1, #1 9 | strb r1, [r0] 10 | 11 | pop{r0, r1, pc} 12 | -------------------------------------------------------------------------------- /Soluciones/01/capturar_tiempo.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | 6 | @; Me entra puntero a char de 6 pos en r0 7 | capturar_tiempo: 8 | push{r0-r5, lr} 9 | bl iniciar_RTC 10 | mov r4, r0 11 | mov r0, #0x26 12 | bl enviar_RTC 13 | 14 | @; Empieza bucle 15 | mov r2, #0 16 | mov r3, #0 17 | 18 | .loop: 19 | 20 | bl recibir_RTC @; r0 tiene el valor 21 | 22 | cmp r3, #3 23 | beq .LfinIf 24 | 25 | mov r1, r0, lsr #4 26 | and r0, #0xF 27 | mov r5, #10 28 | mla r0, r1, r5, r0 29 | strb r0, [r4, r2] 30 | add r2, #1 31 | 32 | .LfinIf: 33 | 34 | add r3, #1 35 | cmp r1, #7 36 | blo .loop 37 | 38 | bl parar_RTC 39 | pop{r0-r5, pc} 40 | -------------------------------------------------------------------------------- /Soluciones/01/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | 6 | #pragma ide diagnostic ignored "EndlessLoop" 7 | 8 | 9 | char signal = 1; 10 | char currentTime[6], alarm[6] = {22, 10, 26, 20, 00, 00}; 11 | 12 | void main() 13 | { 14 | inicializaciones(); 15 | do 16 | { 17 | tareas_independientes(); 18 | inicializar_timer0(); 19 | 20 | // Recibimos señal de la RSI 21 | if (signal == 1) 22 | { 23 | // Nos comunicamos con reloj y printeamos 24 | capturar_tiempo(currentTime); 25 | 26 | swiWaitForVBlank(); 27 | mostrar_tiempo(currentTime); 28 | 29 | detectar_alarma(currentTime, alarm); 30 | 31 | // Cerramos nuestro propio paso a la siguiente iteracion del while principal 32 | signal = 0; 33 | } 34 | 35 | } while(1) 36 | } 37 | -------------------------------------------------------------------------------- /Soluciones/02/.fotos_enunciado_02/02-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/02/.fotos_enunciado_02/02-1.png -------------------------------------------------------------------------------- /Soluciones/02/.fotos_enunciado_02/02-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/02/.fotos_enunciado_02/02-2.png -------------------------------------------------------------------------------- /Soluciones/02/.fotos_enunciado_02/02-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/02/.fotos_enunciado_02/02-3.png -------------------------------------------------------------------------------- /Soluciones/02/02.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/02/02.pdf -------------------------------------------------------------------------------- /Soluciones/02/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-09-28 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/02/.fotos_enunciado_02/02-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/02/.fotos_enunciado_02/02-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/02/.fotos_enunciado_02/02-3.png) 14 | 15 | -------------------------------------------------------------------------------- /Soluciones/02/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Aleix Mariné-Tena 3 | @; 4 | 5 | RSI_timer0: 6 | push{r0-r5, lr} 7 | bl iniciar_MK6 8 | 9 | mov r0, #0 10 | bl enviar_MK6 11 | bl recibir_MK6 12 | mov r1, r0 @; acel X 13 | ldr r0, =inclin_X @; @inclin_X 14 | @; r2 offX, r3 sensX 15 | ldr r4, =calib @; @@calib 16 | ldr r4, [r4] @; @calib 17 | ldrh r2, [r4] @; r2 = xoff 18 | 19 | mov r5, #6 20 | ldrh r3, [r4, r5] 21 | bl convertir_aceleracion 22 | 23 | @; Y 24 | 25 | mov r0, #0x2 26 | bl enviar_MK6 27 | bl recibir_MK6 28 | mov r1, r0 29 | ldr r0, =inclin_Y 30 | 31 | mov r5, #2 32 | ldrh r2, [r4, r5] 33 | 34 | mov r5, #8 35 | ldrh r3, [r4, r5] 36 | bl convertir_aceleracion 37 | 38 | 39 | pop{r0-r5, pc} -------------------------------------------------------------------------------- /Soluciones/02/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Detector de inclinación 2 | El segundo problema trata sobre el uso de un dispositivo de expansion GBA que se usa para medir la inclinación de la 3 | consola. Nuestras tareas son printear los valores de inclinación en todo momento en el main en C, implementar la RSI 4 | del timer0 en assembler para obtener los datos cada cierto periodo de tiempo y transformarlos usando una rutina en 5 | assembler implementada por nosotros mismo para hacer esta manipulacion de datos. Este problema es más sencillo y su 6 | dificultad radica en entender como se relacionan las estructuras de datos de C (arrays unidimensionales) con la forma de 7 | manipular estas estructuras en assembler. -------------------------------------------------------------------------------- /Soluciones/02/convertir_aceleracion.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Aleix Mariné-Tena 3 | @; 4 | 5 | @; r0: @incl 6 | @; r1: acel 7 | @; r2: off 8 | @; r3: sens 9 | convertir_aceleracion: 10 | push{r0-r5, lr} 11 | 12 | @; (acel_X - off) 13 | sub r1, r1, r2 14 | 15 | ldrh r4, [r0] 16 | mla r5, r1, r3, r4 17 | strh r5, [r0] 18 | 19 | pop{r0-r5, pc} -------------------------------------------------------------------------------- /Soluciones/02/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Aleix Mariné-Tena 3 | // 4 | 5 | 6 | 7 | #pragma ide diagnostic ignored "EndlessLoop" 8 | 9 | 10 | 11 | // Señales de RSI al main 12 | short int inclin_X, inclin_Y; 13 | short int calib[6]; 14 | 15 | void main() 16 | { 17 | inicializaciones(); 18 | inicializar_timer0(); 19 | calibrar_inclinacion(calib); 20 | do 21 | { 22 | tareas_independientes(); 23 | 24 | swiWaitForVBlank(); 25 | dibujar_inclinacion(inclin_X, inclin_Y); 26 | } while (1); 27 | } 28 | -------------------------------------------------------------------------------- /Soluciones/03/.fotos_enunciado_03/03-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/03/.fotos_enunciado_03/03-1.png -------------------------------------------------------------------------------- /Soluciones/03/.fotos_enunciado_03/03-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/03/.fotos_enunciado_03/03-2.png -------------------------------------------------------------------------------- /Soluciones/03/03.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/03/03.pdf -------------------------------------------------------------------------------- /Soluciones/03/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-09 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/03/.fotos_enunciado_03/03-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/03/.fotos_enunciado_03/03-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/03/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI timer0: se activa a la frecuencia programada (5, 20 o 50 Hz). 6 | @; Cambia el estado del bit 1 del registro REG_RUMBLE 7 | RSI_Timer0: 8 | push {r0-r1, lr} 9 | 10 | ldr r0, =REG_RUMBLE @; R0 apunta al registro de E/S 11 | ldrb r1, [r0] @; cargar valor actual en R1 12 | eor r1, #0x02 @; cambia el valor del bit 1 13 | strb r1, [r0] @; actualiza registro de E/S 14 | 15 | pop {r0-r1, pc} -------------------------------------------------------------------------------- /Soluciones/03/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Generador de Vibración 2 | -------------------------------------------------------------------------------- /Soluciones/03/alternativa_1/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2022-11-08 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/03/.fotos_enunciado_03/03-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/03/.fotos_enunciado_03/03-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/03/alternativa_1/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del timer 0. 6 | RSI_timer0: 7 | push {r0-r1, lr} 8 | 9 | ldr r0, =REG_RUMBLE 10 | ldrb r1, [r0] @; Se carga el contenido del registro REG_RUMBLE 11 | eor r1, #0x02 @; y se activa el bit 1 si estava desactivado o se desactiva en caso contrario. 12 | strb r1, [r0] 13 | 14 | pop {r0-r1, pc} -------------------------------------------------------------------------------- /Soluciones/03/alternativa_1/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Generador de Vibración 2 | -------------------------------------------------------------------------------- /Soluciones/03/alternativa_1/generar_vibracion.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; Rutina para generar la vibración del dispositivo. 6 | @; R0 = Frecuencia de salida de la vibración. 7 | generar_vibración: 8 | push {r0-r1, r3, lr} 9 | 10 | cmp r0, #0 @; Si la frecuencia de salida es 0 11 | beq .Lparar_vibracion @; se debe parar la vibración. 12 | mov r1, r0 13 | 14 | ldr r0, =32728 @; Se carga la frecuencia de entrada (frecuencia base / 1024). 15 | swi 9 @; divisor_freq = freq_entrada / freq_salida. 16 | rsb r0, r0, #0 @; El divisor de frequencia se carga con un valor negativo. 17 | mov r0, r0, lsl #16 @; Se integra el divisor de frecuencia 18 | orr r0, #0x000000C3 @; junto con los bits de actualización del registro de control (. 19 | b .Lfin_generar_vibracion 20 | 21 | .Lparar_vibracion: 22 | mov r0, #0 @; Se guarda el parámetro para parar la vibración. 23 | 24 | .Lfin_generar_vibracion: 25 | ldr r1, =TIMER0_DATA @; El registro de datos y el registro de control de los timers son contiguos. 26 | str r0, [r1] @; Se guarda el divisor de frecuencia en el registro de datos del timer 0 al mismo tiempo que se actualiza el registro de control de dicho timer. 27 | 28 | pop {r0-r1, r3, pc} -------------------------------------------------------------------------------- /Soluciones/03/alternativa_1/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos 3 | // 4 | 5 | int main() 6 | { 7 | int keys; 8 | short frec = 0; 9 | 10 | inicializaciones(); 11 | do 12 | { 13 | scanKeys(); 14 | keys = keysDown(); 15 | if (keys == KEY_X) 16 | { // Si se pulsa la tecla X 17 | frec = 5; // la frecuencia será de 5 Hz. 18 | } 19 | if (keys == KEY_Y) 20 | { // Si se pulsa la tecla Y 21 | frec = 20; // la frecuencia será de 20 Hz. 22 | } 23 | if (keys == KEY_A) 24 | { // Si se pulsa la tecla A 25 | frec = 50; // la frecuencia será de 50 Hz. 26 | } 27 | if (frec) 28 | { // Si se requiere una vibración (se han pulsado las teclas) 29 | generar_vibracion(frec); // se genera una vibración 30 | retardo(5); // durante medio segundo. 31 | generar_vibracion(0); // y se para la vibración. 32 | } 33 | swiWaitForVBlank(); 34 | printf("La frecuencia de la última vibración activada es de %d Hz", frec); 35 | } while (1); 36 | } -------------------------------------------------------------------------------- /Soluciones/03/generar_vibracion.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; generar_vibración: dada una frecuencia por parámetro, calcula el 6 | @; divisor de frecuencia para el timer0 y lo activa; si la frecuencia 7 | @; es cero, desactiva el 8 | @; Parámetros: 9 | @; R0 = frecuencia requerida, en Hz 10 | generar_vibracion: 11 | push {r0-r3, lr} @;salvar reg. modificados (R3 por swi 9) 12 | 13 | ldr r2, =TIMER0_DATA @; R2 apunta a registros de timer0 14 | cmp r0, #0 15 | beq .Lfin_vibracion 16 | 17 | mov r1, r0 @; R1 = frec. salida (denominador) 18 | ldr r0, =32728 @; R0 = frec. entrada (numerador) 19 | swi 9 @; llamada a la BIOS (dividir) 20 | rsb r0, r0, #0 @; negar el divisor de frecuencia 21 | mov r0, r0, lsl #16 22 | mov r0, r0, lsr #16 @; poner a 0 los 16 bits altos 23 | orr r0, #0x00C30000 @; adjuntar valores para TIMER0_CR 24 | @; (bit 7 = 1 , bit 6 = 1 bits 10 = 11) 25 | 26 | .Lfin_vibracion: 27 | str r0, [r2] @; fijar TIMER0_DATA y TIMER0_CR 28 | @; si R0 = 0, para la vibración 29 | pop {r0-r3, pc} 30 | -------------------------------------------------------------------------------- /Soluciones/03/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | 6 | int main() { 7 | short frec; // variables locales 8 | int keys; 9 | inicializaciones(); 10 | do { 11 | swiWaitForVBlank(); // ajustar velocidad encuesta periódica 12 | scanKeys(); 13 | keys = keysDown(); // captura pulsación actual 14 | frec = 0; // determinar frecuencia de vibración 15 | if (keys & KEY_X) frec = 5; 16 | if (keys & KEY_Y) frec = 20; 17 | if (keys & KEY_A) frec = 50; 18 | if (frec != 0) { 19 | generar_vibracion(frec); // activar vibración 20 | retardo(5); // esperar medio segundo 21 | generar_vibracion(0); // parar vibración 22 | swiWaitForVBlank(); 23 | printf("Ultima frecuencia = %d Hz n", frec); 24 | } 25 | } while (1); 26 | return (0); 27 | } -------------------------------------------------------------------------------- /Soluciones/04/.fotos_enunciado_04/04-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/04/.fotos_enunciado_04/04-1.png -------------------------------------------------------------------------------- /Soluciones/04/.fotos_enunciado_04/04-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/04/.fotos_enunciado_04/04-2.png -------------------------------------------------------------------------------- /Soluciones/04/.fotos_enunciado_04/04-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/04/.fotos_enunciado_04/04-3.png -------------------------------------------------------------------------------- /Soluciones/04/04.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/04/04.pdf -------------------------------------------------------------------------------- /Soluciones/04/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/04/.fotos_enunciado_04/04-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/04/.fotos_enunciado_04/04-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/04/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Piano polifónico 2 | -------------------------------------------------------------------------------- /Soluciones/05/.fotos_enunciado_05/05-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/05/.fotos_enunciado_05/05-1.png -------------------------------------------------------------------------------- /Soluciones/05/.fotos_enunciado_05/05-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/05/.fotos_enunciado_05/05-2.png -------------------------------------------------------------------------------- /Soluciones/05/05.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/05/05.pdf -------------------------------------------------------------------------------- /Soluciones/05/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/05/.fotos_enunciado_05/05-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/05/.fotos_enunciado_05/05-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/05/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI timer0: se activa a 100 veces por segundo (100 Hz) y decrementa 6 | @; el tiempo restante de la nota actual: si llega a 0, carga la siguiente 7 | @; nota. 8 | RSI_Timer0: 9 | push {r0-r4, lr} 10 | 11 | ldr r0, =tiempo_restante 12 | ldrh r1, [r0] @; R1 = tiempo_restante 13 | sub r1, #1 14 | cmp r1, #0 @; verificar si se acabó el tiempo 15 | bne .Lfin_rsi_timer0 16 | 17 | ldr r2, =nota_actual 18 | ldrh r3, [r2] @; R3 = nota_actual 19 | add r3, #1 20 | cmp r3, #MAX_NOTAS @; verificar si final de música 21 | bne .Lno_final_musica 22 | mov r3, #0 @; vuelta a empezar 23 | .Lno_final_musica: 24 | strh r3, [r2] @; actualizar nota_actual 25 | 26 | ldr r2, =musica @; R2 = dir. base vector música 27 | mov r4, #6 28 | mul r4, r3, r4 @; R4 = offset de nota actual 29 | push {r0, r2} 30 | mov r0, #0 @; canal 0 31 | ldrh r1, [r2, r4] @; frecuencia 32 | ldrh r2, [r2, r4, #4] @; volumen 33 | bl activar_nota 34 | pop {r0, r2} 35 | ldrh r1, [r2, r4, #2] @; R1 = tiempo restante nota actual 36 | 37 | ldr r2, =cambio_nota 38 | mov r4, #1 39 | strh r4, [r2] @; cambio_nota = 1 40 | 41 | .Lfin_rsi_timer0: 42 | strb r1, [r0] @; actualizar tiempo_restante 43 | 44 | pop {r0-r4, pc} -------------------------------------------------------------------------------- /Soluciones/05/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Generador de Sonido 2 | -------------------------------------------------------------------------------- /Soluciones/05/activar_nota.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; activar_nota: dado un canal, una frecuencia y un volumen, 6 | @; activa la generación de sonido por ese canal por un tiempo indefinido 7 | @; Parámetros: 8 | @; short canal (R0): canal de sonido (0..15) 9 | @; short frec (R1): frecuencia requerida, en Hz 10 | @; short vol (R2): volumen requerida (0..127) 11 | activar_nota: 12 | push {r0-r3, lr} 13 | 14 | and r0, #0xF @; filtra valor de canal 15 | and r2, #0x7F @; filtra valor de volumen 16 | push {r0} 17 | ldr r0, =33513982 18 | mov r0, r0, lsr #1 @; R0 = frecuencia de entrada 19 | swi 9 20 | rsb r3, r0, #0 @; R3 = -(frec_entrada / frec_salida) 21 | pop {r0} 22 | mov r0, r0, lsl #4 @; desplazar canal 4 bits a la izquierda 23 | ldr r1, =0x04000400 24 | orr r1, r0 @; R1 = dirección registro de control 25 | strh r3, [r1, #4] @; guardar valor divisor de frecuencia 26 | orr r2, #0x88000000 @; activar bits inicio + bucle infinito 27 | strh r2, [r1] @; guardar valor registro control 28 | 29 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/05/alternativa_1/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2022-12-18 | 7 | | Fecha de modificación | 2022-12-18 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/05/.fotos_enunciado_05/05-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/05/.fotos_enunciado_05/05-2.png) -------------------------------------------------------------------------------- /Soluciones/05/alternativa_1/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del timer 0. 6 | RSI_timer0: 7 | push {r0-r5, lr} 8 | 9 | ldr r5, =tiempo_restante 10 | ldrh r4, [r5] 11 | subs r4, #1 @; Cada vez que ocurre una interrucpción se reduce el tiempo restante para que siga sonando de la nota. 12 | bne .Lfin_cargar_nota 13 | @; Si el tiempo restante ha llegado a 0. 14 | ldr r0, =cambio_nota 15 | mov r1, #1 16 | strb r1, [r0] @; Se indica que se ha producido un cambio de nota. 17 | 18 | ldr r0, =pos_nota 19 | ldrh r1, [r0] 20 | add r1, #1 @; Se incrementa el índice del vector de notas. 21 | ldr r2, =MAX_NOTAS 22 | cmp r1, r2 23 | movhs r1, #0 @; y se asegura que no se haya excedido el límite. 24 | strh r1, [r0] 25 | 26 | ldr r0, =musica 27 | mov r3, #6 28 | mul r3, r1, r3 @; Cada nota ocupa 6 Bytes, por lo que el índice del vector de notas debe multiplicarse por 6. 29 | ldrh r1, [r0, r3] @; R1 = Frecuencia. 30 | ldrh r2, [r0, r3, #4] @; R2 = Volumen. 31 | mov r0, #0 @; R0 = Canal 0. 32 | bl activar_nota 33 | 34 | .Lfin_cargar_nota: 35 | strh r4, [r5] 36 | 37 | pop {r0-r5, pc} -------------------------------------------------------------------------------- /Soluciones/05/alternativa_1/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Generador de Sonido 2 | -------------------------------------------------------------------------------- /Soluciones/05/alternativa_1/activar_nota.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; Rutina para activar una nota. 6 | @; R0 = Canal de sonido. 7 | @; R1 = Frecuencia de la nota. 8 | @; R2 = Volumen de la nota. 9 | activar_nota: 10 | push {r0-r4, lr} 11 | 12 | ldr r3, =0x04000400 @; Se carga la dirección base de los registros de control de cada canal 13 | orr r3, r0, lsl #4 @; y se selecciona el registro de control correspondiente al canal que se está usando a través del propio canal (desplazado cuatro bits a la izquierda). 14 | orr r2, #0x88000000 15 | str r2, [r3] @; Se guarda el volumen de la nota en el registro de control a la vez que se activan los bits de incicio y de repetición activados 16 | 17 | ldr r0, =33513982 18 | mov r0, r0, lsr #1 @; Se divide la frecuencia de entrada entre 2. 19 | swi 9 @; div_freq = freq_entrada / frec_salida 20 | rsb r0, r0, #0 @; Se pasa el valor del divisor de frecuencia a negativo debido a la propia naturaleza de este contador 21 | strh r0, [r3, #4] @; y se guarda en la posición correspondiente del registro de control. 22 | 23 | pop {r0-r4, pc} -------------------------------------------------------------------------------- /Soluciones/05/alternativa_1/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos 3 | // 4 | 5 | typedef struct 6 | { 7 | short freq; // Frecuencia de la nota (Hz). 8 | short time; // Tiempo de la nota (cs). 9 | short vol; // Volumen de la nota (0..127) 10 | } info_note; 11 | 12 | info_note musica[MAX_NOTAS]; // Vector de notas. 13 | 14 | unsigned short pos_nota; // Índice para acceder a la nota actual. 15 | unsigned short tiempo_restante; // Contador de tiempo restante hasta que deba dejar de sonar la nota actual. 16 | unsigned char cambio_nota = 1; // Booleano que indica si se ha cambiado de nota. 17 | 18 | void main() 19 | { 20 | inicializaciones(); 21 | 22 | pos_nota = 0; 23 | tiempo_restante = musica[0].time; // Se carga el tiempo restante de la primera nota. 24 | activar_nota(0, musica[0].freq, musica[0].vol); // Se activa la primera nota. 25 | 26 | do 27 | { 28 | tareas_independientes(); 29 | swiWaitForVBlank(); 30 | if (cambio_nota) 31 | { // Si se ha cambiado de nota 32 | printf("Nota actual: %i\n", pos_nota); // se imprime el número de la nueva nota por pantalla. 33 | cambio_nota = 0; 34 | } 35 | } while(1); 36 | } -------------------------------------------------------------------------------- /Soluciones/05/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | typedef struct { 6 | short freq; // frecuencia de la nota (Hz) 7 | short time; // tiempo de la nota (centésimas de segundo) 8 | short vol; // volumen de la nota (0..127) 9 | } info_note; 10 | 11 | info_note musica[MAX_NOTAS]; 12 | 13 | short nota_actual; // índice de la nota actual 14 | short tiempo_restante; // cuenta el tiempo restante de la nota actual 15 | short cambio_nota = 0; // indica si ha habido cambio de nota 16 | 17 | int main() 18 | { 19 | inicializaciones(); 20 | nota_actual = 0; 21 | tiempo_restante = musica[0].time; 22 | activar_nota(0, musica[0].freq, musica[0].vol); 23 | do 24 | { 25 | tareas_independientes(); 26 | swiWaitForVBlank(); 27 | if (cambio_nota == 1) 28 | { 29 | printf("Nota actual = %d\n", nota_actual); 30 | cambio_nota = 0; 31 | } 32 | } while (1); 33 | } -------------------------------------------------------------------------------- /Soluciones/06/.fotos_enunciado_06/06-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/06/.fotos_enunciado_06/06-1.png -------------------------------------------------------------------------------- /Soluciones/06/.fotos_enunciado_06/06-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/06/.fotos_enunciado_06/06-2.png -------------------------------------------------------------------------------- /Soluciones/06/06.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/06/06.pdf -------------------------------------------------------------------------------- /Soluciones/06/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/06/.fotos_enunciado_06/06-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/06/.fotos_enunciado_06/06-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/06/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Micrófono 2 | -------------------------------------------------------------------------------- /Soluciones/07/.fotos_enunciado_07/07-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/07/.fotos_enunciado_07/07-1.png -------------------------------------------------------------------------------- /Soluciones/07/.fotos_enunciado_07/07-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/07/.fotos_enunciado_07/07-2.png -------------------------------------------------------------------------------- /Soluciones/07/.fotos_enunciado_07/07-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/07/.fotos_enunciado_07/07-3.png -------------------------------------------------------------------------------- /Soluciones/07/07.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/07/07.pdf -------------------------------------------------------------------------------- /Soluciones/07/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/07/.fotos_enunciado_07/07-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/07/.fotos_enunciado_07/07-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/07/.fotos_enunciado_07/07-3.png) 14 | 15 | -------------------------------------------------------------------------------- /Soluciones/07/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Servomotor 2 | -------------------------------------------------------------------------------- /Soluciones/08/.fotos_enunciado_08/08-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/08/.fotos_enunciado_08/08-1.png -------------------------------------------------------------------------------- /Soluciones/08/.fotos_enunciado_08/08-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/08/.fotos_enunciado_08/08-2.png -------------------------------------------------------------------------------- /Soluciones/08/.fotos_enunciado_08/08-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/08/.fotos_enunciado_08/08-3.png -------------------------------------------------------------------------------- /Soluciones/08/.fotos_enunciado_08/08-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/08/.fotos_enunciado_08/08-4.png -------------------------------------------------------------------------------- /Soluciones/08/08.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/08/08.pdf -------------------------------------------------------------------------------- /Soluciones/08/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2022-12-24 | 7 | | Fecha de modificación | 2022-12-24 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/08/.fotos_enunciado_08/08-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/08/.fotos_enunciado_08/08-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/08/.fotos_enunciado_08/08-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/08/.fotos_enunciado_08/08-4.png) 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/08/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del timer 0. 6 | RSI_timer0: 7 | push {r0-r3, lr} 8 | 9 | ldr r0, =cont_visual 10 | ldrb r1, [r0] 11 | add r1, #1 @; Se incrementa el contador que permite gestionar la visualización. 12 | cmp r1, #40 13 | beq .Lfin_desplazamiento 14 | @; Si el contador ha llegado a su valor máximo, se debe llevar a cabo la visualización. 15 | ldr r1, =desplazamiento 16 | ldrb r2, [r1] 17 | mov r3, r2, lsl #2 @; Se desplaza el valor de 'desplazamiento' para acomodarlo a los bits que le corresponden en el comando 'cursor/display shift'. 18 | eor r2, #0xFE @; Se invierte el sentido del desplazamiento para la siguiente ocasión en que el contador llegue a 40. 19 | strb r2, [r1] 20 | 21 | orr r3, #0x018 @; Se crea el comando 'cursor/display shift' uniendo el sentido indicado por 'desplazamiento' con el bit del comando que indica 'display'. 22 | ldr r1, =REG_DISPLAY 23 | bl sincro_display 24 | strh r3, [r1] @; Se envía comando 'cursor/display shift' en el registro REG_DISPLAY. 25 | 26 | mov r1, #0 @; Se reinicia el contador cuando ha producido la visualización. 27 | .Lfin_desplazamiento: 28 | strb r1, [r0] @; Se guarda el contador. 29 | 30 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/08/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Display LCD 2 | -------------------------------------------------------------------------------- /Soluciones/08/insertar_string.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; Rutina para insertar un único string en el display LCD. 6 | @; R0 = string. 7 | @; R1 = Comando para fijar la dirección base. 8 | insertar_string: 9 | push {r0-r3, lr} 10 | 11 | ldr r2, =REG_DISPLAY 12 | bl sincro_display 13 | strh r1, [r2] @; Se fija la dirección base del string con el comando 'DDRAM Address set' 14 | 15 | mov r1, #0 16 | .Lnueva_posicion: 17 | 18 | ldrb r3, [r0, r1] @; Se carga una elemento (byte) del string. 19 | orr r3, #0x200 @; Se construye el comando 'DDRAM or CGRAM write' con un elemento del string. 20 | bl sincro_display 21 | strh r3, [r2] @; Se escribe el elemento del string en el display. 22 | 23 | add r1, #1 24 | cmp r1, #MAX_ELEMENTS @; Se comprueba si se ha llegado al final del string. 25 | blo .Lnueva_posicion 26 | 27 | pop {r0-r3, pc} 28 | 29 | -------------------------------------------------------------------------------- /Soluciones/08/insertar_strings.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; Rutina para insertar dos strings en el display LCD. 6 | @; R0 = str1. 7 | @; R1 = str2. 8 | insertar_strings: 9 | push {r0-r2, lr} 10 | 11 | mov r2, r1 @; Se traslada la dirección base del primer string para no perderla. 12 | mov r1, #0x080 @; R1 = Comando para fijar la dirección base. 13 | bl insertar_string @; Se inserta el primer string. 14 | 15 | mov r0, r2 16 | mov r1, #0x0C0 17 | bl insertar_string @; Se inserta el segundo string. 18 | 19 | pop {r0-r2, pc} 20 | 21 | -------------------------------------------------------------------------------- /Soluciones/08/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos. 3 | // 4 | 5 | #define MAX_ELEMENTS 32 6 | 7 | unsigned char str1[MAX_ELEMENTS] = NULL; // String para almacenar los carácteres de la primera línea del display. 8 | unsigned char str2[MAX_ELEMENTS] = NULL; // String para almacenar los carácteres de la segunda línea del display. 9 | 10 | unsigned char cont_visual = 16; // Contador que permite llevar a cabo la visualización cada 40 interrupciones del timer. Se debe tener en cuenta que, 11 | // cuando se arranca el programa, la RSI no requerirá los dos segundos necesarios para hacer el scroll de derecha a izquierda. 12 | // Por ello, incializar el contador a 16 permite diseñar una RSI más sencilla. 13 | unsigned char desplazamiento = 1; // Booleano que indica el sentido del scroll horizontal. 14 | 15 | void main() 16 | { 17 | int i; 18 | 19 | inicializaciones(); 20 | do 21 | { 22 | tareas_independientes(); 23 | if (wifiReciveText(str2)) 24 | { // El texto recibido por wifi se copia en el segundo string. 25 | insertar_strings(str1, str2); // Se llama a la rutina para imprimir los strings en el display. 26 | swiWaitForVBlank(); 27 | for (i = 0; i < MAX_ELEMENTS; i++) 28 | { // Se imprime el segundo string por la pantalla inferior de la NDS. 29 | printf("%c", str2[i]); 30 | } 31 | printf("\n"); 32 | strcpy(str1, str2); // Se copia el contenido del segundo string en el primer string (scroll vertical). 33 | } 34 | else 35 | { // Se quiere reducir el consum de la CPU en cada iteración del bucle principal 36 | swiWaitForVBlank(); // y no sólo cuando se haya recibido un texto por wifi. 37 | } 38 | } while(1); 39 | } -------------------------------------------------------------------------------- /Soluciones/09/.fotos_enunciado_09/09-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/09/.fotos_enunciado_09/09-1.png -------------------------------------------------------------------------------- /Soluciones/09/.fotos_enunciado_09/09-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/09/.fotos_enunciado_09/09-2.png -------------------------------------------------------------------------------- /Soluciones/09/09.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/09/09.pdf -------------------------------------------------------------------------------- /Soluciones/09/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/09/.fotos_enunciado_09/09-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/09/.fotos_enunciado_09/09-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/09/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI timer0: se activa a una frecuencia aproximada de 300 Hz. 6 | @; Captura el estado de los bits A y B de los dos paddles, compara con 7 | @; el estado anterior y, en caso de cambio, determina el sentido y 8 | @; actualiza las variables globales correspondientes. 9 | .global RSI_Timer0 10 | RSI_Timer0: 11 | push {r0-r3, lr} 12 | 13 | ldr r0, =0x0A0000000 @; a cada interrupción del timer 0 14 | ldrh r1, [r0] @; R1 = estado de los dos paddles 15 | mov r2, r1, lsr #1 16 | and r2, #0x3 @; R2 = bits AB de paddle 1 17 | ldr r0, =f_ant1 18 | ldrb r3, [r0] @; R3 = fase anterior paddle 1 19 | cmp r2, r3 20 | beq .Lcont_timer0 @; si son iguales, continua 21 | strb r2, [r0] @; actualiza el valor de fase anterior 22 | push {r1} 23 | mov r0, r3 24 | mov r1, r2 25 | bl detectar_sentido @; R0 = -1, 0 o 1 26 | pop {r1} @; restaura valor de R1 27 | ldr r3, =posY1 28 | ldrh r2, [r3] @; R2 = posY1 29 | add r2, r0 @; incrementa o decrementa posición 30 | strh r2, [r3] @; actualiza variable global 31 | ldr r0, =dibujar1 32 | mov r2, #1 33 | strb r2, [r0] @; dibujar1 = 1; 34 | 35 | .Lcont_timer0: 36 | mov r2, r1, lsr #4 37 | and r2, #0x3 @; R2 = bits AB de paddle 2 38 | ldr r0, =f_ant2 39 | ldrb r3, [r0] @; R3 = fase anterior paddle 2 40 | cmp r2, r3 41 | beq .Lfin_timer0 @; si son iguales, finaliza RSI 42 | strb r2, [r0] @; actualiza el valor de fase anterior 43 | mov r0, r3 44 | mov r1, r2 45 | bl detectar_sentido @; R0 = -1, 0 o 1 46 | ldr r3, =posY2 47 | ldrh r2, [r3] @; R2 = posY2 48 | add r2, r0 @; decrementa o incrementa posición 49 | strh r2, [r3] @; actualiza variable global 50 | ldr r0, =dibujar2 51 | mov r2, #1 52 | strb r2, [r0] @; dibujar2 = 1; 53 | 54 | .Lfin_timer0: 55 | pop {r0-r3, pc} 56 | -------------------------------------------------------------------------------- /Soluciones/09/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Paddles 2 | -------------------------------------------------------------------------------- /Soluciones/09/detectar_sentido.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; detectar_sentido: verifica el sentido de movimiento dadas dos fases 6 | @; consecutivas, utilizando los vectores globales s_derecha y s_izquierda 7 | @; Parámetros: 8 | @; char f_ant (R0): fase anterior 9 | @; char f_act (R1): fase actual 10 | @; Resultado: 11 | @; R0 : +1 si derecha, -1 si izquierda, 0 si no coincide con ningún 12 | @; sentido. 13 | detectar_sentido: 14 | push {r2, r3, lr} 15 | 16 | ldr r2, =s_derecha 17 | ldrb r3, [r2, r0] @; R3 = s_derecha[f_ant] 18 | cmp r1, r3 19 | bne .Lno_derecha @; if (f_act = s_derecha[f_ant]) 20 | mov r0, #1 @; return(1); 21 | b .Lfin_detectar_sentido 22 | 23 | .Lno_derecha: @; else 24 | ldr r2, =s_izquierda 25 | ldrb r3, [r2, r0] @; R3 = s_izquierda[f_ant] 26 | cmp r1, r3 27 | bne .Lno_izquierda @; if (f_act == s_izquierda[f_ant]) 28 | mov r0, #-1 @; return(-1); 29 | b .Lfin_detectar_sentido 30 | 31 | .Lno_izquierda: 32 | mov r0, #0 @; else return(0); 33 | 34 | .Lfin_detectar_sentido: 35 | pop {r2, r3, pc} 36 | -------------------------------------------------------------------------------- /Soluciones/09/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | #define posX1 10 // posiciones X de las raquetas (fijas) 6 | #define posX2 240 7 | 8 | short posY1 = 96; // posiciones Y de las raquetas (variables) 9 | short posY2 = 96; 10 | 11 | char s_derecha[] = {1, 3, 0, 2}; // indicadores de la fase siguiente 12 | char s_izquierda[] = {2, 0, 3, 1}; // para cada sentido de giro 13 | 14 | char f_ant1 = 0; // fases anteriores (una por raqueta) 15 | char f_ant2 = 0; 16 | 17 | char dibujar1 = 0; // indicadores de necesidad de redibujar 18 | char dibujar2 = 0; // cada una de las raquetas 19 | 20 | int main() 21 | { 22 | inicializaciones(); 23 | do 24 | { 25 | tareas_independientes(); 26 | swiWaitForVBlank(); 27 | if (dibujar1) 28 | { 29 | dibujar_raqueta(posX1, posY1); 30 | dibujar1 = 0; 31 | } 32 | if (dibujar2) 33 | { 34 | dibujar_raqueta(posX2, posY2); 35 | dibujar2 = 0; 36 | } 37 | } while (1); 38 | return(0); 39 | } -------------------------------------------------------------------------------- /Soluciones/10/.fotos_enunciado_10/10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/10/.fotos_enunciado_10/10-1.png -------------------------------------------------------------------------------- /Soluciones/10/.fotos_enunciado_10/10-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/10/.fotos_enunciado_10/10-2.png -------------------------------------------------------------------------------- /Soluciones/10/10.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/10/10.pdf -------------------------------------------------------------------------------- /Soluciones/10/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/10/.fotos_enunciado_10/10-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/10/.fotos_enunciado_10/10-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/10/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI timer0: se activa a una frecuencia aproximada de 2000 Hz. 6 | @; Captura el estado del bit que introduce el tren de impulsos, 7 | @; i lo compara con el estado anterior para determinar cuando hay un 8 | @; nuevo impulso; actualiza el nivel de flujo para cada impulso 9 | @; y el gráfico cada 5 centésimas de segundo. 10 | .global RSI_Timer0 11 | RSI_Timer0: 12 | push {r0-r3, lr} @; a cada interrupción del timer 0 13 | 14 | ldr r0, =0x0A0000180 15 | ldrb r1, [r0] @; R1 = estado del tren de impulsos 16 | cmp r1, #0 17 | beq .Lcont_timer0 @; continúa si se encuentra en 0 18 | ldr r2, =estado 19 | ldrb r3, [r2] @; R3 = estado anterior 20 | cmp r1, r3 21 | beq .Lcont_timer0 22 | strb r1, [r2] @; actualiza estado 23 | 24 | ldr r0, =flujo 25 | ldrh r1, [r0] @; R1 = valor actual de flujo 26 | add r1, #1 27 | strh r1, [r0] @; incrementa el nivel de flujo 28 | 29 | .Lcont_timer0: 30 | ldr r2, =tics 31 | ldrh r3, [r2] @; R3 = valor actual de tics 32 | add r3, #1 33 | strh r3, [r2] @; incrementa el número de tics 34 | 35 | cmp r3, #100 36 | blo .Lfin_timer0 @; finaliza si todavía no han pasado 37 | @; 5 centésimas de segundo 38 | mov r3, #0 39 | strh r3, [r2] @; tics = 0; 40 | 41 | ldr r2, =tiempo 42 | ldrh r3, [r2] @; R3 = valor actual de tiempo 43 | cmp r3, #200 44 | bhs .Lcont2 @; salta si tiempo supera 10 segundos 45 | add r3, #1 46 | strh r3, [r2] @; incrementa el número de intervalos 47 | 48 | push {r0} 49 | mov r0, r3 @; R0 = tiempo / R1 = flujo 50 | bl convertir_punto @; R0 = px / R1 = py 51 | bl add_pixel 52 | pop {r0} 53 | 54 | ldr r2, =actualizar 55 | mov r3, #1 56 | strb r3, [r2] @; actualizar = 1; 57 | 58 | .Lcont2: 59 | mov r1, #0 60 | strh r1, [r0] @; flujo = 0; 61 | 62 | .Lfin_timer0: 63 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/10/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Espirómetro 2 | -------------------------------------------------------------------------------- /Soluciones/10/convertir_punto.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; convertir_punto: convierte los valores de (tiempo, flujo), expresados 6 | @; con rangos de (0-200) y (0-30) respectivamente, a valores de píxeles 7 | @; (px, py), expresados con rangos de (20-220) y (0-180) respectivamente, 8 | @; aplicando una inversión de la coordenada Y (si flujo = 0, py = 180). 9 | @; Parámetros: 10 | @; int ppx (R0): tiempo (número de intervalos de 5 centésimas) 11 | @; int ppy (R1): flujo (número de impulsos por intervalo) 12 | @; Resultado: 13 | @; int px (R0): coordenada X 14 | @; int py (R1): coordenada Y 15 | .global convertir_punto 16 | convertir_punto: 17 | push {r2, lr} 18 | 19 | add r0, #20 @; px = tiempo + 20 20 | mov r2, #6 21 | mul r1, r1, r2 22 | rsb r1, #180 @; py = 180 - flujo*6 23 | 24 | pop {r2, pc} -------------------------------------------------------------------------------- /Soluciones/10/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | short tics; // contador de impulsos del timer 6 | short tiempo; // número de intervalos de 5 centésimas (0-200) 7 | short flujo; // nivel de flujo instantáneo (0-30) 8 | 9 | char actualizar = 0; // indica si hay que actualizar el gráfico 10 | char estado = 0; // indica el estado anterior del bit0 11 | 12 | int main() 13 | { 14 | inicializar_timer0(); 15 | do 16 | { 17 | do 18 | { 19 | swiWaitForVBlank(); 20 | scanKeys(); 21 | } while (!(keysDown() & KEY_START)); 22 | tics = 0; 23 | tiempo = 0; 24 | dibujar_ejes(); 25 | do 26 | { 27 | swiWaitForVBlank(); 28 | if (actualizar) 29 | { 30 | actualizar = 0; 31 | actualizar_grafico(); 32 | } 33 | } while (tiempo < 200); 34 | } while (1); 35 | return(0); 36 | } -------------------------------------------------------------------------------- /Soluciones/11/.fotos_enunciado_11/11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/11/.fotos_enunciado_11/11-1.png -------------------------------------------------------------------------------- /Soluciones/11/.fotos_enunciado_11/11-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/11/.fotos_enunciado_11/11-2.png -------------------------------------------------------------------------------- /Soluciones/11/11.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/11/11.pdf -------------------------------------------------------------------------------- /Soluciones/11/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/11/.fotos_enunciado_11/11-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/11/.fotos_enunciado_11/11-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/11/RSI_lector.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del lector: se activa cada vez que el haz de luz detecta un cambio 6 | @; de intensidad (de claro a oscuro o de oscuro a claro). 7 | RSI_Lector: 8 | push {r0-r3, lr} 9 | 10 | ldr r1, =i_elem 11 | ldr r2, [r1] @; R2 = valor actual de i_elem 12 | cmp r2, #0 13 | beq .L_lector_0 @; en primera interrup. solo inicia cronómetro 14 | cmp r2, #T_ELEM 15 | bhi .L_fin_lector @; filtra posibles interrupciones sobrantes 16 | bl cpuGetTiming @; R0 = número tics respecto int. anterior 17 | ldr r3, =t_abs 18 | sub r2, #1 @; ajustar R2 a índice anterior 19 | str r0, [r3, r2, lsl #2] @; t_abs[i_elem-1] = cpuGetTiming(); 20 | add r2, #1 @; restablecer R2 a índice actual; 21 | .L_lector_0: 22 | mov r0, #0 23 | bl cpuStartTiming @; iniciar cronómetro para siguiente int. 24 | add r2, #1 25 | str r2, [r1] @; i_elem++; 26 | .L_fin_lector: 27 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/11/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Lector de códigos de barras 2 | 3 | Este problema trata sobre controlar un periférico capaz de leer códigos de barras. Al pasar el dispositivo por encima 4 | del código, nuestro computador va a recibir interrupciones cada vez que haya un cambio de luz correspondiente a la 5 | transición de zona oscura a zora clara o al revés. La forma de detectar el valor correspondiente a cada barra va a ser 6 | usando un timer que nos indique cuanto tiempo ha pasado desde la última vez que recibimos una interrupción por cambio de 7 | luz. Esos tiempos se almacenarán en un vector que luego se relativizaran con respecto a un tiempo unitario, el cual es 8 | el tiempo mínimo que puede pasar entre dos interrupciones por cambio de luz. Este tiempo unitario deberá ser calculado a 9 | partir de los calibrajes obtenidos en las tres primeras marcas de la lectura. Finalmente, tras obtener los tiempos 10 | relativos de cada una de las barras, traduciremos el código al valor representado y lo printearemos por pantalla. 11 | -------------------------------------------------------------------------------- /Soluciones/11/alternativa_1/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Aleix Mariné Tena | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-11-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/11/.fotos_enunciado_11/11-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/11/.fotos_enunciado_11/11-2.png) 13 | 14 | -------------------------------------------------------------------------------- /Soluciones/11/alternativa_1/RSI_lector.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Aleix Mariné-Tena 3 | @; 4 | 5 | RSI_lector: 6 | 7 | push {r0-r4, lr} 8 | 9 | ldr r1, =i_abs @; r1 = &i_abs 10 | ldrb r2, [r1] @; r2 = i_abs 11 | cmp r2, #0 12 | moveq r0, #0 13 | bleq cpuStartTiming 14 | beq .LRSIEnd 15 | 16 | cmp r2, #28 17 | bhs .LEnd 18 | 19 | 20 | @; t_abs[i_abs - 1] = cpuGetTiming(); 21 | bl cpuGetTiming 22 | sub r3, r2, #1 23 | 24 | ldr r4, =t_abs 25 | 26 | str r0, [r4, r3, lsl #2] 27 | 28 | .LRSIEnd: 29 | add r2, #1 30 | strb r2, [r1] 31 | 32 | .LEnd: 33 | push {r0-r4, pc} -------------------------------------------------------------------------------- /Soluciones/11/alternativa_1/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Lector de códigos de barras 2 | Esta solución principalmente tiene la diferencia con la solución del profesor en que en lugar de usar el parámetro de 3 | dispersión 'mediana' para obtener el valor definitivo de T, se usa el parámetro de dispersión 'media aritmética' usando 4 | la rutina `swi 9` para realizar la división. Todo lo demás es más o menos equivalente, aunque no se lleva a cabo el paso 5 | de reducción preventiva de T. 6 | -------------------------------------------------------------------------------- /Soluciones/11/alternativa_1/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Aleix Mariné-Tena 3 | // 4 | 5 | #define NUM_ELEMS 27 6 | 7 | 8 | int t_abs[NUM_ELEMS]; 9 | char i_abs = 0; 10 | 11 | void main() 12 | { 13 | char t_rel[NUM_ELEMS]; 14 | 15 | inicializaciones(); 16 | do 17 | { 18 | tareas_independientes(); 19 | 20 | if (i_abs > NUM_ELEMS) 21 | { 22 | normalizar_tiempos(t_abs, t_rel); 23 | 24 | swiWaitForVBlank(); 25 | decodificar_codigo(t_rel); 26 | i_abs = 0; 27 | } 28 | 29 | } while(1) 30 | 31 | } -------------------------------------------------------------------------------- /Soluciones/11/alternativa_1/normalizar_tiempos.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Aleix Mariné-Tena 3 | @; 4 | 5 | @; normalizar_tiempos(int* t_abs, char* t_rel); 6 | normalizar_tiempos: 7 | 8 | push {r0-r6, lr} 9 | mov r5, r0 10 | mov r6, r1 11 | 12 | ldr r2, [r0] 13 | ldr r3, [r0, #4] 14 | ldr r4, [r0, #8] 15 | 16 | add r2, r3 17 | add r3, r4 18 | 19 | mov r0, r3 20 | mov r1, #3 21 | swi 9 @; (T1 + T2 + T3) / 3 22 | 23 | mov r2, r0 @; r2 = T = promedio(T1, T2, T3) 24 | 25 | 26 | 27 | 28 | 29 | mov r3, #0 @; i = 0 30 | .LbucleGuardar: 31 | ldr r0, [r5, r3, lsl #2] 32 | mov r1, r2 33 | swi 9 34 | strb r0, [r6, r3] 35 | 36 | add r3, #1 37 | cmp r3, 27 38 | bne .LbucleGuardar 39 | 40 | pop {r0-r6, pc} -------------------------------------------------------------------------------- /Soluciones/11/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | #define T_ELEM = 27 // se supone que todos los códigos constan 6 | // de 27 elementos (barras y espacios) 7 | 8 | int t_abs[T_ELEM]; // vector de tiempos absolutos 9 | char t_rel[T_ELEM]; // vector de tiempos relativos 10 | 11 | int i_elem; // índice del elemento que se está leyendo 12 | // actualmente 13 | void main() 14 | { 15 | inicializaciones(); 16 | i_elem = 0; // primera inicialización del índice 17 | do 18 | { 19 | tareas_independientes(); 20 | if (i_elem > T_ELEM) // vector lleno i_elem = 28 21 | { 22 | normalizar_tiempos(t_abs, t_rel); 23 | swiWaitForVBlank(); 24 | decodificar_codigo(t_rel); 25 | i_elem = 0; // inicialización para siguiente código 26 | } 27 | } while (1); 28 | } -------------------------------------------------------------------------------- /Soluciones/11/normalizar_tiempos.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; normalizar_tiempos: obtiene los tiempos relativos de todos los 6 | @; elementos de un código de barras de 6 dígitos, dividiendo los tiempos 7 | @; absolutos por un tiempo de referencia (T) correspondiente a la anchura 8 | @; unitaria. 9 | @; Parámetros: 10 | @; R0 = dirección inicial vector t_abs[] (de enteros) 11 | @; R1 = dirección inicial vector t_rel[] (de bytes) 12 | @; Resultado: 13 | @; Se actualiza el contenido del vector de tiempos relativos 14 | @; (por referencia) 15 | normalizar_tiempos: 16 | push {r0-r6, lr} 17 | 18 | ldr r2, [r0] @; R2 = t_abs[0] 19 | ldr r3, [r0, #4] @; R3 = t_abs[1] 20 | ldr r4, [r0, #8] @; R4 = t_abs[2] 21 | cmp r2, r3 22 | bls .Lnorm_cont1 @; si (R2 > R3), 23 | mov r6, r2 24 | mov r2, r3 @; intercambio(R2, R3) 25 | mov r3, r6 26 | 27 | .Lnorm_cont1: 28 | cmp r3, r4 29 | bls .Lnorm_cont2 @; si (R3 > R4) 30 | mov r6, r3 31 | mov r3, r4 @; intercambio(R3, R4) 32 | mov r4, r6 33 | 34 | .Lnorm_cont2: @; R4 = max(t_abs[0], t_abs[1], t_abs[2]) 35 | cmp r2, r3 36 | bls .Lnorm_cont3 @; si (R2 > R3) 37 | mov r6, r2 38 | mov r2, r3 @; intercambio(R2, R3) 39 | mov r3, r6 40 | @; R2 = min(t_abs[0], t_abs[1], t_abs[2]) 41 | .Lnorm_cont3: 42 | mov r6, r3 @; R3 = mediana(t_abs[0], t_abs[1], t_abs[2]) 43 | 44 | 45 | 46 | 47 | T - (1 / 8) * T = (8 / 8) T - (1 / 8) T = (7 / 8) T 48 | 49 | sub r6, r3, lsr #3 @; R6 = T = (7/8)R3 (reducción preventiva) 50 | mov r2, r0 @; R2 = dirección inicial t_abs[] 51 | mov r4, r1 @; R4 = dirección inicial t_rel[] 52 | mov r5, #0 @; R5 es i (índice de elementos) 53 | 54 | .Lnorm_for: 55 | ldr r0, [r2, r5, lsl #2] @; R0 = t_abs[i]; 56 | mov r1, r6 @; R1 = T; 57 | swi 9 58 | strb r0, [r4, r5] @; t_rel[i] = t_abs[i] / T; 59 | add r5, #1 60 | cmp r5, #27 61 | bne .Lnorm_for 62 | 63 | pop {r0-r6, pc} -------------------------------------------------------------------------------- /Soluciones/12/.fotos_enunciado_12/12-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/12/.fotos_enunciado_12/12-1.png -------------------------------------------------------------------------------- /Soluciones/12/.fotos_enunciado_12/12-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/12/.fotos_enunciado_12/12-2.png -------------------------------------------------------------------------------- /Soluciones/12/.fotos_enunciado_12/12-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/12/.fotos_enunciado_12/12-3.png -------------------------------------------------------------------------------- /Soluciones/12/12.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/12/12.pdf -------------------------------------------------------------------------------- /Soluciones/12/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2022-11-08 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/12/.fotos_enunciado_12/12-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/12/.fotos_enunciado_12/12-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/12/.fotos_enunciado_12/12-3.png) 14 | 15 | -------------------------------------------------------------------------------- /Soluciones/12/RSI_Ping.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del sensor de distancia. 6 | RSI_Ping: 7 | push {r0-r2, lr} 8 | 9 | ldr r2, =fase 10 | ldrb r0, [r2] @; Se carga la fase. 11 | cmp r0, #0 12 | bne .Lcapturar_tiempo 13 | @; En la fase 0 del programa 14 | bl cpuStartTiming @; Se inicia el contaje de tics. 15 | mov r0, #1 @; Finaliza la fase 0 del programa. 16 | b .Lfin_capturar_tiempo 17 | 18 | .Lcapturar_tiempo: @; En la fase 1 del programa 19 | bl cpuGetTiming @; se captura una muestra de tiempo (tics). 20 | ldr r1, =25135 21 | sub r0, r1 @; Se resta 25513 tics a la muestra de tiempo para descontar el tiempo que tarda el dispositivo en generar la ráfaga. 22 | ldr r1, =t_in 23 | str r0, [r1] @; Se guarda la muestra de tiempo en el vector de muestras de tiempo. 24 | mov r0, #2 @; Finaliza la fase 1 del programa. 25 | 26 | .Lfin_capturar_tiempo: 27 | strb r0, [r2] @; Se guarda la nueva fase del programa. 28 | 29 | pop {r0-r2, pc} -------------------------------------------------------------------------------- /Soluciones/12/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Sensor de distancia 2 | -------------------------------------------------------------------------------- /Soluciones/12/calcular_distancia.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; Rutina para calcular la distancia a partir del tiempo transcurrido (en forma de número de tics). 6 | @; R0 = Número de tics correspondientes al tiempo transcurrido. 7 | @; Retorna la distancia por R0. 8 | calcular_distancia: 9 | push {r1, r3, lr} 10 | 11 | mov r1, r0, lsr #1 @; Se divide el número de tics entre 2. 12 | mov r0, #5 13 | mul r0, r1, r0 @; Se multiplica el número de tics por 5 14 | 15 | ldr r1, =168000000 16 | swi 9 @; y se divide entre 168000000 para pasarlo a segundos. 17 | 18 | ldr r1, =34000 19 | mul r0, r1, r0 @; Se multiplica el tiempo por 34000 para obtener la distancia (cm). 20 | 21 | pop {r1, r3, pc} -------------------------------------------------------------------------------- /Soluciones/12/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos 3 | // 4 | 5 | unsigned int t_in; // Variable para almacenar las muestras de distancia. 6 | unsigned char fase = 0; // Variable para gestionar en que fase se encuentra el programa. 7 | 8 | int main() 9 | { 10 | int distancia, medida = 1; 11 | 12 | inicializaciones(); 13 | do 14 | { 15 | tareas_independientes(); 16 | if (fase == 0) 17 | { // Si el programa está en la fase 0 18 | startPulse(); // se tiene que generar un nuevo pulso. 19 | } 20 | else if (fase == 2) 21 | { // Si el programa está en la fase 2 22 | fase = 0; 23 | distancia = calcular_distancia(t_in); // se hace la media de todas las distancias 24 | swiWaitForVBlank(); 25 | printf("%i: %i cm\n", medida++, distancia); // y se imprime dicha media por pantalla. 26 | } 27 | else 28 | { 29 | swiWitForVBlank(); // Se quiere reducir el consumo de la CPU aunque el programa no esté en la fase 2. 30 | } 31 | } while (1); 32 | return 0; 33 | } -------------------------------------------------------------------------------- /Soluciones/13/.fotos_enunciado_13/13-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/13/.fotos_enunciado_13/13-1.png -------------------------------------------------------------------------------- /Soluciones/13/.fotos_enunciado_13/13-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/13/.fotos_enunciado_13/13-2.png -------------------------------------------------------------------------------- /Soluciones/13/.fotos_enunciado_13/13-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/13/.fotos_enunciado_13/13-3.png -------------------------------------------------------------------------------- /Soluciones/13/13.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/13/13.pdf -------------------------------------------------------------------------------- /Soluciones/13/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/13/.fotos_enunciado_13/13-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/13/.fotos_enunciado_13/13-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/13/.fotos_enunciado_13/13-3.png) 14 | 15 | -------------------------------------------------------------------------------- /Soluciones/13/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Tensiómetro 2 | -------------------------------------------------------------------------------- /Soluciones/14/.fotos_enunciado_14/14-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/14/.fotos_enunciado_14/14-1.png -------------------------------------------------------------------------------- /Soluciones/14/.fotos_enunciado_14/14-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/14/.fotos_enunciado_14/14-2.png -------------------------------------------------------------------------------- /Soluciones/14/.fotos_enunciado_14/14-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/14/.fotos_enunciado_14/14-3.png -------------------------------------------------------------------------------- /Soluciones/14/14.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/14/14.pdf -------------------------------------------------------------------------------- /Soluciones/14/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-09 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/14/.fotos_enunciado_14/14-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/14/.fotos_enunciado_14/14-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/14/.fotos_enunciado_14/14-3.png) 14 | 15 | -------------------------------------------------------------------------------- /Soluciones/14/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del timer 0: se activa 40 veces por segundo, de modo que se 6 | @; utilizará para activar el barrido de una fila, aunque se 7 | @; interpretarán las columnas activas de la fila anterior, 8 | @; lo cual introducirá un retardo de 25 milisegundos entre activación 9 | @; de fila y consulta de columnas correspondientes. 10 | @; La RSI fijará el código de tecla en la variable global currentKey 11 | @; después de analizar las 4 filas de cada barrido completo del teclado. 12 | RSI_timer0: 13 | push {r0-r6, lr} 14 | 15 | ldr r6, =REG_TECL 16 | ldrh r0, [r6] @; R0 = valor actual de REG_TECL 17 | ldr r2, =num_fila 18 | ldrb r1, [r2] @; R1 = número de fila actual 19 | bl descodificar_tecla @; R0 = código de tecla de fila actual 20 | ldr r3, =tempKey 21 | ldsb r4, [r3] @; R4 = código temporal de tecla 22 | cmp r0, r4 23 | ble .Lkey_cont1 24 | mov r4, r0 @; actualizar R4 si código de fila actual 25 | @; es mayor que código temporal del barrido 26 | .Lkey_cont1: 27 | add r1, #1 @; pasar a siguiente fila 28 | cmp r1, #4 29 | blo .Lkey_cont2 30 | ldr r5, =currentKey @; si estamos en la “quinta” fila (R1== 31 | strb r4, [r5] @; Actualizar currentKey con código temporal 32 | mov r4, #-1 @; reset código temporal 33 | mov r1, #0 @; reset número de fila 34 | 35 | .Lkey_cont2: 36 | strb r4, [r3] @; actualizar código de tecla temporal 37 | strb r1, [r2] @; actualizar número de fila actual 38 | mov r0, #0x10 39 | mvn r0, r0, lsl r1 @; R0 tiene el bit de fila actual a cero 40 | strh r0, [r6] @; actualiza REG_TECL para siguiente interrupción 41 | 42 | .Lkey_fin: 43 | pop {r0-r6, pc} -------------------------------------------------------------------------------- /Soluciones/14/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Teclado numérico 2 | -------------------------------------------------------------------------------- /Soluciones/14/descodificar_tecla.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; descodificar_tecla: a partir del estado de los bits b3..b0 de las 6 | @; columnas y de la fila que se pasa por parámetro, detectar la columna 7 | @; de mayor peso de dicha fila que presenta pulsación (bit a 0); 8 | @; a partir de esta información (fila, columna), devolver el código 9 | @; numérico correspondiente (fila*4+columna), o -1 si no hay pulsación 10 | @; en la fila 11 | @; 12 | @; Parámetros: 13 | @; R0 = estado de las columnas (valor de bits b3..b0 de REG_TECL) 14 | @; R1 = número de fila analizada (0..3) 15 | @; 16 | @; Resultado: 17 | @; R0 = código numérico de tecla 18 | descodificar_tecla: 19 | push {r2-r3, lr} 20 | 21 | mov r2, #3 @; R2 = código de columna testada ( 22 | mov r3, #1 @; R3 es máscara de test (inicialmente, 23 | .Ldesc_col: 24 | tst r0, r3 25 | beq .Ldesc_fincol @; salir del bucle si encuentra bit a 0 26 | mov r3, r3, lsl #1 @;desplazar máscara a la izquierda 27 | sub r2, #1 @; siguiente código columna (de mayor a menor) 28 | cmp r2, #0 29 | bge .Ldesc_col @;repetir mientras código de columna >= 0 30 | 31 | mov r0, #-1 @; R0 = código de no pulsación 32 | b .Ldesc_fin 33 | 34 | .Ldesc_fincol: 35 | add r0, r2, r1, lsl #2 @;R0 = columna (r2) + fila*4 (r1 lsl #2) 36 | .Ldesc_fin: 37 | pop {r2-r3, pc} -------------------------------------------------------------------------------- /Soluciones/14/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | char currentKey = -1; // código de tecla actual 6 | char tempKey = -1; // código de tecla temporal (para el barrido) 7 | char num_fila = 0; // número de fila actual (0..3) 8 | 9 | int main() 10 | { 11 | char prevKey = -1; // tecla anterior (variable 12 | inicializaciones(); 13 | REG_TECL = -1; // inicialmente no se selecciona ninguna fila 14 | do 15 | { 16 | tareas_independientes(); 17 | if (currentKey != prevKey) // detección cambio de tecla 18 | { 19 | prevKey = currentKey; 20 | if ( currentKey != -1) // si hay pulsación 21 | { 22 | swiWaitForVBlank(); 23 | processKey(currentKey); 24 | } 25 | } 26 | } while (1); // repetir siempre 27 | } -------------------------------------------------------------------------------- /Soluciones/15/.fotos_enunciado_15/15-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/15/.fotos_enunciado_15/15-1.png -------------------------------------------------------------------------------- /Soluciones/15/.fotos_enunciado_15/15-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/15/.fotos_enunciado_15/15-2.png -------------------------------------------------------------------------------- /Soluciones/15/.fotos_enunciado_15/15-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/15/.fotos_enunciado_15/15-3.png -------------------------------------------------------------------------------- /Soluciones/15/15.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/15/15.pdf -------------------------------------------------------------------------------- /Soluciones/15/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/15/.fotos_enunciado_15/15-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/15/.fotos_enunciado_15/15-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/15/.fotos_enunciado_15/15-3.png) 14 | 15 | -------------------------------------------------------------------------------- /Soluciones/15/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Display de LEDs 2 | -------------------------------------------------------------------------------- /Soluciones/16/.fotos_enunciado_16/16-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/16/.fotos_enunciado_16/16-1.png -------------------------------------------------------------------------------- /Soluciones/16/.fotos_enunciado_16/16-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/16/.fotos_enunciado_16/16-2.png -------------------------------------------------------------------------------- /Soluciones/16/.fotos_enunciado_16/16-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/16/.fotos_enunciado_16/16-3.png -------------------------------------------------------------------------------- /Soluciones/16/.fotos_enunciado_16/16-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/16/.fotos_enunciado_16/16-4.png -------------------------------------------------------------------------------- /Soluciones/16/16.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/16/16.pdf -------------------------------------------------------------------------------- /Soluciones/16/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/16/.fotos_enunciado_16/16-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/16/.fotos_enunciado_16/16-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/16/.fotos_enunciado_16/16-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/16/.fotos_enunciado_16/16-4.png) 15 | -------------------------------------------------------------------------------- /Soluciones/16/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del timer 0: se activa 256*25 veces por segundo; 6 | @; se utilizará para transferir una linea de píxeles circulares al 7 | @; display de revolución, es decir, un radio con 32 áxels, según la 8 | @; imagen circular actual 'current_ci' y el ángulo actual 'current_ang', 9 | @; además de incrementar el ángulo y ponerlo a cero cuando llegue al 10 | @; límite (256); también debe resetear el valor del ángulo si se detecta 11 | @; la activación del bit de puesta a cero. 12 | RSI_timer0: 13 | push {r0-r2, lr} 14 | 15 | ldr r0, =circ_img 16 | ldr r1, =current_ci 17 | ldr r1, [r1] @; R1 = número actual de imagen circular 18 | cmp r1, #1 19 | addeq r0, #256 * 12 @; R0 apunta al inicio de imagen circular act. 20 | ldr r2, =current_ang 21 | ldr r1, [r2] @; R1 = ángulo actual 22 | bl transferir_radio 23 | add r1, #1 @; incrementar ángulo actual 24 | cmp r1, #256 @; si ángulo >= 256, 25 | movhs r1, #0 @; resetear ángulo actual 26 | 27 | ldr r0, =RDISP_STATUS 28 | ldrh r0, [r0] @; R0 = bit de puesta a cero 29 | tst r0, #1 @; si bit a 1 30 | movne r1, #0 @; también hay que resetear ángulo actual 31 | 32 | str r1, [r2] @;actualizar variable global 33 | 34 | pop {r0-r2, pc} -------------------------------------------------------------------------------- /Soluciones/16/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Propeller display 2 | -------------------------------------------------------------------------------- /Soluciones/16/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | int current_ang = 0; // valor actual del ángulo 6 | int current_ci = 0; // identificador imagen circular actual (0..1) 7 | unsigned char rect_img[64 * 64]; 8 | unsigned int circ_img[2][256 * 3]; 9 | 10 | void main() 11 | { 12 | inicializaciones(); 13 | do 14 | { 15 | swiWaitForVBlank(); 16 | tareas_independientes(); 17 | if (wifiReceiveImage(rect_img)) // si recepción nueva imagen 18 | { 19 | convertirImagen(rect_img, circ_img[1 - current_ci]); 20 | swiWaitForVBlank(); 21 | mostrarImagen(rect_img); 22 | current_ci = 1 – current_ci; 23 | } 24 | } while (1); // repetir siempre 25 | } -------------------------------------------------------------------------------- /Soluciones/16/transferir_radio.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @;transferir_radio: a partir de la dirección base de una imagen circular 6 | @; y del número de radio (ángulo) que se pasan por parámetro, obtener el 7 | @; estado de los bits de rojo, verde y azul para los 32 áxels, y 8 | @; generar un patrón de 32 bits donde cada bit indicará si el LED 9 | @; correspondiente debe estar encendido o apagado, según el estado del 10 | @; botón SELECT: 11 | @; soltado (=1): activar LED si el bit verde está a 1 y alguno de los 12 | @; otros dos bits está a 1 (pero no los dos a la vez) 13 | @; pulsado (=0): activar LED si algún bit de color está a 1, 14 | @; La rutina envía los 32 bits resultantes por el registro de datos del 15 | @; dispositivo. 16 | @; Parámetros: 17 | @; R0 = dirección base de la imagen circular 18 | @; R1 = número de radio (ángulo : [0..255]) 19 | transferir_radio: 20 | push {r0-r3, lr} 21 | 22 | mov r2, #12 23 | mla r0, r1, r2, r0 @; R0 += núm.radio (ang.) * 12 bytes/ángulo 24 | ldr r1, [r0] @; R1 carga bits de rojo 25 | ldr r2, [r0, #4] @; R2 carga bits de verde 26 | ldr r3, [r0, #8] @; R3 carga bits de azul 27 | ldr r0, =REG_KEYINPUT 28 | ldrh r0, [r0] @; R0 carga estado botones 29 | tst r0, #0x04 @; comprobar estado bit de SELECT 30 | beq .Ltrans_select @; saltar si bit SELECT = 0 (botón pulsado) 31 | eor r3, r1 @; R3: bit activo si bit azul o rojo activo, 32 | @; pero no los dos a la vez (or exclusiva) 33 | and r1, r2, r3 @; R1: bit activo si bit verde y bit R3 activo 34 | b .Ltrans_cont 35 | .Ltrans_select: 36 | orr r1, r2 37 | orr r1, r3 @; R1: bit activo si algún bit de color activo 38 | .Ltrans_cont: 39 | ldr r0, =RDISP_DATA 40 | str r1, [r0] @; transferir 32 bits del radio actual 41 | 42 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/17/.fotos_enunciado_17/17-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/17/.fotos_enunciado_17/17-1.png -------------------------------------------------------------------------------- /Soluciones/17/.fotos_enunciado_17/17-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/17/.fotos_enunciado_17/17-2.png -------------------------------------------------------------------------------- /Soluciones/17/.fotos_enunciado_17/17-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/17/.fotos_enunciado_17/17-3.png -------------------------------------------------------------------------------- /Soluciones/17/17.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/17/17.pdf -------------------------------------------------------------------------------- /Soluciones/17/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2023-01-27 | 7 | | Fecha de modificación | 2023-01-27 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/17/.fotos_enunciado_17/17-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/17/.fotos_enunciado_17/17-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/17/.fotos_enunciado_17/17-3.png) 14 | 15 | -------------------------------------------------------------------------------- /Soluciones/17/RSI_sensor.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del sensor de distancia. 6 | RSI_sensor: 7 | push {r0-r1, r3, lr} 8 | 9 | ldr r0, =Drayos 10 | ldrh r1, [r0] 11 | add r1, #1 12 | strh r1, [r0] @; Se incrementa el número de rayos por segundo cada vez que un rayo pasa por delante del sensor. 13 | 14 | ldr r0, =Perimetro 15 | ldrh r0, [r0] 16 | ldr r1, =Nrayos 17 | ldrb r1, [r1] 18 | swi 9 @; R0 = Perímetro / Nrayos. 19 | 20 | ldr r3, =Tdist 21 | ldr r1, [r3] 22 | add r1, r0 @; Se acumula la distancia entre dos rayos sobre la distancia total. 23 | str r1, [r3] @; Se guarda la distancia total. 24 | 25 | pop {r0-r1, r3, pc} 26 | -------------------------------------------------------------------------------- /Soluciones/17/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del timer 0. 6 | RSI_timer0: 7 | push {r0-r3, lr} 8 | 9 | ldr r0, =Perimetro 10 | ldrh r0, [r0] @; Cargamos el perímetro. 11 | ldr r1, =Nrayos 12 | ldrb r1, [r1] @; Cargamos el número de rayos. 13 | swi 9 @; R0 = Perímetro / Nrayos. 14 | 15 | ldr r2, =Drayos 16 | ldrh r1, [r2] @; Cargamos el número de rayos por segundo. 17 | mov r3, #0 18 | strh r3, [r2] @; Reiniciamos el contador de rayos por segundo. 19 | 20 | mul r0, r1, r0 @; R0 = (Perímetro / Nrayos) * Drayos. 21 | mov r0, r0, lsl #1 @; Vinst = Drayos * (Perímetro / Nrayos) * 2. 22 | ldr r1, =Vinst 23 | strh r0, [r1] @; Guardamos la muestra actual de velocidad instantánea. 24 | 25 | ldr r1, =buffVinst 26 | ldr r3, =ind 27 | ldrb r2, [r3] 28 | strh r0, [r1, r2, lsl #1] @; Guardamos la nueva muestra de velocidad instantánea en el buffer con las velocidades instantáneas. 29 | add r2, #1 30 | cmp r2, #180 @; Si el índice del búffer de velocidades instantáneas es mayor que 180 31 | movhs r2, #0 @; se reinicia a 0 (buffer circular). 32 | strb r2, [r3] 33 | 34 | ldr r0, =Tdist 35 | ldr r0, [r0] @; Cargamos la distancia total. 36 | ldr r2, =Ttiempo 37 | ldr r1, [r2] @; Cargamos el contador de tiempo total. 38 | add r1, #1 @; Incrementamos el contador de tiempo total. 39 | str r1, [r2] 40 | swi 9 @; Vmed (cm / ss) = Tdist / Ttiempo 41 | 42 | mov r0, r0, lsl #1 @; Vmed (cm / s) 43 | ldr r1, =1000 44 | swi 9 @; Vmed (dam / s) 45 | ldr r1, =3600 46 | mul r0, r1, r0 @; Vmed (dam / h) 47 | ldr r1, =Vmed 48 | str r0, [r1] @; Guardamos la velocidad media. 49 | 50 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/17/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Velocímetro para bicicletas 2 | -------------------------------------------------------------------------------- /Soluciones/17/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos 3 | // 4 | 5 | unsigned short Perimetro; // Perímetro de la rueda. Valor fijo. 6 | unsigned char Nrayos; // Número de rayos de la rueda. Valor fijo. 7 | unsigned short Drayos; // Número de rayos por segundo. Valor variable -> Drayos++ && Drayos = 0 8 | unsigned short Vinst; // Velocidad instantánea (cm/s). Valor variable -> Vinst = Drayos * (Perimetro / Nrayos) * 2 9 | unsigned int Vmed; // Velocidad media (dam/h). Valor variable -> Vmed = Tdist / Ttiempo * 2 / 1000 * 3600 10 | unsigned int Tdist; // Distancia total (cm). Valor variable -> Tdist = Tdist + Perimetro / Nrayos 11 | unsigned int Ttiempo; // Tiempo total (semisegundos). Valor variable -> Ttiempo++ 12 | unsigned char ind; // Índice posición actual buffer Vinst. 13 | unsigned short buffVinst[180]; 14 | 15 | void main() 16 | { 17 | inicializaciones(); 18 | do 19 | { 20 | tareas_independientes(); 21 | scanKeys(); 22 | if (keysDown() == KEY_START) 23 | { // Si se ha pulsado la tecla start 24 | Drayos = 0; // Reiniciar los contadores. 25 | Tdist = 0; 26 | Ttiempo = 0; 27 | for (ind = 0; ind < 180; ind++) 28 | { // Reiniciar el buffer con las velocidades instantáneas. 29 | buffVinst[ind] = 0; 30 | } 31 | ind = 0; 32 | } 33 | swiWaitForVBlank(); 34 | representarInfo(Vinst, Vmed, Tdist, buffVinst, ind); 35 | } while(1); 36 | } 37 | 38 | -------------------------------------------------------------------------------- /Soluciones/18/.fotos_enunciado_18/18-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/18/.fotos_enunciado_18/18-1.png -------------------------------------------------------------------------------- /Soluciones/18/.fotos_enunciado_18/18-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/18/.fotos_enunciado_18/18-2.png -------------------------------------------------------------------------------- /Soluciones/18/.fotos_enunciado_18/18-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/18/.fotos_enunciado_18/18-3.png -------------------------------------------------------------------------------- /Soluciones/18/.fotos_enunciado_18/18-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/18/.fotos_enunciado_18/18-4.png -------------------------------------------------------------------------------- /Soluciones/18/18.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/18/18.pdf -------------------------------------------------------------------------------- /Soluciones/18/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/18/.fotos_enunciado_18/18-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/18/.fotos_enunciado_18/18-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/18/.fotos_enunciado_18/18-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/18/.fotos_enunciado_18/18-4.png) 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/18/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Luz LED regulada por PWM 2 | -------------------------------------------------------------------------------- /Soluciones/19/.fotos_enunciado_19/19-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/19/.fotos_enunciado_19/19-1.png -------------------------------------------------------------------------------- /Soluciones/19/.fotos_enunciado_19/19-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/19/.fotos_enunciado_19/19-2.png -------------------------------------------------------------------------------- /Soluciones/19/.fotos_enunciado_19/19-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/19/.fotos_enunciado_19/19-3.png -------------------------------------------------------------------------------- /Soluciones/19/19.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/19/19.pdf -------------------------------------------------------------------------------- /Soluciones/19/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-12-24 | 7 | | Fecha de modificación | 2022-12-24 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/19/.fotos_enunciado_19/19-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/19/.fotos_enunciado_19/19-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/19/.fotos_enunciado_19/19-3.png) 14 | 15 | 16 | -------------------------------------------------------------------------------- /Soluciones/19/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also. 3 | @; 4 | 5 | @; RSI del timer 0: se activará a 100 Hz, para contabilizar el número de 6 | @; impulsos que genera el anemómetro y poner el biestable J-K a cero, 7 | @; además de contabilizar el paso del tiempo (centésimas de segundo). 8 | RSI_timer0: 9 | push {r0-r3, lr} 10 | 11 | mov r0, #0x0A000000 @; R0 es dirección del registro E/S 12 | ldr r1, [r0] @; R1 captura bits de registro E/S 13 | ldr r2, =reset 14 | ldrb r3, [r2] @; R3 = 1 si la interrupción anterior 15 | cmp r3, #1 @; activó el reset del J-K 16 | beq .LRSIt0_reset1 17 | 18 | .LRSIt0_reset0: 19 | tst r1, #0x20 @; testear bit 5 20 | beq .LRSIt0_cont @; continuar si es cero 21 | 22 | bic r1, #0x10 @; desactiva el bit 4 del registro E/S 23 | str r1, [r0] @; lo cual activa el reset del J-K 24 | mov r3, #1 25 | strb r3, [r2] @; memoriza 1 en la variable global 'reset' 26 | 27 | ldr r0, =vel 28 | ldrh r1, r0 @; R1 = acumulador de cm/s 29 | add r1, #112 @; (1,12 m/s por impulso detectado) 30 | strh r1, [r0] @; actualiza la variable global 'vel' 31 | 32 | b .LRSIt0_cont 33 | 34 | .LRSIt0_reset1: 35 | orr r1, #0x10 @; activa el bit 4 del registro E/S 36 | strh r1, [r0] @; lo cual desactiva el reset del J-K 37 | mov r3, #0 38 | strb r3, [r2] @; memoriza 0 en la variable global 'reset' 39 | 40 | .LRSIt0_cont: 41 | ldr r0, =tic_count 42 | ldrh r1, [r0] @; R1 = contador de tics 43 | add r1, #1 44 | strh r1, [r0] @; actualiza la variable global 'tic_count' 45 | 46 | pop {r0-r3, pc} 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /Soluciones/19/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Anemómetro electrónico 2 | -------------------------------------------------------------------------------- /Soluciones/19/inicializar_timer0_01.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; inicializar_timer0_01: pasada una frecuencia por parámetro, calcula 6 | @; el divisor de frecuencia para el timer0 y lo activa, utilizando la 7 | @; segunda frecuencia de entrada más alta (523.657 Hz). 8 | @; Parámetros: 9 | @; R0: frecunecia de salida requerida, en Hz 10 | inicializar_timer0_01: 11 | push {r0-r3, lr} @; salvar reg. modificaciones (R3 por swi 9) 12 | 13 | ldr r2, =TIMER0_DATA @; R2 apunta a registros de E/S del timer 0 14 | mov r1, r0 @; R1 = frec. salida (denominador) 15 | ldr r0, =-523657 @; R0 = frec. entrada (numerador) 16 | swi 9 @; llamada a la bios para dividir 17 | strh r0, [r2] @; escibir TIMER0_DATA 18 | mov r0, #0xC1 @; activar timer/int., selec. frec. ent. = 01 19 | strh r0, [r2, #2] @; escribir TIMER0_CR 20 | 21 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/19/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | unsigned short vel = 0; // velocidad acumulada del viento (cm/s) 6 | unsigned short tic_count = 0; // tics deun intérvalo (centésimas) 7 | unsigned char reset = 0; // indica si se está haciendo reset 8 | 9 | void main() 10 | { 11 | unsigned short num_med = 1; // número actual de mediciones 12 | 13 | inicializaciones(); 14 | inicializar_timer0_01(100); // freq. salida = 100 Hz 15 | do 16 | { 17 | tareas_independientes(); 18 | if (tic_count >= 300) // si han pasado 3 segundos 19 | { 20 | swiWaitForVBlank(); 21 | printf("%d:\t%0.2f\n", num_med++, (float) vel / tic_count); 22 | // con (vel. acumulada / tiempo. intervalo) 23 | // se obtiene un promedio de la velocidad 24 | // instantánea del viento (con decimales) 25 | tic_count = 0; // puesta a cero para el siguinete 26 | vel = 0; // intérvalo 27 | } 28 | } while(1); 29 | } -------------------------------------------------------------------------------- /Soluciones/20/.fotos_enunciado_20/20-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/20/.fotos_enunciado_20/20-1.png -------------------------------------------------------------------------------- /Soluciones/20/.fotos_enunciado_20/20-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/20/.fotos_enunciado_20/20-2.png -------------------------------------------------------------------------------- /Soluciones/20/.fotos_enunciado_20/20-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/20/.fotos_enunciado_20/20-3.png -------------------------------------------------------------------------------- /Soluciones/20/.fotos_enunciado_20/20-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/20/.fotos_enunciado_20/20-4.png -------------------------------------------------------------------------------- /Soluciones/20/20.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/20/20.pdf -------------------------------------------------------------------------------- /Soluciones/20/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/20/.fotos_enunciado_20/20-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/20/.fotos_enunciado_20/20-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/20/.fotos_enunciado_20/20-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/20/.fotos_enunciado_20/20-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/20/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del timer 0: se activará a la frecuencia de pasos calculada 6 | @; según la velocidad de rotación requerida del motor; a cada 7 | @; activación debe cambiar de fase, según el sentido actual de avance 8 | @; y la fase anterior; además, debe decrementar el número de pasos 9 | @; pendientes, y parar el timer si dicho número ha llegado a cero. 10 | RSI_timer0: 11 | push {r0-r2, lr} 12 | ldr r0, =fase 13 | ldrb r1, [r0] @; R1 es fase actual 14 | ldr r2, =sentido 15 | ldsb r2, [r2] @; R2 es sentido de avance 16 | add r1, r2 @; actualizar fase (inc. o 17 | and r1, #7 @; módulo 8 para actualización circular 18 | strb r1, [r0] @; actualiza variable global ' 19 | ldr r0, =Vphases 20 | ldrb r2, [r0, r1] @; R2 es estado de los bits de salida 21 | @; según la nueva fase 22 | mov r0, #0x0A000000 @; R0 es dirección registro E/S 23 | ldr r1, [r0] @; R1 es valor actual del reg. E/S 24 | bic r1, #0xF0 @; limpiar bits b7-b4 25 | orr r1, r2 @; añadir bits de fase 26 | str r1, [r0] @; actualiza reg. E/S 27 | 28 | ldr r0, =pasos 29 | ldrh r1, [r0] @; decrementa contador de pasos restantes 30 | subs r1, #1 @; si llega a cero, FZ = 1 31 | bleq desactivar_timer0 @;si FZ = 1, parar las interrupciones 32 | strh r1, [r0] 33 | 34 | pop {r0-r2, pc} -------------------------------------------------------------------------------- /Soluciones/20/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Motor de tracción 2 | -------------------------------------------------------------------------------- /Soluciones/20/intr_main.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; intr_main: rutina principal de gestión de las interrupciones; 6 | @; comprueba si se ha activado la RSI del timer 0 y, en caso afirmativo, 7 | @; invoca a la rutina RSI_timer0(); 8 | @; además, debe notificar la resolución de cualquier IRQ que se haya 9 | @; producido al controlador de interrupciones y a la posición global 10 | @; de memoria INTR_WAIT_FLAGS 11 | intr_main: 12 | push {r0-r2, lr} 13 | 14 | ldr r0, =REG_IF 15 | ldr r1, [r0] @; R1 = valor actual de REG_IF 16 | tst r1, #IRQ_TIMER0 @; verificar si se ha activado IRQ_TIMER0 17 | blne RSI_timer0 @; en caso afirmativo, llamar la RSI específica 18 | 19 | str r1, [r0] @; marcar todas las IRQ activadas en REG_IF 20 | ldr r2, =INTR_WAIT_FLAGS 21 | str r1, [r2] @; ídem en INTR_WAIT_F LAGS 22 | 23 | pop {r0-r2, pc} -------------------------------------------------------------------------------- /Soluciones/20/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | unsigned short pasos = 0; // número de pasos pendientes a enviar 6 | // (243 pasos por cm) 7 | char sentido; // 1 → forward, 1 → backward 8 | unsigned char fase = 0; // fase actual (0..7) 9 | // bits de salida b7-b4 por cada fase 10 | char Vphases[] = {0x80, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x90}; 11 | 12 | void main() 13 | { 14 | 15 | char velocidad; // variables locales de la 16 | unsigned char avance; // consigna actual 17 | 18 | inicializaciones(); 19 | desactivar_timer0(); // inicialmente el motor estará parado 20 | do 21 | { 22 | tareas_independientes(); 23 | if (pasos == 0) // si el motor está parado 24 | { 25 | siguiente_movimiento(&velocidad, &avance); 26 | if (velocidad != 0) 27 | { 28 | // sentido es el signo de velocidad 29 | sentido = (velocidad < 0 ? 1 : 1); 30 | // obtener valor absoluto de 31 | velocidad = velocidad * sentido; 32 | // frec. pasos = pasos/cm * cm/s 33 | fijar_frecuencia(243 * velocidad); 34 | // pasos avance = pasos/cm * cm 35 | pasos = 243 * avance; 36 | if (pasos > 0) activar_timer0(); 37 | swiWaitForVBlank(); 38 | printf("v = %d cm/s\n", velocidad); 39 | printf(" t%c = %d cm\n", 'd' + 2 * sentido, avance); 40 | // 'f' = 'd' + 2 41 | // 'b' = 'd' - 2 42 | } 43 | } 44 | } while (1); 45 | } -------------------------------------------------------------------------------- /Soluciones/21/.fotos_enunciado_21/21-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/21/.fotos_enunciado_21/21-1.png -------------------------------------------------------------------------------- /Soluciones/21/.fotos_enunciado_21/21-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/21/.fotos_enunciado_21/21-2.png -------------------------------------------------------------------------------- /Soluciones/21/.fotos_enunciado_21/21-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/21/.fotos_enunciado_21/21-3.png -------------------------------------------------------------------------------- /Soluciones/21/.fotos_enunciado_21/21-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/21/.fotos_enunciado_21/21-4.png -------------------------------------------------------------------------------- /Soluciones/21/21.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/21/21.pdf -------------------------------------------------------------------------------- /Soluciones/21/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/21/.fotos_enunciado_21/21-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/21/.fotos_enunciado_21/21-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/21/.fotos_enunciado_21/21-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/21/.fotos_enunciado_21/21-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/21/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Emisor IR 2 | -------------------------------------------------------------------------------- /Soluciones/22/.fotos_enunciado_22/22-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/22/.fotos_enunciado_22/22-1.png -------------------------------------------------------------------------------- /Soluciones/22/.fotos_enunciado_22/22-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/22/.fotos_enunciado_22/22-2.png -------------------------------------------------------------------------------- /Soluciones/22/.fotos_enunciado_22/22-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/22/.fotos_enunciado_22/22-3.png -------------------------------------------------------------------------------- /Soluciones/22/.fotos_enunciado_22/22-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/22/.fotos_enunciado_22/22-4.png -------------------------------------------------------------------------------- /Soluciones/22/22.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/22/22.pdf -------------------------------------------------------------------------------- /Soluciones/22/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/22/.fotos_enunciado_22/22-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/22/.fotos_enunciado_22/22-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/22/.fotos_enunciado_22/22-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/22/.fotos_enunciado_22/22-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/22/RSI_ascensor.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @;RSI de la interfaz con el ascensor: se activará cada vez que el 6 | @; ascensor llegue a una nueva planta; activará la variable global 7 | @; 'nueva_planta' y actualizará 'planta_actual' consecuentemente; 8 | @; además, si la planta a la que acaba de llegar el ascensor 9 | @; estaba solicitada, parará el motor y desactivará el bit de petición 10 | @; correspondiente. 11 | RSI_Ascensor: 12 | push {r0-r7, lr} 13 | 14 | ldr r0, =nueva_planta 15 | mov r1, #1 16 | strb r1, [r0] @; activar variable 'nueva_planta' 17 | 18 | ldr r0, =RA_Detect 19 | ldrh r1, [r0] @; R1 = bits de detección de planta 20 | ldr r2, =RA_Botons 21 | ldrh r3, [r2] @; R3 = bits de peticiones pendientes 22 | 23 | ldr r4, =planta_actual 24 | ldrb r5, [r4] @; R5 = número de planta actual 25 | mov r6, #1 26 | mov r6, r6, lsl r5 @; R6 = máscara de planta actual 27 | ldr r7, =sentido 28 | ldrb r7, [r7] @; R7 = sentido de movimiento actual 29 | cmp r7, #1 30 | addeq r5, #1 @; si subiendo, incrementar contador de planta 31 | moveq r6, r6, lsl #1 @; y mover máscara a planta superior 32 | subne r5, #1 @; si bajando, decrementar contador de planta 33 | movne r6, r6, lsr #1 @; y mover máscara a planta inferior 34 | strb r5, [r4] @; actualizar variable 'planta_actual' 35 | 36 | tst r3, r6 @; comprobar si bit de petición activado 37 | beq .LRSIA_final @; si planta actual no solicitada, salir de 38 | @; la rutina de servicio de interrupción 39 | 40 | ldr r0, =RA_Motor 41 | mov r1, #0 42 | strb r1, [r0] @; parar motor (inmediatamente < 5s) 43 | bic r3, r6 @; bit de petición de planta actual = 0 44 | strh r3, [r2] @; actualizar registro RA_Botons 45 | 46 | .LRSIA_final: 47 | pop {r0-r7, pc} -------------------------------------------------------------------------------- /Soluciones/22/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Ascensor con memoria 2 | -------------------------------------------------------------------------------- /Soluciones/22/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | #define NUM_PLANT 4 // número de plantas a gestionar 6 | unsigned char planta_actual = 0; // número de planta actual 7 | unsigned char sentido = 1; // sentido de movimiento actual 8 | // = 1 → subida, 9 | // = 2 → bajada 10 | 11 | unsigned char nueva_planta = 0; // indica si el ascensor ha llegado a una nueva planta 12 | 13 | void main() 14 | { 15 | int i; 16 | 17 | inicializaciones(); 18 | do 19 | { 20 | tareas_independientes(); 21 | if ((RA_Botons != 0) && (RA_Motor == 0)) // si hay peticiones pendientes y el motor está parado 22 | { 23 | cerrar_puerta(); 24 | RA_Motor = siguiente_movimiento(RA_Botons, planta_actual, &sentido); 25 | } 26 | 27 | if (nueva_planta) // comprobar si hay detección de llegada a una nueva planta 28 | { 29 | nueva_planta = 0; // desmarcar variable 30 | swiWaitForVBlank(); 31 | printf("Planta: %d\n", planta_actual); 32 | printf("Peticiones:\n\t"); 33 | for (i = NUM_PLANT-1; i >= 0; i--) 34 | { 35 | // escribir peticiones pendientes 36 | if (RA_Botons & (1 << i)) printf(“%d “, i); // planta solicitada 37 | else printf(“_ “); // planta no solicitada 38 | } 39 | printf("\n"); 40 | if (RA_Motor == 0) // en caso de motor parado 41 | abrir_puerta(); 42 | } 43 | } while (1); 44 | } -------------------------------------------------------------------------------- /Soluciones/22/siguiente_movimiento.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; siguiente_movimiento: calcula cual es el siguiente sentido del 6 | @; movimiento del motor, según las peticiones pendientes (se supone que 7 | @; existe al menos una), la planta actual y el sentido actual del 8 | @; movimiento; el tercer parámetro se pasa por referencia para poder 9 | @; ser modificado directamente en memoria desde la propia rutina; además, 10 | @; el nuevo valor del sentido se devolverá también como resultado de la 11 | @; rutina. 12 | @; Parámetros: 13 | @; R0: peticiones pendientes (unsigned short) 14 | @; R1: valor de planta actual (unsigned char) 15 | @; R2: referencia de la variable que memoriza el sentido actual 16 | @; del movimiento (unsigned char *) 17 | @; Resultado: 18 | @; R0: siguiente sentido del movimiento (1 → subida, 2 → bajada) 19 | siguiente_movimiento: 20 | push {r3-r5, lr} @; salvar registros a modificar 21 | 22 | ldrb r3, [r2] @; R3 = valor de sentido actual 23 | mov r4, #1 24 | mov r4, r4, lsl r1 @; R4 = máscara de bit de planta actual 25 | mov r5, r1 @; R5 = índice de búsqueda (número de planta) 26 | 27 | cmp r3, #1 @; comprobar sentido actual del movimiento 28 | bne .Lsm_bajada 29 | 30 | .Lsm_subida: 31 | mov r4, r4, lsl #1 @; máscara de piso siguiente (superior) 32 | add r5, #1 @; avanzar índice de piso 33 | cmp r5, #NUM_PLANT-1 @; si se pasa del índice máximo 34 | movgt r3, #2 @; cambiar el sentido de movimiento 35 | bgt .Lsm_actualizar 36 | tst r0, r4 @; mientras no detecte nueva petición, 37 | beq .Lsm_subida @; continuar bucle 38 | b .Lsm_final @; si hay detección, finalizar rutina sin cambio de sentido 39 | 40 | .Lsm_bajada: 41 | mov r4, r4, lsr #1 @; máscara de piso siguiente (inferior) 42 | sub r5, #1 @; retroceder índice de piso 43 | cmp r5, #0 @; si se pasa del índice mínimo 44 | movlt r3, #1 @; cambiar el sentido de movimiento 45 | blt .Lsm_actualizar 46 | tst r0, r4 @; mientras no detecte nueva petición, 47 | beq .Lsm_bajada @; continuar bucle 48 | b .Lsm_final @; si hay detección, finalizar rutina sin cambio de sentido 49 | 50 | .Lsm_actualizar: 51 | strb r3, [r2] @;actualizar variable sentido, por referencia 52 | 53 | .Lsm_final: 54 | mov r0, r3 @; y devolver su valor como resultado 55 | 56 | pop {r3-r5, pc} @;restaurar registros modificados -------------------------------------------------------------------------------- /Soluciones/23/.fotos_enunciado_23/23-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/23/.fotos_enunciado_23/23-1.png -------------------------------------------------------------------------------- /Soluciones/23/.fotos_enunciado_23/23-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/23/.fotos_enunciado_23/23-2.png -------------------------------------------------------------------------------- /Soluciones/23/.fotos_enunciado_23/23-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/23/.fotos_enunciado_23/23-3.png -------------------------------------------------------------------------------- /Soluciones/23/.fotos_enunciado_23/23-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/23/.fotos_enunciado_23/23-4.png -------------------------------------------------------------------------------- /Soluciones/23/23.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/23/23.pdf -------------------------------------------------------------------------------- /Soluciones/23/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-10 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/23/.fotos_enunciado_23/23-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/23/.fotos_enunciado_23/23-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/23/.fotos_enunciado_23/23-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/23/.fotos_enunciado_23/23-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/23/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del timer 0: se activa periódicamente (240 Hz) para realizar el 6 | @; refresco de una fila de LEDs, en función del contenido de la 7 | @; variable global 'matriz'. 8 | RSI_timer0: 9 | push {r0-r7, lr} @;salvar registros a modificar 10 | 11 | ldr r0, =f_refresco 12 | ldrb r1, [r0] @; R1 = fila de refresco actual, rango (0..7) 13 | ldr r2, =matriz 14 | add r2, r1, lsl #3 @; R2 = dirección inicial de fila de refresco 15 | 16 | mov r3, #0 @; R3 = índice de columna 17 | mov r4, #0x80 @; R4 = máscara de activación de una columna 18 | mov r5, #0xFF @; R5 = patrón de bits de columnas en rojo 19 | mov r6, #0xFF @; R6 = patrón de bits de columnas en verde 20 | .LRSIt0_for: 21 | ldrb r7, [r2, r3] @; R7 = valor en la matriz (columna actual) 22 | cmp r7, #1 @; comprobar si es jugador 1 23 | biceq r5, r4 @; activar bit (=0) en patrón de rojos 24 | cmp r7, #2 @; comprobar si es jugador 2 25 | biceq r6, r4 @; activar bit (=0) en patrón de verdes 26 | mov r4, r4, lsr #1 @; desplazar máscara 27 | add r3, #1 @; y avanzar índice de siguiente columna 28 | cmp r3, #8 29 | blo .LRSIt0_for @; cerrar bucle 30 | 31 | mov r7, r6, lsl #16 @; R7 = patrón de bits verdes (desplazados) 32 | orr r7, r5, lsl #8 @; añadir patrón de bits rojos (desplazados) 33 | 34 | rsb r3, r1, #7 @; invertir f_refresco a núm. bit (R3 = 7 - R1) 35 | mov r4, #1 36 | mov r4, r4, lsl r3 @; crear máscara de activación del bit de fila 37 | orr r7, r4 @; añadir al total de bits 38 | ldr r2, =RegMLED 39 | str r7, [r2] @; escribir registro de Entrada/Salida 40 | 41 | add r1, #1 @; pasar a la siguiente fila de refresco 42 | cmp r1, #7 @; si supera el último índice (7), 43 | movhi r1, #0 @; volver a empezar por la fila 0 44 | strb r1, [r0] @; actualizar variable global 'f_refresco' 45 | 46 | pop {r0-r7, pc} @; restaurar registros modificados -------------------------------------------------------------------------------- /Soluciones/23/RSI_timer1.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del timer 1: se activa periódicamente (3 Hz) para realizar la 6 | @; caída de la ficha, una fila por cada activación de la RSI, hasta 7 | @; que detecte otra ficha en la fila inferior o hasta que llegue a 8 | @; la última fila. 9 | RSI_timer1: 10 | push{r0-r8, lr} 11 | 12 | ldr r0, =fase 13 | ldrb r1, [r0] @; R1 = valor de la fase del programa 14 | cmp r1, #1 15 | bne .LRSIt1_final @; salir si no estamos en fase de caída 16 | 17 | ldr r2, =fil 18 | ldrb r3, [r2] @; R3 = valor de fila 19 | cmp r3, #8 20 | beq .LRSIt1_fincaida @; finalizar caída por llegar a última fila 21 | 22 | ldr r4, =col 23 | ldrb r4, [r4] @; R4 = valor de columna 24 | sub r4, #1 @; ajustar índice de columna a rango (0..7) 25 | ldr r5, =matriz @; R5 = dirección inicial de la matriz de juego 26 | add r6, r4, r3, lsl #3 @; R6 = desplazamiento (col-1 + fil*8) 27 | ldrb r7, [r5, r6] @; comprobar posición inferior (fil indica el 28 | @; desplazamiento de la fila inferior, 29 | @; porque el índice de filas empiezan en 0 30 | @; y la variable fil empieza en 1) 31 | cmp r7, #0 32 | bne .LRSIt1_fincaida @; finalizar caída por detectar ficha debajo 33 | 34 | ldr r8, =turno 35 | ldrb r8, [r8] @; R8 = valor del turno 36 | strb r8, [r5, r6] @; si se puede bajar la ficha, guardar turno en 37 | sub r6, #8 @; posición inferior y borrar posición anterior 38 | strb r7, [r5, r6] @; (R7 seguro que contiene un 0) 39 | add r3, #1 @; bajar una fila 40 | strb r3, [r2] @; actualizar variable global de fila b 41 | b .LRSIt1_final 42 | 43 | .LRSIt1_fincaida: 44 | mov r1, #2 @;cambiar a fase 2 cuando finaliza la caída 45 | strb r1, [r0] @;actualizar variable global de fase 46 | 47 | .LRSIt1_final: 48 | pop {r0-r8, pc} -------------------------------------------------------------------------------- /Soluciones/23/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Matriz 8x8 LEDs 2 | -------------------------------------------------------------------------------- /Soluciones/23/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | unsigned char matriz[8][8]; //valores de los LEDs, en cada posición: 6 | // = 0 → vacía (apagado) 7 | // = 1 → ficha jugador 1 (rojo) 8 | // = 2 → ficha jugador 2 (verde) 9 | unsigned char turno = 1; // número de jugador actual 10 | 11 | unsigned char fil = 1, col = 4; // fila y columna de la ficha que se está colocando 12 | 13 | unsigned char fase = 0; // fase actual del programa: 14 | // = 0 → seleccionar columna 15 | // = 1 → caída de ficha 16 | // = 2 → comprobar ganador 17 | // = 3 → final de partida 18 | 19 | unsigned char f_refresco = 0; // índice de fila que se tiene 20 | // que refrescar en el display 21 | void main() 22 | { 23 | int keys; 24 | inicializaciones(); // la matriz estará toda a ceros, 25 | matriz[0][col - 1] = turno; // excepto la posición de salida 26 | do 27 | { 28 | swiWaitForVBlank(); // relajar bucle principal 29 | switch (fase) 30 | { 31 | case 0: // selección de columna 32 | scanKeys(); 33 | keys = keysDown(); 34 | if ((keys & KEY_LEFT) && (col > 1)) 35 | { 36 | matriz[0][col - 1] = 0; 37 | col--; 38 | matriz[0][col - 1] = turno; 39 | } 40 | if ((keys & KEY_RIGHT) && (col < 8)) 41 | { 42 | matriz[0][col-1] = 0; 43 | col++; 44 | matriz[0][col-1] = turno; 45 | } 46 | if ((keys & KEY_SELECT) && (matriz[1][col - 1] == 0)) 47 | { 48 | printf("Jug: %d\tCol: %d\n", turno, col); 49 | fase = 1; 50 | } 51 | break; 52 | case 1: // esperar caída de ficha 53 | break; 54 | case 2: 55 | if (comprobar_4(&matriz[1][0], 7, 8)) // detección de ganador 56 | { 57 | mostrar_ganador(turno); 58 | fase = 3; // programa finalizado 59 | } 60 | else // cambio de turno 61 | { 62 | turno = 3 - turno; 63 | fil = 1; 64 | col = 4; // inicializaciones para 65 | matriz[0][col-1] = turno; // la nueva selección 66 | fase = 0; 67 | } 68 | break; 69 | } 70 | } 71 | } while (1); 72 | } -------------------------------------------------------------------------------- /Soluciones/24/.fotos_enunciado_24/24-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/24/.fotos_enunciado_24/24-1.png -------------------------------------------------------------------------------- /Soluciones/24/.fotos_enunciado_24/24-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/24/.fotos_enunciado_24/24-2.png -------------------------------------------------------------------------------- /Soluciones/24/.fotos_enunciado_24/24-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/24/.fotos_enunciado_24/24-3.png -------------------------------------------------------------------------------- /Soluciones/24/.fotos_enunciado_24/24-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/24/.fotos_enunciado_24/24-4.png -------------------------------------------------------------------------------- /Soluciones/24/24.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/24/24.pdf -------------------------------------------------------------------------------- /Soluciones/24/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/24/.fotos_enunciado_24/24-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/24/.fotos_enunciado_24/24-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/24/.fotos_enunciado_24/24-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/24/.fotos_enunciado_24/24-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/24/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 100 Hz 2 | @; Pre --> i_fon = 0; 3 | @; REG_MOUTH ya tiene cargado fonemas[0] 4 | @; num_fon > 0 5 | RSI_timer0: 6 | push {r0-r3, lr} 7 | ldr r0, =i_fon @; r0 = @i_fon 8 | ldrb r1, [r0] @; r1 = i_fon 9 | 10 | ldr r2, =fcs @; r2 = char @fcs 11 | ldrb r3, [r2, r1] @; r3 = fcs[i_fon] 12 | 13 | cmp r3, #0 14 | beq .LNextChar 15 | @; bne implicito 16 | sub r3, #1 17 | strb r3, [r2, r1] 18 | b .Lfin 19 | 20 | 21 | .LNextChar: 22 | add r1, #1 23 | 24 | ldr r2, =num_fon @; r2 = @num_fon 25 | ldrb r2, [r2] @; r2 = num_fon 26 | cmp r1, r2 27 | bne .LLoadChar 28 | @; beq implicito, hemos terminado la palabra actual, cerramos todo 29 | 30 | ldr r2, =REG_MOUTH @; r2 = @REG_MOUTH 31 | mov r3, #0 32 | str r3, [r2] @; ponemos bit 31 a 0. 33 | bl desactivar_timer0 @; desactivar timer 34 | 35 | mov r1, #-1 36 | strb r1, [r0] @; i_fon = -1 37 | 38 | b .Lfin 39 | 40 | .LLoadChar: 41 | strb r1, [r0] @; actualizar i_fon a siguiente valor 42 | ldr r0, =fonemas 43 | ldr r2, [r0, r1] 44 | 45 | orr r2, #0x8000 0000 46 | ldr r0, =REG_MOUTH @; r0 = @REG_MOUTH 47 | str r2, [r0] 48 | 49 | .Lfin: 50 | 51 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/24/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Boca artificial 2 | 3 | Este problema trata sobre controlar un periférico capaz de vocalizar y emitir sonidos, emulando una boca humana. Para 4 | ello dispondremos de un registro de E/S que usaremos para controlar las cuerdas vocales del dispositivo, la nariz, la 5 | lengua y el paso de aire. Los bits de este registro controlan directamente elementos mecánicos de la boca que permiten 6 | la modulación de la pronunciación. Nuestro objetivo será el de recibir palabras por Wi-Fi, usando el ARM7, que será 7 | transparente para nosotros en este ejercicio. Estas palabras seran reenviadas al ARM9 (el que ejecutará la totalidad del 8 | código implementado) usando el sistema de comunicación entre los dos procesadores IPC-FIFO. Las palabras serán 9 | decodificadas por una función que viene implementada que transformará nuestro array de carácteres en dos arrays que 10 | tendran tantas posiciones como fonemas tengamos que pronunciar para la palabra actual. El primer vector contendrá los 11 | valores que tendremos que escribir en nuestro registro de control del dispositivo y el segundo el tiempo que durará el 12 | fonema en centésimas de segundo. 13 | 14 | El control de tiempo, la gestión del cambio de fonema y la gestión del final de la palabra se realizará desde la RSI de 15 | un timer. El primer fonema debe prepararse desde el main. Habrá que sincronizar main y timer para que trabajen 16 | conjuntamente de forma coordinada. -------------------------------------------------------------------------------- /Soluciones/24/main.c: -------------------------------------------------------------------------------- 1 | #define MAX_CAR 16 2 | #define MAX_FON 50 3 | 4 | char palabra[MAX_CAR+1]; // palabra a vocalizar 5 | unsigned int fonemas[MAX_FON]; // fonemas a vocalizar 6 | unsigned char fcs[MAX_FON]; // tiempo de cada fonema, en centésimas de segundo 7 | unsigned char num_fon = 0; // número de fonemas a vocalizar 8 | char i_fon = -1; 9 | 10 | int main() 11 | { 12 | unsigned int* REG_MOUTH; 13 | 14 | inicializaciones(); 15 | do { 16 | tareas_independientes(); 17 | 18 | if (i_fon == -1) 19 | { 20 | if (siguiente_palabra(palabra) == 0) 21 | { 22 | continue; 23 | } 24 | 25 | num_fon = pal2fon(palabra, fonemas, fcs); 26 | i_fon = 0; 27 | 28 | swiWaitForVBlank(); 29 | printf("%s", palabra); 30 | 31 | *REG_MOUTH = fonemas[0] | 0x40000000 ; 32 | activar_timer0(100); 33 | } 34 | } while(1); 35 | } -------------------------------------------------------------------------------- /Soluciones/24/siguiente_palabra.s: -------------------------------------------------------------------------------- 1 | @; int siguiente_palabra(char *string); 2 | @; Entrada: 3 | @; r0 = @String (salida) 4 | @; 5 | @; Salida: 6 | @; r0 = num_char en @String 7 | siguiente_palabra: 8 | push {r1-r4, lr} 9 | 10 | ldr r1, =REG_IPC_FIFO_CR @; r1 = @REG_IPC_FIFO_CR 11 | ldr r2, =REG_IPC_FIFO_RX 12 | mov r3, #0 13 | 14 | .Lbucle: 15 | ldr r4, [r1] 16 | and r4, r4, #0x0000 0080 --> 0b 0000000000000000 0000 0000 1000 0000 @; tst r4, #0x0000 0080 17 | cmp r4, #0x0000 0080 18 | beq .Lvacio 19 | 20 | ldrb r4, [r2] 21 | strb r4, [r0, r3] 22 | add r3, #1 23 | b .Lbucle 24 | 25 | .Lvacio: 26 | mov r1, #0 27 | strb r1, [r0, r3] 28 | mov r0, r3 29 | 30 | pop {r1-r4, pc} -------------------------------------------------------------------------------- /Soluciones/25/.fotos_enunciado_25/25-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/25/.fotos_enunciado_25/25-1.png -------------------------------------------------------------------------------- /Soluciones/25/.fotos_enunciado_25/25-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/25/.fotos_enunciado_25/25-2.png -------------------------------------------------------------------------------- /Soluciones/25/.fotos_enunciado_25/25-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/25/.fotos_enunciado_25/25-3.png -------------------------------------------------------------------------------- /Soluciones/25/.fotos_enunciado_25/25-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/25/.fotos_enunciado_25/25-4.png -------------------------------------------------------------------------------- /Soluciones/25/25.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/25/25.pdf -------------------------------------------------------------------------------- /Soluciones/25/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2022-12-05 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/25/.fotos_enunciado_25/25-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/25/.fotos_enunciado_25/25-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/25/.fotos_enunciado_25/25-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/25/.fotos_enunciado_25/25-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/25/RSI_timer1.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del timer 1. 6 | RSI_Timer1: 7 | push {r0-r1, lr} 8 | 9 | ldr r0, =num_disp 10 | ldrb r1, [r0] @; Se carga el número de disparos. 11 | cmp r1, #0 12 | beq .Ldetener_disparos 13 | @; Si quedan disparos 14 | sub r1, #1 @; se disminuye el número de disparos. 15 | strb r1, [r0] 16 | 17 | ldr r0, =REG_SHUTER 18 | mov r1, #0x0010 19 | strh r1, [r0] @; se activa el bit half press del registro REG_SHUTTER. 20 | 21 | mov r1, #1 22 | ldr r0, =status 23 | strb r1, [r0] @; se pasa al estado 1. 24 | ldr r0, =actualizar_info 25 | strb r1, [r0] @; se activa la variable booleana 'actualizar_info'. 26 | 27 | ldr r0, =350 28 | bl activar_timer2 @; se activa el timer 2 con un periodo de 350 ms. 29 | 30 | b .Lfin_detener_disparos 31 | 32 | .Ldetener_disparos: @; Si no quedan disparos 33 | mov r0, #0x3 34 | bl desactivar_timers @; se paran los timers. 35 | 36 | .Lfin_detener_disparos: 37 | pop {r0-r1, pc} 38 | 39 | -------------------------------------------------------------------------------- /Soluciones/25/RSI_timer2.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del timer 2. 6 | RSI_Timer2: 7 | push {r0-r3, lr} 8 | 9 | ldr r3, =status 10 | ldr r2, [r3] @; Se carga el estado. 11 | cmp r2, #2 12 | beq .Lreposo 13 | @; Si el estado es 1 14 | ldr r1, =ind_p2 15 | ldrb r1, [r1] 16 | mov r0, r2, lsl r1 @; se desplaza el valor 1 tantos bits como indique ind_p2 para obtener p2. 17 | bl activar_timer2 18 | 19 | mov r2, #2 @; se pasa al estado 2. 20 | mov r0, #0x0030 @; Se activan los bits half press + full press. 21 | b .Lfin_reposo 22 | 23 | .Lreposo: @; Si el estado es 2 24 | mov r0, #0x04 25 | bl desactivar_timers @; se desactivan los timers. 26 | 27 | mov r2, #0 @; se pasa al estado 0. 28 | mov r0, #0x00 @; se desactivan los bits half press + full press. 29 | 30 | .Lfin_reposo: 31 | strb r2, [r3] @; Se guarda el nuevo valor de estado. 32 | ldr r1, =REG_SHUTER 33 | strb r0, [r1] @; Se actualiza el registro REG_SHUTTER con los valores correspondientes de half press + full press. 34 | 35 | pop {r0-r3, pc} 36 | -------------------------------------------------------------------------------- /Soluciones/25/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Disparador de cámara réflex 2 | -------------------------------------------------------------------------------- /Soluciones/25/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos 3 | // 4 | 5 | unsigned char num_disp = 0; // Número de disparos pendientes 6 | unsigned char ind_p1 = 0; // Índice del periodo p1 7 | unsigned char ind_p2 = 0; // Índice del periodo p2 8 | unsigned char status = 0; // Estado actual (0 --> parado, 9 | // 1 --> half press, 10 | // 2 --> half+full press) 11 | unsigned char actualizar_info = 0; // Indica si hay que actualizar información en pantalla 12 | 13 | void main() 14 | { 15 | int keys = 0; 16 | 17 | inicializaciones(); 18 | do 19 | { 20 | tareas_independientes(); 21 | 22 | scanKeys(); 23 | keys = keysDown(); 24 | if (keys & KEY_START) 25 | { // Si se ha pulsado la tecla KEY_START. 26 | if (num_disp == 0) 27 | { // Si no se ha efectuado ningún disparo 28 | activar_timers01(1 << ind_p1); // se activan los timers para que se inicie los disparos. 29 | } 30 | num_disp++; // Se incrementa el número de disparos. 31 | actualizar_info = 1; 32 | } 33 | if ((keys & KEY_LEFT) && (ind_p1 > 0)) 34 | { 35 | activar_timers01(1 << --ind_p1); // Primero se decrementa el contador y después se lleva a cabo el desplazamiento de bits. 36 | actualizar_info = 1; 37 | } 38 | if ((keys & KEY_RIGHT) && (ind_p1 < 9)) 39 | { 40 | activar_timers01(1 << ++ind_p1); // Primero se incrementa el contador y después se lleva a cabo el desplazamiento de bits. 41 | actualizar_info = 1; 42 | } 43 | if ((keys & KEY_DOWN) && (ind_p2 > 0)) 44 | { 45 | ind_p2--; 46 | actualizar_info = 1; 47 | } 48 | if ((keys & KEY_UP) && (ind_p2 < 9)) 49 | { 50 | ind_p2++; 51 | actualizar_info = 1; 52 | } 53 | 54 | swiWaitForVBlank(); // Se pone fuera porque la evaluación de la condición apenas ralentiza el programa y no existirán problemas de colisiones. 55 | // Así, se disminuye el consumo de la CPU aunque no haya pulsación de teclas. 56 | if (actualizar_info == 1) 57 | { 58 | printf("Periodo 1: %d s\n Periodo 2: %d ms\n Disparos pendientes: %d", 1 << ind_p1, 1 << ind_p2, num_disp); 59 | actualizar_info = 0; 60 | keys = 0; 61 | } 62 | } while(1); 63 | } 64 | -------------------------------------------------------------------------------- /Soluciones/26/.fotos_enunciado_26/26-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/26/.fotos_enunciado_26/26-1.png -------------------------------------------------------------------------------- /Soluciones/26/.fotos_enunciado_26/26-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/26/.fotos_enunciado_26/26-2.png -------------------------------------------------------------------------------- /Soluciones/26/.fotos_enunciado_26/26-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/26/.fotos_enunciado_26/26-3.png -------------------------------------------------------------------------------- /Soluciones/26/.fotos_enunciado_26/26-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/26/.fotos_enunciado_26/26-4.png -------------------------------------------------------------------------------- /Soluciones/26/26.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/26/26.pdf -------------------------------------------------------------------------------- /Soluciones/26/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-21 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/26/.fotos_enunciado_26/26-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/26/.fotos_enunciado_26/26-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/26/.fotos_enunciado_26/26-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/26/.fotos_enunciado_26/26-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/26/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del timer0: se activará cada tic del timer0, correspondiente al 6 | @; tiempo de referencia de los elementos del código Morse; 7 | @; en caso de final de activación del pulsador, debe almacenar los 8 | @; símbolos 1 o 2 en el vector global simb[], en la posición i_simb, 9 | @; y actualizar dicha posición; 10 | @; en caso de final de desactivación del pulsador, debe determinar 11 | @; el tipo de espacio (códigos 3, 4, 5 o 6) y, para códigos > 3, 12 | @; notificarlo a través de la variable global nuevo_bloque. 13 | RSI_timer0: 14 | push {r0-r5, lr} 15 | 16 | ldr r0, =cont_tics 17 | ldrb r1, [r0] @; R1 = contador de tics 18 | add r1, #1 19 | strb r1, [r0] @; Incrementar el contador 20 | cmp r1, #9 21 | bhi .LRSI_finmens @; Forzar fin de mensaje 22 | 23 | ldr r2, =REG_DATA 24 | ldr r2, [r2] @; R2 = valor registro de E/S 25 | and r2, #0x8000 @; Filtrar el valor del bit 15 26 | ldr r3, =estado_ant 27 | ldrh r4, [r3] @; R4 = estado anterior del bit 15 28 | cmp r4, r2 29 | beq .LRSI_fin 30 | 31 | @; Detección cambio de estado del bit 15 32 | strh r2, [r3] @; Actualizar variable 'estado_ant' 33 | cmp r2, #0 34 | bne .LRSI_findes 35 | @; Final de activación 36 | 37 | cmp r1, #3 38 | movlo r5, #1 @; Detección de punto 39 | movhs r5, #2 @; Detección de ralla 40 | ldr r2, =simb 41 | ldr r3, =i_simb 42 | ldrb r4, [r3] 43 | strb r5, [r2, r4] @; Guardar símbolo en vector simb 44 | add r4, #1 45 | strb r4, [r3] @; Actualizar índice símbolos 46 | b .LRSI_tics0 47 | 48 | .LRSI_findes: @; Final de desactivación 49 | cmp r1, #2 50 | bls .LRSI_tics0 @; Detección espacio entre símbolos 51 | cmp r1, #5 52 | movls r5, #4 @; Detección espacio entre letras 53 | bls .LRSI_set_nuevo_bloque 54 | cmp r1, #9 55 | movls r5, #5 @; Detección espacio entre palabras 56 | .LRSI_finmens: 57 | movhi r5, #6 @; Detección final de mensaje 58 | .LRSI_set_nuevo_bloque: 59 | ldr r2, =nuevo_bloque 60 | strb r5, [r2] 61 | 62 | .LRSI_tics0: @; Reiniciar contador de tics 63 | mov r1, #0 64 | strb r1, [r0] 65 | 66 | .LRSI_fin: 67 | pop {r0-r5, pc} -------------------------------------------------------------------------------- /Soluciones/26/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Lectura Morse 2 | -------------------------------------------------------------------------------- /Soluciones/26/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | #define MAX_LETRAS 100 // Máximo de letras por mensaje 6 | 7 | unsigned char i_simb = 0; // Índice del vector simb[] 8 | unsigned char simb[8]; // vector de símbolos Morse 9 | // 1 → '.' (punto) 10 | // 2 → '-' (ralla) 11 | unsigned char i_mens = 0; // Índice del vector mensaje[] 12 | char mensaje[MAX_LETRAS+1]; // Vector de letras (string) 13 | unsigned char cont_tics = 0; // Contador de tics (para la RSI) 14 | unsigned short estado_ant = 0; // Estado anterior del pulsador 15 | unsigned char nuevo_bloque = 0; // Código de nuevo bloque: 16 | // 0 → no hay bloque pendiente 17 | // 4 → nueva letra 18 | // 5 → nueva palabra 19 | // 6 → nuevo mensaje 20 | int main() 21 | { 22 | int t = inicializaciones(); // Determina tiempo de referencia 23 | inicializar_timer0((unsigned short) (1000 / t)); 24 | do 25 | { 26 | swiWaitForVBlank(); // Sincronización general para escrituras en pantallas 27 | 28 | recibir_mensaje(); // Tarea independiente 29 | if (nuevo_bloque) // Detectar si hay nuevo bloque 30 | { 31 | if (i_simb > 0) // Para cualquier tipo de bloque, traducir, registrar, escribir símbolos y letra correspondiente 32 | { 33 | for (int i = 0; i < i_simb; i++) 34 | { 35 | printf("%c", (simb[i] == 1 ? '.' : '-'); 36 | } 37 | mensaje[i_mens] = traducir_morse(simb, i_simb); 38 | printf("(%c) ", mensaje[i_mens++]); 39 | i_simb = 0; // Restablece índice de símbolos 40 | } 41 | if ((nuevo_bloque == 5) && (i_mens > 0)) // Si ha llegado una nueva palabra y hay caracteres pendientes, 42 | { 43 | mensaje[i_mens++] = ' '; // Registrar espacio en blanco 44 | printf("(SPACE) "); // Y escribir marca 45 | } 46 | if ((nuevo_bloque == 6) && (i_mens > 0)) // Si ha llegado un nuevo mensaje y hay caracteres pendientes, 47 | { 48 | mensaje[i_mens] = '\0'; // Añade el centinela 49 | printf("\n%s\n", mensaje); // Escribe y envía el mensaje 50 | enviar_mensaje(mensaje); 51 | i_mens = 0; // Restablece índice de letras 52 | } 53 | nuevo_bloque = 0; // Desactiva señalización bloques 54 | } 55 | } while (1); 56 | } -------------------------------------------------------------------------------- /Soluciones/27/.fotos_enunciado_27/27-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/27/.fotos_enunciado_27/27-1.png -------------------------------------------------------------------------------- /Soluciones/27/.fotos_enunciado_27/27-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/27/.fotos_enunciado_27/27-2.png -------------------------------------------------------------------------------- /Soluciones/27/.fotos_enunciado_27/27-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/27/.fotos_enunciado_27/27-3.png -------------------------------------------------------------------------------- /Soluciones/27/.fotos_enunciado_27/27-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/27/.fotos_enunciado_27/27-4.png -------------------------------------------------------------------------------- /Soluciones/27/27.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/27/27.pdf -------------------------------------------------------------------------------- /Soluciones/27/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-10-21 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/27/.fotos_enunciado_27/27-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/27/.fotos_enunciado_27/27-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/27/.fotos_enunciado_27/27-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/27/.fotos_enunciado_27/27-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/27/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del timer0: se activará a cada tic del timer0 (cada 25 ms); 6 | @; debe refrescar la visualización de una posición del display de 7 | @; números, fijando los bits de selección de posición, 7 segmentos 8 | @; y punto decimal correspondientes en el registro REG_DATA; 9 | @; solo se refrescan las posiciones que contengan algún valor 10 | @; significativo en el vector Vdigits[], según el formato decimal 11 | @; registrado en las variables globales num_dent y num_ddec. 12 | RSI_timer0: 13 | push {r0-r7, lr} 14 | 15 | ldr r0, =cont_tics 16 | ldrb r1, [r0] @; R1 = contador de tics 17 | add r1, #1 18 | cmp r1, #40 @; Comprobar si ha pasado un segundo 19 | blo .LRSI_nosec 20 | ldr r2, =nuevo_sec 21 | mov r3, #1 22 | strb r3, [r2] @; Marcar nuevo segundo 23 | mov r1, #0 @; Restablecer contador 24 | .LRSI_nosec: 25 | strb r1, [r0] @; Actualizar variable contador 26 | 27 | ldr r0, =cont_pos 28 | ldrb r1, [r0] @; R1 = contador de posición 29 | ldr r2, =Vsegments @; R2 = dirección Vsegments 30 | ldr r3, =Vdigits @; R3 = dirección Vdigits 31 | ldrb r4, [r3, r1] @; R4 = dígito en posición actual 32 | ldrb r5, [r2, r4] @; R5 = bits de 7 segmentos 33 | 34 | mov r6, #1 35 | mov r6, r6, lsl r1 @; R6 = máscara para bits de pos. 36 | orr r5, r6, lsl #8 @; Añadir bits pos. a bits 7 segm. 37 | 38 | ldr r6, =num_dent 39 | ldrb r7, [r6] @; R7 = número de dígitos enteros 40 | 41 | add r1, #1 @; Incrementar contador posición 42 | cmp r1, r7 @; (pos+1 == num_dent)? 43 | orreq r5, #0x80 @; En caso afirmativo, activar punto decimal 44 | 45 | ldr r6, =num_ddec 46 | ldrb r4, [r6] @; R4 = número de dígitos decimales 47 | add r7, r4 48 | cmp r1, r7 @; (pos+1 == num_dent + num_ddec)? 49 | moveq r1, #0 @; En caso afirmativo, volver a posición inicial 50 | 51 | strb r1, [r0] @; Actualizar contador posiciones 52 | 53 | ldr r2, =REG_DATA 54 | strh r5, [r2] @; Fijar 12 bits del reg. E/S 55 | 56 | pop {r0-r7, pc} -------------------------------------------------------------------------------- /Soluciones/27/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Display Numérico de 4 dígitos 2 | -------------------------------------------------------------------------------- /Soluciones/27/alternativa_1/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2022-11-08 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/27/.fotos_enunciado_27/27-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/27/.fotos_enunciado_27/27-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/27/.fotos_enunciado_27/27-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/27/.fotos_enunciado_27/27-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/27/alternativa_1/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos 3 | @; 4 | 5 | @; RSI del timer 0. 6 | RSI_timer0: 7 | push {r0-r4, lr} 8 | 9 | ldr r0, =capturar 10 | ldrb r1, [r0] 11 | add r1, #1 12 | strb r1, [r0] @; Se autoriza la captura de una muestra. 13 | 14 | ldr r0, =Vdigits 15 | ldr r3, =num_digit 16 | ldrb r2, [r3] 17 | ldrb r1, [r0, r2] @; Se carga el dígito del vector que contiene los dígitos del reloj indicado por el contador de dígitos. 18 | 19 | ldr r0, =Vsegments 20 | ldrb r1, [r0, r1] @; Se carga el conjunto de segmentos correspondiente al dígito cargado. 21 | mov r0, #0x100 22 | orr r1, r0, lsl r2 @; Se desplazan los bits de los segmentos tantas posiciones a la izquierda como indique el contador de dígitos y se activa el bit 8. 23 | add r2, #1 @; Se incrementa el contador de dígitos. 24 | 25 | ldr r0, =num_dent 26 | ldrb r0, [r0] 27 | cmp r2, r0 @; Si se ha tratado el último dígito de la parte entera 28 | addeq r1, #128 @; se suma el valor correspondiente al segmento '.' al conjunto de segmentos del dígito tratado. 29 | 30 | ldr r4, =num_ddec 31 | ldrb r4, [r4] 32 | add r0, r4 33 | cmp r2, r0 @; Si se ha tratado el último dígito 34 | moveq r2, #0 @; Se restablece el contador de dígitos. 35 | 36 | strb r2, [r3] @; Se actualiza el valor del contador de dígitos. 37 | ldr r0, =REG_DATA 38 | strh r1, [r0] @; Se guarda el conjunto de segmentos correspondientes al dígito tratado en el registro REG_DATA. 39 | 40 | pop {r0-r4, pc} -------------------------------------------------------------------------------- /Soluciones/27/alternativa_1/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Display Numérico de 4 dígitos 2 | -------------------------------------------------------------------------------- /Soluciones/27/alternativa_1/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos 3 | // 4 | 5 | #define MAX_CAPTURAS 10 // Máximo número de capturas (en un segundo). 6 | 7 | unsigned char Vsegments[] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111}; // Vector de generación de los dígitos decimales en 7 segmentos. 8 | 9 | unsigned char n_vals = 0; // Número de capturas actual. 10 | float valores[MAX_CAPTURAS]; // Vector de valores capturado. 11 | 12 | unsigned char Vdigits[4] = {0, 0}; // Vector de dígitos (inicial 0.0). 13 | unsigned char num_dent = 1; // Número de dígitos enteros. 14 | unsigned char num_ddec = 1; // Número de dígitos decimales. 15 | 16 | unsigned char capturar = 0; // Booleano para nueva captura. 17 | unisgned char num_digit = 0; // Contador de dígitos. 18 | 19 | int main() 20 | { 21 | int i, segundo = 1; 22 | float acum, valor; 23 | 24 | inicializaciones(); 25 | inicializar_timer0(40); // frecuencia = 40 Hz. 26 | do 27 | { 28 | if (capturar >= 4) 29 | { 30 | valores[n_vals++] = capturar_dato(); // Tarea independiente. 31 | capturar = 0; 32 | } 33 | if (n_vals == MAX_CAPTURAS) 34 | { 35 | n_vals = 0; 36 | acum = 0; 37 | for (i = 0; i < MAX_CAPTURAS; i++) // Se calcula el promedio de todas las muestras tomadas. 38 | { 39 | acum += valores[i]; 40 | } 41 | valor = acum / MAX_CAPTURAS; 42 | convertir_numero(valor, Vdigits, &num_dent, &num_ddec); // Se convierte el valor decimal del promedio en un vector de dígitos. 43 | swiWaitForVBlank(); 44 | printf("\t%i:\t", segundo++); 45 | for (i = 0; i < num_dent; i++) 46 | { // Se imprimen los dígitos de la parte entera. 47 | printf("%i", Vdigits[i]); 48 | } 49 | printf("."); 50 | for (; i < num_dent + num_ddec; i++) 51 | { // Se imprimen los dígitos de la parte decimal. 52 | printf("%i", Vdigits[i]); 53 | } 54 | printf("\n"); 55 | } 56 | else 57 | { // Se quiere reducir el consumo de la CPU cada vez que se obtenga una nueva muestra 58 | swiWaitForVBlank(); // y no sólo cuando el promedio de todas ellas se imprima por pantalla. 59 | } 60 | } while (1); 61 | } -------------------------------------------------------------------------------- /Soluciones/27/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | #define MAX_CAPTURAS 10 // máximo número de capturas (en un segundo) 6 | 7 | // Vector de generación de los dígitos decimales en 7 segmentos 8 | unsigned char Vsegments[] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111}; 9 | 10 | unsigned char n_vals = 0; // Número de capturas actual 11 | float valores[MAX_CAPTURAS]; // Vector de valores capturados 12 | unsigned char Vdigits[4] = {0, 0}; // Vector de dígitos (inicial 0.0) 13 | unsigned char num_dent = 1; // Número de dígitos enteros 14 | unsigned char num_ddec = 1; // Número de dígitos decimales 15 | unsigned char cont_tics = 0; // Contador de tics (para la RSI) 16 | unsigned char cont_pos = 0; // Contador de posiciones 17 | unsigned char nuevo_sec = 0; // Booleano para nuevo segundo 18 | 19 | int main() 20 | { 21 | float promedio; 22 | int nsec = 0; 23 | 24 | inicializaciones(); 25 | inicializar_timer0(40); // F = 40 Hz (T = 25 ms) 26 | do 27 | { 28 | for (int i = 0; i < 5; i++) // ralentizar bucle principal 29 | { 30 | swiWaitForVBlank(); // Alrededor de 0,1 segundos 31 | } 32 | 33 | valores[n_vals++] = capturar_dato(); // Tarea independiente 34 | 35 | if (nuevo_sec) // Detectar si hay nuevo segundo 36 | { 37 | promedio = 0.0; 38 | for (int i = 0; i < n_vals; i++) 39 | { 40 | promedio += valores[i]; // Calcular valor promedio 41 | } 42 | promedio /= n_vals; 43 | n_vals = 0; // Reiniciar contador de capturas 44 | 45 | convertir_numero(promedio, Vdigits, &num_dent, &num_ddec); 46 | 47 | swiWaitForVBlank(); 48 | printf("\n\t%d:\t", ++nsec); 49 | for (int i = 0; i < num_dent + num_ddec; i++) 50 | { 51 | printf("%d", Vdigits[i]); 52 | if (i + 1 == num_dent) 53 | { 54 | printf("."); 55 | } 56 | } 57 | nuevo_sec = 0; // Desactiva señalización segundo 58 | } 59 | } while (1); 60 | } -------------------------------------------------------------------------------- /Soluciones/28/.fotos_enunciado_28/28-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/28/.fotos_enunciado_28/28-1.png -------------------------------------------------------------------------------- /Soluciones/28/.fotos_enunciado_28/28-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/28/.fotos_enunciado_28/28-2.png -------------------------------------------------------------------------------- /Soluciones/28/.fotos_enunciado_28/28-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/28/.fotos_enunciado_28/28-3.png -------------------------------------------------------------------------------- /Soluciones/28/.fotos_enunciado_28/28-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/28/.fotos_enunciado_28/28-4.png -------------------------------------------------------------------------------- /Soluciones/28/28.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/28/28.pdf -------------------------------------------------------------------------------- /Soluciones/28/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Santiago Romaní Also | 6 | | Fecha de creación | 2022-11-28 | 7 | | Fecha de modificación | 2022-12-21 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/28/.fotos_enunciado_28/28-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/28/.fotos_enunciado_28/28-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/28/.fotos_enunciado_28/28-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/28/.fotos_enunciado_28/28-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/28/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Santiago Romaní Also 3 | @; 4 | 5 | @; RSI del timer0: 6 | @; Se activará cada tic del timer0, correspondiente al tiempo de referencia de los elementos del código Morse; 7 | @; En caso de final de activación del pulsador, debe almacenar los símbolos 1 o 2 en el vector global simb[], en la 8 | @; posición i_simb, y actualizar dicha posición; 9 | @; En caso de final de desactivación del pulsador, debe determinar el tipo de espacio (códigos 3, 4, 5 o 6) y, para 10 | @; códigos > 3, notificarlo a través de la variable global nuevo_bloque. 11 | RSI_timer0: 12 | push {r0-r5, lr} 13 | 14 | ldr r0, =cont_tics 15 | ldrb r1, [r0] @; R1 = contador de tics 16 | add r1, #1 17 | strb r1, [r0] @; Incrementar el contador 18 | cmp r1, #9 19 | bhi .LRSI_finmens @; Forzar fin de mensaje 20 | 21 | ldr r2, =REG_DATA 22 | ldr r2, [r2] @; R2 = valor registro de E/S 23 | and r2, #0x8000 @; Filtrar el valor del bit 15 24 | ldr r3, =estado_ant 25 | ldrh r4, [r3] @; R4 = estado anterior del bit 15 26 | cmp r4, r2 27 | beq .LRSI_fin 28 | 29 | @; Detección cambio de estado del bit 15 30 | strh r2, [r3] @; Actualizar variable 'estado_ant' 31 | cmp r2, #0 32 | bne .LRSI_findes @; Final de activación 33 | 34 | cmp r1, #3 35 | movlo r5, #1 @; Detección de punto 36 | movhs r5, #2 @; Detección de ralla 37 | ldr r2, =simb 38 | ldr r3, =i_simb 39 | ldrb r4, [r3] 40 | strb r5, [r2, r4] @; Guardar símbolo en vector simb 41 | add r4, #1 42 | strb r4, [r3] @; Actualizar índice símbolos 43 | b .LRSI_tics0 44 | 45 | .LRSI_findes: @; Final de desactivación 46 | cmp r1, #2 47 | bls .LRSI_tics0 @; Detección espacio entre símbolos 48 | cmp r1, #5 49 | movls r5, #4 @; Detección espacio entre letras 50 | bls .LRSI_set_nuevo_bloque 51 | cmp r1, #9 52 | movls r5, #5 @; Detección espacio entre palabras 53 | .LRSI_finmens: 54 | movhi r5, #6 @; Detección final de mensaje 55 | .LRSI_set_nuevo_bloque: 56 | ldr r2, =nuevo_bloque 57 | strb r5, [r2] 58 | .LRSI_tics0: @; Reiniciar contador de tics 59 | mov r1, #0 60 | strb r1, [r0] 61 | .LRSI_fin: 62 | pop {r0-r5, pc} -------------------------------------------------------------------------------- /Soluciones/28/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Lector de hojas de marcas 2 | -------------------------------------------------------------------------------- /Soluciones/29/.fotos_enunciado_29/29-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/29/.fotos_enunciado_29/29-1.png -------------------------------------------------------------------------------- /Soluciones/29/.fotos_enunciado_29/29-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/29/.fotos_enunciado_29/29-2.png -------------------------------------------------------------------------------- /Soluciones/29/.fotos_enunciado_29/29-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/29/.fotos_enunciado_29/29-3.png -------------------------------------------------------------------------------- /Soluciones/29/.fotos_enunciado_29/29-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/29/.fotos_enunciado_29/29-4.png -------------------------------------------------------------------------------- /Soluciones/29/29.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/29/29.pdf -------------------------------------------------------------------------------- /Soluciones/29/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/29/.fotos_enunciado_29/29-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/29/.fotos_enunciado_29/29-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/29/.fotos_enunciado_29/29-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/29/.fotos_enunciado_29/29-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/29/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Envío de datos por RS-232-E 2 | -------------------------------------------------------------------------------- /Soluciones/30/.fotos_enunciado_30/30-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/30/.fotos_enunciado_30/30-1.png -------------------------------------------------------------------------------- /Soluciones/30/.fotos_enunciado_30/30-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/30/.fotos_enunciado_30/30-2.png -------------------------------------------------------------------------------- /Soluciones/30/.fotos_enunciado_30/30-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/30/.fotos_enunciado_30/30-3.png -------------------------------------------------------------------------------- /Soluciones/30/30.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/30/30.pdf -------------------------------------------------------------------------------- /Soluciones/30/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/30/.fotos_enunciado_30/30-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/30/.fotos_enunciado_30/30-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/30/.fotos_enunciado_30/30-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/30/.fotos_enunciado_30/30-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/30/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Frecuencia cardíaca 2 | -------------------------------------------------------------------------------- /Soluciones/31/.fotos_enunciado_31/31-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/31/.fotos_enunciado_31/31-1.png -------------------------------------------------------------------------------- /Soluciones/31/.fotos_enunciado_31/31-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/31/.fotos_enunciado_31/31-2.png -------------------------------------------------------------------------------- /Soluciones/31/.fotos_enunciado_31/31-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/31/.fotos_enunciado_31/31-3.png -------------------------------------------------------------------------------- /Soluciones/31/.fotos_enunciado_31/31-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/31/.fotos_enunciado_31/31-4.png -------------------------------------------------------------------------------- /Soluciones/31/31.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/31/31.pdf -------------------------------------------------------------------------------- /Soluciones/31/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/31/.fotos_enunciado_31/31-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/31/.fotos_enunciado_31/31-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/31/.fotos_enunciado_31/31-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/31/.fotos_enunciado_31/31-4.png) 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/31/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Joystick analógico 2 | -------------------------------------------------------------------------------- /Soluciones/32/.fotos_enunciado_32/32-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/32/.fotos_enunciado_32/32-1.png -------------------------------------------------------------------------------- /Soluciones/32/.fotos_enunciado_32/32-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/32/.fotos_enunciado_32/32-2.png -------------------------------------------------------------------------------- /Soluciones/32/.fotos_enunciado_32/32-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/32/.fotos_enunciado_32/32-3.png -------------------------------------------------------------------------------- /Soluciones/32/32.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/32/32.pdf -------------------------------------------------------------------------------- /Soluciones/32/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/32/.fotos_enunciado_32/32-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/32/.fotos_enunciado_32/32-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/32/.fotos_enunciado_32/32-3.png) 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Soluciones/32/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Caudalímetros 2 | -------------------------------------------------------------------------------- /Soluciones/33/.fotos_enunciado_33/33-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/33/.fotos_enunciado_33/33-1.png -------------------------------------------------------------------------------- /Soluciones/33/.fotos_enunciado_33/33-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/33/.fotos_enunciado_33/33-2.png -------------------------------------------------------------------------------- /Soluciones/33/.fotos_enunciado_33/33-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/33/.fotos_enunciado_33/33-3.png -------------------------------------------------------------------------------- /Soluciones/33/.fotos_enunciado_33/33-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/33/.fotos_enunciado_33/33-4.png -------------------------------------------------------------------------------- /Soluciones/33/33.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/33/33.pdf -------------------------------------------------------------------------------- /Soluciones/33/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/33/.fotos_enunciado_33/33-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/33/.fotos_enunciado_33/33-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/33/.fotos_enunciado_33/33-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/33/.fotos_enunciado_33/33-4.png) 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Soluciones/33/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Tiempo de tránsito del pulso 2 | -------------------------------------------------------------------------------- /Soluciones/34/.fotos_enunciado_34/34-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/34/.fotos_enunciado_34/34-1.png -------------------------------------------------------------------------------- /Soluciones/34/.fotos_enunciado_34/34-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/34/.fotos_enunciado_34/34-2.png -------------------------------------------------------------------------------- /Soluciones/34/.fotos_enunciado_34/34-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/34/.fotos_enunciado_34/34-3.png -------------------------------------------------------------------------------- /Soluciones/34/.fotos_enunciado_34/34-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/34/.fotos_enunciado_34/34-4.png -------------------------------------------------------------------------------- /Soluciones/34/.fotos_enunciado_34/34-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/34/.fotos_enunciado_34/34-5.png -------------------------------------------------------------------------------- /Soluciones/34/34.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/34/34.pdf -------------------------------------------------------------------------------- /Soluciones/34/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Aleix Mariné-Tena | 6 | | Fecha de creación | 2022-01-29 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/34/.fotos_enunciado_34/34-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/34/.fotos_enunciado_34/34-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/34/.fotos_enunciado_34/34-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/34/.fotos_enunciado_34/34-4.png) 15 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/34/.fotos_enunciado_34/34-5.png) 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Soluciones/34/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Aleix Mariné-Tena 3 | @; 4 | 5 | @; Every 1 / 30 s (1 TICK) start PWM cycle. if gradation in progress, update percentage intensity values regarding the 6 | @; linear ratio between the last valid intensities and the destiny intensities 7 | @; Every 1 / 600 s (1 MINITICK = 1 TICK / 20) perform PWM cycle 8 | RSI_timer0: 9 | push{lr} 10 | 11 | @; cycle through CURRENT_NUM_MINITICK for each minitick 12 | ldr r0, =CURRENT_NUM_MINITICK 13 | ldr r1, [r0] 14 | add r1, #1 15 | cmp r1, #20 16 | moveq r1, #0 17 | str r1, [r0] 18 | beq .tick_process 19 | @; Minitick process 20 | 21 | 22 | mov r0, #REG_IO @; direction 23 | ldrh r1, [r0] @; value 24 | 25 | 26 | 27 | 28 | .tick_process: 29 | @; On tick update CURRENT_NUM_INTERPOL 30 | ldr r0, =CURRENT_NUM_INTERPOL 31 | ldr r1, [r0] 32 | cmp r1, #300 33 | addlt r1, #1 34 | strlt r1, [r0] 35 | 36 | 37 | 38 | 39 | pop{pc} 40 | -------------------------------------------------------------------------------- /Soluciones/35/.fotos_enunciado_35/35-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/35/.fotos_enunciado_35/35-1.png -------------------------------------------------------------------------------- /Soluciones/35/.fotos_enunciado_35/35-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/35/.fotos_enunciado_35/35-2.png -------------------------------------------------------------------------------- /Soluciones/35/.fotos_enunciado_35/35-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/35/.fotos_enunciado_35/35-3.png -------------------------------------------------------------------------------- /Soluciones/35/35.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/35/35.pdf -------------------------------------------------------------------------------- /Soluciones/35/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2022-12-13 | 7 | | Fecha de modificación | 2022-12-20 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/35/.fotos_enunciado_35/35-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/35/.fotos_enunciado_35/35-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/35/.fotos_enunciado_35/35-3.png) 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Soluciones/35/RSI_VBlank.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos. 3 | @; 4 | 5 | @; RSI del vertical blank. 6 | RSI_vblank: 7 | push {r0-r3, lr} 8 | 9 | ldr r1, =ang_actual 10 | ldr r0, [r1] 11 | ldr r2, =fraccion 12 | ldr r2, [r2] 13 | add r0, r2 @; Se suma la fracción al índice 'ang_actual' para generar la nueva posición del vector de ángulos a la que se tendrá que acceder. 14 | 15 | mov r2, #360 16 | mov r2, r2, lsl #12 @; Se carga el valor 360 en formato Q12. 17 | cmp r0, r2 @; Si se ha llegado al valor límite del índice 'ang_actual' 18 | subge r0, r2 @; se le resta 360 (para mantener el valor acumulado de la fracción). 19 | str r0, [r1] 20 | mov r0, r0, lsr #12 @; Se elimina la parte decimal (Q12) del ángulo actual porque las posiciones de los vectores siempre deben ser enteras. 21 | 22 | ldr r3, =ang_pos @; Se carga la dirección base del vector de ángulos. 23 | mov r0, r0, lsl #2 24 | ldrh r1, [r3, r0] @; R1 = px (ángulo actual). 25 | add r0, #2 26 | ldrh r2, [r3, r0] @; R2 = py (ángulo actual) 27 | bl SPR_moverSprite 28 | 29 | mov r0, #0x07000000 @; R0 = OAM. 30 | mov r1, #1 @; R1 = Número de sprites. 31 | bl SPR_actualizarSprites 32 | 33 | bl activar_beat @; Se llama activar_beat desde la RSI (Justificación en el archivo 'activar_beat.md'). 34 | 35 | pop {r0-r3, pc} -------------------------------------------------------------------------------- /Soluciones/35/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Metrónomo digital -------------------------------------------------------------------------------- /Soluciones/35/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos. 3 | // 4 | 5 | typedef struct // Coordenadas de sprites. 6 | { 7 | short px; // [-64..288] 8 | short py; // [-32..224] 9 | } t_pos; 10 | 11 | t_pos ang_pos[360]; // Vector con posiciones (px, py) para cada ángulo. 12 | 13 | unsigned char bpm = 60; // "Beats" por minuto. 14 | unsigned char accent = 4; // Divisiones para generar el acento. 15 | unsigned char paused = !0; // Metrónomo pausado? (!0: sí, 0: no). 16 | 17 | unsigned int ang_actual = 0; // Ángulo actual (en formato Q12). 18 | unsigned int fraccion = ((bpm / accent) / 10) << 12; // Incremento del ángulo en un VBL (Q12). 19 | 20 | int main(void) 21 | { 22 | inicializaciones(); 23 | do 24 | { 25 | tareas_independientes(); 26 | if (gestionar_botones()) 27 | { // Actualizar fracción según nuevos 28 | fraccion = ((bpm / accent) / 10) << 12; // valores de bpm i accent. 29 | } 30 | swiWaitForVBlank(); 31 | actualizar_pantallas(); 32 | // activar_beat(); 33 | } while(1); 34 | } -------------------------------------------------------------------------------- /Soluciones/36/.fotos_enunciado_36/36-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/36/.fotos_enunciado_36/36-1.png -------------------------------------------------------------------------------- /Soluciones/36/.fotos_enunciado_36/36-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/36/.fotos_enunciado_36/36-2.png -------------------------------------------------------------------------------- /Soluciones/36/.fotos_enunciado_36/36-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/36/.fotos_enunciado_36/36-3.png -------------------------------------------------------------------------------- /Soluciones/36/.fotos_enunciado_36/36-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/36/.fotos_enunciado_36/36-4.png -------------------------------------------------------------------------------- /Soluciones/36/36.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/36/36.pdf -------------------------------------------------------------------------------- /Soluciones/36/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Aleix Mariné-Tena | 6 | | Fecha de creación | 2022-02-02 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/36/.fotos_enunciado_36/36-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/36/.fotos_enunciado_36/36-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/36/.fotos_enunciado_36/36-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/36/.fotos_enunciado_36/36-4.png) 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Soluciones/36/RSI_timer1.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Aleix Mariné-Tena 3 | @; 4 | 5 | RSI_timer1: 6 | 7 | push {r0 - r5, lr} 8 | 9 | @; Generar pulsos, invertir estado del bit 7 par control M1 10 | ldr r2, =REG_TEL 11 | ldrb r3, [r2] 12 | 13 | and r4, r3, #0x80 @; 0b1000 0000 14 | cmp r4, #0x80 15 | moveq r5, #0 16 | movne r5, #0x80 17 | 18 | strb r5, [r2] 19 | 20 | @; Comparar RA actual RA destino con circ_sub 21 | ldr r0, =ra_objetivo 22 | ldr r0, [r0] 23 | ldr r1, =ra_actual 24 | ldr r1, [r1] 25 | 26 | bl circ_sub 27 | @; Usar R0 para saber direccion 28 | cmp r0, #0 29 | movlt r2, #-1 30 | movgt r2, #1 31 | 32 | ldr r0, =seek_ra 33 | ldrb r3, [r0] 34 | cmp r3, #1 35 | bne .NotSeeking 36 | @; Estamos en modo busqueda 37 | 38 | cmp r1, #120 39 | blo .LessThan120 40 | @; r1 => 120 41 | 42 | mov r0, #1 43 | ldr r1, =divfreq_vmax 44 | ldrh r1, [r1] 45 | bl activar_timer 46 | 47 | ldr r2, =REG_TEL 48 | ldrb r3, [r2] 49 | 50 | @; r3 = 0b XX1X XXXX 51 | @; 0x20 =0010 0000 = 1101 1111 52 | 53 | bic r3, #0x20 @; 0b0010 0000 54 | strb r3, [r2] 55 | 56 | b .End 57 | 58 | 59 | 60 | .LessThan120: 61 | cmp r1, #0 62 | beq .Difference0 63 | @; Menor de 120 64 | 65 | mov r0, #1 66 | ldr r1, =divfreq_vmax 67 | ldrh r1, [r1] 68 | bl activar_timer 69 | 70 | ldr r2, =REG_TEL 71 | ldrb r3, [r2] 72 | 73 | orr r3, #0x20 @; 0b0010 0000 74 | strb r3, [r2] 75 | 76 | b .End 77 | 78 | .Difference0: 79 | 80 | ldr r3, =track 81 | mov r4, #1 82 | strb r4, [r3] 83 | 84 | mov r0, #1 85 | ldr r1, =divfreq_vmin 86 | ldrh r1, [r1] 87 | bl activar_timer 88 | 89 | b .End 90 | 91 | 92 | .NotSeeking: 93 | 94 | mov r0, #1 95 | ldr r1, =divfreq_vmin 96 | ldrh r1, [r1] 97 | bl activar_timer 98 | 99 | ldr r2, =REG_TEL 100 | ldrb r3, [r2] 101 | orr r3, #0x20 @; 0b0010 0000 102 | strb r3, [r2] 103 | 104 | .End: 105 | 106 | ldr r3, =ra_actual 107 | ldr r4, [r4] 108 | 109 | @; circ_sub r1 = 1 o bvien r1 = -1 110 | @; depende de giro grueso o fino o r3 120 o 1 111 | @; mul r5, r1, r3 112 | @; add r4, r5 113 | 114 | 115 | 116 | pop {r0 - r5, pc} -------------------------------------------------------------------------------- /Soluciones/36/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Control de telescopio 2 | 3 | 4 | -------------------------------------------------------------------------------- /Soluciones/36/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | #define FREQ_ENT 32728 // frecuencia de entrada mínima (Hz) 6 | 7 | short divfreq_vmax = ¿_a_?; // Divisor freq. Velocidad máx. 8 | short divfreq_vmin = ¿_b_?; // Divisor freq. Velocidad mín. 9 | 10 | short dec_actual = 0, dec_objetivo = 0; // [-9000..9000] centígrados 11 | int ra_actual = 0, ra_objetivo = 0; // [0..86399] segundos 12 | unsigned char seek_ra = 0, seek_dec = 0; // Búsqueda de objetivo 13 | unsigned char track = 0; // Seguimiento de objetivo 14 | 15 | 16 | int main() 17 | { 18 | inicializaciones(); 19 | activar_timer(0, ¿_c_?); // Timer 0 siempre activo 20 | do 21 | { 22 | tareas_independientes(); 23 | if (gestionar_interfaz(&ra_objetivo, &dec_objetivo)) // Activar giros de búsqueda 24 | { 25 | activar_timer(1, divfreq_vmax); seek_ra = 1; track = 0; 26 | activar_timer(2, divfreq_vmax); seek_dec = 1; 27 | } 28 | swiWaitForVBlank(); 29 | actualizar_pantallas(); 30 | } while (1); 31 | return(0); 32 | } -------------------------------------------------------------------------------- /Soluciones/37/.fotos_enunciado_37/37-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/37/.fotos_enunciado_37/37-1.png -------------------------------------------------------------------------------- /Soluciones/37/.fotos_enunciado_37/37-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/37/.fotos_enunciado_37/37-2.png -------------------------------------------------------------------------------- /Soluciones/37/.fotos_enunciado_37/37-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/37/.fotos_enunciado_37/37-3.png -------------------------------------------------------------------------------- /Soluciones/37/.fotos_enunciado_37/37-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/37/.fotos_enunciado_37/37-4.png -------------------------------------------------------------------------------- /Soluciones/37/37.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/37/37.pdf -------------------------------------------------------------------------------- /Soluciones/37/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Aleix Mariné-Tena | 6 | | Fecha de creación | 2022-02-02 | 7 | | Fecha de modificación | 2022-12-07 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/37/.fotos_enunciado_37/37-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/37/.fotos_enunciado_37/37-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/37/.fotos_enunciado_37/37-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/37/.fotos_enunciado_37/37-4.png) 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Soluciones/37/RSI_timer0.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Aleix Mariné-Tena 3 | @; 4 | 5 | @; RSI_timer0 6 | RSI_timer0: 7 | push {r0-r6, lr} 8 | 9 | @; decrementar current bit 10 | ldr r0, =curr_bit 11 | ldrb r1, [r0] 12 | sub r1, #1 13 | @; strb r1, [r0] 14 | 15 | @; Obtener bitcode de letra a transmitir actualmente 16 | ldr r2, =curr_ind 17 | ldrb r3, [r2] 18 | 19 | ldr r6, =transmsg 20 | ldrb r6, [r6, r3] @; indice a nbcode 21 | 22 | ldr r4, =nbcode @; r4 = @nbcode 23 | ldr r5, [r4, r6 lsl #2] 24 | and r5, r5, #0x00 FF FF FF @; r5 = bitcode 25 | 26 | @; poner bit 5 de REG_DATA a ese bit sin modificar el resto de REG_DATA 27 | mov r5, r5 lsr r1 28 | and r5, r5, #0x1 @; r5 = 00000000000X 29 | ldr r4, =REG_DATA 30 | ldrh r6, [r4] 31 | 32 | mov r5, r5 lsl #5 33 | orr r6, r5 34 | strh r4, [r6] 35 | 36 | @; Si curr_bit == 0 entonces siguiente letra 37 | cmp r1, #0 38 | bne .End 39 | 40 | @; curr_bit == 0 41 | ldr r4, =lontr 42 | ldrb r4, [r4] 43 | sub r4, #1 44 | cmp r4, r1 45 | beq .LEndTimer 46 | 47 | @; current bit == 0 pero lontr - 1 != curr_index 48 | add r3, #1 49 | strb r3, [r2] 50 | 51 | ldr r5, [r4, r3 lsl #2] 52 | mov r5, r5, lsr #24 53 | strb r5, [r0] 54 | b .End 55 | 56 | .LEndTimer: 57 | mov r0, #0 58 | bl desactivar_timer 59 | 60 | .End: 61 | pop {r0-r6, pc} -------------------------------------------------------------------------------- /Soluciones/37/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Escritura Morse 2 | 3 | Cálculo de S = ... 4 | 5 | ... = 0b10101000 --> {8} 6 | 7 | 8 tic / 1 s = freq salida 8 | 9 | freq entrada = {2^15, 2^19, 2^23, 2^29} Hz 10 | 0 <= divisor de frecuencia <= 1024 11 | freq salida = 8 tic / 1 s = 8 Hz 12 | 13 | freq salida = freq entrada / divisor --> 14 | divisor = freq entrada / freq salida 15 | 16 | 17 | 2 ^ 3 = 2 ^ 15 / x --> x = 2 ^ 15 / 2 ^ 3 = 2 ^ 12 = 4096 18 | 19 | 20 | Este problema trata sobre controlar un periférico capaz de emitir luz, la cual se utilizará para codificar caracteres 21 | en Morse. 22 | Para ello dispondremos de un registro de E/S que usaremos para controlar si la luz está encendida o no. 23 | 24 | Las palabras seran leídas usando una función que ya viene dada que invoca un teclado virtual para tal fin. 25 | El output de esa función se tendrá que usar en otra función implementada que nos devolverá un array de índices al array 26 | nbcode, el cual contiene los valores de bits (bitcodes) para codificar los caracteres en Morse, así como el número de 27 | bits que tiene ese bitcode. 28 | 29 | Nuestro objetivo es implementar la rutina de la RSI del timer 0 para ir modificando el estado de la luz para codificar 30 | los carácteres en Morse. También tenemos que proveer el cálculo de la frecuencia de entrada y del divisor de frecuencia 31 | tal que se cumpla una cierta medida de tiempo (el carácter S tiene que durar 1 segundo). 32 | -------------------------------------------------------------------------------- /Soluciones/37/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Santiago Romaní Also 3 | // 4 | 5 | #define FREQ_ENT0 33513982 // Posibles frecuencias de entrada de un timer (en Hz) 6 | #define FREQ_ENT1 523656 7 | #define FREQ_ENT2 130914 8 | #define FREQ_ENT3 32728 9 | #define MAX_LON 50 // Longitud máxima del mensaje 10 | 11 | unsigned int nbcode[59]; // Vector códigos (ya inicializado) 12 | char inputstr[MAX_LON+1]; // Mensaje introducido por usuario 13 | unsigned char transmsg[MAX_LON]; // Mensaje transformado 14 | unsigned char lontr = 0; // Longitud mensaje transformado 15 | unsigned char curr_ind = 0, // Índice de letra actual 16 | unsigned char curr_bit; // número de bit actual 17 | 18 | 19 | void main() 20 | { 21 | inicializaciones(); 22 | do 23 | { 24 | leer_mensaje(inputstr, MAX_LON); 25 | while (curr_ind < lontr) // Eperar el final de la reproducción del mensaje anterior (si la hay) 26 | { 27 | swiWaitForVBlank(); 28 | } 29 | lontr = transformar_mensaje(inputstr, transmsg); 30 | if (lontr > 0) 31 | { 32 | curr_ind = 0; 33 | curr_bit = nbcode[transmsg[curr_ind]] >> 24; 34 | 35 | a = FREQ_ENT3; 36 | b = FREQ_ENT3 / 8; // b = 4096 37 | 38 | activar_timer(0, a, b); 39 | } 40 | } while (1); 41 | } -------------------------------------------------------------------------------- /Soluciones/38/.fotos_enunciado_38/38-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/38/.fotos_enunciado_38/38-1.png -------------------------------------------------------------------------------- /Soluciones/38/.fotos_enunciado_38/38-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/38/.fotos_enunciado_38/38-2.png -------------------------------------------------------------------------------- /Soluciones/38/.fotos_enunciado_38/38-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/38/.fotos_enunciado_38/38-3.png -------------------------------------------------------------------------------- /Soluciones/38/.fotos_enunciado_38/38-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/38/.fotos_enunciado_38/38-4.png -------------------------------------------------------------------------------- /Soluciones/38/38.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/38/38.pdf -------------------------------------------------------------------------------- /Soluciones/38/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | Arey Ferrero Ramos | 6 | | Fecha de creación | 2023-01-31 | 7 | | Fecha de modificación | 2023-01-31 | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/38/.fotos_enunciado_38/38-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/38/.fotos_enunciado_38/38-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/38/.fotos_enunciado_38/38-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/38/.fotos_enunciado_38/38-4.png) 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Soluciones/38/RSI_sensor.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos. 3 | @; 4 | 5 | @; RSI del sensor. 6 | RSI_sensor: 7 | push {r0-r5, lr} 8 | 9 | ldr r4, =num_pulses 10 | ldrb r0, [r4] @; Cargamos el número de pulsos. 11 | ldr r5, =REG_TEL 12 | ldrh r1, [r5] @; Cargamos el registro REG_TEL. 13 | 14 | ldr r2, =TIMER0_DATA 15 | ldrh r2, [r2] @; Cargamos el contador de tics. 16 | cmp r2, #0 @; Si el contador de tics es mayor que 16364 se tiene que tratar el dígito (Se tiene que tener en cuenta que se da la vuelta al contador). 17 | blo .Ltratar_digito 18 | ldr r3, =16364 19 | cmp r2, r3 @; Si el contador de tics es mayor que 16364 se tiene que tratar el dígito. 20 | bhi .Ltratar_digito 21 | 22 | add r0, #1 @; Incrementamos el número de pulsos. 23 | mov r1, r1, lsl #1 @; Desplazamos una posición los bits del registro REG_TEL 24 | orr r1, #0x0002 @; y ponemos el penúltimo bit a 1. 25 | b .Lfin_tratar_digito 26 | 27 | .Ltratar_digito: 28 | bl capture_digit 29 | mov r0, #1 @; Reiniciamos el número de pulsos. 30 | mov r1, #0 @; Reiniciamos el registro REG_TEL 31 | ldr r2, =new_digit 32 | strb r0, [r2] @; Ponemos new_digit a 1 porque hay un nuevo dígito. 33 | 34 | .Lfin_tratar_digit: 35 | strb r0, [r4] @; Guardamos el nuevo valor del número de pulsos. 36 | strb r1, [r5] @; Guardamos el nuevo valor del registro REG_TEL. 37 | 38 | pop {r0-r5, pc} -------------------------------------------------------------------------------- /Soluciones/38/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Teléfono Vintage 2 | -------------------------------------------------------------------------------- /Soluciones/38/capture_digit.s: -------------------------------------------------------------------------------- 1 | @; 2 | @; Author: Arey Ferrero Ramos. 3 | @; 4 | 5 | @; Rutina para capturar el dígito. 6 | @; R0 = Número de pulsos. 7 | capture_digit: 8 | push {r1-r3, lr} 9 | 10 | ldr r1, =Ntel 11 | ldr r3, =ind_digit 12 | ldrb r2, [r3] 13 | strb r0, [r1, r2] @; Se almacena el nuevo dígito en el vector que almacena el número de teléfono. 14 | 15 | add r2, #1 16 | strb r2, [r3] @; Se almacena el índice a la siguiente posición del vector. 17 | 18 | pop {r1-r3, pc} 19 | -------------------------------------------------------------------------------- /Soluciones/38/main.c: -------------------------------------------------------------------------------- 1 | // 2 | // Author: Arey Ferrero Ramos. 3 | // 4 | 5 | #define MAX_DIGITS 14 6 | 7 | unsigned char Ntel[MAX_DIGITS]; // Vector para almacenar el número de teléfono. 8 | unsigned char ind_digit = 0; // Índice del dígito actual. 9 | unsigned char new_digit = 0; // Si vale 1 es que hay nuevos dígitos. 10 | unsigned char num_pulses = 0; // Número de pulsos actual. 11 | 12 | void main(void) 13 | { 14 | unsigned char ind_digit_ant = 0; // Índice del dígito anterior. 15 | incializaciones(); 16 | TIMER0_DATA = 0; // Fijar divisor de frecuencia máximo. 17 | 18 | do 19 | { 20 | tareas_independientes(); 21 | if (new_digit) 22 | { // Si se han marcado nuevos dígitos. 23 | swiWaitForVBlank(); 24 | if (ind_digit_ant == 0) 25 | { // Si se trata del primer dígito. 26 | printf("Número tel.: "); 27 | } 28 | while (ind_digit_ant < ind_digit) 29 | { // Visualizar dígitos pendientes. 30 | printf("%d", Ntel[ind_digit_ant]); 31 | ind_digit_ant++; 32 | } 33 | if (num_pulses == 0) 34 | { // Si se ha terminado la marcación de los dígitos. 35 | printf("\n"); 36 | realizar_llamada(Ntel, ind_digit); 37 | ind_digit_ant = 0; 38 | ind_digit = 0; // Reiniciar el proceso de marcación. 39 | } 40 | new_digit = 0; 41 | } 42 | } while(1); 43 | } -------------------------------------------------------------------------------- /Soluciones/39/.fotos_enunciado_39/39-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/39/.fotos_enunciado_39/39-1.png -------------------------------------------------------------------------------- /Soluciones/39/.fotos_enunciado_39/39-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/39/.fotos_enunciado_39/39-2.png -------------------------------------------------------------------------------- /Soluciones/39/.fotos_enunciado_39/39-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/39/.fotos_enunciado_39/39-3.png -------------------------------------------------------------------------------- /Soluciones/39/.fotos_enunciado_39/39-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/39/.fotos_enunciado_39/39-4.png -------------------------------------------------------------------------------- /Soluciones/39/39.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vidwise/Problemas-Computadores/ba6b1dd59bedc6b9b463c5210b928d72a0b83f2a/Soluciones/39/39.pdf -------------------------------------------------------------------------------- /Soluciones/39/README.md: -------------------------------------------------------------------------------- 1 | # Ficha solución 2 | 3 | | Dato | Valor | 4 | | :-------------------: | :---------------------: | 5 | | Autor | - | 6 | | Fecha de creación | - | 7 | | Fecha de modificación | - | 8 | 9 | --- 10 | 11 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/39/.fotos_enunciado_39/39-1.png) 12 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/39/.fotos_enunciado_39/39-2.png) 13 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/39/.fotos_enunciado_39/39-3.png) 14 | ![alt text](https://raw.githubusercontent.com/AleixMT/Problemas-Computadores/master/Soluciones/39/.fotos_enunciado_39/39-4.png) 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Soluciones/39/SOLUTION.md: -------------------------------------------------------------------------------- 1 | # Lanzamiento con electroimanes 2 | --------------------------------------------------------------------------------