Ir ao conteúdo
  • Cadastre-se

Comando IF - dúvida


avinicius

Posts recomendados

Boa tarde.

Segue abaixo, um comando bem simples com if...

Quando compilo, não há nenhum erro.

Só que quando vou simular no Proteus,quando pressiono um dos botões não seta os leds.

Alguém poderia me ajudar.

obg


#include <16f628a.h> //obigatório, endereço do chip p/ o compilador
#fuses nolvp // desabilitando baixo nível de programação
#fuses nowdt // desabilitando relógio cão de guarda
#fuses xt // cristal = a 4mhz

#use delay (clock=4000000)

//conf.botões
#define bt1 PIN_A0
#define bt2 PIN_B0
//conf.leds
#define led1 PIN_A1
#define led2 PIN_B1

void main ()
{
while(1)
{
if(input(bt1==1)){
output_high(led1);

}

if(input(bt2==1)){
output_high(led2);

}

}
}

Link para o comentário
Compartilhar em outros sites

olá amigo, o erro está aqui ó:

void main ()

{

while(1)

{

if(input(bt1==1)){ <---------------------- o correto é assim: if(input(bt1) == 1) , nao pode fazer uma verificação dentro do input ... tem que ser fora ...

output_high(led1);

}

if(input(bt2==1)){<------------------ a mesma coisa aqui ... if(input(bt2) == 1)

output_high(led2);

}

}

}

Abraços ...

Link para o comentário
Compartilhar em outros sites

Que eu saiba se escreve assim:

#include <16f628a.h> //obigatório, endereço do chip p/ o compilador
#fuses nolvp // desabilitando baixo nível de programação
#fuses nowdt // desabilitando relógio cão de guarda
#fuses xt // cristal = a 4mhz

#use delay (clock=4000000)

//conf.botões
#define bt1 PIN_A0
#define bt2 PIN_B0
//conf.leds
#define led1 PIN_A1
#define led2 PIN_B1

void main ()
{
while(1)
{
if([B]input(bt1)[/B]){
output_high(led1);

}

if([B]input(bt2)[/B]){
output_high(led2);

}

}
}

Na condição IF se o valor já for boleano não precisa usar o ==.

E se você usar, deve colocar fora dos parêntesis do input().

Link para o comentário
Compartilhar em outros sites

Demorei para postar e o peticionário já foi atendido.:D

Estou dizendo que quando o resultado na operação já é boleano não precisa colocar ==.

Exemplo:

Int8 x

If(x==45) //ai precisa do ==

Boolean x

IF(x) //não precisa do ==, equivalente a if(x==1)

IF(!x) // x negado, equivalente a if(x ==0)

Link para o comentário
Compartilhar em outros sites

Nessa outra...


#include <16f628a.h>
#fuses xt,nowdt,put,nolvp,intrc_io
#use delay(clock=4000000)

int q1,q2,q3;

set_adc_ports(no_analogs);//desabilitando o modo comparador *)

#int_TIMER1 //Interrupção do Timer1
void varredura_timer1()//Funcão que deverá ser feita a cada interrupção
{
q1++; //Variável q incrementada a cada estouro do Timer1
q2++;
q3++;

if (q1 == 4)//se o timer1 estourar 4 vezes,ou seja se q1 for igual a 4 estouros do timer1 equivalente a 0,500x4=2seg,executa a função if,faz o led piscar a cada 2 segnds.
{
output_toggle(PIN_A2);
q1=0;
}

if (q2 == 6)//enquanto zera q1,essa contagem começa em 4 estouros,quando atinge os 6 ....6x0,500=3sgnds,executa a função if,faz o led piscar a cada 3 segnds.
{
output_toggle(PIN_A3);
q2=0;
}

if (q3 == 10)//enquanto zera q2,essa contagem começa em 6 estouros,quando atinge os 10 ....10x0,500=3sgnds,executa a função if,faz o led piscar a cada 5 segnds.
{
output_toggle(PIN_A4);
q3=0;
}

set_timer1 (3036); //Preload do Timer1,a cada 500ms dá um ciclo completo,ou seja a cada 500ms incrementa++ 1 nas variáveis q1,q2 e q3.

}


void main()
{
output_b(0); //para garantir que o portb não comece flutuando,e sim em nível baixo
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global
set_timer1 (3036); //para estourar a cada 0.5 segundos
while(true);
}

Precisaria implementar um botão, no qual, se mesmo eu segurando-o com o dedo o programa não iniciaria, e sim , apenas quando soltasse.

Tentei com uma variável char...

mas não tinha dado certo..

Esse programa acima , não o fiz sózinho.

mas sim , com ajuda de alguns membros daqui.!

até ai tudo bém...!

O programa acima funciona assim.

Tenho 3 leds.

1,2 e 3

Cada um irá piscar ao mesmo tempo , mas em tempos diferentes.

Foi utilizado,o timer, e uma variável para cada led.

Mas o esquema , do botão...

Se alguém tiver alguma dica.

abraços

obg

Link para o comentário
Compartilhar em outros sites


.....
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global
set_timer1 (3036); //para estourar a cada 0.5 segundos
while(!botao); //aguarda o botão ser precionado
while(botao); //aguarda o botão ser solto
}

O programa inicia sózinho sem ser pressionado o botão

mas vou tentando.

obrigado

Link para o comentário
Compartilhar em outros sites

Tente assim:

16f628a_led_timer_1_varios.png

Código:

#include <16f628a.h>           

#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES INTRC_IO
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!

#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection


#use delay(clock=4000000)

int m,p,q;

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
p++;
m++;
if (q == 4)
{
output_toggle(PIN_B0);
q=0;
}

if (p == 6)
{
output_toggle(PIN_B1);
p=0;
}

if (m == 10)
{
output_toggle(PIN_B2);
m=0;
}

set_timer1 (3036); //Preload do Timer1
}

void main()
{
output_b(0);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8

enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global
set_timer1 (3036);



while (TRUE)
{
if (input(PIN_B7))
{
disable_interrupts(INT_TIMER1);

do
{
} while (input(PIN_B7));
}
else
{
enable_interrupts(INT_TIMER1);

do
{
} while (!input(PIN_B7));
}
}
}

Falou

Link para o comentário
Compartilhar em outros sites

Mesma coisa....

Continua iniciando sózinho.

=/

mas obrigado..!!

Você deve colocar isso logo depois do main(), antes de configurar o timer.

Tentei desse modo...mas também não deu....

assim também..


void main()
{
while(!botao) //aguarda o botão ser precionado
{
disable_interrupts(INT_TIMER1);
}

while(botao) //aguarda o botão ser solto
{
enable_interrupts(INT_TIMER1);
}
output_b(0); //para garantir que o portb não comece flutuando,e sim em nível baixo
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global
set_timer1 (3036); //para estourar a cada 0.5 segundos
}

Mas também nem inicia...

continuo tentando...!

obg

Link para o comentário
Compartilhar em outros sites

Então....

Sim.....

Eu gostaria de setar o programa com 1 botão.Para iniciar a varredura.

Mas tem as seguintes condições.

Eu tenho que pressioná-lo, e soltá-lo.Não é só pressionar pra iniciar a varredura.

E se pressionado,o tempo que quiser.

Ele só irá setar a varredura se soltá-lo.

Tentei com um flag.

mas também não obtive resultado.

mas... é isso.

obg.!

Link para o comentário
Compartilhar em outros sites

Veja se é isso:

#include <16f628a.h>           

#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES INTRC_IO
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!

#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection


#use delay(clock=4000000)

int m,p,q;

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
p++;
m++;
if (q == 4)
{
output_toggle(PIN_B0);
q=0;
}

if (p == 6)
{
output_toggle(PIN_B1);
p=0;
}

if (m == 10)
{
output_toggle(PIN_B2);
m=0;
}

set_timer1 (3036); //Preload do Timer1
}

void main()
{
output_b(0);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8

disable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global
set_timer1 (3036);



while (TRUE)
{
if (input(PIN_B7))
{
disable_interrupts(INT_TIMER1);
do
{
} while (input(PIN_B7));
enable_interrupts(INT_TIMER1);
}
}
}

Falou

Link para o comentário
Compartilhar em outros sites

Sucesso..!


void main()
{
output_b(0);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8

disable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global
set_timer1 (3036);



while (TRUE)
{
if (input(PIN_B7))
{
disable_interrupts(INT_TIMER1);
do
{
} while (input(PIN_B7));
enable_interrupts(INT_TIMER1);
}
}
}

Nesse laço do while que você fez....

O interessante também, é que você ja desabilitou o int.timer1 na rotina principal, e só habilitou na do while...

Seria assim..então....

//

Enquanto for verdade;

Se pressionado b7.

então.

desabilita int.timer1,nesse momento você criou um laço no do {};

que agora a varredura segue para o outro while,mas não entendi por que outro input, e porque não um output? b7 enable......

Link para o comentário
Compartilhar em outros sites

Funciona assim:

O código tá lá conrrendo dentro do while (true).

Até aí o PIC nao faz nada.

Se você apertar o Botão no PINO B7, if (input_B7)... ele vai entrar no laço do IF.

Aí ele vai desabilitar a interrupção caso ela esteja ligada.

o do {} quer dizer que o PIC ficará preso nessa parte enquanto o botao estiver precionado. Por isos tem outro input. Veja que o while faz parte do do {}!

do

{} enquanto (botao pressionado).

Se você soltar o botao, o PIC sai desse loop e ativa a interrupção.

Só isso.

Falou

Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!