Saida de teste de estados.

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Saida de teste de estados.

Mensagempor die6o » 07 Jan 2011 07:00

Pessoal, estou com uma duvida que pode parecer simples.
Mas o keil insiste em não aceitar...

Suponham que em uma __irq, você tem um teste de sentença para poder entrar nas chaves.

Código: Selecionar todos
  if(temp != oldtemp && sense>sensi){

   if(oldtemp==3 & temp ==2)
     variavel++;
   
   
   if(oldtemp==3 & temp ==1)
   variavel--;
   
   if(oldtemp==2 & temp ==0)
   variavel++;
   
   if(oldtemp==2 & temp ==3)
   variavel--;

   if(oldtemp==0 & temp ==1)
   variavel++;
   
   if(oldtemp==0 & temp ==2)
   variavel--;

   oldtemp = temp;
   sense = 0;
   
   }


observando o codigo, fica facil identificar que o PC irá testar todas as comparações de sentença, mesmo que a verdadeira seja o 3° IF.
Eu ja usei o Continue varias vezes, para ele pular para o fim e não fazer os testes nos outros if´s. Só que desta vez o keil diz que eu não posso utilizar este comando. Alguém sabe uma forma simples de sair da chave principal, sem que eu tenha que cometer o sacrilégio de GOTO LABEL ?

Muito obrigado
die6o
Nibble
 
Mensagens: 71
Registrado em: 07 Mar 2007 13:26

Mensagempor barboza » 07 Jan 2011 07:46

Código: Selecionar todos
if (() && ())
{
}
else if (() && ())
{
}
else if (() && ())
{
}
else if (() && ())
{
}


cuidado, pois & é AND lógico e && teste condicional.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Red Neck Guy » 07 Jan 2011 10:17

Dá pra fazer de várias formas....


Código: Selecionar todos

...

if(oldTemp==3 && temp==1){
  variavel++;
  return;
}

if(oldTemp==2 && temp==0){
  variavel--;
  return;
}



2ª forma
Código: Selecionar todos
  switch(oldtemp){
    case 0: if(temp==2)
                 variavel++;
               break;
    case 1: if(temp==1)
                  variavel--;
               break;
    case 2: //etc...
               break;
    case 3:
               break;
  }


E a forma mais elegante, a exposta pelo Barboza.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor die6o » 08 Jan 2011 19:29

Aquino.
Eu ja havia feito da forma sugerida, só que olhando o wath do keil, percebi que o switch perde bem mais tempo do que o if();
Minha idéia é utilizar o minimo possivel de tempo no tratamento desse pooling...
Pois são 6 interrupções... :-(....
Não que vá dar problema, mais não quero de forma alguma que de pau...
die6o
Nibble
 
Mensagens: 71
Registrado em: 07 Mar 2007 13:26

Mensagempor polesapart » 08 Jan 2011 21:12

Código: Selecionar todos
  ...
  unsigned short combined;

  if (temp != oldtemp && sense > sensi)
  {
   combined = temp << 8 | oldtemp;

   switch (combined)
   {
      case 0x0203:
      case 0x0002:
      case 0x0100:
       variavel++;
       break;

     case 0x0103:
     case 0x0302:
     case 0x0200:
      variavel--;
      break;
   
   }
   oldtemp = temp;
   sense = 0;
  }
...
Warning: time of day goes back (-163479us), taking countermeasures. :)
Avatar do usuário
polesapart
Byte
 
Mensagens: 477
Registrado em: 19 Nov 2007 12:56
Localização: Curitiba


Voltar para ARM

Quem está online

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

x