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
Tags:
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
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por