sexta-feira, 30 de dezembro de 2016

Tecla por nível



No código implementado na atividade 5 do contador binário (botão que controla o incremento),  a ideia é incrementar o contador a partir de ação da tecla ligada ao pino 8 e não pelo tempo

A explicação deste tutorial presume que a chave esteja montada da seguinte forma ligada a um pino com resistor de pull up ativado:




Para isso teríamos, em tese, dentro do looping principal:
  

void loop() { // função que repete infinitamente os passos listados
  escreve_byte (contador);      // escreve o byte na saída
  if (digitalRead(bt_inc)==0) contador++; // incrementa a variável contador em uma unidade
}
  


Em tese, o programa acima funciona, ou seja, a sua lógica está correta.

Porém, na prática este código se torna ineficiente, pois o nosso microcontrolador executa este código em uma velocidade muito alta, e dessa forma ao pressionar a chave ele passa diversas vezes pelo comando de teste da chave (if), o que provoca o resultado de “corrida” do contador (o contador incrementa mais de uma posição).

Para solucionar é necessário após a detecção de chave pressionada aguardar que ela seja solta.

O truque consiste em abrir um looping para deixar preso o programa até que o botão seja solto.

  

void loop() { // função que repete infinitamente os passos listados
  escreve_byte (contador);      // escreve o byte na saída
  if (digitalRead(bt_inc)==0){
    while (digitalRead(bt_inc)==0);
    contador++; // incrementa a variável contador em uma unidade
  }

}  

O comando  while (digitalRead(bt_inc)==0); fica preso em um looping enquanto que a chave estiver pressionada. Enquanto a condição for verdadeira (chave pressionada) o comando while não executa nada ( o “;” no final do comando while garante isso).




  


Nenhum comentário:

Postar um comentário