Página 1 de 1

Incremento e decremento de variável - RESOLVIDO

MensagemEnviado: 25 Nov 2008 15:21
por r.bertini
Olá pessoal,

Fiz o seguinte programa no mikroc:
Código: Selecionar todos
/************ENTRADAS***********/
#define bt_ciclos (porta.f1)
#define bt_10s (porta.f2)
#define bt_20s (porta.f3)
#define bt_30s (porta.f4)
/*************SAÍDAS*********/
#define rele (portb.f7)
#define led1 (portb.f1)
#define led2 (portb.f0)
/********Configurações*******/
void configs()
{
cmcon=0x07;
option_reg=0x80;
intcon=0x00;
trisa=0x1E;
trisb=0x00;
portb=0;
}
int ciclos=0;
void main()
  {
  configs();
  do
  {
    if(bt_ciclos==0)
    {
    ciclos++;
    }
    else if((bt_10s==0)&&(ciclos!=0))
    {
    while(ciclos!=0)
    {
    rele=1;
    delay_ms(10000);
    rele=0;
    delay_ms(10000);
    ciclos--;
    }}
    else if((bt_20s==0)&&(ciclos!=0))
    {
    while(ciclos!=0)
    {
    rele=1;
    delay_ms(20000);
    rele=0;
    delay_ms(20000);
    ciclos--;
    }}
    else if((bt_30s==0)&&(ciclos!=0))
    {
    while(ciclos!=0)
    {
    rele=1;
    delay_ms(30000);
    rele=0;
    delay_ms(30000);
    ciclos--;
    }}
  }while(1);
  }

Porém ao pressionar 1x o bt_ciclos e depois pressionar o bt_10s ou bt_20s ou bt_30s ele fica executando infinitamente o processo.
O que será que eu fiz de errado?

vlw

MensagemEnviado: 25 Nov 2008 15:30
por ffcprog
o mikroC não se da bem com delays muito longos.
E observe que tem uma lógica incorreta... "ou incorretamente correta"?!?!

MensagemEnviado: 25 Nov 2008 15:53
por r.bertini
ffcprog escreveu:o mikroC não se da bem com delays muito longos.
E observe que tem uma lógica incorreta... "ou incorretamente correta"?!?!

Já reduzi o delay para 1s, 2s e 3s e mesmo assim não sai do laço.

Qual seria a lógica incorretamente correta?

vlw

MensagemEnviado: 25 Nov 2008 17:21
por guest2003
Veja que voce esta num loop infinito...

Lembre-se que o processador é veloz :)

Quando você pressiona o botão ciclos ele acaba passando varias vezes por ali enquanto você não solta o botão...

Vamos supor que você pressione o botão rapidamente por meros 200ms... e vamos imaginar que seu loop demore 1ms para ser completado... veja que nesta leve pressionada você já vai ter 200 na variavel ciclos...

é isso

[]'s

MensagemEnviado: 25 Nov 2008 17:26
por guest2003
Coloca isso que deve funcionar seu projeto...

Código: Selecionar todos
    if(bt_ciclos==0)
    {
      ciclos++;
      delay_ms( 100 ); //tempo para bounce da chave
      while ( !bt_ciclos ); //fica aqui até soltar o botão
    }


[]'s

PS: Só uma dica, você pode comparar os outros botões e carregar um valor de delay numa variavel, ai vai para uma rotina padrão de pulsar o rele com o tempo que estiver na variavel.

MensagemEnviado: 25 Nov 2008 21:31
por Jeovadj
somente para facilitar com leitura de teclas

Utilize a Função Button para ler uma entrada.
sintaxe:

Button( port, pin, time, estado_de_ativação);

port = port onde esta ligado a tecla, pode ser PORTA, PORTB, PORTC, PORTD ou PORTE.
pin = é o pino onde esta ligado a tecla no PIC, pode ser de 0 a 7.
timer = tempo de debounce em escala de milisegundos.
estado_de_ativação = determina se a tecla vai ser ativada em nível 0 ou em 1.

Exemplo:
button (portb, 1, 10, 0)
a tecla que será lida está conectada ao PORTB (RB0), delay de debounce de 10 milisegundos e acionada em nível lógico 0.

A função retorna 1 se pressionada a tecla e 0 se não foi pressionada.

A função button automaticamente configura os respectivo port como entrada.

Veja exemplo do HELP do Mikroc:

Código: Selecionar todos
    do {
  if (Button(&PORTB, 0, 1, 1)) oldstate = 1;
  if (oldstate && Button(&PORTB, 0, 1, 0)) {
    PORTD = ~PORTD;
    oldstate = 0;
  }
} while(1);

MensagemEnviado: 25 Nov 2008 21:45
por r.bertini
guest2003 escreveu:Coloca isso que deve funcionar seu projeto...

Código: Selecionar todos
    if(bt_ciclos==0)
    {
      ciclos++;
      delay_ms( 100 ); //tempo para bounce da chave
      while ( !bt_ciclos ); //fica aqui até soltar o botão
    }


[]'s

PS: Só uma dica, você pode comparar os outros botões e carregar um valor de delay numa variavel, ai vai para uma rotina padrão de pulsar o rele com o tempo que estiver na variavel.



Valeu pela ajuda!!!
Funcionou perfeito agora.


Valeu Jeovadj você já solucionou outro problema que ia ter após a solução desse, o efeito "bounce" .
Já conhecia essa função button, só não utilizei pois ainda é um programa teste.

Obrigado a todos