Como fazer uma rotina para botão?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Como fazer uma rotina para botão?

Mensagempor alexhnunes » 28 Jun 2008 15:58

Caros amigos, tenho desenvolvido alguns programas no MikroC e tenho gostado muito, tenho tido muito menos problemas do que quando fazia com o CCS, além de ser uma linguagem mais fácil e objetiva (pelo menos para mim). Quando incluo acionamento de botão, porém, não estou conseguindo fazer uma rotina em que por exemplo a ação ocorra somente quando eu solto o botão (fazendo com que o desvio da rotina seja feito somente uma vez). O artifício que utilizo é um delay de alguns milissegundos. Porém acontece que, se o tempo em que o botão fica pressionado for maior, a rotina é desviada várias vezes, coisa que eu não desejo em algumas condições. Tenho utilizado alguns flags para habilitar/desabilitar esses desvios, porém sem sucesso. Existe alguma rotina em especial para este caso?
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor fabim » 28 Jun 2008 16:39

use a função test button(porta,bit,tempo em ms);

Se o botão precionado => tempo, entra
{ enquanto botão precionado nop;
soltou botão FAZ {


}
}
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 alexhnunes » 28 Jun 2008 20:08

Seria este exemplo do Help?

do {
if (Button(&PORTB, 0, 1, 1)) oldstate = 1; *****
if (oldstate && Button(&PORTB, 0, 1, 0)) {
PORTD = ~PORTD;
oldstate = 0;
}
} while(1);

Onde **** ==> unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state);

Estou perguntando porque usei exatamente esta função q vc sugeriu, "test button(porta,bit,tempo em ms); ", porém o programa não aceitou a palavra "test".
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor fabim » 29 Jun 2008 00:22

intão amigo, é esse exemplo mesmo..

Mais raciocine o seguinte, conforme a função que voce adentra com este teste, pode ser tão rapido que você ainda não soltou o botão e ela ja voltou de novo... agora observe o seguinte"não programop em c" o exemplo que eu vou colocar e tente compreender como ele funca.

if (Button(&PORTB, 0, 1, 1)) {//pressionou por 1ms, passou no teste condicional

while portb,0=0 do{ nop; } // enquanto precionado fica preso
soltou o botão FAZ o que esta daqui pra baixo.

}

No pascal eu so faço assim ó.

IF TESTBUTTON(PORTB,0,0,5) THEN
Begin
While (portb,0)=0 do nop; //enquanto precionado faz nada
// soltou botão executa pra baixo..

End;
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 alexhnunes » 29 Jun 2008 18:31

Ah, sim, entendi. É que eu não sabia que vc utilizava Pascal, eu utilizei o MikroPascal uma vez para programar alguns microcontroladores AVR e vi que existem algumas diferenças na descrição dos comandos em relação ao C.

Quanto ao entendimento do comando, ficou bem mais claro agora...

Muito obrigado, Fabim.
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor lpagano » 01 Jul 2008 09:47

Outro dia eu fiz o seguinte código, que deu certo e consumiu menos memória:

Código: Selecionar todos

** EXEMPLO **

// o botão está em RC0 e é ativado colocando esse pino em GROUND
// o pino RC4 indicará se o botão foi ativado ou não


if (PORTC.F0 == 0) {            // caso o botão pressionado esteja em RC0
       
       delay_ms(30);
       while (PORTC.F0 == 0) {   // enquanto o botão estiver pressionado não acontece nada
       }         

       PORTC.F4 = 1;           // caso RC0 não esteja mais em 0, RC4 vai para 1
}


O pino RC4 só será ativado quando você soltar o botão.
Isso depende de cada aplicação, mas no meu caso deu certo pois a função Button ocupa muito espaço na memória ROM do PIC.
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor alexhnunes » 01 Jul 2008 10:38

Lpagano, foi exatamente o que eu fiz além da rotina do botão, agora está funcionando corretamente. Muito obrigado!
Alexandre Nunes
alexhnunes
Nibble
 
Mensagens: 59
Registrado em: 28 Mai 2007 10:04
Localização: Campinas - SP

Mensagempor ze » 01 Jul 2008 10:40

hitech C zip
Código: Selecionar todos
while(!RC0);
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

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

cron

x