BOTAO COM MAIS DE UMA FUNÇÃO

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 06 Jul 2014 21:50

André.. Voce esta corretíssimo.. Por isso eu nao vejo seguro fazer esse codigo assim. Parece que ele funciona quando quer..rss.. Hora funciona, hora falha. Falando no While(botao).. eu consegui fazer o switch funcionar colocando os outros blocos dentro do bloco desse while(botao).. aí eles conseguem trabalhar com a variavel controlada dentro desse laço, mas mesmo assim ele falha.. Eu vou fazer esse fluxograma e colocar aqui.. acho que é a melhor maneiro.. por enquanto eu só tenho que agradecer...

Obrigado

Eloy
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 06 Jul 2014 22:36

Consegui fazer um demonstrative de como o programa precisa fincionar..

espero que funcione o upload..

http://imagizer.imageshack.us/v2/150x100q90/822/uy93.jpg
uy93.jpg


Obrigadão...
Você não está autorizado a ver ou baixar esse anexo.
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor Red Neck Guy » 07 Jul 2014 07:48

Eu faria assim:

cpp code
unsigned int contadorBotao;

#define TEMPO_FUNCAO_01 10
#define TEMPO_FUNCAO_02 20
#define TEMPO_FUNCAO_03 30
#define TEMPO_FUNCAO_04 40
#define TEMPO_FUNCAO_05 50

//int timer com resolução de 100 ms, digamos....
void rti_timer(void){

if(contadorBotao<TEMPO_FUNCAO_05)
contadorBotao++;

}


void main(void){
unsigned char tecla;

tecla = le_teclado();
if(tecla==PRESSIONADA){
if(contadorBotao ==TEMPO_FUNCAO_05)
contadorBotao = 0x00;

if(contadorBotao ==TEMPO_FUNCAO_05){
funcao_05();
contadorBotao = TEMPO_FUNCAO_05-1;
}
if(contadorBotao == TEMPO_FUNCAO_04)
funcao_04();

if(contadorBotao == TEMPO_FUNCAO_03)
funcao_03();

if(contadorBotao == TEMPO_FUNCAO_02)
funcao_02();

if(contadorBotao == TEMPO_FUNCAO_01)
funcao_01();
}


}


Mais ou menos assim.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 07 Jul 2014 09:19

Não sei se eu consegui entender, mas esse codigo me parece que faz um botao ter funções diferentes conforme os tempos diferentes. mas o que eu preciso é bem diferente.. É um botão que quando segurado muda a variavel..( A ) uma vez que essa variavel esteja em valor ( um ), cada apertado do botao incrementa variavel (B). depois quando segura o botao novamente retorna a variável ( A ) ao esta anterior.. essa pode ser ( 1 ou 0 )..

Obrigado

Eloy
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor Red Neck Guy » 07 Jul 2014 10:50

Poxa desculpa...
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor ze » 07 Jul 2014 11:06

tipo 2 seg de tecla pressionada=enter?
Código: Selecionar todos
#define botao RA0 //push buttom pro gnd. não esquecer do pullup
#define a RA1 //sua variável 'a' como led p.ex.
//static bit a //ou se preferir como variável mesmo.

unsigned char contadorBotao;
//int timer com resolução de 100 ms, digamos....
void rti_timer(void){
if (!botao) contadorBotao++;
else contadorBotao=0;
}

unsigned char le_tecla(void)
{
unsigned char b=0;
contadorBotao=0;
while(botao);//pressione
while ((!botao) && (contadorBotao<20)));//2 seg de tecla pressionada=enter
if (contadorBotao>=20)
   {
   a=1;//entrou no menu. Pode...
   while(!botão);//...tirar o dedo do botão
   contadorBotao=0; //pra garantir
   while(contadorBotao<20)//2 seg de tecla pressionada=enter
      {
      while(botao);//pressione
      while ((!botao) && (contadorBotao<20)));//2 seg de tecla pressionada=enter
      b++;
      }
   }
a=0;//saiu
while(!botao);//tira o dedo do botão pow
return b; //numero de vezes de botão pressionado
}
void main(void)
{
unsigned char t;
...
for(;;)
{
t=le_tecla();
if (t==1) funcao1();
...
if (t==x) funcaox();
}
}

reservo-me no direito dos enganos e de não editar para corrigi-los
De fato, acho que preferiria usar vários botões numa entrada só de ad ou comparador
http://ww1.microchip.com/downloads/en/D ... 40040c.pdf
página 8
abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 07 Jul 2014 11:20

Ola Zé.. Eu só tenho que agradecer a ajuda.. tudo é válido..
Vou tentando aui os codigos para ver se alem de funcionar, eu aprendo. Já que me falta muito ainda.. Quando estudava Assembly (decadas atras )me parecia mais facil. No C eu ainda estou tentando entender com substituir uma rotina e subrotina do Assembly.. Mas devagar a gente chega la... Obrigado...

Eloy
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 07 Jul 2014 20:36

Boa Noite..
tentei adaptar o codigo para o CCs no Pic 877A , e mudei algumas coisas porque deu trocentos erros, mas acho que é de outro controlador ou compilador, mas mesmo assim acho que não consegui fazer porque devo ter deixado algo de fora , ou não entendi a logica do codigo todo..

alguem poderia ver onde esta o meu erro ( ou erros ).... rss.. obrigado...!!!!


cpp code
#include <16F877A.h>
#use delay (clock=4000000)

#fuses HS, NOLVP, NOWDT, PUT, BROWNOUT

#use fast_io(A)
#use fast_io(B)

#define botao PIN_A4 //push buttom pro gnd. não esquecer do pullup
#define led PIN_B0 //sua variável 'a' como led p.ex.


unsigned char a=0;
unsigned char contadorBotao; // VARIAVEL PARA CONTAGEM DO BOTAO

//int timer com resolução de 100 ms, digamos....
void rti_timer(void)

{ // FUNÇÃO INICIA PERSSIONAMENTO DO BOTAO

if (!input(botao)) contadorBotao++; // S/O BOT PRESS INCREM VARI CONTADOR BOTAO

else contadorBotao=0; // SE NAO O CONTADOR VAI A ZERO
}
unsigned char le_tecla(void) // FUNÇÃO LER A TECLA
{
unsigned char b=0; // CRIA VARIAVEL B=0
contadorBotao=0; //CONTADOR VAI A ZERO NOVAMENTE

while(input(botao)) //pressione
while (!input(botao) && contadorBotao<20) //2 seg de tecla pressionada=enter

if (contadorBotao>=20)
{
a=1;//entrou no menu. Pode...
output_bit(led,a);
while(!input(botao)) //...tirar o dedo do botão
contadorBotao=0; //pra garantir
while(contadorBotao<20) //2 seg de tecla pressionada=enter
{
while(input(botao)) //pressione
while (!input(botao) && contadorBotao<20) //2 seg de tecla pressionada=enter
b++;
}
}
a=0;//saiu
while(!input(botao)) //tira o dedo do botão pow
return b; //numero de vezes de botão pressionado
}
void main(void)
{
set_tris_B(0b00000000);
output_B(0b00000000);
set_tris_A(0b00010000);

{
unsigned char t;

for(;;)
{

t=le_tecla();

if (t==1) output_bit(pin_b2,1);//funcao1();

if (t==2) output_bit(pin_b3,1);//funcaox();
}
}
}
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor andre_luis » 07 Jul 2014 22:04

Agora que você postou o fluxograma ficou bem claro pra mim o que você tá precisando, que é um meio de entrar num modo de configuração e depois sair, mantendo o estado das saidas programadas no modo de configuração, interessante...

Bom, desconsidera o que postei anteriormente, e avalia essa nova implementação abaixo:

cpp code
#define TECLA_MODO_PADRAO               1
#define TECLA_MODO_MENU ~TECLA_MODO_PADRAO

#define TEMPO_3_SEGUNDOS xxxx // xxxx definido empiricamente

char ModoOperacaoTecla = TECLA_MODO_PADRAO ;
int TempoDeAcionamento = 0 ;
char contLED = 0 ;

//////////////////////////////////////////////////////////////////////
void AnalisaTeclaPressionada ( void )
{
if (input(botao)) // ENQUANTO SEGURO O BOTÃO APENAS MEDE O TEMPO
{
TempoDeAcionamento++ ;
DelayMS ( 1 ) ; // DELAY DE ALGUNS MILISEGUNDOS PODE SER NECESSARIO, AVALIAR...
}
else // BOTAO FOI LIBERADO, DECIDE A FUNCAO SELECIONADA
{
if ( TempoDeAcionamento < TEMPO_3_SEGUNDOS )
{
switch ( ModoOperacaoTecla )
{
case TECLA_MODO_PADRAO :
LED8 = ~LED8 // Realiza toggle do LED
break ;
case TECLA_MODO_MENU :
switch ( contLED++ )
{
Case 1 : LED2 = 1 ; break ;
Case 2 : LED3 = 1 ; break ;
Case 3 : LED4 = 1 ; break ;
Case 4 : LED5 = 1 ; break ;
Case 5 : LED6 = 1 ; break ;
Case 6 : LED7 = 1 ; break ;
Case 7 : contLED = 0 ; LED7=0; LED6=0; LED5=0; LED4=0; LED3=0; LED2=0 ; break ;
}
break ;
}
}
else \\ TempoDeAcionamento >= TEMPO_3_SEGUNDOS
{
switch ( ModoOperacaoTecla )
{
case TECLA_MODO_PADRAO : LED1 = 1 ; break ;
case TECLA_MODO_MENU : LED1 = 0 ; break ;
}
ModoOperacaoTecla = ~ModoOperacaoTecla ; // Alterna modo de operação
}
TempoDeAcionamento = 0 ;
}
}

//////////////////////////////////////////////////////////////////////
void main()
{
set_tris_B(0b00000000);
output_B(0b00000000);
set_tris_A(0b00010000);
while(true)
{
AnalisaTeclaPressionada() ;
}
}



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 08 Jul 2014 00:50

Óla André.

Esse parece que vai funcionar. Só não consegui porue esto morrendo de sono. Durante a adaptação para o meu notei que nos SWITCHES CASE tem as seleções entre numero Zero e Um.. Mas essa função Switch não funciona somente se for 1,2 3,4 5 etc.. ? Não estou certo ainda mas até agora ficou piscando todos os leds.. Amanhã eu pego com mais calma e vejo o que mais preciso fazer .. Obrigadão pela força..
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 10 Jul 2014 00:40

Oi Pessoal..

Só para não esquecer.. Aproveitei as ferias forçadas desses dias e estou brigando aqui com o ultimo codigo que o Andre sugeriu. Eu to vendo que
no Switch ( tem um ++ ) e acho que é isso que não permite pressionar o botao para escolher uma posição entre os (cases ) eles ficam correndo
como se fosse um sequencial, mas acho que fica executando uma a uma em um loop.

Será que estou certo ??

Eloy...
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor andre_luis » 10 Jul 2014 12:32

Lembrou de implementar o debounce ?


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 10 Jul 2014 16:46

Eu acertei o tempo no define (#define TEMPO_3_SEGUNDOS xxxx ) e tentei alguns tempos no (debouce) , mas não sitriu nenhum efeito..tambem fiz uns acertos para adaptar para o codigo ao CCS. depois que eu simulei no Proteus e tambem coloquei numa placa que tenho só apra fazer esse codigo notei que ficam correndo em sequencia sem apertar nenhum botao.. Não consegui mudra nada porque queri ver antes com voce, mas hoje a noite eu pego ele de novo.. Obrigado..
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor andre_luis » 10 Jul 2014 19:12

Tem como postar no youtube o que tá acontecendo com os LEDs ?
Quanto ao debounce, ajustando o Delay de 1ms para algo maior talvez possa ajudar...

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: BOTAO COM MAIS DE UMA FUNÇÃO

Mensagempor eloyfm » 10 Jul 2014 22:54

Tentei de tudo, mas não consegui fazer funcionar..
Assim que liga o power o led 8 fica piscando sem parar. Sò para quando aperta o Botao. A parte quando segura mais de 3 Segundos não funciona.
Pode ser que eu tenha feito algum erro pois tive ue converter para usar no CCs.
Não sei como fazer o video para colocar o youtube.

obrigado...
eloyfm
Bit
 
Mensagens: 37
Registrado em: 03 Jul 2014 14:29

AnteriorPróximo

Voltar para PIC

Quem está online

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

cron

x