Desafio maker 02: solução – bit field

solução | TaskHandle | PORTB | bitwise | bit field | função lambda

No Desafio maker 02 tivemos uma código seguindo os requisitos descritos no artigo. A solução dada eu não havia previsto, mas é excelente e certamente fácil de lembrar e aplicar; mais do que bit field. Vamos começar apresentando a solução encontrada pelo Ricardo Amaral Andrade (nosso revisor, mas também leitor). A solução foi anunciada em nosso grupo Raspberry Pi BR no facebook.

desafio maker 02 - solução

O código apresentado:

int led = 0;
unsigned int i=0;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
    digitalWrite(led, i%2);
    i++; delay(1000);
}

Aqui ele utilizou o módulo (%), que retorna 0 ou 1, que é a diferença da divisão por 2. Quando o valor incrementado for par, o retorno do módulo será 0 e quando o valor incrementado for ímpar, o retorno do módulo será 1 (ex.: 17/2 = 8; sobra 1, que é o módulo). Agora vou apresentar a solução pretendida.

Segunda solução – bit field

Como a do Ricardo foi apresentada primeiro, a minha fica sendo então a segunda solução.

struct {
    unsigned int i:1;
} counter;

void setup(){
    pinMode(13,OUTPUT);
    counter.i = 0;
}

void loop(){
    digitalWrite(13,counter.i);
    counter.i++;
    delay(1000);
}

Qual é mais simples? Obviamente é mais clara a solução do Ricardo Amaral. Mas a segunda solução tem um propósito, que é justamente explicar o que acontece com a variável da struct.

Nossa base numérica é decimal, indo de 0 à 9, portanto 10 dígitos. Quando passamos do número 9, a unidade volta para 0. Esse é o primeiro estouro de base. Na struct temos um unsigned int, que só apresentará valores positivos.  Ao declarar int i:1 definimos apenas 1 bit a ser usado. Mas isso não significa que a variável tem 1 bit; no Arduino o tipo int tem 16 bits – ou, 2 bytes. Tendo definido apenas 1 bit para manipulação, os valores possíveis são o 0 e o 1, sendo 2 o estouro da base binária, portanto retornando ao 0 novamente.

Assim como fez o Ricardo, é importante definir como unsigned int o tipo da variável porque os tipos tem valores negativos e ao estourar uma base ela começará a acumular novamente a partir do valor negativo. Se tivesse usado apenas int, o resultado seria 0 e -1, respectivamente.

Esse recurso se chama “bit field” e só funciona dentro de uma struct, por isso foi necessário declará-la. Depois é só fazer o loop e incrementar ad eternum, seguido pelo delay proposto.

Já escrevi sobre esse recurso no artigo “Programar em C/C++ para microcontoladores PIC e Arduino“, onde discorro sobre outros recursos da linguagem.

Desafio Maker 02 – bit field

Esse desafio é um oferecimento da Usina Info, uma das grandes lojas para comprar seus eletrônicos sem receio, já conhecida por muitos makers.

Espero que estejam gostando da brincadeira, logo mais tem o terceiro desafio!