0% encontró este documento útil (0 votos)
31 vistas16 páginas

Introducción a Sistemas Embebidos en C

La práctica se centra en la introducción a los sistemas embebidos y la programación en C, utilizando microcontroladores como el ESP32 y Arduino Mega 2560. Los estudiantes aprenderán sobre la arquitectura de hardware, manipulación de bits, y desarrollo de programas modulares para controlar LEDs. Se enfatiza el uso de buenas prácticas de programación y la optimización del código en entornos de recursos limitados.

Cargado por

Luis Lliguipuma
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
31 vistas16 páginas

Introducción a Sistemas Embebidos en C

La práctica se centra en la introducción a los sistemas embebidos y la programación en C, utilizando microcontroladores como el ESP32 y Arduino Mega 2560. Los estudiantes aprenderán sobre la arquitectura de hardware, manipulación de bits, y desarrollo de programas modulares para controlar LEDs. Se enfatiza el uso de buenas prácticas de programación y la optimización del código en entornos de recursos limitados.

Cargado por

Luis Lliguipuma
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Práctica No.

1 – Introducción a los Sistemas Embebidos


y Programación en C
Universidad ECOTEC – Ingeniería en Mecatrónica
2025

Objetivo General
Familiarizar al estudiante con los conceptos fundamentales de los sistemas embebidos,
mediante el uso de microcontroladores, la programación en C y la comprensión de la arqui-
tectura de hardware a bajo nivel.

Objetivos Específicos
Describir la arquitectura y funciones principales del ESP32 y Arduino Mega 2560.

Identificar los roles de los pines GPIO y su configuración mediante registros.

Aplicar operadores de bits en ejemplos reales de control embebido.

Relacionar el código de alto nivel en C con instrucciones a nivel de ensamblador.

Desarrollar un programa funcional para el control de LEDs mediante máscaras

binarias. Aplicar funciones en C para estructurar programas embebidos de forma

modular.

1. Introducción a Sistemas Embebidos


Un sistema embebido es un sistema electrónico diseñado para realizar tareas específicas.
Incorpora un microcontrolador, memoria y periféricos. Se encuentra comúnmente en electro-
domésticos, sistemas de automatización industrial, automóviles y dispositivos IoT.

1
1.1. Comparación de Plataformas
Característica ESP32 DevKit Arduino Mega 2560
Arquitectura Xtensa LX6 (dual core) AVR de 8 bits
Frecuencia 240 MHz 16 MHz
GPIOs 34 54
Memoria RAM 520 KB 8 KB
Voltaje de operación 3.3 V 5V
Interfaces WiFi, BT, ADC, DAC, SPI, UART UART, SPI, I2C, PWM

2. Introducción al Lenguaje C en el Arduino IDE


El lenguaje C es uno de los más utilizados en la programación de sistemas embebidos por
su cercanía al hardware y eficiencia. El entorno Arduino IDE facilita su uso mediante una
estructura simple y funciones predefinidas que permiten interactuar con pines y periféricos.

2.1. Estructura General de un Programa


Todo programa en Arduino se divide en dos partes principales:

setup(): función que se ejecuta una sola vez al iniciar el programa. Se usa para inicia-
lizar variables, configurar pines y periféricos.

loop(): función que se ejecuta en bucle continuo. Aquí se escribe el comportamiento


principal del sistema.

1 void setup () {
2 // Codigo de configuracion
3
}
4
void loop () {
5
// Codigo que se ejecuta repetidamente
6
}
7

2.2. Sentencias Básicas en C


A continuación, se detallan algunas construcciones esenciales:

Declaración de variables:
1 int temperatura ;
2 float voltaje = 3.3;

Condicionales:

2
1 if ( temperatura > 30) {
2 digitalWrite ( ledPin , HIGH );
3
} else {
digitalWrite ( ledPin , LOW );
4
}
5

Bucles:
1 for ( int i = 0; i < 10; i++) {
2
Serial. println (i);
3
}
4
while ( digitalRead ( boton ) == LOW ) {
5
// Espera hasta que se presione el boton
6 }
7

Funciones:
1 int sumar( int a, int b) {
2
return a + b;
3
}

2.3. Buenas Prácticas de Programación


Usar nombres descriptivos para variables y funciones.

Documentar el código con comentarios claros.

Utilizar constantes con const o #define para facilitar cambios.


Modularizar el código en funciones reutilizables.

Evitar el uso innecesario de retardos (delay()) para no bloquear la ejecución.

2.4. Ejemplo Comentado: Parpadeo de LED

1 // Encender y apagar un LED cada segundo


2

3
const int LED_PIN = 13;
4
void setup () {
5
pin Mode ( LED_PIN , OUTPUT ); // Configura el pin como salida
6 }
7

8 void loop () {
digitalWrite ( LED_PIN , HIGH ); // 3Enciende el LED
9

10

4
11 delay (1000); // Espera 1 segundo
12 digitalWrite ( LED_PIN , LOW );// Apaga el LED
13
delay (1000); // Espera 1 segundo
}
14

Este programa es la base de muchas pruebas iniciales. Permite verificar que el microcon-
trolador está correctamente programado y que los pines funcionan como salidas digitales.

3. Tipos de Datos y Constantes en C


En sistemas embebidos, elegir correctamente el tipo de dato es esencial para optimizar el
uso de memoria y asegurar el comportamiento correcto del programa.

3.1. Tipos de Datos Primitivos


Tipo Tamaño Rango Aproximado
int 2 o 4 bytes -32,768 a 32,767 / -2G a 2G
unsigned int 2 o 4 bytes 0 a 65,535 / 0 a 4G
char 1 byte -128 a 127
unsigned char / uint8_t 1 byte 0 a 255
float 4 bytes ±3.4×1038
bool 1 byte true / false

Ejemplo:
1 int temperatura = 25;
2
float voltaje = 3.30;
3
char letra = ’A’;
bool activo = true ;
4

3.2. Uso de Constantes


const: define una variable constante con tipo de dato.
#define: define un valor simbólico sin ocupar memoria RAM.

1 const int led Pin = 13; // Constante de tipo entero


2 # define TIEMPO_ESPERA 1000 // Constante preprocesada

Recomendación: Usa const para variables con tipo; #define para valores estáticos
globales o configuraciones.

4. Manipulación de Bits
La manipulación de bits permite controlar directamente el hardware, lo cual es funda-
5
mental en sistemas embebidos.

6
4.1. Operadores de Bits
Operador Descripción
& AND bit a bit
| OR bit a bit
ˆ XOR bit a bit
˜ Complemento (NOT)
< Desplazamiento a la izquierda
> Desplazamiento a la derecha

4.2. Ejemplos de Uso


1 uint8_t estado = 0 b 00000101 ;
2

3
estado |= (1 << 2); // Encender el bit 2
estado &= ~(1 << 0); // Apagar el bit 0
4

5
bool bit1 = ( estado & (1 << 1)) != 0; // Leer el bit 1
6

4.3. Caso Práctico: Encender LEDs con Máscara


Supón que tienes 3 LEDs conectados a los pines 16, 17 y 18 del ESP32. Puedes encenderlos
con una máscara binaria:
1 uint8_t mascara = 0 b 00000101 ;
2

3
digitalWrite (16 , ( mascara & (1 << 0)) ? HIGH : LOW ); // LED1
digitalWrite (17 , ( mascara & (1 << 1)) ? HIGH : LOW ); // LED2
4
digitalWrite (18 , ( mascara & (1 << 2)) ? HIGH : LOW ); //
5
LED3

4.4. Optimización con Registro Directo (AVR)


En el Arduino Mega (ATmega2560), es posible escribir directamente sobre registros de
puerto:
1 DDRB |= (1 << DDB5 ); // Configura pin 13 como salida
2 PORTB |= (1 << PORTB5 ); // Enciende el pin 13
3
PORTB &= ~(1 << PORTB5 ); // Apaga el pin 13

Esto se traduce a lenguaje ensamblador de manera muy eficiente, usando instrucciones


como:
sbi DDRB, 5
sbi PORTB, 5
cbi PORTB, 5

7
Este tipo de control es especialmente útil cuando se necesita velocidad y precisión tem-
poral, como en protocolos de comunicación o control de motores.

8
5. Funciones en C para Sistemas Embebidos
En C, una función permite encapsular un conjunto de instrucciones que realizan una tarea
específica. El uso de funciones en sistemas embebidos mejora la legibilidad, la
mantenibilidad y la reutilización del código.

5.1. Sintaxis de una Función

1 tipo_retorno nombre_funcion ( tipo_parametro arg1 , ...) {


2 // Cuerpo de la funcion
3
return valor; // si el tipo de retorno no es void
}
4

Ejemplo básico:
1 int sumar( int a, int b) {
2
return a + b;
3
}

5.2. Paso de Parámetros


Los parámetros se pasan por valor, lo que significa que la función trabaja sobre copias de
los datos originales.

5.3. Funciones tipo void


Cuando no se necesita devolver un valor, se usa el tipo void:
1 void encenderLED ( int pin ) {
2 digitalWrite ( pin , HIGH );
3
}

5.4. Prototipos de Función


Es recomendable declarar las funciones antes de usarlas si su definición aparece después
del setup() o loop():
1 void configurarLEDs ();
2 void actualizarLEDs( uint8_t estado );

5.5. Ejemplo: Control Modular de 3 LEDs

1 # define LED1 16
2 # define LED2 17
# define LED3 18
9
3

10
5 void configurarLEDs ();
6 void actualizarLEDs( uint8_t estado );
7
void escribirLED ( uint8_t pin , uint8_t encendido );
8
void setup () {
9
configurarLEDs ();
10 }
11

12 void loop () {
13
for ( uint8_t i = 0; i < 3; i++) {
14
actualizarLEDs (1 << i); // Enciende uno por uno
delay (500);
15
}
16
}
17

18 void configurarLEDs () {
19 pin Mode ( LED1 , OUTPUT );
20
pin Mode ( LED2 , OUTPUT );
pin Mode ( LED3 , OUTPUT );
21
}
22

23
void actualizarLEDs( uint8_t estado ) {
24 escribirLED ( LED1 , estado & (1 << 0));
25 escribirLED ( LED2 , estado & (1 << 1));
26 escribirLED ( LED3 , estado & (1 << 2));
27
}
28
void escribirLED ( uint8_t pin , uint8_t encendido ) {
29
digitalWrite ( pin , encendido ? HIGH : LOW );
30 }
31

32

33

34

5.6. Modularización y Ventajas


Claridad: cada bloque de código realiza una sola tarea.
Reutilización: una función puede ser llamada desde diferentes partes.
Mantenimiento: los cambios se realizan en un único lugar.

5.7. Traducción a Nivel Bajo (Ensamblador)


Cuando se llama una función, el compilador traduce esa operación a instrucciones como:

CALL actualizarLEDs
11
...
RET
Internamente se realiza lo siguiente:

12
Copia de parámetros al stack.

Salto a la dirección de memoria de la función.

Al finalizar, ejecución de RET para regresar a la instrucción siguiente al llamado.

Este comportamiento debe considerarse especialmente cuando se programan microcon-


troladores con recursos limitados o sin sistema operativo.

6. Actividad Práctica: Control de LEDs con Manipula-


ción de Bits
6.1. Objetivo de la Actividad
Aplicar los conocimientos de manipulación de bits, estructura modular en C y uso de
funciones para encender y apagar LEDs conectados al microcontrolador (ESP32 o Arduino
Mega).

6.2. Materiales Requeridos


1 microcontrolador ESP32 DevKit o Arduino Mega 2560.

3 LEDs rojos.

3 resistencias de 220 Ω.

Protoboard y cables de conexión.

6.3. Conexión de Hardware


LED1 conectado a GPIO 16.

LED2 conectado a GPIO 17.

LED3 conectado a GPIO 18.

El cátodo de cada LED va a GND a través de una resistencia de 220 Ω.

Nota: Si se usa Arduino Mega, se pueden usar los pines digitales 8, 9 y 10 como equiva-
lentes.

13
6.4. Código de Base
Este programa enciende los LEDs según una máscara de bits definida:
1 # define LED1 16
2 # define LED2 17
3
# define LED3 18
4
void setup () {
5
pin Mode ( LED1 , OUTPUT );
6 pin Mode ( LED2 , OUTPUT );
7 pin Mode ( LED3 , OUTPUT );
8 }
9

10
void loop () {
uint8_t mascara = 0 b 00000101 ; // LED1 y LED3
11
encendidos
12

13

14 digitalWrite ( LED1 , ( mascara & (1 << 0)) ? HIGH : LOW );


15 digitalWrite ( LED2 , ( mascara & (1 << 1)) ? HIGH : LOW );
16 digitalWrite
delay (1000); ( LED3 , ( mascara & (1 << 2)) ? HIGH : LOW );
17
}
18

19

6.5. Reto de Programación


Implementa una secuencia animada en la que cada LED se encienda uno por uno utili-
zando desplazamientos de bits, de izquierda a derecha y luego de derecha a izquierda (efecto
ping-pong). Evita repetir código, usa funciones auxiliares.
Pistas:

Usa una variable tipo uint8_t como máscara.

Aplica operadores << y >> para desplazar bits.


Implementa un retardo entre cada cambio.

7. Preguntas de Reflexión
1. ¿Qué ventaja ofrece la manipulación directa de bits frente a funciones de más alto nivel
como digitalWrite()?

2. ¿Qué diferencia existe entre const y #define? ¿Cuál conviene usar y cuándo?

3. ¿Cómo se traduce un llamado a función en términos de memoria y ejecución en un


microcontrolador?
14
4. ¿Qué sucede si el stack del microcontrolador se llena por llamadas recursivas?

15
5. Investiga: ¿Cómo accede el ESP32 a los registros de GPIO? ¿Qué diferencias existen
frente a un AVR?

Bibliografía y Lecturas Sugeridas


Espressif Systems. ESP32 Technical Reference Manual. Disponible en: [Link]
[Link]

Microchip. ATmega2560 Datasheet. Disponible en: [Link]

Elliot Williams. Make: AVR Programming: Learning to Write Software for Hardware.
Maker Media.

Jonathan Valvano. Embedded Systems: Introduction to ARM Cortex-M Microcontro-


llers.

Bryan Mealy, Fabrizio Tappero. Embedded Systems: Introduction to the MSP432 Mi-
crocontroller.

16

También podría gustarte