Variables y Ciclo for:

No siempre debemos esperar a que una condición cambie, sino que también podemos repetir un código la cantidad de veces que necesitemos, antes de conocer el ciclo que nos permite hacerlo, vamos a aprender que es una variable.

Una variable es un espacio dentro de la memoria de nuestro microcontrolador donde podemos almacenar un dato. Dependiendo del dato a almacenar será el tipo de variable, recordemos que al tratarse de información de digital esta se almacena en bytes, con un byte (8 bits), podemos representar los números desde el 0 hasta el 255, o desde el -127 al 127 si necesitamos representar el signo.

Por ahora nos concentraremos en los tipos de variables de 8 y de 16 bits:

Nombre Cantidad de Bits Rango
char 8 -127 a 127
unsigned char 8 0 a 255
int 16 -32767 a 32767
unsigned int 16 0 a 65535

En algunos casos el tipo int, equivale a 32 bits, pero en nuestro caso es a 16.

Para declarar una variable hay que tener en cuenta que valor máximo esta podrá alcanzar, de ahí sabremos qué tipo será el más conveniente, también si es necesario iniciarla en un valor por ejemplo:

char cantidad = 100;

Aquí estamos creando un variable con el nombre “cantidad” y la estamos inicializando con un valor de 100. También la podemos dejar sin inicializar y no habrá inconvenientes en el programa.

Teniendo en cuenta lo anterior veamos un ejemplo de cómo usar una variable y a la vez el ciclo llamado for.

Vamos a continuar con un plano similar al primero, a este nuevo vamos a añadir 7 Leds mas y vamos a hacer el código para un contador que nos muestre los números en binario desde el 0 hasta el 255.

Este será el plano:

Y este el código que usaremos:

#include <xc.h>

#pragma config FOSC = XT        // Oscilador con cristal de cuarzo de 4MHz conectado en los pines 15 y 16
#pragma config WDTE = OFF       // Perro guardian (WDT deshabilidado)
#pragma config MCLRE = ON       // Master clear habilitado (pin reset)

#define _XTAL_FREQ 4000000      // Oscilador a 4MHz

void main(){
    TRISB = 0;                  // Puerto B como salida
    ANSELB = 0;                 // Puerto B como Digital
    PORTB = 0;                  // Inicializa el Puerto B en 0
    
    while(1){                   // Inicio del código a ejecutar constantemente
        for(unsigned char i = 0; i <= 255; i++){
                                // Iniciamos el ciclo for con los tres parametros necesarios
                                // Variable, condición, incremento

            PORTB = i;          // El valor actual en i se le es asignado al Puerto B
            __delay_ms(100);    // se da un retardo de 100 milisegundos
                                // para que se pueda apreciar el cambio
        }
    }
}

Nuevamente aparece el registro ANSEL, en este caso para la B, ya pronto sabremos que significa y porque lo usamos.

Ocupemonos del ciclo for:

for(Variable; Condición; Incremento){
	// Código
}

El ciclo for se repite un número determinado de veces mientras una condición se cumpla, a diferencia del ciclo while, en el for podemos controlar cuantas veces se repite el código que hay entre las llaves.

Para declararlo correctamente necesitamos incluir tres parámetros: una variable, una condición y un cambio en la variable.

La variable que se declara es en la que realizaremos ese cambio por cada iteración del ciclo y realizaremos la evaluación de la condición.

Para nuestro código, estamos declarando una variable char sin signo llamada “i” y la inicializamos en 0, luego hacemos la comparación donde si el valor de esta variable es menor o igual a 255, se ejecute el código entre las llaves. Por cada iteración del ciclo se realiza el cambio en la variable, para este caso hay un incremento con el operador ++, este se encarga de sumar una cifra al valor de la variable, es decir que cada vez que se repite el valor de i va a incrementar en 1, de este modo cuando alcance el valor 256, la condición ya no se va a cumplir y es por esto que el ciclo termina y se reinicia.

En la línea 19, se ve que el valor que toma i se le es asignado al puerto B, es por eso que vemos el valor reflejado en los Leds que tenemos conectados al microcontrolador.

Tenemos un retardo de 100 milisegundos por iteración para que podamos apreciar visualmente el cambio.

Hagamos otro ejemplo con el mismo circuito, donde ya no hagamos un conteo en binario, sino que usando el mismo ciclo for veamos como los Leds encienden en secuencia.

Con solo cambiar la línea 15 con el siguiente código:

for(int i = 1; i <= 128; i*=2){

Tendremos una variable con mayor espacio para almacenar datos, dado que si observamos bien el valor máximo que alcanzara i será de 256, (es un desperdicio de memoria pero funciona para el ejemplo).

Analicemos un poco el cambio en la variable, tenemos i*=2, esta es una forma valida y abreviada de escribir i = i * 2, lo que hace es que al valor existente en i lo multiplica por 2 y el resultado lo almacena de nuevo en i.

Veamos los cambios en la siguiente tabla:

Iteración Valor en i Resultado en Puerto B
0 i = 1 00000001
1 i = 1 * 2 = 2 00000010
2 i = 2 * 2 = 4 00000100
3 i = 4 * 2 = 8 00001000
4 i = 8 * 2 = 16 00010000
5 i = 16 * 2 = 32 00100000
6 i = 32 * 2 = 64 01000000
7 i = 64 * 2 = 128 10000000
8 i = 128 * 2 = 256 No cumple la condición

Si cambiamos el resultado decimal al reflejado en binario, notamos que hay una secuencia.