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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • ..................................

    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
  • Autor do tópico
  • 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

    ×