Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Entre para seguir isso  
adrianoliz9

Problemas com pic 16f628a

Recommended Posts

Olá amigos, estou trabalhando num projeto com o pic 16f628a, preciso, que ao pressionar um botão, ele dê um pulso de +- 5 seg numa porta, e um pulso direto em outra, e ao pressionar novamente, desligue o pulso direto, e dê outro pulso de +- 5seg naquela porta, desenvolvi esse programa no CCS, mas ele só realiza um ciclo, não volta ao início após terminar as funções, notei no proteus, que as portas, após o pulso positivo(ponto vermelho no proteus) ficam em descanso negativo(ponto azul), acredito que é isso q está impossibilitando o loop da função, será que é alguma configuração dos #fuses? ou um erro no programa?

#include<16f628a.h>

#use delay(clock=4000000)

#fuses INTRC_IO,NOWDT,PUT,BROWNOUT

#define BOTAO PIN_A0

void main(void)

{ while(true){

if(input(BOTAO)){

if (output_low(PIN_A2)){

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

output_high(PIN_A2);}

else

{

output_low(PIN_A2);

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

}

}

}

}

Editado por adrianoliz9
Colocar letra maiúscula no inicio do título

Compartilhar este post


Link para o post
Compartilhar em outros sites
if (output_low(PIN_A2)){

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

output_high(PIN_A2);}

Aqui ao apertar o botão vai dar o pulso de 3 seg e depois o continuo

Ficaria assim:


int y = 0;

if(botão pressionado)
{
funcao_toque;

}

void funcao_toque(void)
{
do{
output_high(PIN_A2);
output_high(PIN_A1);
delay_ms(3000);
output_low(PIN_A1);
do{
y = 1;
funcao_botao2;
}while(1);
}while(y != 1);
}
void funcao_botao2

do{
if(botao pressionado) // aqui ele verifica pela segunda vez
{
output_low(PIN_A2);
output_high(PIN_A1);
delay_ms(3000);
output_low(PIN_A1);

}
}while(1);

Editado por Angelo Eletronic
arrumar codigo

Compartilhar este post


Link para o post
Compartilhar em outros sites
de que frequencia seria esse pulso?

um pulso de 5v para acionar relês;

Aqui ao apertar o botão vai dar o pulso de 3 seg e depois o continuo

Ficaria assim:


int y = 0;

if(botão pressionado)
{
funcao_toque;

}

void funcao_toque(void)
{
do{
output_high(PIN_A2);
output_high(PIN_A1);
delay_ms(3000);
output_low(PIN_A1);
do{
y = 1;
funcao_botao2;
}while(1);
}while(y != 1);
}
void funcao_botao2

do{
if(botao pressionado) // aqui ele verifica pela segunda vez
{
output_low(PIN_A2);
output_high(PIN_A1);
delay_ms(3000);
output_low(PIN_A1);

}
}while(1);

obrigado pela ajuda amigo.. tô com algumas dúvidas, esse código que me passou eu compilo no CCS ou em outro soft?

if(botão pressionado) é igual a if(input(botao)), e outra funcao_toque seria main, desde já agradeço pela atenção;

Editado por adrianoliz9
Unir Post seguidos em menos de 24 horas, use a opção editar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Angelo, tento compilar o código no CCS, mas recebo a seguinte mensagem "expecting a declaration" no comando if, onde estou errando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

primeiro, tentei substitui pressionar botão por input(botao), funcao_toque por main, e funcao_toque2 por rotina, e o restante copiei na integra, onde recebi a mensagem do if, tentei também desta outra maneira:

#include<16f628a.h>

#use delay(clock=4000000)

#fuses INTRC_IO,NOWDT,PUT,BROWNOUT

#define BOTAO PIN_A0

int y = 0;

void rotina()

{

do{

if(input(BOTAO))

{

output_low(PIN_A2);

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

}

}while(1);

}

void main(void)

{

do{

if(input(BOTAO))

output_high(PIN_A2);

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

do{

y = 1;

rotina();

}while(1);

}while(y != 1);

}

até consegui compilar, mas na simulação do Proteus não funcionou..

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta: o codigo

#include<16f628a.h>

#use delay(clock=4000000)

#fuses INTRC_IO,NOWDT,PUT,BROWNOUT

#define BOTAO PIN_A0

int y = 0;

int x = 1;

void rotina()

{

x = 0;

do{

if(input(BOTAO))

{

output_low(PIN_A2);

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

}

}while(1);

}

void main(void)

{

do{

if(input(BOTAO))

output_high(PIN_A2);

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

do{

y = 1;

rotina();

}while(x != 1);

}while(y != 1);

}

errei poe esse:#include<16f628a.h>

#use delay(clock=4000000)

#fuses INTRC_IO,NOWDT,PUT,BROWNOUT

#define BOTAO pin_b0

int y = 0;

int x = 1;

void rotina()

{

x = 0;

do{

if(input(BOTAO))

{

output_low(PIN_A2);

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

}

}while(1);

}

void main(void)

{

do{

if(input(BOTAO))

output_high(PIN_A2);

output_high(PIN_A1);

delay_ms(3000);

output_low(PIN_A1);

do{

y = 1;

rotina();

}while(x != 1);

}while(y != 1);

}

TA TUDO ERRADO.

Vou refazer.

Editado por Bcpetronzio
Unir Post seguidos em menos de 24 horas, use a opção editar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É esta mesmo:


void rotina()
{
x = 0;
do{
if(input(BOTAO))
{
output_low(PIN_A2);
output_high(PIN_A1);
delay_ms(3000);
output_low(PIN_A1);
}
}[B][I]while(1);[/I][/B] //Vai ficar aqui eternamente executando o que esta dentro do "Do" e mais nada!!
}

revejam esse código ai!

abs.

Editado por Felipe_Eletronic

Compartilhar este post


Link para o post
Compartilhar em outros sites

codigo funcionando e simulando:

#include "D:\Documents and Settings\NFSMWLAN\Meus documentos\main.h"

#define BOTAO pin_B2

int x1 = 1;

int y = 0;

void rotina2()

{

do{

if(input(BOTAO))

{

output_low(PIN_A2);

output_high(PIN_A1);

delay_ms(100);

output_low(PIN_A1);

y = 1;

}

}while(y != 1);

}

void rotina1()

{

do{

output_high(PIN_A2);

output_high(PIN_A1);

delay_ms(100);

output_low(PIN_A1);

x1 = 0;

rotina2();

}while(x1 !=0);

}

void main()

{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

setup_timer_1(T1_DISABLED);

setup_timer_2(T2_DISABLED,0,1);

setup_comparator(NC_NC_NC_NC);

setup_vref(FALSE);

setup_oscillator(False);

do{

if(input(BOTAO))

{

rotina1();

}

}while(1);

// TODO: USER CODE!!

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Excelente funcionou perfeitamente, só alterei os delays para mais tempo, não sei se chegou a acontecer com você na simulação, mas aqui, algumas vezes tenho q dar dois ou três cliques para ligar ou desligar, a princípio achei que era no proteus, então percebi que para a segunda função (desligar), é necessário um pulso de 3 segundos no botão, agora vou gravar no pic, pra testar na prática, e postar o resultado OK.. muito obrigado mesmo pela força, e pela atenção!

Editado por adrianoliz9

Compartilhar este post


Link para o post
Compartilhar em outros sites

adrianoliz, o que está acontecendo é o problema de bounce, mas não se preocupe ele é bem comum e fácil de resolver, basta você acrescentar um delay de alguns milissegundos após ler o botão e apos esse delay testar novamente se o botão encontra - se apertado.

Mas porque isso acontece?

Bom em poucas palavras quando apertamos uma chave de toque ela leva um tempo até seus contatos pararem de se atritar com isso é gerado um ruido que pode fazer o PIC fazer erroneamente a leitura de um botão, por isso as vezes devemos o apertar mais de uma vez.

abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No primeiro ciclo da simulação do proteus, funciona com apenas um clique, já nas próximas preciso segurar precionado, tentei isso

{

do{

if(input(BOTAO))

delay_ms(200);

if(input(BOTAO))

{

output_high(PIN_A1);

output_low(PIN_A2);

delay_ms(3000);

output_low(PIN_A1);

, mas não mudou, não sei se foi assim que orientou? Editado por adrianoliz9

Compartilhar este post


Link para o post
Compartilhar em outros sites
não foi quase isso, apos o delay você deve testar novamente o botão para saber se ele continua pressionado entendeu?

abs.

não seria então por um if(input(botao)) após o delay novamente? se puder me dar uma dica agradeço..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade se eu aumentar o delay do pino a_2, conforme o valor que eu botar, é o tempo que preciso ficar pressionado o botão para realizar a função desligar, no projeto com delay de 100 ms, funciona com um toque, se o toque for desse mesmo tempo do delay, mas somente após a primeira simulação, será que é no proteus? o que eu poderia alterar no projeto?

Editado por adrianoliz9

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×