Ola galera...a duvida é referente a linguagem C compilador CCS para PIC.

vou expor um trecho aqui somente p ilustrar  e logo apos dito a pergunta..ok

while(true)
{
if (input(botao))
{ if (++ x > 1)
{x = 0;}
do{}
while (input(botao))
}
If (x == 1)
{
printf(lcd_putc,"\fteste 0 \nteste 1 ");
delay_ms(1500);

printf(lcd_putc,"\fteste 2 \nteste 3 ");
delay_ms(1500);

}

else

{

printf(lcd_putc,"\fteste 4 \nteste 5 ");
delay_ms(100);

          }

}

incluo o delay para tirar as piscadas q ocorrem na pratica ao olhar ao lcd, desta maneira eles de certa forma nao atrapalham na leitura do botao q seria um pino de entrada..a duvida é referente se desejaria aumentar esse delay para 1500ms. ai vou ter a leitura do botao drasticamente alterado, tendo q ficar com o botao pressionado muito tempo para esperar q o programa fazer o loop e ler o botao..

como contornar essa questao de atualizar o lcd e assim eliminar o delay da historia.

obrigado

Exibições: 951

Responder esta

Respostas a este tópico

Oi CL, bom dia.

O comando, (estrutura de controle),  " while ", está escrito errado.

Rui

Oi CL, não entendi certas partes do seu code.

veja abaixo.

{
  while(true)
 {
   if (input(botao))
   {
     if (++ x > 1)
     {
       x = 0;
     }
     do{}                        //  ???????
     while (input(botao))  //   ?????????
   }
   If (x == 1)
   {
     printf(lcd_putc,"\fteste 0 \nteste 1 ");
     delay_ms(150);
     printf(lcd_putc,"\fteste 2 \nteste 3 ");
     delay_ms(150);
   }
  }

}

Rui

realmente erro meu.. corrigi acima e adicionei mais um trecho... td ele é questao de tentar explicar a duvida.. Por exemplo veja q qd x == 0 ; a leitura nao é interferida, pois o tempo de loop p retornar a entrada do botao é rapida.. ,agora qd x ==1; veja q peço p intercalar uma msg na tela com valor entre msgs de 1 e 1/2 segundos.. entao  nessa hora  a leitura do botao é muito prejudicada pois pelo loop  demora aproximadamente 3 segundos ,, entao na pratica tem q ficar 3 segundos com botao apertado.. essa é o problema como reverter de forma simples?

CL, 

use interrupt pra verificar se o botão foi pressionado.

Rui

Boa dica.. no momento funcionou apenas com o pino b0, ainda estou tentando fazer com todo o portb , logo mais volto dizendo se consegui. obrigado

CL, li seu problema varias vezes e não consegui entender o seu problema.

Só sei que não iniciou o valor do x, do{} está vazio, while (input(botao)) não faz nada, não tenho ideia de como o x chegará a ter valor = 1, e como quer que o botão funcione.

  'Eiju

Ola CEI. O grande problema de ter entendido foi culpa minha por não ter comentado linha por linha. Assim q tiver no PC vou fazer. Esse código foi escrito direto no tópico,nao é um código q vou usar, apenas quero aprender.. mas é bem simples... tenho uma variável x q pode ter valor 0 ou 1 if (++ x > 1)
{x = 0;}.comandado pelo botao. if (input(botao))
Essa expressão do{} while (input(botao)) serve para evitar deboucing.. no CCS funciona muito bem.
Qd x receber valor 0, o display mostra uma mensagem e quando tiver valor 1 alternará outra msg. Nesta última tem um delay p dar essa alteração de mensagens e aí está o problema pois o delay altera a leitura do botao, tenho q ficar com ele 3 segundos apertado na pior da hipótese kk. Usei a interrupção do pino b0 e funcionou, pq independente da hora q aperto o botao ele faz o loop da mensagem e cai fora, melhor seria se caísse fora da msg qd x=1 imediatamente ao apertar o botao.. o RV comentou sobre usar interrupção em td portb, mas não consegui..
Espero q entendesse o problema..

Agora eu entendi uns 80% mas creio que sei como te ajudar.

Não conheço a interrupção do PIC, mas conheço interrupção de outros microcontroladores e não vou me arriscar a dar dica errada neste sentido.

Portanto, a estratégia alternativa (famosa gambiarra) é a de fazer um loop principal com as verificações de forma a não prender o loop, como fiz em vários códigos que acendiam 10 leds por 1, 2 ou whatever segundos.

Que tal?

#define TEMPO_BOUNCE 10 // bounce dura menos de 100 milissegundos
#define TEMPO_MSG_1 150 // Mensagem 1 dura 1500 milissegundos
#define TEMPO_MSG_2 150 // Mensagem 2 dura 1500 milissegundos

int botao_bounce = -1; // indica o momento que o botao foi apertado
boolean botao_apertado = false; // estado corrente do botao
int tempo_mensagem1 = -1; // tempo da mensagem "\fteste 0 \nteste 1 "
int tempo_mensagem2 = -1; // tempo da mensagem "\fteste 2 \nteste 3 "

while(true) {
  if (input(botao) && (!botao_apertado)) { // se apertar o botao e ele nao estava apertado
    if(botao_bounce < 0) { botao_bounce = 0; } // inicia a contagem de tempo do anti bounce
    else if {botao_bounce >= TEMPO_BOUNCE} { // passaram-se 100 milissegundos pois delay = 10 milissegundos
      botao_bounce = 0;
      printf(lcd_putc,"\fteste 0 \nteste 1 ");
      tempo_mensagem1 = 0; // inicia o temporizador da mensagem 1
    } else { ++botao_bounce } // senao incrementa 10 milissegundos enquanto ocorre o bounce
  }
  if(tempo_mensagem1 > -1) { ++tempo_mensagem1; } // se estiver correndo o tempo da mensagem 1, incrementa contador
  if(tempo_mensagem1 >= TEMPO_MSG_1) { // se o tempo terminou 150 * 10 milissegundos
    printf(lcd_putc,"\fteste 2 \nteste 3 "); // mostra mensagem 2
    tempo_mensagem2 = 0; // inicia o temporizador da mensagem 2
    tempo_mensagem1 = -1; // reseta o temporizador da mensagem 1
  };
  if(tempo_mensagem2 > -1) { ++tempo_mensagem2; } // se estiver correndo o tempo da mensagem 2, incrementa contador
  if(tempo_mensagem2 >= TEMPO_MSG_2) { // se o tempo terminou 150 * 10 milissegundos
    printf(lcd_putc,"\fteste 4 \nteste 5 "); // mostra mensagem 3
    tempo_mensagem2 = -1; // reseta o temporizador da mensagem 1
  };
  
  delay_ms(100); // a cada loop, o delay é de 10 milissegundos
}

ola EJI.  entendi perfeitamente  a gambiara.. acredito q vai funcionar bem,, no momento acho q tenho  a duvida resolvida.. obrigado pessoal.

Oi CL, bom dia.

E aí funfou?

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço