Dúvida em aplicação de uma matriz

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida em aplicação de uma matriz

Mensagempor _blackmore_ » 26 Abr 2010 15:45

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?
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor guest2003 » 26 Abr 2010 19:13

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...
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor styg » 27 Abr 2010 21:51

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)
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor MOR_AL » 27 Abr 2010 22:11

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
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Mensagempor _blackmore_ » 28 Abr 2010 01:10

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
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x