Ir ao conteúdo

Posts recomendados

Postado

Oi, estou tentando organizar um jogo do estilo quis onde terão 8 participantes e cada um pode responder uma pergunta baseado em conhecimentos específicos. O jogo em si já esta preparado, contudo estou com dificuldades para fazer um método para detectar quais participantes "bateram" o botão na ordem. A questão é que é preciso saber quais participantes batem o botão depois de autorizados e saber a ordem caso mais de um bata. Pensei em usar um arduino para controlar o jogo. 8 botões conectados em uma shield e o arduino mandando a resposta para um computador, contudo nunca mexi com arduinos diretamente e nao achei bons exemplos com esse caso especifico de uso de tantos "periféricos" e ainda com integração com o computador. Alguém poderia me ajudar com uma fonte boa de informação, ou mesmo com uma ideia de como programar. Eu tenho base boa de programação em C então eu entendo os códigos e comandos que vejo, mas não consigo achar a integração com o computador.

Postado

@Eduardo bader Alves ,

 

Bom, posso te ajudar de uma maneira mais "genérica" :

 

Primeiro, eu criaria um Timer de 16 bits, incrementando a cada 0,2 milisegundo. Esse Timer seria inicializado no instante da autorização. Veja que não é necessário gerar interrupção do Timer, pois o próprio Timer incrementa por hardware.

 

Segundo, um Atmega328 pode ser programado para gerar uma interrupção para quando qualquer um de seus pinos escolhidos mudem de nível lógico... você pode usar pinos de dois Ports diferentes ( por exemplo PortB e PortC, programar esses pinos para gerar a interrupção, usando uma mascara para cada um dos Ports ), e agora vem a parte legal :

 

Na rotina de interrupção, você pega logo de cara a contagem do Timer, identifica qual dos 8 pinos que gerou a interrupção, e guarda numa tabela as informações do numero do pino e do tempo do Timer, e sai da interrupção. Quando você terminar de preencher essa tabela, o primeiro elemento será o primeiro pino que foi apertado. Se quiser pode até calcular a diferença de tempo entre os acionamentos.

 

No programa principal você fica simplesmente esperando preencher toda a tabela com os 8 pinos, e aí pode apresentar na sequência desejada.

 

Já fiz algo parecido com o Bascom e também em ASM, mas detesto C ..... 

 

Repare que no datasheet do Atmega328 existem 23 pinos que tem também um nome de função tipo PCINT0 até PCINT23 .  Por exemplo o PortB tem os seus 8 pinos com os nomes PCINT0 até PCINT7, o PortC tem os nomes de PCINT8 até PCINT14, e o PortD tem os nomes de PCINT16 até PCINT23. A Atmel faz uma baita confusão pois dá aos pinos um nome que ela também dá para o vetor de interrupção ! Ah, e não existe mesmo o PCINT15 !

 

Cada um desses 3 Ports pode gerar uma interrupção quando qualquer um de seus pinos muda de estado. Por exemplo, o nome da interrupção que é gerada pelo PortB é a PCINT0 , a do PortC é a PCINT1 e a do PortC é a PCINT2 .

 

O que falta agora é que cada um desses ports possui um registrador de máscara, onde você coloca nível 1 para cada um dos 8 pinos do port que podem gerar a interrupção. Assim você pode escolher quais pinos podem gerar essa interrupção. Para o PortB, o nome desse registrador é PCMSK0, e para o PortC é PCMSK1 .

 

Cuidado que no Arduíno você não vai conseguir usar os 8 pinos de um mesmo port, por causa do sistema de comunicação serial. Eu sugiro usar tipo 4 pinos do PortB e mais 4 pinos do PortC.

 

Resumindo, para habilitar uma interrupção para qualquer mudança feita nos pinos 14,15,16 e 17 do Atmega328 temos de gravar os registradores com os dados abaixo :

 

PCMSK0= 00001111   ;  habilitamos apenas os 4 pinos que queremos

PCICR = 00000001     ;  habilita a interrupção PCINT0 ( control register )

 

Já se você quiser usar também mais 4 pinos, totalizando 8, e supondo os pinos 23,24,25 e 26 ( PortC ) , temos de mexer nos seguintes registradores :

 

PCMSK0= 00001111   ;  habilitamos apenas os 4 pinos que queremos do PortB

PCMSK1= 00001111   ;  habilitamos apenas os 4 pinos que queremos do PortC

PCICR = 00000011     ;  habilita as interrupções PCINT0 e PCINT1 ( control register )

 

Da maneira acima criamos duas interrupções, a PCINT0 e a PCINT1, e dentro da rotina interna de cada uma você tem de ler o Timer e depois o Port correspondente para ver o estado dos pinos e ver qual mudou, comparando com o estado inicial. Em seguida, eu gravaria 0 no PCMSK no bit do pino que gerou essa interrupção, para que ele não mais possa interromper. 

Em seguida, gravaria a minha tabela com o valor do Timer e qual o pino que foi ativado, e sairia  da interrupção.

 

Essas duas interrupções iriam ficar preenchendo a mesma tabela, e quando o programa principal verificar que o ultimo valor da tabela foi escrito, já está tudo pronto para ser mostrado.

 

Desculpe não poder escrever isso tudo em C .....

 

Paulo

 

 

  • Curtir 1
  • mês depois...
  • Membro VIP
Postado

BASOM

 

Config Pind=input: portd=255  'todos os pinos em pullup

dim ordem(8) as byte, myport as byte

do

mybyte=pinc

select case mybyte

case 1: (coloca a condição)

case 2..

case 4,,

 case 8..

 perceba que é a condição do valor binário de cada pino...

end select

loop until mybyte<> 255

'

 

 

adicionado 4 minutos depois

Esqueci de colocar a ordem.

dim cordem=1

 

 

e a cada toque incremente o contador.

assim, ordem(x) terá o seu valor.

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!