Página 1 de 2
Leitura de chaves sem interrupção

Enviado:
29 Jan 2010 10:10
por rudsomlima
Bom dia!
Estou fazendo um projetinho simples: são 16 chaves de toque que acendem 16 leds. Com um toque na chave, o respectivo led acende, com outro ele apaga. Não posso multiplexar as chaves porque elas já alimentam outro circuito.
Eu estou usando o 18F452 e dois 74595 para expandir as portas de saída dos leds.
Até ai tudo tranquilo. Funciona muito bem no Proteus.
Acontece que na prática, como não estou usando interrupção (não teria suficiente pra todas as chaves) às vezes o led não acende com um toque da chave, preciso pressionar novamente. Isso usando 20 MHz! Gostaria de saber se alguém tem alguma idéia antes que eu parta pra usar mais dois CI's que joguem todas as chaves para a interrupção do RB0.
Testei com interrupção para apenas uma entrada (RB0) e uma saída e funciona bem.
Uso o CCS e para ler as chaves:
while(1)
{
while(input_c() | input_d()>0)
{
port_c=input_c();
port_d=input_d();
.
.
.
.
.
}
}

Enviado:
29 Jan 2010 11:34
por Vonnilmam
MEU DEUS!!!!!
Amigo, vc gosta mesmo de matar "fumiga" com elefante! rsos...
Uma idéia é vc testar uma tecla (entrada de cada vêz) e não precisa usar interrupção eu faria assim: (veja que eu vou demostrar para vc em ASM)...
Configure os porte a serem utilizados como entradas (não use interrupção) coloque em cada entrada um resistor de 2k2 para +5vcc (para melhorar o isolamente do circuito que vc vai adaptar esse "TREM" utilize um diodo para cada entrada com o KATODO ligado no circuito a adaptar e o ANODO ligado na suas entradas (use um diodo para cada entrada do pic).
;Define entrada das teclas:
#Define Key01 PortA, 0
#Define Key02 PortA, 1
............................Etc, faça assim definindo conforme suas entradas
Define flags de sinalização para criar os estados On/Off:
#Define FKey01 TempA, 0
#Define FKey02 TempA, 1
#Define FKey03 TempA, 2
#Define FKey04 TempA, 3
#Define FKey05 TempA, 4
#Define FKey06 TempA, 5
#Define FKey07 TempA, 6
#Define FKey08 TempA, 7
#Define FKey09 TempB, 0
#Define FKey10 TempB, 1
#Define FKey11 TempB, 2
#Define FKey12 TempB, 3
#Define FKey13 TempB, 4
#Define FKey14 TempB, 5
#Define FKey15 TempB, 6
#Define FKey16 TempB, 7
; ************
; * Rotina principal *
; ************
Main:
Call ScanTec ; Executa rotina de scaner do teclado
Goto Main ; Fica no looping
;-----------
ScanTec: ; Rotina de leitura de teclas e execução de função.
Tecla_01:
Btfsc Key01 ; Testa entrada numero 01
Goto _SaiKey01 ; Não foi pressionada a tecla 01
; AQUI SE É EFETUADO O FREIO PARA A LEITURA SUSSESIVA DA TECLA!
Btfsc TravaKey01 ; Verifica se tecla já foi pressionada?
Goto Tecla_02 ; Sim, então faz scan da próxima tecla!
Bsf TravaKey01 ; Não, então excuta e trava a tecla em questão!
; AQUÍ SE INICIA O PROCESSAMENTE DA FUNÇÃO!
Btfsc FKey01 ; Vefica o flag para aceder ou apagar LED
Goto AcendeLed01 ; Vai para a rotina de acender o LED
Goto ApagaLed01 ; Vai para a rotina de apagar o LED
;
AcendeLed01:
Bsf Led01 ; Acende o LED referente a entrada (botão 01)
Bcf FKey01 ; Inverte o flag de sinalização!
.....pode colocar mais funções aquí!
Goto Tecla02 ; Vai verificar a próxima tecla
;
ApagaLed01:
Bcf Led01 ; Apaga o LED referente a entrada (botão 01)
Bsf FKey01 ; Inverte novamente o flag de sinalização (essa
; inversão no flag de sinalização é para conseguir o
; efeito de LIGADO/DESLIGADO com um toque para
; ligar e outro toque para desligar conforme vc
; solicitou.
.....pode colocar mais funções aquí!
Goto Tecla02 ; Vai verificar a próxima tecla
;
_SaiKey01:
Bcf TravaKey01 ; Esse flag serve para liberar ou parar a função de
; apertar a tecla constantemente, assim vc poderá
; ficar apertando a tecla em contínuo que só será
; enviada uma sequencia de informação no seu
; programa, sem essa "trava" o seu programa vai
; ficar chamando indefinidamente a mesma rotina.
;
Tecla_02:
Repetir aquí o mesmo trecho acima só alterando o nome dos flags e registros
No final da rotina de leitura de tecla insira um return para continuar no loop.
Espero ter conseguido ajudar vc, meu amigo.
Boa sorte,

Enviado:
29 Jan 2010 11:36
por Vonnilmam
MEU DEUS!!!!!
Amigo, vc gosta mesmo de matar "fumiga" com elefante! rsos...
Uma idéia é vc testar uma tecla (entrada de cada vêz) e não precisa usar interrupção eu faria assim: (veja que eu vou demostrar para vc em ASM)...
Configure os porte a serem utilizados como entradas (não use interrupção) coloque em cada entrada um resistor de 2k2 para +5vcc (para melhorar o isolamente do circuito que vc vai adaptar esse "TREM" utilize um diodo para cada entrada com o KATODO ligado no circuito a adaptar e o ANODO ligado na suas entradas (use um diodo para cada entrada do pic).
;Define entrada das teclas:
#Define Key01 PortA, 0
#Define Key02 PortA, 1
............................Etc, faça assim definindo conforme suas entradas
Define flags de sinalização para criar os estados On/Off:
#Define FKey01 TempA, 0
#Define FKey02 TempA, 1
#Define FKey03 TempA, 2
#Define FKey04 TempA, 3
#Define FKey05 TempA, 4
#Define FKey06 TempA, 5
#Define FKey07 TempA, 6
#Define FKey08 TempA, 7
#Define FKey09 TempB, 0
#Define FKey10 TempB, 1
#Define FKey11 TempB, 2
#Define FKey12 TempB, 3
#Define FKey13 TempB, 4
#Define FKey14 TempB, 5
#Define FKey15 TempB, 6
#Define FKey16 TempB, 7
; ************
; * Rotina principal *
; ************
Main:
Call ScanTec ; Executa rotina de scaner do teclado
Goto Main ; Fica no looping
;-----------
ScanTec: ; Rotina de leitura de teclas e execução de função.
Tecla_01:
Btfsc Key01 ; Testa entrada numero 01
Goto _SaiKey01 ; Não foi pressionada a tecla 01
; AQUI SE É EFETUADO O FREIO PARA A LEITURA SUSSESIVA DA TECLA!
Btfsc TravaKey01 ; Verifica se tecla já foi pressionada?
Goto Tecla_02 ; Sim, então faz scan da próxima tecla!
Bsf TravaKey01 ; Não, então excuta e trava a tecla em questão!
; AQUÍ SE INICIA O PROCESSAMENTE DA FUNÇÃO!
Btfsc FKey01 ; Vefica o flag para aceder ou apagar LED
Goto AcendeLed01 ; Vai para a rotina de acender o LED
Goto ApagaLed01 ; Vai para a rotina de apagar o LED
;
AcendeLed01:
Bsf Led01 ; Acende o LED referente a entrada (botão 01)
Bcf FKey01 ; Inverte o flag de sinalização!
.....pode colocar mais funções aquí!
Goto Tecla02 ; Vai verificar a próxima tecla
;
ApagaLed01:
Bcf Led01 ; Apaga o LED referente a entrada (botão 01)
Bsf FKey01 ; Inverte novamente o flag de sinalização (essa
; inversão no flag de sinalização é para conseguir o
; efeito de LIGADO/DESLIGADO com um toque para
; ligar e outro toque para desligar conforme vc
; solicitou.
.....pode colocar mais funções aquí!
Goto Tecla02 ; Vai verificar a próxima tecla
;
_SaiKey01:
Bcf TravaKey01 ; Esse flag serve para liberar ou parar a função de
; apertar a tecla constantemente, assim vc poderá
; ficar apertando a tecla em contínuo que só será
; enviada uma sequencia de informação no seu
; programa, sem essa "trava" o seu programa vai
; ficar chamando indefinidamente a mesma rotina.
;
Tecla_02:
Repetir aquí o mesmo trecho acima só alterando o nome dos flags e registros
No final da rotina de leitura de tecla insira um return para continuar no loop.
Espero ter conseguido ajudar vc, meu amigo.
Boa sorte,
Re: Leitura de chaves sem interrupção

Enviado:
29 Jan 2010 13:56
por ze
São MUITAS maneiras de se resolver isso. Vamos ver 1 se seu hw for "imexível":
Faça uma porta AND com 16 diodos catodo em cada SAÍDA dos leds cada um em série com sua chave que tem um ponto comum ligado a um pino (B) de entrada do pic. Apague os leds momentaneamente por um controle anodo comum p.ex. e faça uma varredura de um bit 0. Sabendo que cada chave está numa saída, se em determinado momento da varredura B=0 então chave=saída.
Bom mas caso a entrada de projeto seja apenas
rudsomlima escreveu:...um projetinho simples: são 16 chaves de toque que acendem 16 leds. Com um toque na chave, o respectivo led acende, com outro ele apaga. ...
nem precisa de expansão de i/o. Bastariam 2 ports 8 bits com uma multiplexação do tipo que mencionei. Bota o tico e teco pra funcionar. Dica: use interrupt. É simples mesmo.
abç

Enviado:
29 Jan 2010 21:12
por rudsomlima
Obrigado pela ajuda. Para vocês entenderem o projetinho:
Mexo com PIC por hobby e tenho um amigo que está montando pra ele um cockpit pra um simulador de vôo. Ele comprou de outra pessoa uma réplica de um painel com 16 botões que é uma adaptação do hw de um teclado USB. Ou seja, ele liga o painel ao simulador através da USB. Fui tentar medir que nível lógico estava presente nos botões e pra minha surpresa achei um valor em torno de 2,1 V nos dois lados da chave. Quando o botão era pressionado não mudava nada do outro lado da chave. Imaginei então que o acionamento poderia ser por código. Eu também não instalei o driver do referido teclado no meu computador.
Alguém sabe como funciona por dentro desses teclados?
Vonnilmam: Matar formiga com elefante é pq o 18F452 ta sem uso aqui e não tenho o 16F877A... Vc também me alertou a fazer os testes porta por porta, pode ser q eu encontre a chave pressionada logo no inicio da varredura e nao precise fazer o resto. Obrigado.
Lellis: Muito boa a idéia da multiplexação. Obrigado.

Enviado:
29 Jan 2010 21:37
por fabim
o rudsom. Fala pro seu amigo arrumar um pic18f4550 ou 2550.
Eu te arrumo um programinha para USB HID que eu fiz a uns dois anos.
32 buttons , 8 axys.
Se precisar o mesmo pic consegue fazer a emulação de até 8 joysticks. Com configurações diferentes. ja propria para funções de avião,, só criar o descriptor..
Porque desmontar teclado usb, e adaptar com fio.. nionguem merece..

Enviado:
30 Jan 2010 10:33
por Red Neck Guy
Uma idéia para isso:
- Código: Selecionar todos
....
__int16 teclas;
(GET_TECLA_0)?(teclas|=0x01):(teclas&=~0x01);
(GET_TECLA_1)?(teclas|=0x01):(teclas&=~0x02);
(GET_TECLA_2)?(teclas|=0x01):(teclas&=~0x04);
(GET_TECLA_4)?(teclas|=0x01):(teclas&=~0x04);
//E assim por diante até 16...
//daí faz assim
if(teclas != ultimasTeclas){
leds = leds ^teclas;
}
ultimasTeclas = teclas;
....
GET_TECLA_X é um macro que tu define com base na forma como ler as teclas no teu sistema....
Leds é a variavel que tu joga o conteúdo sobre os 74hc595....
Cara eu não fabrico varistores em caixinha da patola, por isso não sou o cara, mas tento ajudar.

Enviado:
30 Jan 2010 11:27
por vtrx
Para joystick tipo simulador,não usando PIC,existe um projeto antigo e muito usado,o Mjoy.
Voce não precisa programar nada,é só gravar,mas vai ter que ler todos os post;
http://forum.clubedohardware.com.br/mjoy-atmega8/472888

Enviado:
30 Jan 2010 12:48
por fabim
O VTRX... AQui é um forum de PIC, o cara esta perguntando sobre pic, eu respondi oferecendo uma solução direta usando PIC, ja que esta aprendendo usando PIC, PIQUE tu não para com isso ? ta ficando chato sabia!?

Enviado:
30 Jan 2010 12:52
por fabim
Aquino, é que tu é tão inutil, e pé rapado e burro.
Que não sabe que no brasil ninguem fabrica varistor..
É tudo importado, só uso joslin ou thinking....
Não uso caixa da patola, todas as ferramentas são da empresa..
Como tu é pe rapado, não imagina que alguem que tenha grana possa ter ferramentas proprias né ?...
Mesmo querendo que você seja atropelado, ou morto por uma bala perdida, ou mesmo que sofra um derrame, ou um AVC fulminante.
Eu perdoo você, e reconheço que tu é tão burro, que quer ensinar um codigo simplesmente inutil para o que o amigo quer...

Enviado:
30 Jan 2010 14:23
por Red Neck Guy
fabim escreveu:Aquino, é que tu é tão inutil, e pé rapado e burro.
Que não sabe que no brasil ninguem fabrica varistor..
É tudo importado, só uso joslin ou thinking....
Não uso caixa da patola, todas as ferramentas são da empresa..
Como tu é pe rapado, não imagina que alguem que tenha grana possa ter ferramentas proprias né ?...
Mesmo querendo que você seja atropelado, ou morto por uma bala perdida, ou mesmo que sofra um derrame, ou um AVC fulminante.
Eu perdoo você, e reconheço que tu é tão burro, que quer ensinar um codigo simplesmente inutil para o que o amigo quer...
Desculpa se eu não tenho o código-fonte do OSX pra postar aqui... Não sou como você que é o fodão...
Alias, vendendo pão, aposto que ganho mais do que você....

Enviado:
30 Jan 2010 14:28
por KrafT
Fica chateado não Aquino, frente à genialidade assombrosa do Fabim até o Stephen Hawking é burro.
Por outro lado voce não pode condenar o fabim por ele trabalhar na Patola.

Enviado:
30 Jan 2010 14:35
por fabim
com certeza... Tu ja deve vender pão mesmo, e fazer outras coisas pela sua incompetencia,. Por exemplo tu queima rosca todos os dias...
kkkkk

Enviado:
30 Jan 2010 14:39
por Red Neck Guy
fabim escreveu:Aquino, é que tu é tão inutil, e pé rapado e burro.
Que não sabe que no brasil ninguem fabrica varistor..
É tudo importado, só uso joslin ou thinking....
Não uso caixa da patola, todas as ferramentas são da empresa..
Como tu é pe rapado, não imagina que alguem que tenha grana possa ter ferramentas proprias né ?...
Mesmo querendo que você seja atropelado, ou morto por uma bala perdida, ou mesmo que sofra um derrame, ou um AVC fulminante.
Eu perdoo você, e reconheço que tu é tão burro, que quer ensinar um codigo simplesmente inutil para o que o amigo quer...
O que foi perguntado pelo amigo lá no inicio do tópico?
Acho que era tipo: Um código que toggle um led através do teclado.
O que o meu código faz?
Ele é um pseudo-código que dá um idéia de como fazer isso. Não postei o fonte-completo pq pensei que aqui fosse um fórum e o colega estivesse atrás de idéias não de projetos para download.
Fabim, não tenho culpa se tu só viu o microC até hoje na tua vida e quando vê um código que não esteja completo e sem os comentários não consegue tirar a idéia ali presente e entender a solução proposta.
Alias, acredito que os moldes que tu fala sejam do teu chefe e não teus. Nesse caso, quantos moldes eu consigo fazer com o capital investido na pick&place aqui da empresa?
Ao menos eu vivo há 7 anos só como projetista e ganho um salário que acredito que tu nunca virá a ganhar. Bixo, só falar e fazer propaganda pra desconhecidos na internet não resolve. Quero ver ser um profissional responsável e que não ache que só pq faz um led piscar com um pic é o cara. Existe muito mais coisas além disso e não estou falando de tecnologias.

Enviado:
30 Jan 2010 14:50
por fabim
sim, como por exemplo.
Sim são da empresa.
E sim, tem mais coisas mesmo.
Como tu ir caçar um macho para vocÊ, ou uma mulher, "não conheço sua opção sexual". E descarregar o seu stresssss no seu parceiro...
Ao invés de ficar enxendo o o saco, de quem nem tem contato com você.
tu ja encrencou com o phopholetti, ja encrencou com o xultz, e com um outro que não lembro quem foi.
Cara sinceramente, acredito que aqui ninguem goste de homo sexuais. Procure um garoto de programa ou algo melhor que te satisfaça..
E deixe os que tem passa tempo, como este é o meu, em paz. E pare de ficar vadiando no literal, só pra ler informações, ou seja se quer fazer chupisco faça num macho pago, e não aqui no forum...
hehe,