Ir ao conteúdo
  • Cadastre-se

Ajuda Pic 16f628a


David4455

Posts recomendados

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

}

}

Link para o comentário
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...

Link para o comentário
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 !

Link para o comentário
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...

Link para o comentário
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
}
}
}

Link para o comentário
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 :)

Link para o comentário
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

Link para o comentário
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

}

Link para o comentário
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.

Link para o comentário
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

}

}

}

}

}

Link para o comentário
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.

Link para o comentário
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

}

}

Link para o comentário
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.

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!