quarta-feira, 17 de agosto de 2016

Tecla por nível

No código implementado na atividade "contador binário incrementado pela ação de um botão" a ideia é incrementar o contador a partir de ação da tecla B0.

A explicação deste tutorial presume que a chave esteja montada da seguinte forma:




Para isso teríamos, em tese, dentro do looping principal:
//**************************************************************
while (1){
LATD = contador; // coloca na porta D o conteúdo da variável contador
     if (PORTBbits.RB0 == 0) { // detecta o pressionamento da chave em B0
contador++; // incrementa o contador de a chave estiver pressionada
     }
}
//**************************************************************

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.

//**************************************************************
while (1){
     LATD = contador; // coloca na porta D o conteúdo da variável contador
     if (PORTBbits.RB0 == 0) { // detecta o pressionamento da chave em B0
     while (PORTBbits.RB0 == 0);
     contador++; // incrementa o contador de a chave estiver pressionada
     }
}
//**************************************************************

O comando while (PORTBbits.RB0 == 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)

Nenhum comentário:

Postar um comentário