Electrónica y programación para Microcontroladores.

Cursos técnicos para electrónica programable

Mapa
Estamos en

Urquiza 1695, Entre Ríos, Gualeguaychú

Email
Contactanos

consultas@firteconline.com.ar

Arduino

En la actualidad en casi cualquier publicación de electrónica vamos a encontrar la palabra Arduino y seguramente encontrará muchas personas que dirán “Nunca antes trabajar con microcontroladores fue tan simple”.
Y esto claro es verdad, pero desde el punto de vista electrónico que es en realidad Arduino?
Tomemos como ejemplo Arduino UNO y vemos que todo lo que hace el “Sistema Arduino” es cubrir el ATmega328P con una capa que hace mas simple su uso.
Por debajo de esta capa se encuentra el mismo conjunto de registros, las mismas estructuras básicas de un programa para microcontroladores incluso usa los mismos compiladores como es el caso de GCC.

(En realidad para programar Arduino se necesitan avr-binutils, avr-gcc y avr-libc, todas estas herramientas ya están incluidas en el IDE de Arduino y su funcionamiento es trasparente al programador).

Esta capa o envoltura proporciona un conjunto de funciones por ejemplo digitalWrite(), digitalRead(), delay(), etc, también proporciona una estructura de programa con el clásico void loop() y void setup(). Todo esto se implementa en un conjunto de “includes” archivos que están ocultos en las estructuras de carpetas Arduino.
La estructura es bastante enredada, pero encontrará los principales archivos de inclusión en …/Arduino/hardware/arduino/avr/cores/arduino.

Cuando se compila un sketch, el IDE de Arduino añade algo de código adicional y se incluye el archivo arduino.h, también agrega una función main(). Y el resultado final es que se ha convertido el programa Arduino en un programa “normal” C ++ con una capa de abstracción de hardware que permite al programador trabajar sin tener que lidiar con la electrónica del ATMega328P y así surge la magia de la simpleza Arduino.
Pero claro la magia no es gratis, esta capa de abstracción de hardware son piezas de software que se deben ejecutar, cuando se ejecuta algo tan simple como digitalWrite(0, LOW), lo que ocurre realmente es lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void digitalWrite(uint8_t pin, uint8_t val)
{
    uint8_t timer = digitalPinToTimer(pin);
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    volatile uint8_t *out;
    if (port == NOT_A_PIN) return;
    if (timer != NOT_ON_TIMER) turnOffPWM(timer);
    out = portOutputRegister(port);
    uint8_t oldSREG = SREG;
    cli();
 
    if (val == LOW) {
        *out &= ~bit;
    } else {
        *out |= bit;
    } 
    SREG = oldSREG;
}

Observe la cantidad de líneas y variables necesarias para esa simple acción, claro está que esto ocupa memoria y consume tiempo de CPU para decodificar las líneas lo que significa una merma de velocidad y recursos del ATMega328P.
Pero veamos un ejemplo mas claro, en la siguiente imagen pude ver un programa simple encendiendo y apagando el LED colocado en el pin 13 de la placa Arduino UNO con la clásica programación Arduino.

Observe la cantidad de recursos tomados en este ejemplo y compare con los recursos usados en la siguiente imagen. 

Notará la impresionante diferencia en el uso de los recursos pero claro también se ve que la forma de programar deja de ser la clásica de Arduino y es mas C convencional sin embargo el IDE sigue siendo el mismo ya que como se dijo el IDE es solo la ventana donde escribimos la magia la hacen los compiladores que están por debajo. 
Esta claro que si nos valemos de estos recursos podemos obtener de una placa Arduino un rendimiento muy superior a la obtenida usando la programación clásica de Arduino.