Ir ao conteúdo

Ajuda Pic 16f628a


David4455

Posts recomendados

Postado

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

}

}

Postado

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

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

Postado

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

Postado

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

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

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

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

Postado
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

Postado

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

}

Postado

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.

Postado

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

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

}

}

}

}

}

Postado

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.

Postado

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

}

}

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

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!