viernes, 3 de abril de 2026

Diseño y Análisis de Algoritmos ( PARTE 1)

Sean todos bienvenidos a este minitutorial sobre Diseño y Análisis de Algoritmos,en Artes Electronicas Pachani, los algoritmos son la piedra fundamental para iniciar en la programación, sea este en algún lenguaje de programación (C, C++, java, etc) o bien para la programación de chips sea PIC, AVR u otros microntroladores o placas de desarrollo, que en lo que se refiere nuestro caso sera nuestro objeto de estudio. Entonces empecemos definiendo conceptos que nos ayudaran para comprender este mundo.


¿Que es Algoritmo?

“Un algoritmo es una serie de pasos organizados que describe el proceso que se debe seguir, para dar solución a un problema específico.”

Un algoritmo es, en su esencia más pura, una secuencia lógica y finita de pasos diseñados para resolver un problema o realizar una tarea específica. 

Aunque hoy los asociamos casi exclusivamente con la informática y el código, los algoritmos han existido desde que el ser humano empezó a sistematizar tareas para obtener resultados predecibles.

¿Qué es realmente?

Para que una serie de instrucciones sea considerada un algoritmo, debe cumplir con tres requisitos fundamentales:

  • Finitud: Debe tener un inicio y un final. No puede ejecutarse eternamente.
  • Precisión: Cada paso debe estar claramente definido, sin ambigüedades. No hay lugar para la "interpretación".
  • Entrada y Salida: Recibe datos (input) y genera un resultado (output) tras procesarlos.

Para comprender de mejor manera la utilidad de los algoritmos podemos tomar el siguiente ejemplo:

Ejemplo Cotidiano

Imagina que quieres enseñarle a alguien a preparar un café. El algoritmo sería:

Inicio.

Hervir agua.

Poner el filtro en la cafetera.

Agregar el café molido.

Verter el agua caliente.

Esperar 3 minutos.

Servir en una taza.

Fin.

Ahora si aplicamos esto a la tecnología (resolver aplicaciones de automatizacion por ejemplo), un algoritmo puede ser desde algo tan simple como la suma de dos números en un microcontrolador, hasta algo tan complejo como el sistema que decide qué vídeo mostrarte a continuación en una red social en nuestros dispositivos.

El Poder Oculto


Hoy en día, los algoritmos no solo "resuelven problemas", sino que moldean la realidad. Aquí es donde nosotros tenemos que realizar una mirada crítica a nuestro estudio:

1. La Ilusión de la Objetividad


Solemos pensar que, al ser matemáticos, los algoritmos son neutrales. Sin embargo, los algoritmos son creados por humanos y entrenados con datos humanos. Si los datos históricos contienen prejuicios (racismo, sexismo, clasismo), el algoritmo los aprenderá y los automatizará, creando lo que se conoce como sesgo algorítmico.

2. El Efecto "Caja Negra"


El concepto de caja negra aplicado a un microcontrolador es una abstracción fundamental en la ingeniería y la enseñanza de sistemas embebidos. Permite concentrarse en el comportamiento funcional del dispositivo sin necesidad de considerar la complejidad interna del silicio, los registros o la arquitectura del procesador.

Bajo este enfoque, el microcontrolador se define exclusivamente por sus interacciones con el entorno:


1. Entradas (Inputs)
Son los estímulos o datos que el sistema recibe del mundo exterior. En el modelo de caja negra, no nos importa cómo se digitalizan internamente, sino qué representan:
  • Señales analógicas: Voltajes de sensores (temperatura, luz).
  • Señales digitales: Pulsadores, interruptores o niveles lógicos.
  • Protocolos de comunicación: Datos entrantes vía UART, I2C o SPI.
2. Salidas (Outputs)
Es la respuesta del microcontrolador tras procesar la información. Representan la acción física o la transferencia de datos:
  • Actuadores: Motores, relés o servomotores.
  • Interfaz visual: LEDs, pantallas LCD o paneles de matriz de puntos.
  • Señales de control: PWM para variar potencia o señales de reloj.
3. La Función de Transferencia (El Proceso)
Aunque el interior es "invisible", la caja negra opera bajo una lógica predefinida (el firmware). La relación se puede resumir así:
Salida = f(Entrada, Estado,Anterior)
En este modelo, el programador se enfoca en que, ante la combinación A de entradas, el sistema siempre debe producir la respuesta B.

¿Por qué es útil este enfoque?

Modularidad: Permite diseñar sistemas complejos dividiéndolos en bloques. Puedes diseñar la etapa de potencia de un motor asumiendo que el microcontrolador es una caja que entrega una señal PWM estable.

Simplificación Pedagógica: Es ideal para introducir a estudiantes en la programación lógica antes de profundizar en temas complejos como el manejo de bancos de memoria, el stack o los vectores de interrupción.

Pruebas (Black Box Testing): Se centra en verificar que el sistema cumpla con los requisitos funcionales. Si presionas el botón de "encendido", la salida debe activarse, independientemente de si el código está escrito en Assembly o en C.


Ejemplo Práctico: Control de Iluminación
Si tratamos un sistema de control de luces como caja negra:
  1. Input:  Nivel de luz ambiental (sensor LDR).
  2. Caja Negra: Lógica que decide si el nivel es inferior a un umbral X.
  3. Output: Activación de un panel LED.

Desde fuera, no importa si dentro hay un PIC, un ATmega o un procesador ARM; lo que importa es que la luz se encienda cuando oscurece.

3. La Economía de la Atención y la Polarización


Empecemos por entender que en nuestro día a día tenemos a nuestro alrededor por ejemplo algoritmos de recomendación están diseñados para maximizar el tiempo que pasas en una plataforma. Para lograrlo, suelen mostrarte contenido que refuerza tus creencias previas (cámaras de eco), eliminando el matiz y fomentando la polarización social. Lo que empezó como una herramienta de eficiencia se ha convertido en un motor de moldeo conductual.

Ya en nuestro caso de estudio optimizar un microcontrolador es, en esencia, el arte de meter un océano en un vaso de agua. A diferencia de una computadora convencional donde los recursos suelen sobrar, en un sistema embebido cada byte de memoria y cada ciclo de reloj tienen un costo directo en rendimiento o energía.

De ahi que la optimización no es un proceso único, sino un juego de equilibrios entre tres pilares que suelen entrar en conflicto.

1. El Triángulo de Compromiso (Trade-offs)
Para ganar en un área, generalmente hay que ceder en otra:
  1. Velocidad vs. Espacio: Si quieres que un código corra más rápido, puedes usar una tabla de búsqueda (Lookup Table) en lugar de calcular una fórmula. Ganas velocidad, pero pierdes memoria Flash.
  2. Velocidad vs. Consumo: Un procesador que corre a máxima frecuencia termina las tareas rápido, pero consume más corriente por segundo (mA).
2. Optimización de Ejecución (Velocidad)

El objetivo es que el microcontrolador pase el menor tiempo posible procesando una tarea.
  • Aritmética de Punto Fijo: Los microcontroladores pequeños (como los de 8 bits) sufren procesando números decimales (float). Es mucho más eficiente multiplicar por 100 y trabajar con enteros, reservando la coma decimal solo para el final.
  • Uso de Interrupciones: En lugar de que la CPU esté preguntando constantemente si un botón se presionó (polling), se usa una interrupción. Esto permite que el procesador haga otras cosas o descanse mientras no ocurre el evento.
  • Variables Globales vs. Locales: En arquitecturas de registros limitados, el uso excesivo de variables locales puede saturar el stack. Usar variables globales bien gestionadas a veces ahorra ciclos de carga y descarga de memoria.

3. Optimización de Espacio (Memoria)
Fundamental cuando el código empieza a rozar el límite de la capacidad del chip.
  • Tipos de Datos Mínimos: No uses un int (16 o 32 bits) para una variable que nunca pasará de 100. Un uint8_t (8 bits) ocupa la mitad o una cuarta parte del espacio.
  • Evitar Funciones Pesadas: Las librerías estándar como stdio.h (específicamente printf) son enormes. En sistemas embebidos, es preferible escribir funciones de envío de texto personalizadas y ligeras.
  • Reutilización de Código: Identificar bloques de código idénticos y convertirlos en funciones, aunque esto añada un pequeño retraso por el salto en el flujo del programa.

4. Optimización de Energía (Consumo)
Es la prioridad número uno en dispositivos que funcionan con baterías.

Modos de Sueño (Sleep): El microcontrolador debe estar "dormido" el 99% del tiempo. Solo debe despertar por un evento externo, hacer su trabajo en milisegundos y volver a dormir.

Gestión de Periféricos: Si no estás usando el convertidor Analógico-Digital (ADC) o la comunicación UART en un momento dado, apágalos. Cada módulo encendido suma microamperios al consumo total.

4. La Automatización del Pensamiento

Algo cotidian que podemos observar en nuestro dia a dia es delegar decisiones pequeñas (qué ruta tomar en GPS) o grandes (qué estudiar) a los algoritmos puede atrofiar nuestra capacidad crítica y de resolución de problemas. La eficiencia es una virtud, pero la dependencia absoluta puede convertirnos en meros ejecutores de instrucciones externas.

Dicho de otro modo la automatización del pensamiento es el proceso mediante el cual una secuencia de razonamientos o acciones complejas deja de requerir atención consciente para ejecutarse de manera fluida y casi instantánea. En términos de sistemas, es el paso de ejecutar código en "modo de depuración" (paso a paso) a grabarlo en la memoria Flash como un proceso de ejecución rápida.

Este fenómeno se puede desglosar en niveles de integración y eficiencia:

1. La Transición de Competencia
Para que un pensamiento se automatice, debe atravesar un ciclo de aprendizaje que transforma la carga cognitiva.

Incompetencia Consciente: El sistema reconoce que no tiene el "algoritmo" necesario. El procesamiento es lento y propenso a errores.

Competencia Consciente: Se ha desarrollado el código, pero requiere de toda la capacidad de la "CPU" (atención total) para ejecutarse. Un error de distracción detiene el proceso.

Competencia Inconsciente (Automatización): El pensamiento se ha convertido en una subrutina que corre en segundo plano. Ya no consume recursos de la memoria de trabajo.


2. Heurísticas: El "Firmware" del Juicio
Las heurísticas son atajos mentales que automatizan la toma de decisiones. Funcionan como una caja negra: recibes un estímulo y entregas una respuesta sin analizar conscientemente todas las variables.

Reconocimiento de Patrones: Un experto no "analiza" una situación desde cero; su cerebro hace un match con una base de datos de experiencias previas.

Sistema 1 vs. Sistema 2: Según el psicólogo Daniel Kahneman, el Sistema 1 es el pensamiento automatizado (rápido, emocional, intuitivo), mientras que el Sistema 2 es el procesamiento analítico y lento.

3. Automatización mediante Estructuras Externas
Hoy en día, la automatización del pensamiento no solo ocurre dentro del cerebro, sino mediante la descarga cognitiva hacia herramientas externas:
  • Algoritmos de Asistencia: Delegar el cálculo o la organización de datos a software permite que el pensamiento humano se enfoque en la arquitectura de alto nivel en lugar de en la aritmética básica.
  • Sistemas de Organización (Zettelkasten o Second Brain): Crear una red de notas vinculadas permite que el pensamiento "recuerde" y "conecte" ideas de forma automática a través de la infraestructura digital.
4. Riesgos de la Automatización: El "Hardcoding" Mental
Así como un error en el firmware de un microcontrolador puede causar fallos críticos, la automatización del pensamiento tiene sus peligros:

Sesgos Cognitivos: Son errores lógicos que se han automatizado. Por ejemplo, el "sesgo de disponibilidad" nos hace creer que lo más reciente es lo más importante, simplemente porque es más fácil de "leer" en la memoria RAM.

Rigidez Mental: Cuando un proceso se automatiza demasiado, perdemos la capacidad de cuestionar su validez si las condiciones externas cambian. Es como intentar correr un programa diseñado para un PIC16F84 en un procesador moderno de 64 bits; la lógica ya no es compatible.



Reflexión Final

El uso de algoritmos en ensamblador es un ejercicio de ingeniería de precisión. Aunque la tendencia moderna se inclina hacia el uso de C o C++ por su rapidez de desarrollo, el dominio del algoritmo en el nivel más bajo sigue siendo la base para crear sistemas embebidos de alta eficiencia.

Hoy en día, la conclusión más equilibrada es que el algoritmo debe ser concebido de forma universal, pero su implementación en ensamblador debe ser reservada para aquellos módulos críticos donde el rendimiento máximo y el consumo mínimo de energía son las prioridades absolutas del proyecto.


Conclusión

Espero les aya sido de gran ayuda todo lo expuesto aqui que tiene por objetivo ser una referencia cuando realicemos los proyectos, sin mas me despido hasta el próximo tutorial ya que iré actualizando este hilo de modo que agregare mas información de mas componentes y su próxima utilización con nuestros proyectos.

Bibliografia
1.- Apuntes de Microprocesadores I ; Facultad de Tecnologia; dictado por el Licenciado Marques ;[Fecha cursada año 2013 en semestres seguidos].
2.-Manual del taller: INTRODUCCIÓN AL MICROCONTROLADOR PIC18F4550; M.C. Jesús Medina Cervantes; se encuentra libre bajo licencia http://creativecommons.org/licenses/by-nc-nd/2.5/mx/ [Fecha consultada 23 de febrero 2017] .
3.-Apuntes de electrónica I y II Facultad de Tecnologia; dictado por el Licenciado Marques ;[Fecha cursada año 2014 en semestres seguidos].
4.- IA Geminis, de google

No hay comentarios.:

Publicar un comentario

Hola, con tu comentario puedes aportar para mejorar la calidad de mi trabajo

Microcontroladores AVR (Microchip) – Programando en ASM (PART002)

Hola nuevamente a  Artes Electrónicas Pachani ,  acá iré explicando mis experiencias con el microcontrolador  Atmega   en el entorno AVR Stu...