Ir ao conteúdo

Dúvida com while e If


Evertton Laddaga

Posts recomendados

Postado

Olá galera, to desenvolvendo um projeto da faculdade em q um sensor e uma interface gráfica (PC) controla um motor, no entanto não esta dando muito certo quando eu uso os 2 no mesmo código. vou postar a parte que esta dando erro e explicar melhor.

void main()

{

int X, Y;

float t, valor_temp, velocidade;

setup_adc_ports(AN0);

setup_adc(ADC_CLOCK_INTERNAL);

set_adc_channel(0);

delay_ms(76);

lcd_ini();

delay_ms(1000);

printf (lcd_escreve,"\f SENSOR");

// printf("Sistemas digitais");

while (true)

{

t = read_adc();

valor_temp = 100 * (5.0 * t / 1023.0 );

lcd_pos_xy (1, 2);

printf (lcd_escreve, "Temp: %2.1f %c C", (float)valor_temp, 0b11011111);

printf("%2.1f %c", (float)valor_temp, 0);

X=getc();

if(X=='N')

{

if (valor_temp>=30 & valor_temp<=35)

{

output_low(pin_d2);

delay_ms(50); //largura de pulso

output_low(pin_d1);

delay_ms(100-50); //complemento do periodo

output_high(pin_d1);

}

if (valor_temp>35 & valor_temp<40)

{

output_low(pin_d2);

delay_ms(75); //largura de pulso

output_low(pin_d1);

delay_ms(100-75); //complemento do periodo

output_high(pin_d1);

}

if (valor_temp>=40)

{

output_low(pin_d2);

delay_ms(100); //largura de pulso

output_low(pin_d1);

delay_ms(100-100); //complemento do periodo

output_high(pin_d1);

}

if (valor_temp <30)

{

output_low(pin_d1);

delay_ms(75); //largura de pulso

output_low(pin_d2);

delay_ms(100-75); //complemento do periodo

output_high(pin_d2);

}

}

else if (X=='C' ||X== 'A' || X=='B' )

{

switch(X){

case 'A':

output_low(pin_d2);

delay_ms(0); //largura de pulso

output_low(pin_d1);

delay_ms(100-0); //complemento do periodo

output_high(pin_d1);

break;

case 'B':

output_low(pin_d2);

delay_ms(0); //largura de pulso

output_low(pin_d1);

delay_ms(100-0); //complemento do periodo

output_high(pin_d1);

break ;

Case 'C':

output_low(pin_d2);

delay_ms(0); //largura de pulso

output_low(pin_d1);

delay_ms(100-0); //complemento do periodo

output_high(pin_d1);

break;

}

}

}

Então galera quando eu faço isso meu display que mostra a temperatura para de atualizar a temperatura... acontece como se o while estivesse esperando um comando pra rodar, gostaria de saber como posso fazer pra mesmo que eu não mande nem um comando o while continue fazendo o laço permanentemente.

Postado

Bom, vejo que utiliza o CCS para programar.

Poste a parte inicial de configuração do PIC. Pois do jeito que está não consigo verificar qual PIC você usa, qual a velocidade do clock e nem como configurou a serial. Ahh e o ADC, é em 8 ou 10 bits?

E tente utilizar a identação. Veja como aqui e aqui.

Mas já vi que você está usando um LM35 (sensor de temperatura). E também já vi o erro.

Nessa linha:

X=getc();

você diz que X irá receber o valor do que estiver na serial, mas e se não tiver nada na serial? Ele fica esperando pra sempre. Por isso o código trava.

Vou realizar algumas mudanças, não muhitas pois a essência dos eu código está corrreta.

E vou testar e postar o resultado.

EDIT:

Fiz um teste aqui e o código se comportou de forma que você espera.

Veja que chutei o PIC utilizado.

Tive que trocar os pinos de saída pois você utilizava os pinos D1 e D2. Mas meu LCD utiliza esses pinos.

Fiz algumas mudanças na estrutura pois a sintaxe estava incorreta/incompleta.

E principalmente: Usei identação.

Circuito:

16F877A_serial_letras_pulsos.png

Código:

#include <16F877A.h>

#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc > 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP
#FUSES NOCPD //No EE protection

#use delay(clock = 4000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

#define frame_time 500

#include <lcd.c>

char x;
float t, valor_temp, velocidade;

void main()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);

set_adc_channel(0);
delay_us(20);
lcd_init();

printf (lcd_putc,"\f SENSOR");
// printf("Sistemas digitais");

while (true)
{
t = read_adc();
valor_temp = 100 * (5.0 * t / 1023.0 );
printf (lcd_putc, "\fTemp: %2.1f %c C\nTecla:%c",valor_temp, 0b11011111,x);
delay_ms (200);

if (kbhit())
{
X=getc();

if(X == 'N')
{
if ((valor_temp >= 30) && (valor_temp<=35))
{
output_low(PIN_B2);
delay_ms(50); //largura de pulso
output_low(PIN_B1);
delay_ms(100-50); //complemento do periodo
output_high(PIN_B1);
}
if ((valor_temp > 35) && (valor_temp < 40))
{
output_low(PIN_B2);
delay_ms(75); //largura de pulso
output_low(PIN_B1);
delay_ms(100-75); //complemento do periodo
output_high(PIN_B1);
}
if (valor_temp >= 40)
{
output_low(PIN_B2);
delay_ms(100); //largura de pulso
output_low(PIN_B1);
delay_ms(100-100) ; //complemento do periodo
output_high(PIN_B1);
}
if (valor_temp < 30)
{
output_low(PIN_B1);
delay_ms(75); //largura de pulso
output_low(PIN_B2);
delay_ms(100-75); //complemento do periodo
output_high(PIN_B2);
}
}

else if ((X == 'C') || (X == 'A') || (X == 'B'))
{
switch(X)
{
case 'A':
{
output_low(PIN_B2);
delay_ms(0); //largura de pulso
output_low(PIN_B1);
delay_ms(100-0); //complemento do periodo
output_high(PIN_B1);
break;
}

case 'B':
{
output_low(PIN_B2);
delay_ms(0); //largura de pulso
output_low(PIN_B1);
delay_ms(100-0); //complemento do periodo
output_high(PIN_B1);
break ;
}

Case 'C':
{
output_low(PIN_B2);
delay_ms(0); //largura de pulso
output_low(PIN_B1);
delay_ms(100-0); //complemento do periodo
output_high(PIN_B1);
break;
}
}
}
}
}
}

Falou

Postado

Isso ajuda a melhorar o problema do getc(), essa parte do código está pronta na ajuda do compilador CCS (só pesquisar por "kbhit"), só adaptar como achar melhor


short timeout_error = false;

char timed_getc()
{
long timeout;
timeout_error = false;
timeout=0;

while(!kbhit()&&(++timeout<50000)) // 1/2 second
delay_us(10);

if(kbhit())
return(getc());

else
{
timeout_error=TRUE;
return(0);
}
}

Onde está "X = getc();"

Substitua por algo como:


X = timed_getc();

if(timeout_error)
{
//Passou 500ms sem receber dado algum
}
else
{
//Recebeu algum dado
}

Postado

O que o colega MoreOne postou acima é bem interessante pois você pode complementar o código que fiz com o código dele.

Nesse caso, você evita que o código trave caso a comunicação serial seja interrompida.

Há outras formas de obter o mesmo resultado.

Falou

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!