FAÇA UM CONTROLE REMOTO DE 5 CANAIS (RF)- COM PIC 12F675 (REF 156)

3

Os controles remotos tipo chaveirinho permite usar apenas 2 ou 3 botões de acionamento. E se você deseja 5 botões?

Neste caso, terá que fazer seu próprio chaveirinho. Uma boa alternativa é usar um pequeno Pic 12f675 de 8 pinos, relativamente barato, para produzir o protocolo de transmissão para um tx comercial de 433mhz (miniatura). Veja o Esquema abaixo:

Com 5 chaves dactilares, e alguns resistores, podem ser facilmente acondicionados em uma pequena caixa plastica, escolhida a gosto pelo hobista. Poderá ser alimentado com uma bateria de 12 volts, reduzindo-se a tensão por meio de um ci regulador do tipo 7805. Ou pode-se usar 4 pilhas de 1,5 volts, com um diodo em série para reduzir a nivel seguro de operação.
O protocolo transmite 4 bytes, sendo 2 bytes de um número serial qualquer, a ser escolhido pelo hobista, e que deverá ser usado tanto no tx como no rx. Neste caso, foi usado o numero 0x89ab. O próximo byte é uma cópia da gpio, mostrando a condição das chaves dactilares. E finalmente o último byte é a somatória dos 3 primeiros, servindo de conferência para a integridade da transmissão.
No receptor, foi previsto a escolha de modo pulso ou retenção pelo usuário, alterando de forma individual, por canal. O mesmo pode ser dito se queremos saída em modo normal ou invertida. Basta alterarmos estas definições por comentar (//) ou descomentar a opção desejada e em seguida, recompilar o arquivo C. Na pasta fornecida abaixo, temos um hex pronto para modo normal e retenção em todos os canais. O hex para o tx não sofre mudanças com as alterações de modo pulso/retenção ou mesmo modo normal/retenção, sendo sempre o mesmo.
No esquema do receptor foi usado reles nas saídas, para controlar cargas, mas nada impede usar apenas transistores de potencia para controlar diretamente pequenos motores ou conjuntos de leds, bem como outras cargas desejadas. Para uso com cargas AC, convém manter os reles, isolando assim o circuito das cargas.
Obs. Esta montagem foi feita unicamente em placa de protoboard, sendo sujeita a bugs ainda não detectados. Esta sendo fornecido os arquivos que poderão ser alterados conforme a necessidade dos hobistas.

Segue pasta com os arquivos desta montagem:

CR_5C_675

Poderá ver também o artigo ‘CONTROLE REMOTO 8 CANAIS ON/OFF – PIC 16F628A’, para 8 canais.

Em 18/12/2014, foi postado esta nova versão de receptor, que testa por 2 recepções corretas antes de acionar saídas as saídas (medida para evitar falsos acionamentos em áreas com muita interferências):

cr_5c_675_v2_

Manuais:

Pic 12f675

Curiosidades:

Mestres medievais da medicina
Mestres medievais da mecânica
O coletor solar da asa da borboleta
Será que a Bíblia está de acordo com a ciência?
Ainda há tempo para salvar o planeta?
Como vencer a estafa
Uma visita a Camarões
Os sensores do besouro
Como posso lidar com o estresse?
Você acredita que já viveu antes?

Outros assuntos:
Como se livrar do ressentimento
Como ensinar seu filho a usar a internet com segurança
Por que rejeitar a pornografia?
Como ser feliz no casamento?
Quando seu casamento não é o que você esperava
Como resolver diferenças no casamento
Como recuperar a confiança no casamento
Quando um dos cônjuges tem necessidades especiais
Aprenda a perdoar
Como acabar com a tática do silêncio
Como criar filhos responsáveis
Como administrar o seu dinheiro
Como posso controlar meu peso?
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?

Até o próximo artigo!!!

3

81 thoughts on “FAÇA UM CONTROLE REMOTO DE 5 CANAIS (RF)- COM PIC 12F675 (REF 156)”

  1. 0

    Oi, obrigado por seu trabalho duro, você faz coisas muito interessantes.
    Megustaria se você pode me ajudar a que eu tenho que colocar que as instruções para as saídas são cronometrados cerca de 20 segundos.
    Obrigado.
    Boas festas.

    1. 0

      Olá Juane!
      Esta implementação no código atual fica difícil, pois necessita ter tempos mais precisos, talvez fazendo uso de um timer interno para garantir o tempo correto.
      Cláudio

      1. 0

        olar craudio qual programa voce usou para copiar os arquivos c preciso recopiar esses arquivos para modo de retençao estou usando o mplabx e ccs mais nao to conseguindo configurar os bits

        1. 0

          Olá José Carlos!
          Use o compilador C da CCS. Na opção de usuário, descomente a saída para modo retenção (retire o ‘//’ da frente da linha) e recompiler para obter o novo arquivo .hex.
          Claudio

          1. 0

            Olá José Carlos!
            Creio que você tem algumas opções do que poderá fazer:
            1) Usar outro pic, com o valor de calibração intacto.
            2) Usar um valor aproximado para funcionar o circuito, colocando no último endereço da flash um valor como 0x34fc (sempre começa com 0x34xx).
            3) Descobrir o valor correto e recolocar no pic na hora de programar o .hex. Leia o artigo ‘COMO CALIBRAR A FREQUÊNCIA DO OSCILADOR INTERNO DO PIC 12F675/629 (DIDÁTICO)’..
            Cláudio

  2. 0

    Olá Claudio, aprecio muito o seu blog, vc esta de parabéns pela iniciativa de divulgar seus conhecimentos.
    Utilizo o aprendizado como hobby e estou tentando terminar esta montagem mas estou tendo dificuldades. Fiz algumas mudanças no código e compilei no MpLab X, Simulei no Proteus e depois parti p\ protobard, tudo funcionando bem até alimentar o transmissor com outra fonte de alimentação. Ou seja,os comandos só são interpretados pelo Pic quando são alimentados pela mesma fonte (carregador ou bateria).
    Poderia me dar uma dica do que esta acontecendo? Como disse, sou hobista e tenho pouca esperiência. Desde já agradeço pela atenção e novamente parabens.

    1. 0

      Olá Paulo!
      Obrigado por sua expressão de apreço pelo trabalho deste blog. Quanto ao que você mencionou, parece um tanto estranho. Se na mesma fonte funciona, mas separando não, então eu chego a conclusão que há algo de errado em uma das fontes. Confira as polaridades , se não está trocando o ‘+’ pelo ‘ -‘ .
      Certifique que, no caso de usar bateria de 9 volts para o TX, você reduza a tensão para 5 volts usando um regulador 7805, mais uns capacitores de filtro de 100uf por exemplo. Ligue também um capacitor de 100 a 220 nf nos pinos 1 e 8, do pic. No caso do receptor, não sei se está usando rele de 5 volts ou 12 volts. Mas se for de 12 v, certifique de filtrar bem a alimentação com capacitores de alto valor (1000uf) e depois reduzir para 5 volts para alimentar o pic receptor, usando também um regulador 7805 e capacitor de 100 uf neste vcc.
      Confira as ligações, por muitos erros são descuidos simples, como curtocircuitar terminais de resistores no protoboard ou esquecer de ligar determinados pontos do circuito.
      Sucesso na sua montagem!

      Cláudio

      1. 0

        Olá Claudio,
        Obrigado pela resposta e tbm pela rapidez. Quanto ao enuciado, antes de recorrer a sua ‘consultoria’ eu li varias vezes suas sugestões e tbm os comentários, porque a aprendi muita coisa com as duvidas dos colegas, e os detalhes que vc citou foram observados sim. Estava pensando se por usar o osc interno e o byte de configuração com valor 3480, que se ñ me engano atua diretamente na presição de tempo do pic, se a mudança de fonte estaria interferindo na sincronia dos bits enviados. Os módulos estão em protos separados, se forem alimentados pela mesma fonte funciona e se separar (Já tentei trocar as fontes e os pics), o módulo receptor recebe mas o pic ñ processa os dados enviados como se a informação estivesse truncada ou corrompida. Tem fundamento minha duvida?
        Um abraço!

        Paulo.

        1. 0

          Olá Paulo!
          Não acredito que seja a frequência do oscilador interno. Se fosse, juntos também daria problema. Você colocou uma antena de 15 cm de fio no tx e outra no rx? As frequências do tx e do rx são iguais? Você mediu se efetivamente tem 5 volts nos dois vcc’s separados? Quanto a transmissão, se esta ocorrendo bem do tx para o rx em separado, coloque um osciloscópio para ver a forma de onda. Se não tiver, coloque um disco piezoelétrico na saída do rx ao gnd e acione o tx. Se tiver um ruído característicos então não é problema de transmissão. Mas se a forma de onda estiver estranha ou o ruído no piezo estiver ‘falhando’, pode ser uma falha no casamento das frequências do par tx/rx (ou falta de antenas).
          Cláudio

      1. 0

        Olá José Carlos!
        Você conseguiu compilar ou deu uma mensagem de erro? Qual é a mensagem?
        Cláudio

  3. 0

    Olá Claudio, venho seguindo seus projetos, e são fantásticos. Montei este circuito para ter mais conhecimento, estou tendo problemas em relação ao sinal. Ao acionar o sinal de um canal acaba acionado todos eles. O que eu poderia ter feito errado ?
    Obrigado.

    1. 0

      Olá Thsl!
      Antes de mais nada, por favor, confira as ligações, em especial as que ligam a saídas aos transistores e reles. Tente recarregar os hex de novo nos pic. Pode ter ocorrido alguma falha de gravação.
      Cláudio

      1. 0

        Olá Claudio, primeiramente obrigado pela atenção. Irei fazer estes procedimentos para averiguar possíveis erros tanto das ligações e arquivo hex. So para te explicar estou usando para programar o Chip este GRAVADOR DE PIC USB K150. De repente possar ser alguma configuração dele.

        Thiago L.
        Abraço

        1. 0

          Olá THSL!
          Quanto ao seu programador, já não posso dizer nada, pois não trabalhei ainda com ele. Tente ver o manual para ver este problema de configurações que talvez possa esta ocorrendo.
          Cláudio

          1. 0

            Olá Claudio,

            Feito. Fiz todos os procedimentos citados acima e o sistema está OK. Provavelmente um problema elétrico, pois programei o pic e continuou igual, depois montei novamente todo o conjunto e OK funcionando os 5 canais independentes. Aproveitando já vou pedir mais coisas. Supondo que eu utilize dois sistemas iguais a este em uma área muito próxima, iremos ter interferência correto ? Teria como por um código de codificação para cada aparelho ?

            Obrigado

          2. 0

            Olá THSL!
            Que bom que finalizou sua montagem com sucesso! Quanto a questão de interferência, ela se dará em virtude de se estar usando a mesma frequência nos conjuntos. Use um com 433mhz e outro com 315 mhz que irá resolver o problema. Mesmo modificando o código, se os 2 forem acionados ao mesmo tempo e usando a mesma frequência nos conjuntos, não irá funcionar, mas gerará mau funcionamento.
            Cláudio

          3. 0

            Perfeito. Hoje fiz a montagem na placa funcionou super bem. Bom então para ter mais canais o ideal e ter modulos de frequência diferente. Proximo projeto e com pic 16f628a que quero fazer e com mais canais. Obrigado por enquanto com o auxilio. Voce tem algum canal no YouTube? Abraço

          4. 0

            Ola THSL!
            Muito bom! Espero que seja bem sucedido também em seu próximo projeto! Eu não tenho canal no YouTube, sendo este blog o único meio que uso para repassar a outros o que consigo nos experimentos.
            Obrigado
            Cláudio

          5. 0

            Olá Clauudio,

            Dentro starei acompanhando por este meio todos os projetos. Dentro do possível estarei acompanhando e montando alguns projetos que acho muito interessante. Sabe né engenheiro adora ficar mexendo nas coisas.

            Abração e sucesso.

  4. 0

    Boa Tarde Claudio

    montei o receptor e controle e funcionou bem mas não estou conseguindo fazer ele funcionar com a retenção tentei compilar mas não deu certo será que vc conseguiria o hex para retenção
    obrigado

    1. 0

      Olá Walker!
      Como ele está funcionando agora? Pulso? Invertido?
      Ao recompilar, você lembrou de configurar o ‘modo de atuação’ por comentar as linhas indicadas no programa, usando // no inicio da linha?
      Qual a mensagem que o compilador apresenta?
      Fico no aguardo…
      Cláudio

  5. 0

    Olá, claudio tudo bem?, estou sempre de olho no seu blog, ótimo,
    parabéns.
    Preciso de sua ajuda, pq já tentei de todo jeito e nada, olha só, tou precisando fazer um controle igual ao seu de 5 canais, com 12f675, e não tem jeito não funciona, no proteus sim, mas na protoboard naão, tentei, mudei o codigo, criei um esquema que manda 1 byte, e recebe no outro, e no proteus funciona e na proto nada, aí pensei que pode ser o bit de caligração, pq eu gravo no pic um programa pisca led e funciona, aí gravo esse seu e não funciona, gravo o outro que fiz e nada, queria saber se pode me ajudar, tenho mais 12f675 será que o bit de caligração dos outros pic tá calibrado? me ajuda aí…

    1. 0

      Olá Paulo!
      Você já verificou com o programador se não perdeu o byte de calibração? Pegue o pic gravado para tx e leia a flash. Verifique o ultimo endereço e confira se gravou um byte começando com 34xx, onde ‘xx’ é o byte de calibração escolhido pelo fabricante. Se encontrar apenas ‘FFFF’ então está explicado porque não funciona. Confira o pic rx, também lendo a flash e usando o mesmo procedimento.
      Parece a causa provável, uma vez que o software roda no Proteus.
      Cláudio

      1. 0

        Obrigado, consegui descobrir o problema, era o bit de calibração que tinha perdito, usando winpic800 consegui altear o bit, vou altear do tx e rx, para ver se fuciona, espero que sim, mas me diz uma coisa, todos pic tem esse negocio de bit de calibração? nunca tinha ouvido falar disso, pq existe isso? desde já muito obrigado, se precisar de alguma força em algo, estou as ordens.

        1. 0

          Olá Paulo!
          Microcontroladores é mais ou menos como os carros: os modelos antigos saiam com carburador e platinado. O modelo seguinte saiu com carburador e ignição eletrônica. Passaram mais uns anos, saiu a injeção eletrônica… e continua aperfeiçoando a tecnologia. Nem todos os pic’s tem este byte de calibração na flash. Alguns como no pic 16f628a fica internamente, sem como acessar nem apagar acidentalmente. Terá que estudar o datashhet na seção de osciladores para ver como é o funcionamento de cada um. O byte de calibração serve para fazer o ajuste fino na frequência do oscilador interno. Se você usa oscilador externo não necessita se preocupar. Mas se a palavra de configuração esta para oscilador interno, então o programa compilado em ‘c’ automaticamente vai gerar linhas de código para buscar na ultima posição da flash ( no pic12f675) este valor carregado pelo fabricante. Para isto gera uma instrução ‘call 0x3ff’. No local 0x3ff tem que ter uma instrução ‘retlw xx’. Em hexa retlw=34 e o xx é o valor correto para o oscilador funcionar em 4 mhz. Se não encontrar esta instrução de retorno, o programa se perde e não executa mais nada, resetando continuamente. Não funciona nada!
          Os pic’s tem muitos segredos escondidos em seu datasheet!
          Espero que tenha entendido, e que você consiga finalmente funcionar o seu projeto a contento!
          Cláudio

  6. 0

    OLÁ TUD BEM CLAUDIO LARIOS? ESPERO QUE SIM,
    TOU PRECISANDO MUITO DE SUA AJUDA, PRECISO DE UMA GEITO PARA FAZER UM PIC 12F675 COMUNICAR COM OUTRO, IGUAL NESSE PROJETO, MAS MONTEI E NÃO FUNCIONOU, NÃO SEI PQ, USEI O PICKIT 800 PARA GRAVAR O PIC, E NÃO ENTENDO PORQUE NÃO FUNCIONA, TESTEI CM UM FIO NO LUGAR DOS MODUOS RF 433 E NADA, TEM COMO ME DÁ UMA LUZ DE ACHAR ONDE TÁ ERRO? OU PODERIA TER UM GEITO DE DE MANDAR UM MATERIAL ENSINANDO PASSO A PASSO FAZER O PIC COMUNICAR COM O OUTRO? BEM SIMPLES MESM, DESDE JÁ OBRIGADO, SOU TEU ADMIRADOR. ATT. PAULO

    1. 0

      Olá Paulo!
      Verifique se você não perdeu o byte de calibração dos pic, lendo a flash e conferindo se no ultimo endereço tem um valor começando com ’34xx’. Se estiver ‘3fff’ coloque um valor manualmente, como ’34fc’ e regrave com este hex alterado. Neste projeto a comunicação é unilateral, do tx para o rx apenas. Se necessitar receber e transmitir, seria interessante implementar a comunicação serial, via software, nos 2 pic e usar 2 pinos, um para receber e outro para transmitir, de modo que possar trocar informações de acordo com o programa que deverá rodar. Eu não tenho uma matéria especifica para te indicar, mas na internet tem muitos exemplos de como comunicar um pic com outro.
      Cláudio

  7. 0

    OLÁ, AMIGO, VOCÊ SABERIA ME DIZER COMO POSSO TESTAR ESSE PROJETO NO PROTEUS 8? TEM COMO SIMULAR MODULO RF 433? OU TERIA COMO USAR UM FIO PARA VER O FUNCIONAMENTO E TESTES E NA PRATICA COLOCAR O RF NO LUGAR DO FIO? AGUARDO URGENTE.

    1. 0

      Olá Paulo!
      Assim como você tem dificuldade em programar pic, eu tenho dificuldade em usar simuladores e prefiro montar em placas de teste, na prática mesmo. Assim, não saberia te responder sobre as funcionalidades do Proteus ou se funcionaria interligando com ‘fio’ virtual. Neste blog tem vários tipos de tx/rx em rf, tanto em linguagem ‘c’ como ‘asm’, que poderá servir de base para algum projeto que deseje fazer ou mesmo entender o funcionamento.
      Cláudio

  8. 0

    GRANDE Cláudio Lários, adoro seus projetos, porém se fosse em php (rsrsr, sou bom em php), mas quando se trata de pic, estou só engatinhando, queria saber se você tem algum material para eu entender seu código, porque eu fico meio que voando, e eu gosto de entender sabe? se tiver algum material, queria um projeto mesmo simples, só para acionar um rele, via rf, desde já obrigado. att. Paulo

  9. 0

    Olá Claudio! O sistema contina disparando… Retirei a parte de transmissão sem fio, deixei cabeado mesmo para ver se o defeito possa estar no circuito que faz a interface com o PC (USB) através do mcu atmega. Gostaria muito de agradece-lo por ser sempre solicito com os meus problemas, abraço!

  10. 0

    Amigo uma duvida que me apareceu sobre este projeto ela suprotaria gravar o controle comercial ?
    tipo gravar 3 teclas de um e 2 teclas de outro ?
    ou fica preso ao TX ?

    1. 0

      Olá Liliano!
      Realmente, isto não é possível, pois não há compatibilidade entre o controle remoto comercial e esta montagem , estando ‘preso’ ao TX.
      Cláudio

  11. 0

    Olá Larios… vou te encher de novo. Tô com um probleminha aqui e talvez você possa me dar uma luz! Gostaria de implementar via código um tipo de teste para validar o acionamento do botão, algo assim:

    Receptor detecta o acionamento do botão;
    Receptor aguarda um tempo e verifica se o botão continua acionado;

    Somente após esta verificação é que eu iria acionar ou não a saída do pic.

    Estou tendo alguns problemas com disparo acidental (mesmo com o transmissor desligado) acho que pode ser algum ruido no receptor e gostaria de eliminar esta possibilidade via programação… Como sempre muito grato pela atenção.

    Obs: A saída do meu RX é ativo em nível baixo, até já coloquei uns resistores de pull up para ver se resolveria o problema mas sem sucesso.

    1. 0

      Olá Karllo! A faixa de frequência de 433Mhz já está se tornando saturada com tantos tx de portões hoje em dia. Você diz, se eu entendi bem, para aguardar uma segunda transmissão após um tempo, para confirmar entre um possível falso acionamento de um verdadeiro acionamento, é isto? Se a interferência não for cíclica, poderá funcionar. Poderia compartilhar em que está usando o sistema?
      Cláudio

      1. 0

        O acionamento não é cíclico… Eu não gostaria de passar os detalhes do projeto por aqui, mas me envie um e-mail que te explico direitinho, é um projeto muito legal.

        Tentei executar a procedimento “recebe()” duas vezes dentro do laço while (com um buffer auxiliar) com intuito de comparar as 2 recepções e não funcionou.

        Você teria alguma sugestão de onde eu poderia estar modificando o código?

        Grato.

        1. 0

          Olá Karllo!
          Tente estas alterações (não tive chance de testa-la), que tem por objetivo realizar 2 recepções corretas antes de acionar as saídas. Foi colocado um contador aux_seg que depois de certo tempo reseta para impedir uma segunda recepção que não seja dentro de um tempo específico.

          while(true){
          int8 conf,aux,aux_ret;
          //—————————————————————————
          int1 flag_acionar,flag_1rec; //<——acrescentar
          int8 aux_seg; //<——acrescentar

          if(!–aux_ret){aux_ret=250; at_cont_ret();}
          if(!–aux_seg) {aux_seg++;flag_1rec=0;} //<——acrescentar

          flag_rok=0; // <—–acrescentar
          recebe(); // <—–acrescentar
          if((flag_rok)&&(!flag_1rec)){
          conf=buffer[1]+buffer[2]+buffer[3];
          if(conf==buffer[0]){flag_1rec=1;aux_seg=0xff;}// // <—–acrescentar
          }
          flag_rok=0;
          recebe();
          if((flag_rok)&&(flag_1rec)){
          conf=buffer[1]+buffer[2]+buffer[3];
          if(conf==buffer[0]){flag_acionar=1; }
          }

          if(flag_acionar){ // <—–acrescentar
          flag_1rec=0; // <—–acrescentar
          flag_acionar=0; // <—–acrescentar

          //if(flag_rok){ //<—comentar
          // conf=buffer[1]+buffer[2]+buffer[3]; //<—comentar
          // if(conf==buffer[0]){ //<—comentar

          //——————————————————————————————-

          if((buffer[3]==make8(serial_number,1))&&(buffer[2]==make8(serial_number,0))){
          aux=buffer[1];

          if(!bit_test(aux,3)){
          cont_c1=t_inv;
          #ifdef c1_ret
          if(!fc1){
          c1=!c1; fc1=1;
          }
          #else
          #ifdef c1_inv
          c1=0;
          #else
          c1=1;
          #endif
          #endif
          }
          if(!bit_test(aux,1)){
          cont_c2=t_inv;
          #ifdef c2_ret
          if(!fc2){
          c2=!c2; fc2=1;
          }
          #else
          #ifdef c2_inv
          c2=0;
          #else
          c2=1;
          #endif
          #endif
          }

          if(!bit_test(aux,2)){
          cont_c3=t_inv;
          #ifdef c3_ret
          if(!fc3){
          c3=!c3; fc3=1;
          }
          #else
          #ifdef c3_inv
          c3=0;
          #else
          c3=1;
          #endif
          #endif
          }

          if(!bit_test(aux,4)){
          cont_c4=t_inv;
          #ifdef c4_ret
          if(!fc4){
          c4=!c4; fc4=1;
          }
          #else
          #ifdef c4_inv
          c4=0;
          #else
          c4=1;
          #endif
          #endif
          }

          if(!bit_test(aux,5)){
          cont_c5=t_inv;
          #ifdef c5_ret
          if(!fc5){
          c5=!c5; fc5=1;
          }
          #else
          #ifdef c5_inv
          c5=0;
          #else
          c5=1;
          #endif
          #endif
          }

          // } //<—comentar /////////////////////////////////////////////////////////////////<———————–não esqueça aqui
          }
          flag_rok=0;
          }//if(flag_rok) // agora será flag_acionar
          }//while
          }//main

          Cláudio

          1. 0

            Claudio;

            Antes de mais nada tú é meu salvador, obrigado!

            Fiz a seguinte alteração (acho que está errado no código acima)

            flag_rok=0; //*aqui troquei por flag_acionar = 0;*
            }//if(flag_rok) // agora será flag_acionar
            }//while
            }//main

            Só que o saída não está ativando, ou seja não entra no “if((flag_rok)&&(flag_1rec))” logo o flag_acionar nunca vai para “1”.

            Vou estudando aqui para ver se acho a solução, estou aguardando seu e-mail para lhe passar os detalhes do projeto. Abraço!

          2. 0

            Fui testando aqui e vi que no primeiro recebe() a transmissão é validada (flag_1rec fica igual a “1”), porém no segundo recebe() o flag_rok sempre fica em “0”, logo o flag_acionar sempre será “0”.

          3. 0

            Eu comentei tudo aqui e pelo menos piscou a saída:

            //if(!–aux_seg)
            //{
            // aux_seg++;
            // flag_1rec=0;
            //} // acrescentar

          4. 0

            Olá Karllo!
            Eu analisei melhor o código passado, e notei que fiz um erro de grafia:
            Veja a porção abaixo:
            while(true){
            int8 conf,aux,aux_ret;
            //—————————————————————————
            int1 flag_acionar,flag_1rec; //<——acrescentar
            int8 aux_seg; //<——acrescentar

            if(!–aux_ret){aux_ret=250; at_cont_ret();}

            //————
            if(!–aux_seg) {aux_seg++;flag_1rec=0;} //<——acrescentar xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx aqui tem erro

            modifique esta linha para:

            if(!aux_seg- -) {aux_seg++;flag_1rec=0;} //<——acrescentar

            E experimente, por favor.
            Não estou conseguindo tempo para montar no protoboard para testes. Se não der certo, peço que aguarde até que possa verificar na prática o que me pede.
            Cláudio

          5. 0

            Você já está fazendo demais… Tenho uma placa de teste e ainda analiso no proteus antes…
            Fiz a substituição como sugerida e também não funcionou. É só comentar esta parte que consigo ativar a saída…

          6. 0

            Já ia me esquecendo… se inicializo a variável aux_seg (int8 aux_seg=0xff;) funciona perfeitamente com a última modificação que me passou… mas não sei é correto fazer isto. Grato Claudio.

          7. 0

            Olá Karllo!
            Eu postei uma nova versão com 2 recepções antes de realizar o acionamento. Tente adapta-la ao seu circuito, alterando onde você desejar.( Obs. Esta versão está ajustada para modo pulso, normal.)
            A constante ‘tempo_seg’ determina a janela máxima de tempo para uma nova recepção após uma recepção correta. Passando este tempo, o flag_1rec é resetado obrigando o sistema a ter de receber mais 2 novas recepções corretas. O registrado aux_seg ganhou um companheiro, o aux_seg1, para poder dar suficiente tempo. Ambos foram colocados como variáveis globais do sistema.
            Divirta-se!

            Cláudio

          8. 0

            Nem sei como te agradecer! Como sempre ficou ótimo! Valeu mesmo Claudio.
            Só achei que esta variável de tempo (tempo_seg) não faz muita diferença (o disparo é quase instantâneo), até alterei para int16 (também a aux_seg1) e coloquei o valor inicial em 0xFFFF. Mas vou brincando aqui…

          9. 0

            Olá Karllo!
            O objetivo da variável aux_seg1 (+ aux_seg+ tempo_seg) é disponibilizar uma janela de tempo após uma recepção correta. Você verá que, se reduzir abaixo de 0x05, já não funcionará, por não se ter tempo suficiente para uma segunda recepção . Quanto mais aumentar seu valor (como você fez colocando 0xfffff), mais estará retirando a segurança e propiciando que o ruído acione o sistema. Em resumo, maior segurança será com valores baixos obtidos experimentalmente (por volta de 0x05 para aux_seg1). Resta ver se ainda haverá os acionamentos indesejados com este ‘firewall’.
            Cláudio

  12. 0

    Olá Claudio! O serial é um número hexadecimal (16 bits)? Logo seria correto afirmar que a faixa de valores varia de 0 a 65535 em decimal? Grato.

    1. 0

      Olá Karllo!
      O seu raciocínio está correto. Mas, lembrando que a operação de 2 conjuntos (tx/rx) na mesma frequência de transmissão, apesar de ‘serial number’ diferentes, poderão sofrer mau funcionamento por interferência mutua. Apenas garante que um conjunto não acione outro de ‘serial number’ diferente, mas não garante funcionamento concomitante.
      Cláudio

      1. 0

        Eu sei! Em meu projeto o transmissor só é habilitado (energizado) no momento em que se pressiona o botão. Eu percebi essa interferência quando o portão eletrônico aqui de casa não abria de forma nenhuma, foi só desligar o transmissor e ele voltou a funcionar. Mais uma vez muito obrigado!

  13. 0

    Lários socorro! Teria como introduzir um delay de acionamento em algum dos botões no RX? Tentei adicionar um delay_us(xxx) mas não funcionou da forma esperada. Será que isto seria possível ? Aonde especificamente eu poderia estar inserindo este atraso no código fonte? Mais uma vez muito grato.

    Exemplo do que fiz na rotina “at_cont_ret()”

    if(!–cont_c5)

    delay_us(xxx);

    #ifdef c5_ret
    fc5=0;
    #else
    #ifdef c5_inv
    c5=1;
    #else
    c5=0;
    #endif
    #endif

    1. 0

      Olá Karllo! Poderia explicar melhor o assunto do delay? Você quer que depois de acionado demore a ligar a saída ou que a saída fique ligada por um tempo e desligue? O sistema de recepção neste exemplo opera ‘in-line’. Qualquer temporização colocada no meio das linhas de código irá destruir os tempos de recepção. A temporização terá que ser paralela , ou seja, a cada loop do bloco ‘while’ incrementamos um registrador e chegando a certo valor podemos desligar a saída. Para varias saídas temos que usar vários registradores.
      Para usar a rotina padrão de delay ‘delay_ms(xxxx)’ temos que mudar a rotina de recepção para o método de interrupção por mudança de estado da entrada rf ou por temporização de um timer que examina a entrada rf de tempos em tempos.
      Cláudio

      1. 0

        Claudio, quero que depois de acionado demore a ligar a saída (pulso e em nível baixo). Mas somente para um dos botões, tipo assim:

        Ch 1 -> instantâneo
        Ch 2 -> instantâneo
        Ch 3 -> instantâneo
        Ch 4 -> instantâneo
        Ch 5 -> atraso de xxx ms

        Cheguei a pensar em utilizar um 555 para resolver isso, mas o ideal seria solucionar por programação.

        Desde ja muito grato pela paciência.

        1. 0

          Olá Karllo!
          Entendi! Como já citei anteriormente, então poderá, na saída escolhida, setar um flag ao invés da saída propriamente dita, quando ocorrer o acionamento da mesma.
          Depois, no final do loop principal while(1), deverá testar este flag, e se estiver setado, começará a incrementar um ou mais registradores em cascata, e assim que atingirem determinado valor desejado que corresponda ao tempo, ligar a saída. Mas lembre que deverá ocorrer somente um incremento por ciclo do loop para não travar a recepção.
          Cláudio

  14. 0

    Olá Larios! Mais uma duvida: os capacitores para o regulador de tensão seriam pF o mF? Gostaria de informar a todos que realizei a montagem com sucesso, muito obrigado pela atenção!

  15. 0

    Olá, ainda to apanhando… Comprei um PIC K150 e quando tento programar o chip (meu primeiro pic rsrs) aparece a mensagem:

    The OSCAL value should be in the form of a RETLW instruction [ 34xx ]

    Currently [ 3Fxx ]

    Do you want this changed?

    Fiquei com receio de confirmar e descalibrar o oscilador interno do pic. Por isso peço ajuda a quem já efetuou a gravação deste código com sucesso me informar qual o programa e a gravadora utilizada.

    Grato.

    1. 0

      Olá Karllo!
      Parece que você não tem mais o byte de calibração. Leia o pic e veja no ultimo endereço de programa se tem um valor do tipo 0x34xx, onde xx poderá ser 40, 80,etc. Caso encontre apenas 0x3fff, então você perdeu efetivamente este byte (foi apagado). Alguns gravadores salvam ele antes de apagar e depois o recoloca. Outros perdem ao apagar. Precisar ver o seu gravador se tem recurso para isto.
      Usando o programa WinPic800 e o simples gravador de pic, não se tem problema em perder este byte.
      Para recuperar, poderá usar as informações do artigo ‘ como calibrar a frequência do oscilador interno….’.
      Verifique se consegue colocar um valor manualmente, como por exemplo, 0x3480, após aparecer a mensagem “Do you want this changed?”
      Cláudio

      1. 0

        Larios, muito obrigado pela ajuda! O pic tá “virgem” não gravei nada. O último endereço é o 345c. O que ocorre é que quando dou o load no HEX o “espaço em branco” vem preenchido com 3fff. Mas o programa permite ler o byte de calibração atual e alterar automaticamente o HEX. Vou fazer isto e mandar ver!

      2. 0

        Em tempo, fiz um bakup do HEX original caso aconteça algum problema. Mais uma vez muito obrigado pela atenção!

  16. 0

    Larios, agradeço mais uma vez por mais esse, aproveito para quem estiver com dificuldade de compilar o código que utilize a versão 3.4 do C Compiler. Larios, fiz o que você sugeriu e pesquisei na internet sobre o som de locomotivas a vapor, não encontrei nada a respeito porém achei alguns projetos que utilizam o PIC para tocar wav de um cartão SD, pensei nas possibilidades já que tenho vários sons em wav.

  17. 0

    Amigo uma duvida que me apareceu sobre este projeto ela suprotaria gravar o controle comercial ?
    tipo gravar 3 teclas de um e 2 teclas de outro ?

    ou fica preso ao TX ?

  18. 0

    Olá Claudio.
    Mais um projeto excelente.
    Montei,placa de ensaios, funcionou a 100%.
    Obrigado por compartilhar.

    Para modo pulso, Fiz o seguinte:
    //#define c1_ret
    //#define c2_ret
    //#define c3_ret
    //#define c4_ret
    //#define c5_ret

    //#define c1_inv
    //#define c2_inv
    //#define c3_inv
    //#define c4_inv
    //#define c4_inv
    //#define c5_inv
    //#zero_ram

    Funciona na perfeição!

    Seguindo o conselho do Claudio,persistência!
    -Aquilo que persiste resiste.

    Um abraço.
    Costa.

    1. 0

      Olá Eusebio! Obrigado pelo comentário e pelo retorno sobre sua montagem. Divirta-se com seus projetos!!!
      Cláudio

  19. 0

    olá lario. estamos aqui novamente para tirar seu sossego rsrsr. rapaz enviei este codigo para ser compilado em outro estado Brasil e o misterio continua o danado compila mais nao roda.de momento suspeitei do compilador.mais não era.mais vou continuar com o descombrimómetro ligado rsrs.

    1. 0

      Olá José! Se está compilando então precisa pensar em outra coisa. Você não perdeu o byte de calibração no endereço 0x3ff da flash? As vezes, ao apagar o pic perdemos este byte. Sem ele não roda nada. Leia a flash e descubra vendo se tem no ultimo endereço algo como 0x34xx.
      Claudio

  20. 0

    Olá Claudio mais uma vez vc publicou um excelente projeto meus parabens vou montar este modelo, Agora fica uma ideia para um projeto futuro e que eu acredito que talvez vc ja até tenha algo parecido mas se não tiver é o seguinte poderiamos colocar um de seus tx rf instalado em paralelo com a luz alta do veiculo e assim que chegarmos na frente de casa darmos a luz alta para acender de forma temporizada uma lampada instalada em nosso quintal com um de seus receptores modificados para acionar por tempo no max 3min que é mais que suficiente para entrar em casa sem tropeçar naquele vaso que esta sempre no caminho kkkkkkk .Um abraço e que Deus te de bastante sabedoria para continuar nos enriquecendo e nos incentivando com suas montagens até mais Edmilson LS

    1. 0

      Olá Edmilson! Obrigado por seu comentário e sugestão. Se você já tem portão automático, muitos colocam um interruptor que acende uma lampada quando aberto. Mas anotarei sua sugestão. Obrigado.
      Cláudio

  21. 0

    obrigado lario pelo apoio tecnico gratuito.rsrsr fiz exatamente como demonstração acima,quando uso o hex do pacote funciona normalmente as cinco operações no modo retenção.porem quando compilo para modo pulso ele nao atende conforme descrição acima sempre uso o compilador(pcwhd v104).isto é o que está acontecendo meu caso!

    1. 0

      Olá José! Testei em montagem usando o protoboard, alterando o C e recompilando, sendo que funcionou perfeitamente também em modo pulso. Eu não tenho idéia do que pode estar acontecendo. Quais são as opções que você deseja? Quem sabe possa enviar o hex pronto para você!
      Cláudio

  22. 0

    lario tudo very good?rapaz gostei deste controle,para minhas aplicaçoes de longo alcance, pois alem de ser compacto tambem fica a um preço acessivel importante é que ele é flexivel como pulso,retençao e saida invertida exelente mesmo.apenas uma pequena uma obs me corrija por favor não estou conseguindo comentar para o modo pulso quando compilo.pode me ajudar desvendar o meu misterio? rsrsr obrigado lario pela gentileza.

    1. 0

      Olá José! Você colocou ‘//’ na frente dos defines e não funcionou em modo pulso, foi isto? Deste jeito?

      //DEFINIÇÕES DO USUÁRIO:
      //Define o modo de operação das saidas (comente p/ modo pulso e descomente para
      // modo ‘retenção’):

      //#define c1_ret
      //#define c2_ret
      //#define c3_ret
      //#define c4_ret
      //#define c5_ret

      O que está acontecendo no seu caso?
      Claudio

Os comentários estão fechados.