Manual

do

Maker

.

com

Desafio maker 02: solução - bit field

Desafio maker 02: solução - bit field

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).

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!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.