Página 1 de 1

Dúvida em aplicação de uma matriz

MensagemEnviado: 26 Abr 2010 15:45
por _blackmore_
Amigos foristas, boa tarde.

Estou aprendendo a utilizar o compilador C18 e tomando o livro do Alberto Noburo como referência, e no capítulo 13, tem um exemplo bem interessante de uso de canal AD para leitura de teclas através de um dividor de tensão.
Estou com uma dúvida, que pode parecer esdrúxula para muitos, mas a vontade de entender o funcionamento é maior que o interesse de apenas copiar o exemplo e ver funcionando na protoboard.
Vamos ao fragmento do código:

Código: Selecionar todos
//Matriz
unsigned int range_tensao [13]={ 300,500,700,900 .... };



Código: Selecionar todos
//Atribui valor ao botão e verifica validade dele

unsigned char _checa_tecla(unsigned char desc-tecla_ant)
{
   tecla=0;

   valor_tensao=converte_tensao(); // chama funcao para ler canal

   if (valor_tensao > 300)
      {
         for(cont_t=1; cont_t<13; cont_t++)
          {
              if (valor_tensao>=range_tensao[cont_t-1] && valor_tensao<range_tensao[cont_t])
                 {
                    if (tecla_anterior!=cont_t)
                        tecla=filtro_teclado(cont_t);
                    else
                        tecla=cont_t;
                    break;   
                 }
          }
      }
      if (tecla_anterior==tecla)
         tecla=0;
      else
         tecla_anterior=tecla;

      return nome_tecla (tecla);  //retorna caracter corresp. a tecla pressionada
}


Na variável cont_t ... entendi que ela é incrementada a cada vez que passa pelo for, através da comparação entre valores da matriz [cont_t-1] e [cont_t] e retornando o valor da "posição" que pelo entendipo por mim ao final é o mesmo de cont_t sendo este a tecla pressionada.
No código valor_tensao e filtro_teclado são funções do firm, não achei necessário digitá-las.

Pergunto ... a lógica está certa? ou tem algo errado?

MensagemEnviado: 26 Abr 2010 19:13
por guest2003
Existem N formas de fazer isso... umas mais simples, outras mais complexas...

O software que o cara fez funciona, nao entendi sua pergunta.

Agora ao invez de colocar For / If fazer um monte de coisas pra varrer o array e tals...

Voce pode simplesmente usar direto :) mais simples e rapido.

Imagine que vc tem 8 teclas... distribua os niveis de tensao igualmente ai vc pode ler o AD e considerar apenas os 3 MSB... pronto ja tem a tecla direto.

Tecla = ValorAD >> 5; (mesmo que dividir por 32)

Alguma coisa neste sentido...

MensagemEnviado: 27 Abr 2010 21:51
por styg
black, esses valores da matriz range_tensao, são as faixas de tensao, em mV por exemplo.

a logica ta certa, sim. dentro do loop for o que ele faz é ir comparando o valor lido do ad (valor_tensao: vamos supor 650mV), dai ele varre a matriz com range_tensao para ver em que faixa se encontra o valor_tensao.

na primeira iteração (cont_t=1) ele vai checar se o valor_tensao (650mV)está entre o conteudo da posição 0 (cont_t-1) da matriz range_tensao (300mV) e o conteudo da posição 1 (cont_t) (500mV), nao vai estar.

ai ele vai fazendo isso (varrendo a matriz) até encontrar em que faixa ele está, e daí atribui o valor para a tecla. 8)

MensagemEnviado: 27 Abr 2010 22:11
por MOR_AL
Casualmente o Pask me passou um programa em C e um hardware que faz a mesma coisa. Achei interessante e resolvi alterar um pouco o hardware.
Segue o hardware apresentado. Um detalhe. Para prevenir um curto, caso as chaves superior e inferior sejam fechadas ao mesmo tempo, seria útil incluir um resistor de 4k7 em série com a chave superior. Não tinha como desenhar as chaves mas suas posições no circuito são óbvias.
Imagem
MOR_AL

MensagemEnviado: 28 Abr 2010 01:10
por _blackmore_
guest2003

a minha dúvida é se a lógica descrita por mim é o que o soft deverá realizar, não estou em condições nem de simular nem de montar um prototipo, então entender como funciona era o importante ... capisco?


styg

certo :) poxa .. me expressar as vezes é tão difícil !! mas pelo visto entendi mesmo !! valeus!


MOR_AL

esta forma é semelhante ao que o guest2003 falou ali acima, não?




Pessoal, depois de entender como é esse negocio de usar um AD para vários botões, eu consegui fazer com que funcionasse um firm simples ... apenas ler o valor e em um display mostrar o número ou valor da chave selecionada.
Agradeço a disposição dos colegas que ajudaram em mais esta dúvida minha.

abrax!

Imagem