Ir ao conteúdo

Problemas com pic 16f628a


adrianoliz9

Posts recomendados

Postado

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);

}

}

}

}

Postado
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);

Postado
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;

Postado

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

Postado

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.

Postado

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

Postado

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

}

Postado

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!

Postado

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.

Postado

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

Postado

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?

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!