Página 1 de 1

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

MensagemEnviado: 05 Mai 2009 03:54
por R u s H
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.

MensagemEnviado: 05 Mai 2009 07:30
por chipselect
se tiver no mesmo PORT, tenta:
char a;
a=PORTA;
if ((a & 0x03)==0x03) {}
else if ...

não daria certo?

(corrigido)

MensagemEnviado: 05 Mai 2009 08:12
por fabim
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

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

MensagemEnviado: 05 Mai 2009 15:21
por buiz
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.

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

MensagemEnviado: 05 Mai 2009 20:19
por r.bertini
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))

MensagemEnviado: 06 Mai 2009 02:11
por R u s H
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.

MensagemEnviado: 06 Mai 2009 10:04
por buiz
Ok Rush, um abraço!

MensagemEnviado: 06 Mai 2009 10:28
por fabim
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

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