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  
David4455

Ajuda Pic 16f628a

Recommended Posts

preciso fazer um ferro com dispositivo de segurança!!!

estou fazendo com dispositivo infrared

ate ai esta tudo certo, porém estou me perdendo um pouco na progamação do pic

estou usando um 16f628A

ele deve funcionar da seguinte forma...

quando a mão cortar o sinal do infrared ele manda um sinal positivo para uma entrada do pic

que deve acionar um optoacoplador ligando o ferro!

quando retirar a mão ira cortar o sinal positivo e o pic tera que contar 30 segundos e desligar o optoacoplador

e tera tmbm um led bicolor q acende o vermelho com a resistencia ligada e o verde com a resistencia deslidada.

Ainda estou aprendendo sobre progamação de pic´s e qualquer ajuda é bem vinda.

Desde já agradeço !!!

so consegui isso por enquanto !!!

#include <16f628a.h>

#use delay(clock=4000000)

#fuses nowdt,hs,put,nobrownout,noprotect,mclr,nocpd,nolvp

void main()

{

while (pin_B5==1)

{

output_high (pin_B1); // liga Optoacoplador

output_high (pin_B2); // liga Led vermelho

}

While (pin_B5==0)

{

delay_ms(3000000); // tempo de espere

output_low (pin_B1); // desliga Optoacoplador

Output_low (pin_B2); // desliga led vermelho

Output_high (pin_B3); // liga Led Vende

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom, na contagem dos 30 segundo, eu aconselho utilizar a interrupção timer do microcontrolador... nada de delay...

outra coisa... não sei se esta é a intenção, mas neste programa quando o cara retirar a mão e o sistema esperar 30 segundos para desligar, se por algum acaso o cara colocar novamente a mão antes dos 30 segundos... neste programa, depois dos 30 segundos o sistema irá dar uma leve piscada no led verde e a resistência vai desligar e ligar rapidamente...

talvez um arranjo melhor dos comandos no programa evite esse tipo de situação...

Compartilhar este post


Link para o post
Compartilhar em outros sites
bom, na contagem dos 30 segundo, eu aconselho utilizar a interrupção timer do microcontrolador... nada de delay...

outra coisa... não sei se esta é a intenção, mas neste programa quando o cara retirar a mão e o sistema esperar 30 segundos para desligar, se por algum acaso o cara colocar novamente a mão antes dos 30 segundos... neste programa, depois dos 30 segundos o sistema irá dar uma leve piscada no led verde e a resistência vai desligar e ligar rapidamente...

talvez um arranjo melhor dos comandos no programa evite esse tipo de situação...

você pode me mostrar como usar interrupção timer do microcontrolador nesse sistema ???

eu ainda sou leigo em comando para pic !!!

consegui fazer esse depois de dias.

Obrigado pela ajuda !

Compartilhar este post


Link para o post
Compartilhar em outros sites

não tenho prática em montar rotinas para esse microcontrolador que voce esta usando...

preciso ler o datasheet com calma para configurar o timer do jeito certo, então amanha eu posto algum código em C neste sentido ...

caso seja algo urgente, aconselho pedir opinião de alguns dos mestres em PIC neste forum...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu jogo uma ideia ,você termina ok?

 #include <16f628a.h>
#fuses nowdt,hs,put,nobrownout,noprotect,mclr,nocpd,nolvp
#use delay(clock=4000000)


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

void main()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while (pin_B5==1)

{
output_high (pin_B1); // liga Optoacoplador
output_high (pin_B2); // liga Led vermelho
}

While (pin_B5==0)

{
if (q==2){

for(i=0;i<30;i++
{
output_low (pin_B1); // desliga Optoacoplador
Output_low (pin_B2); // desliga led vermelho
Output_high (pin_B3); // liga Led Vende
}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jorge, em vez disso:

set_timer1 (3036); //Preload do Timer1

faça isso:



set_timer1 (3036 + get_timer1()); //Preload do Timer1
//compensa qualquer offset de contagem

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites
eu jogo uma ideia ,você termina ok?

 #include <16f628a.h>
#fuses nowdt,hs,put,nobrownout,noprotect,mclr,nocpd,nolvp
#use delay(clock=4000000)


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

void main()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while (pin_B5==1)

{
output_high (pin_B1); // liga Optoacoplador
output_high (pin_B2); // liga Led vermelho
}

While (pin_B5==0)

{
if (q==2){

for(i=0;i<30;i++
{
output_low (pin_B1); // desliga Optoacoplador
Output_low (pin_B2); // desliga led vermelho
Output_high (pin_B3); // liga Led Vende
}
}
}

to com duvida no

{

q++1;

if(q==2){

q=0;

}

o compilador para no "q"

qual a função desse "q" no programa ??

Obrigado pela ajuda :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O q é uma variavel int16 que ira declarar no seu programa ,ela incrementa a cada 500ms,então pela logica quando q =2 tempos 1 segundo.Qualquer coisa tamo ai

Compartilhar este post


Link para o post
Compartilhar em outros sites
Ae felipao ,ja vi muito isso em codigo do timer1,você pode me explicar pra que serve ?

Deste modo voce seta o timer com 3036 mais o tempo que passou.

É para compensar o tempo gasto da rotina em C.

Compartilhar este post


Link para o post
Compartilhar em outros sites
O q é uma variavel int16 que ira declarar no seu programa ,ela incrementa a cada 500ms,então pela logica quando q =2 tempos 1 segundo.Qualquer coisa tamo ai

entendi mas por q o compilador não esta reconhecendo ele ???

e de "q" "como identificador indefinido" ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Vtrx valeu pela explicaçao.

Amigo nao reconhece porque nao deve estar declarando a variavel,posta o codigo amigo.Abraço...

#include <16f628a.h>

#fuses nowdt,hs,put,nobrownout,noprotect,mclr,nocpd,nolvp

#use delay(clock=4000000)

#int_TIMER1 //Interrupção do Timer1

void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.

{

q++1;

if(q==2)

{q=0;} //Variável q incrementada a cada estouro do Timer1

set_timer1 (3036 + get_timer1()); //Preload do Timer1

}

void main()

{

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

set_timer1 (3036); //Preload do Timer1

enable_interrupts(INT_TIMER1); //Habilita interrupção timer1

enable_interrupts(global); //habilita interrupcão global

while (pin_B5==1)

{

output_high (pin_B1); // liga Optoacoplador

output_high (pin_B2); // liga Led vermelho

output_low (pin_B3); // desliga led verde

}

While (pin_B5==0)

{

if (q==2)

{

for(i=0;i<30;i++;)

{

output_low (pin_B1); // desliga Optoacoplador

output_low (pin_B2); // desliga led vermelho

output_high (pin_B3); // liga Led Verde

}

}

}

to tomando uma surra da programação, mas eu vou aprender...espero rsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Precisa declarar a variavel q ,la em cima como int16 ficaraia assim:

#use delay(clock=4000000)

//variaveis//

int16 q;

#int_TIMER1 //Interrupção do Timer1

void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.

{

q++1;

if(q==2)

{q=0;} //Variável q incrementada a cada estouro do Timer1

set_timer1 (3036 + get_timer1()); //Preload do Timer1

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloque os dois whiles do PIN_B5 dentro de um while(1).

tipo:


while(1)
{
while(PIN_B5 == 1){...;}
while(PIN_B5 == 0){...;}
}

sem este loop principal, o programa vai executar uma vez só...

David, pelo que vi e como disse o Jorge, esse código C não esta completo para seu projeto. Procure completa-lo antes de compilar.

Editado por HenriqueHack

Compartilhar este post


Link para o post
Compartilhar em outros sites

..................................

coloque os dois whiles do PIN_B5 dentro de um while(1).

tipo:


while(1)
{
while(PIN_B5 == 1){...;}
while(PIN_B5 == 0){...;}
}

sem este loop principal, o programa vai executar uma vez só...

David, pelo que vi e como disse o Jorge, esse código C não esta completo para seu projeto. Procure completa-lo antes de compilar.

você acha que ainda falta alguma coisa ???

#include <16f628a.h>

#fuses nowdt,hs,put,nobrownout,noprotect,mclr,nocpd,nolvp

#use delay(clock=4000000)

int16 q;

int16 i;

#int_TIMER1 //Interrupção do Timer1

void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.

{

q++;

if(q==2){

q=0;

} //Variável q incrementada a cada estouro do Timer1

set_timer1 (3036); //Preload do Timer1

}

void main()

{

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

set_timer1 (3036); //Preload do Timer1

enable_interrupts(INT_TIMER1); //Habilita interrupção timer1

enable_interrupts(global); //habilita interrupcão global

while(true)

{

while (pin_B5==1)

{

output_high (pin_B1); // liga Optoacoplador

output_high (pin_B2); // liga Led vermelho

}

While (pin_B5==0)

{

if (q==2)

{

for(i=0;i<30;i++);

{

output_low (pin_B1); // desliga Optoacoplador

Output_low (pin_B2); // desliga led vermelho

Output_high (pin_B3); // liga Led Verde

}

}

}

}

}

Editado por David4455

Compartilhar este post


Link para o post
Compartilhar em outros sites

então... posso estar errado, mas por exemplo:

dificilmente seu controlador irá executar estas linhas:


if (q==2)
{
for(i=0;i<30;i++);
{
output_low (pin_B1); // desliga Optoacoplador
Output_low (pin_B2); // desliga led vermelho
Output_high (pin_B3); // liga Led Verde
}
}

porque dentro da interrupção de timer, quando Q==2, ele zera o valor da variavel Q ...

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

bom, um mesmo programa pode ser feito de diversas maneiras, porque cada um tem o seu jeito de fazer ...

eu montaria uma rotina neste estilo:


#include <16f628a.h>
#fuses nowdt,hs,put,nobrownout,noprotect,mclr,nocpd,nolvp
#use delay(clock=4000000)

char q = 0;
char aux = 0;

#int_TIMER1
void temp1s(void)
{
q++;
if(q==60)
{
q = 0;
aux = 1;
}

set_timer1 (3036 + get_timer1());

}

main()
{
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);
set_timer1 (3036);
enable_interrupts(INT_TIMER1);
enable_interrupts(global);

T1CON.TMR1ON = 0;

while(1)
{
while (pin_B5==1)

{
output_high (pin_B1);
output_high (pin_B2);

T1CON.TMR1ON = 0;
Q = 0;

}

While (pin_B5==0)

{
T1CON.TMR1ON = 1;

if(aux==1)
{
output_low (pin_B1);
Output_low (pin_B2);
Output_high (pin_B3);
aux = 0;
T1CON.TMR1ON = 0;

}

}
}
}

é bem provavel que eu tenha esquecido um detalhe ou outro no código acima, mas enfim ... rs

veja que utilizei o T1CON.TMR1ON para desligar e ligar o timer em momentos propícios... inclusive, gostaria de saber dos mestres em PIC se este bit é o certo para tal finalidade... li o datasheet e fiquei na duvida entre esse e o PIE1.TMR1IE (esse me pareceu um liga/desliga geral).

outra duvida, gostaria de saber se o comando

set_timer1 (3036 + get_timer1());

serve apenas para PIC.

Editado por HenriqueHack

Compartilhar este post


Link para o post
Compartilhar em outros sites

exatamente nao ira,é por isso que disse pra ele terminar o resto.O amigo larga de preguiça,ta qrendo tudo pronto poow!

#int_TIMER1 //Interrupção do Timer1

void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.

{

q++;

if(q==2){

a=1;

q=0;

} //Variável q incrementada a cada estouro do Timer1

set_timer1 (3036); //Preload do Timer1

}

if (a==1)

{

for(i=0;i<30;i++);

{

output_low (pin_B1); // desliga Optoacoplador

Output_low (pin_B2); // desliga led vermelho

Output_high (pin_B3); // liga Led Verde

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites
exatamente nao ira,é por isso que disse pra ele terminar o resto.O amigo larga de preguiça,ta qrendo tudo pronto poow!

#int_TIMER1 //Interrupção do Timer1

void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.

{

q++;

if(q==2){

a=1;

q=0;

} //Variável q incrementada a cada estouro do Timer1

set_timer1 (3036); //Preload do Timer1

}

if (a==1)

{

for(i=0;i<30;i++);

{

output_low (pin_B1); // desliga Optoacoplador

Output_low (pin_B2); // desliga led vermelho

Output_high (pin_B3); // liga Led Verde

}

}

Não é preguiça amigo, é que como falei ainda estou aprendendo sobre essa linguagem e ainda tenho muitas duvidas, não é coisa pra se aprender de um dia para o outro mas estou fazendo o máximo que posso, desculpa se dei a entender errado, mas obrigado mesmo pela ajuda.

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

×