CCS - Como testar mais de um pino ao mesmo tempo?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

CCS - Como testar mais de um pino ao mesmo tempo?

Mensagempor R u s H » 05 Mai 2009 03:54

Boa noite pessoal.

Para testar se um botão ligado ao pino A0 foi pressionado eu simplesmente uso:
Código: Selecionar todos
if (input(PIN_A0))

Mas e se eu quero testar se os botões ligados em A0 e A1 foram pressionados ao mesmo tempo? Eu já tentei:
Código: Selecionar todos
if ((input(PIN_A0)) && (input(PIN_A1)))

Mas não funcionou então testei dessa forma:
Código: Selecionar todos
   
    if (input(PIN_A0)) 
      SA0=1           
    if (input(PIN_A1))
      SA1=1
       
    if ((SA0 == 1) && (SA1 == 0))
    {

    }
    else if ((SA0 == 0) && (SA1 == 1))
    {

    }
    else if ((SA0 == 1) && (SA1 == 1))
    {

    }
    SA0 = 0;
    SA1 = 0;


O problema é que muitas vezes os dois botões são pressionados quando o programa já passou pelo primeiro IF então somente SA1 recebe 1 e o programa acaba executando o comando presente no primeiro ELSE IF. Alguém tem uma dica para resolver isso? Estou olhando os exemplos do CCS mas ainda não achei nada parecido.
char msg[]={78, 111, 111, 98, 32, 104, 101, 114, 101, 46, 32, 72, 69, 76, 80, 32, 77, 69, 33, 33, 33, 49, 0};
R u s H
 
Mensagens: 4
Registrado em: 03 Mar 2007 19:05

Mensagempor chipselect » 05 Mai 2009 07:30

se tiver no mesmo PORT, tenta:
char a;
a=PORTA;
if ((a & 0x03)==0x03) {}
else if ...

não daria certo?

(corrigido)
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor fabim » 05 Mai 2009 08:12

TITIA, dá uma olhada no asm que este teste esta gerando.
if ((input(PIN_A0)) && (input(PIN_A1))){

}
Eu ja cansei de utilizar isto, e funciona normazinho

se porta0 e porta1 precionados
If((PORTA.F0 ) && (PORTA.F1)){ então
}
Mas de qualquer forma sua sintaxi esta correta, deve ser algum bisouro do compilador..

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 Renie » 05 Mai 2009 12:17

Olá Rush,

Não seria o caso de "montar" um deboucing?

Eu não uso C, mas, vai uma tentativa:

if ((input(PIN_A0)) II (input(PIN_A1))) {
delay_ms (33); // ajuste o tempo se necessário
if ((input(PIN_A0)) && (input(PIN_A1))) {
....... // suas rotinas
}
}


[]'s
Renie
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor buiz » 05 Mai 2009 15:21

Código: Selecionar todos
int conta=0;

while (true)
{
if ((input(botao1)) & (!input(botao2))) {conta++;
                                                        if (conta==5) comando 1;}

if ((!input(botao1)) & (input(botao2))) {conta++;
                                                         if (conta==5) comando 2;}

if ((input(botao1)) & (input(botao2))) {conta++;
                                                        if (conta==5) comando 3;}

if ((!input(botao1)) & (!input(botao2))) conta=0;

delay_ms(50);
}

 



A contagem é uma sugestão para evitar que num atraso entre o pressionar do botão 1 e do botão 2 outra função seja executada.

Não testei, mas acho que funcionaria.

Espero ter ajudado,

Um abraço,

Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Re: CCS - Como testar mais de um pino ao mesmo tempo?

Mensagempor r.bertini » 05 Mai 2009 20:19

Código: Selecionar todos
if ((input(PIN_A0)) && (input(PIN_A1)))



Olá Parece que você está com problemas no abrir e fechar os parenteses, tenta assim:

Código: Selecionar todos
if (input(PIN_A0) && input(PIN_A1))
R.Bertini
__________________________________
#include<stdio.h>
main()
{
printf("\n R.Bertini");
}
r.bertini
Bit
 
Mensagens: 28
Registrado em: 30 Ago 2008 01:43

Mensagempor R u s H » 06 Mai 2009 02:11

Opa!

Valeu pelas dicas. Acho que resolvi (ou resolvemos), fiz assim:
Código: Selecionar todos
  while(true)
  {
    if ((input(PIN_A0)==1) && (input(PIN_A1)==0))
    { 
      Delay_ms(10);
      if ((input(PIN_A0)==1) && (input(PIN_A1)==0))
      { 

      }
    }
    else if ((input(PIN_A0)==0) && (input(PIN_A1)==1))
    {
      Delay_ms(10);
      if ((input(PIN_A0)==0) && (input(PIN_A1)==1))
      { 

      }
    }
    else if ((input(PIN_A0)==1) && (input(PIN_A1)==1))
    { 
      Delay_ms(10);
      if ((input(PIN_A0)==1) && (input(PIN_A1)==1))
      {

      }
    }
    else
    { 
      output_high(PIN_B0);
      output_high(PIN_B1);
      output_high(PIN_B1);
    }
  }


Eu usei a dica do Renie. Se eu remover o primeiro IF com delay de cada teste, somente os dois primeiros funcionam de forma correta. No terceiro teste acontece a mesma coisa que acontecia no código que postei no primeiro post. A princípio funcionou, fiquei um bom tempo testando.
Vou encher de leds e combinações diferentes de botões pra ver o que acontece. :o

chipselect
Mas eu tenho 3 botões em PORTA que fazem coisas diferente, dessa forma todos fariam a mesma coisa, certo?


fabim
TITIA???? :lol:
Eu não coloquei o código todo, mas a forma que eu estava fazendo estava errada. Eu fazia assim:
Código: Selecionar todos
if (input(PIN_A0))
{}
if (input(PIN_A1))
{}
if ((input(PIN_A0)) && (input(PIN_A1)))
{}

Então acontecia que pressionando os dois juntos todos os teste eram válidos.

buiz
Valeu. Logo eu vou testar dessa forma. Se funcionar vai me economizar algumas linhas. :o

r.bertini
Dessa forma o compilador acusa ERROR 51: A numeric expression must appear here.
char msg[]={78, 111, 111, 98, 32, 104, 101, 114, 101, 46, 32, 72, 69, 76, 80, 32, 77, 69, 33, 33, 33, 49, 0};
R u s H
 
Mensagens: 4
Registrado em: 03 Mar 2007 19:05

Mensagempor buiz » 06 Mai 2009 10:04

Ok Rush, um abraço!
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor fabim » 06 Mai 2009 10:28

Bom, como ninguém disse nada....

_u short bts;

//se lógica for de 0 nopress 1 simpress
bts = porta & 0x02;

if(bts == 3){ // bit´s 0 e 1 = 1;

}

//se lógica for de 1 nopress 0 simpress
bts = porta & 0x02;

if(!bts){ // bit´s 0 e 1 = 0;

}

sem contar que pode fazer um ||,,,, ticetera...

vamos supor o mesmo para o bit 4.

bts = porta & 0x08;

if(bts){ // se bit 4 = 1, então bts dif 0 {verdade}

}

agóra com lógica 1 nopress e 0 simpress.

bts = porta & 0x08;

if(!bts){ // se bit 4 = 0, então bts = 0 {verdade}

}

e la vai abroba e abroba pro assunto, nossa que pessoal complicado..rsrs

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 fabim » 06 Mai 2009 17:25

ia esquecendo...

//se lógica for de 1 nopress 0 simpress

if( (!PORTA.0) || (!PORTA.1)){ // SE 0 OU 1 PRECIONADO
DELAYMS(20);// ESPERA TEMPO DE ADEQUAÇÃO DE SINAIS
bts = PORTA & 0x02; // PEGA APENAS BIT´S 0 E 1
if(!bts){ PORTB = ~PORTB; } //bts = 0 ? SIM ENTÃO 2 PRECIONADOS.
}


:twisted:
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!!!?


Voltar para PIC

Quem está online

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

cron

x