Página 1 de 1

Ler 2 Botões ao mesmo tempo e 4 rotinas diferentes...

MensagemEnviado: 02 Set 2008 12:51
por nagkiller
Gostaria de saber se é possivel fazer o seguinte:

Tenho dois Botoes(RA0 e RA1) e gostaria que eles fizessem 4 jumps diferentes...

RA0 = 1 = Vai pra Funcao1
RA1 = 1 = Vai pra Funcao2
RA0 e RA1 = 0 = Vai pra Funcao3
RA0 e RA1 = 1 = Vai pra Funcao4

Para ler o PORTA estou utilizando o seguinte codigo:


MOVF PORTA,W
MOVWF BOTOES

Vlw...

MensagemEnviado: 02 Set 2008 13:06
por ze
sim. é possível

MensagemEnviado: 02 Set 2008 13:10
por nagkiller
Como eu faço?!?!?

Estou utilizando Assembler

MensagemEnviado: 02 Set 2008 13:14
por styg
se for com int tu pode colocar uma int p cada botao, e no tratamento da int checar se a outra tecla tb esta apertada) e dai agir de acordo.

sem int, é mais simples ainda

MensagemEnviado: 03 Set 2008 14:10
por Djalma Toledo Rodrigues
Parabéns por estar programando em Assembler

Transforme em número

A = 0 ou 1
B = 0 ou 1

Então a leitura disso vai se transformar em 4 números
00 / 01 / 10 / 11, B ou Hex ______ou 0 / 1 / 2 / 3 , Dec.



:idea: Como o PIC não possui instrução de comparação entra na
função e verifica se é com ela memo. Assim:

----------------------------
Função1:
Movf Botões,1; para testar se zero
Btfss Status,Z; É zero? Pula próxima e executa Função 1
Goto Função2; Não é comigo diz a função1, vou passar para a seguinte, rsrsrs
....
End; função1
-----------------------------
Função2
Movlw 01H
Subwf Botões,0
Btfss Status,Z; É hum ? Pula próxima e executa Função 2
Goto Função3; Não é comigo diz a função2 , vou fazer como fez a 1,rsrsrs
....
End; função2
--------------------------------

A 3ª semelhante a Função2

A Função4 não precisa testar


Outra possibilidade seria fazer endereçamento indireto.


Abraço e boa função

MensagemEnviado: 03 Set 2008 14:45
por RobL
Desta forma não funciona.
Pois não considera um probleminha humano. As duas teclas não serão pressionadas em um ciclo (tempo de leitura da porta). Poderá pegar uma ou duas teclas.
Terá que acrescer um retardo após algo existir na porta.
Somente após este retardo verificar o que se tem. Note não estou falando de debounce.
Então:
Pegue a porta e por uma operação XOR com a porta anterior, veja se algo mudou.
Se sim, dispare um retardo "humano" (tempo para uma pessoa poder pressionar duas teclas).
Verifique se houve alteração com a última tomada da porta.
Dê mais um tempo e verifique se a porta não foi alterada, aqui sim tipo um debounce (em tempo).
E aí vai para a seleção das funções.

MensagemEnviado: 06 Set 2008 16:15
por Djalma Toledo Rodrigues
RobL
Eu não cogitei isso, passou despercebido.

A propósito a melhor solução para evitar o Debounce (palavra horrorosa) é o Flip Flop R/S, por ser quase instantâneo , mas exige que a tecla possua dois contatos, como o micro-switch, um para R e outro para S, poderia ser implementado no uC, caso exista uma única tecla , da seguinte maneira:
Clear porta
Ao ocorrer interrupção externa, borda de descida
Desabilita Interrupção externa
Muda o pino para saida, ficará então em nível baixo; acabou o Debounce
Processa a informação
Retorna esse pino como entrada.
etc.
---------------------------------------------------------------------
Para mais de uma tecla:
Todos contatos interligados ao pino de interrupção externa do uC
Faz a varredura das teclas com velocidade reduzida, Vv << VuC e de modo que haja um intervalo de tempo entre linhas. Assim:
Linha0 ¨¨¨¨|__|¨¨¨¨
Linha1 ¨¨¨¨¨¨¨¨|__|¨¨¨¨
Ao ocorrer interrupção borda de descida
Desabilita Interrupção externa
Pára a varredura
A linha de varredura em nível baixo identifica qual tecla foi pressionada.

Não é ? Depois vou experimentar.

MensagemEnviado: 06 Set 2008 17:36
por Maurício
Debounce, em hardaware, uma das soluções é filtragem e schmitt-trigger.

Em software, faz varredura a cada 100, 200ms e pronto!

Pra que simplificar, se a gente podemos complicar, né não?

[]'s

MensagemEnviado: 06 Set 2008 18:19
por Djalma Toledo Rodrigues
é o Flip Flop R/S, por ser quase instantâneo


100ms, 200ms pode as vezes ser uma eternidade, um uC a 80Mhz em 100ms daria para executar 8 000 000 de instruções, imagine um Pentium de 3.6 GHz.

MensagemEnviado: 07 Set 2008 16:07
por Maurício
Pois, é!

Seria uma eternidade se a CPU ficasse bebendo e fumando entre os intervalos, mas, como ela é casta, não bebe e não fuma, a técnica usada pode ser através de sinalização de flags, ou então, por meio de interrupçòes. O que não causa a paralisação da máquina.

Técnica esta, que é exatamente a mesma do funcionamento do teclado dos PCs. Até tem na BIOS, um campo lá pra vc configurar a taxa de repetição! A não ser que os caras colocaram isso, só pra ocupar espaço da ROM. Vai saber!?!?! :lol: :lol:

[]'s

MensagemEnviado: 06 Ago 2009 09:51
por nagkiller
Grato a todos!!!

Estou sem tempo agora pra testar...

Estou ganhando experiencia em PIC/Freescale em C...

Vlw...

MensagemEnviado: 06 Ago 2009 10:06
por fabim
estranho como ninguém levou em consideração o estado off.
rs
Se tem 2 bits.
00
01
10
11
Qual vai ser o of state ? Porque se simplesmente você for testar o peso binario, tu vai ficar travado e executando constantemente o estado off..rsrs
Da uma pesquisada na net, que tem uma manha de você testar 3state usando um resistor e um capacitor, e uma máquina de estados simples.
Aí sim, pode-se dizer que 2 pinos vão te levar a no minimo 4 niveis lógicos para seleção de botões.
Deixando o HZ das portas como estado off.

Abraços

Fabim

MensagemEnviado: 06 Ago 2009 17:43
por ze
o mais estranho: não esperou chegar setembro pra agradecer e completar uma volta em torno do sol. provavelmente vai pedir ajuda pra outra questão a qquer momento. rs .me lembre de responder daqui a 1 ano. mas só se for algo de pisca led. rs
abç

MensagemEnviado: 06 Ago 2009 23:28
por msamsoniuk
bom, vc pode encodificar os 5 estados logicos (4 ativados e um desativado) utilizando um unico pino que tenha ADC e divisores resistivos :)

fabim escreveu:estranho como ninguém levou em consideração o estado off.
rs
Se tem 2 bits.
00
01
10
11
Qual vai ser o of state ? Porque se simplesmente você for testar o peso binario, tu vai ficar travado e executando constantemente o estado off..rsrs
Da uma pesquisada na net, que tem uma manha de você testar 3state usando um resistor e um capacitor, e uma máquina de estados simples.
Aí sim, pode-se dizer que 2 pinos vão te levar a no minimo 4 niveis lógicos para seleção de botões.
Deixando o HZ das portas como estado off.

Abraços

Fabim