Leitura de chaves sem interrupção

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Leitura de chaves sem interrupção

Mensagempor rudsomlima » 29 Jan 2010 10:10

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();
.
.
.
.
.
}
}
rudsomlima
Bit
 
Mensagens: 37
Registrado em: 26 Nov 2006 21:00

Mensagempor Vonnilmam » 29 Jan 2010 11:34

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,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor Vonnilmam » 29 Jan 2010 11:36

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,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: Leitura de chaves sem interrupção

Mensagempor ze » 29 Jan 2010 13:56

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

Mensagempor rudsomlima » 29 Jan 2010 21:12

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.
rudsomlima
Bit
 
Mensagens: 37
Registrado em: 26 Nov 2006 21:00

Mensagempor fabim » 29 Jan 2010 21:37

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..
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 Red Neck Guy » 30 Jan 2010 10:33

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.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor vtrx » 30 Jan 2010 11:27

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
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor fabim » 30 Jan 2010 12:48

vtrx escreveu: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


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!?
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 fabim » 30 Jan 2010 12:52

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...
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 Red Neck Guy » 30 Jan 2010 14:23

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ê....
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor KrafT » 30 Jan 2010 14:28

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.
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor fabim » 30 Jan 2010 14:35

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
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 Red Neck Guy » 30 Jan 2010 14:39

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.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor fabim » 30 Jan 2010 14:50

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,
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!!!?

Próximo

Voltar para PIC

Quem está online

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

cron

x