Control de Flujo en C y Arduino

Análisis de las principales estructuras de control de flujo en lenguaje C y su implementación en Arduino: condicionales, bucles y sentencias de selección múltiple.

Temario
Declaración IF

Si se cumple la condición, se ejecuta la declaración; de lo contrario, la sentencia se omite. Es la estructura condicional más básica en C y Arduino.

if (n >= 3) { expr++; n = expr; }


Declaración IF-ELSE

Similar a la instrucción IF, pero con una sentencia else incondicional adicional. Si la condición es verdadera se ejecuta sentencia1; si es falsa, se ejecuta sentencia2.

if (n == 5) { expr++; } else { n = expr; }
Declaración IF-ELSEIF-ELSE

Mezcla anidada de IF y ELSE IF. Permite evaluar múltiples condiciones en cadena. Si ninguna condición se cumple, se ejecuta el bloque else final.

if (n < 3) expr++; else if (n == 5) n = expr; else n++;
Declaración WHILE

La sentencia while se utiliza comúnmente para crear bucles repetitivos. La condición se evalúa al inicio del bucle. Es habitual emplearla para crear bucles infinitos en Arduino.

while (n < 10) { sum += n; n++; }


Sentencia DO y Sentencia FOR
Sentencia DO

Variante del while donde la condición se evalúa al final del bucle, garantizando al menos una ejecución.

do { sum += n; n--; } while (n > 0);
Sentencia FOR

Al igual que while, ejecuta código de forma iterativa. Combina inicio, condición e incremento en una sola línea.

for (n = 0; n < 10; n++) sum += n;
Sentencia Switch

La sentencia switch es una condicional multivía, resultado de generalizar la instrucción IF-ELSE. Evalúa una variable y ejecuta el bloque correspondiente al caso coincidente.

switch (val) { case 1: a_cnt++; break; case 2: case 3: b_cnt++; break; default: c_cnt++; }
Ejercicio: Mover Datos de Memoria Flash a SRAM

Objetivo: Mover 10 datos de memoria flash y enviarlos a memoria SRAM (dirección 0x0100), usando subrutinas (rcall), punteros y lazos.

Subrutinas

Uso de rcall para llamar a la rutina copiar

Punteros

Puntero X apunta a SRAM 0x0100; puntero Z a la tabla en flash

Lazos

Bucle con dec y brne para iterar 10 veces

Solución: Código Ensamblador
Inicialización y Lazo Principal
.include "m328pdef.inc" .def Aux=R16 .def Dato=R17 .def temp=r18 .org 0x00 rjmp inicio inicio: ldi Aux,10 ldi temp,0 ldi R26,0x00 ldi R27,0x01 salto: rcall copiar dec Aux brne salto lazo: rjmp lazo
Subrutina Copiar y Tabla de Datos
copiar: ldi ZH,high(tabla<<1) ldi ZL,low(tabla<<1) add ZL,temp lpm Dato,Z inc temp st X+,Dato ret ; tabla de datos tabla: .db 255,10,4,127,63,31,15,7,3,1
ARDUINO IDE

Arduino IDE (Integrated Development Environment) es un entorno de desarrollo integrado de código abierto diseñado para programar placas electrónicas basadas en microcontroladores, como las de la familia Arduino. Proporciona una interfaz sencilla que permite escribir, editar, compilar y cargar programas (llamados sketches) en la memoria del microcontrolador mediante una conexión USB. Está basado en los lenguajes C y C++, pero incorpora bibliotecas y funciones simplificadas que facilitan el aprendizaje y el desarrollo de proyectos electrónicos.

El Arduino IDE incluye herramientas para la gestión de bibliotecas, selección de placas y puertos de comunicación, así como un monitor serie que permite visualizar e intercambiar datos entre la computadora y el microcontrolador en tiempo real. Gracias a su facilidad de uso, compatibilidad con múltiples sistemas operativos y amplia comunidad de usuarios, se ha convertido en una de las plataformas más utilizadas en educación, prototipado electrónico, automatización, robótica e Internet de las Cosas (IoT).

La última versión de Arduino IDE se puede descargar en :

www.arduino.cc


Movimiento de datos entre memorias:

Ejercicio: Mover 10 datos de la memoria de programa (Flash) a la memoria RAM de un Arduino Nano.

//Inicio
const byte tabla[10] PROGMEM = {
255, 10, 4, 127, 63, 31, 15, 7, 3, 1
}; // Creación de tabla en FLASH

byte datosRAM[10]; // Cración de tabla en RA;M
//////////////////////////////////////////////////////////////////
void setup() {
// Copiar 10 datos desde Flash hacia RAM
for (byte i = 0; i < 10; i++) {
datosRAM[i] = pgm_read_byte(&tabla[i]);
}

}
//////////////////////////////////////////////
void loop() {
// No se repite nada
}

Resumen: Estructuras de Control de Flujo
IF / IF-ELSE / IF-ELSEIF-ELSE

Condicionales simples y anidadas para tomar decisiones según el valor de una expresión.

WHILE y DO-WHILE

Bucles con condición al inicio o al final. El DO garantiza al menos una ejecución.

FOR

Bucle iterativo con inicio, condición e incremento integrados en una sola expresión.

SWITCH

Condicional multivía que generaliza el IF-ELSE para múltiples casos posibles.

Volver