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

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

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

Mensagempor nagkiller » 02 Set 2008 12:51

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...
Avatar do usuário
nagkiller
Bit
 
Mensagens: 40
Registrado em: 21 Jul 2007 09:38

Mensagempor ze » 02 Set 2008 13:06

sim. é possível
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor nagkiller » 02 Set 2008 13:10

Como eu faço?!?!?

Estou utilizando Assembler
Avatar do usuário
nagkiller
Bit
 
Mensagens: 40
Registrado em: 21 Jul 2007 09:38

Mensagempor styg » 02 Set 2008 13:14

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

Mensagempor Djalma Toledo Rodrigues » 03 Set 2008 14:10

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
Editado pela última vez por Djalma Toledo Rodrigues em 04 Set 2008 00:16, em um total de 3 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor RobL » 03 Set 2008 14:45

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor Djalma Toledo Rodrigues » 06 Set 2008 16:15

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.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Maurício » 06 Set 2008 17:36

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
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Djalma Toledo Rodrigues » 06 Set 2008 18:19

é 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.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Maurício » 07 Set 2008 16:07

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
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor nagkiller » 06 Ago 2009 09:51

Grato a todos!!!

Estou sem tempo agora pra testar...

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

Vlw...
Nagkiller
Avatar do usuário
nagkiller
Bit
 
Mensagens: 40
Registrado em: 21 Jul 2007 09:38

Mensagempor fabim » 06 Ago 2009 10:06

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 06 Ago 2009 17:43

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor msamsoniuk » 06 Ago 2009 23:28

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
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04


Voltar para PIC

Quem está online

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

x