Incremento e decremento de variável - RESOLVIDO

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Incremento e decremento de variável - RESOLVIDO

Mensagempor r.bertini » 25 Nov 2008 15:21

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
Editado pela última vez por r.bertini em 25 Nov 2008 21:45, em um total de 1 vez.
R.Bertini
__________________________________
#include<stdio.h>
main()
{
printf("\n R.Bertini");
}
r.bertini
Bit
 
Mensagens: 28
Registrado em: 30 Ago 2008 01:43

Mensagempor ffcprog » 25 Nov 2008 15:30

o mikroC não se da bem com delays muito longos.
E observe que tem uma lógica incorreta... "ou incorretamente correta"?!?!
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor r.bertini » 25 Nov 2008 15:53

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
R.Bertini
__________________________________
#include<stdio.h>
main()
{
printf("\n R.Bertini");
}
r.bertini
Bit
 
Mensagens: 28
Registrado em: 30 Ago 2008 01:43

Mensagempor guest2003 » 25 Nov 2008 17:21

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
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor guest2003 » 25 Nov 2008 17:26

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.
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor Jeovadj » 25 Nov 2008 21:31

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);
Jeovadj
Bit
 
Mensagens: 6
Registrado em: 13 Out 2006 22:25
Localização: Brasília - DF

Mensagempor r.bertini » 25 Nov 2008 21:45

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
R.Bertini
__________________________________
#include<stdio.h>
main()
{
printf("\n R.Bertini");
}
r.bertini
Bit
 
Mensagens: 28
Registrado em: 30 Ago 2008 01:43


Voltar para PIC

Quem está online

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

cron

x