CONTROLE REMOTO 8 CANAIS ON/OFF – PIC 16F628A

Controlar brinquedos por controle remoto tem sido um dos passatempos mais apreciados por crianças e também ‘adultos’. Muitos gastam ‘fortunas’ comprando replicas de carros, locomotivas, etc. Os menos afortunados nas finanças , preferem ser mais ‘economicos’, montando suas proprias réplicas e construindo seus próprios circuitos eletrônicos. Em alguns casos, queremos apenas controlar alguma coisa a distância, como por exemplo, um aparelho colocado no telhado ou em um prédio distante. Será que poderiamos tirar proveito das facilidades de programação de um microcontrolador para fazermos isto? Veja a resposta…

Veja o esquema abaixo:

Este projeto experimental, utiliza 2 PIC’s 16F628A , sendo um no transmissor e outro no receptor. No transmissor, temos 8 chaves ligadas aos pinos do PIC, que quando acionadas, setarão as respectivas saidas no receptor (led 0 a led 7). Esta saidas poderão controlar reles de carga, controlando assim maior potência. Cargas pequenas poderão ser controladas por transistores, também pode-se usar foto acopladores como MOC3021 para controlar triac’s diretamente em corrente alternada (lampadas, motores,etc). Use sua imaginação!!!

O protocolo usado, basicamente envia um startbit, seguido por um numero de 8 bit, correspondente ao ‘NÚMERO IDENTIFICADOR’ do aparelho, após o que, vem os 8 bits correspondentes ao estado dos botões e um intervalos final entre transmissões. A idéia do numero do aparelho, é poder usar varios conjuntos tx + rx de numeros diferentes, sem que um controle o outro (pelo menos em teoria). Este número poderá ser alterado no arquivo asm e deverá ser recompilado para obter o novo arquivo hex.
Um bit ’0′ é formado por 1 periodo de tempo ‘low’ + 2 periodos de tempo ‘high’ na saida, pino 17. O bit ’1′ corresponde a 2 periodos de tempo em nivel ‘low’, seguido de 1 periodo de tempo em nivel ‘high’ na saida, pino 17.
A rotina de recepção examina a cada 50 microsegundos o estado do pino 17 (entrada de rf) e se=0 incrementa o contador ‘LC’. Se for =’1′, incrementa o contador ‘HC’. A diferença entre eles corresponde ao bit a ser transferido no contador de saida (Res1,Res0). Em uma recepção bem sucedida, o byte Res0 é comparado com um número fixo do aparelho, e se for igual, irá colocar na saida (Portb), os valores recebidos. Caso cesse a transmissão, os contadores de tempos NOTX1 E NOTX, serão decrementados pela rotina, e , chegando em ‘zero’, irão apagar todas as saidas (clrf portb).

Deverá ser usado transmissor e receptor na frequencia cedida a controle remotos na faixa de 27 mhz . Existe muitos vendidos comercialmente, mas poderão ser também montados. Abaixo temos um exemplo ilustrativo de circuito transmissor e receptor, comum nos sites da internet, (porém, não tendo sido testado por mim, nem tenho algum em especial para recomendar):

Como se trata de uma montagem experimental, foi testada apenas em protoboard, com um tx + rx de 433 mhz, mas, para uso em brinquedos, não é permitido, porque nesta frequencia, poderá atrapalhar o funcionamento de equipamentos como portões, alarmes, etc.

Segue abaixo o arquivo ASM para TX:

CR27_TX_ASM

Segue abaixo o arquivo HEX para TX:

CR27_TX_HEX

Segue abaixo o arquivo ASM para RX:

CR27_RX_ASM

Segue abaixo o arquivo HEX para RX:

CR27_RX_HEX

Adicionalmente, pode-se aproveitar as portas que sobram do portA para colocar uma chave ‘DIP’ externa, com o
objetivo de com um único transmissor, poder controlar vários receptores que usem o mesmo ‘serial number’ escolhido no ASM.
Aquele que tiver a combinação da chave “DIP’ igual a do transmissor é que será acionado naquele momento.
Veja o esquema para esta opção de montagem abaixo:

Como temos 6 bits disponíveis, isto permite usar até 64 receptores em um grupo de mesmo ‘serial number’.
Note que o acionamento é apenas momentâneo, uma vez que paramos de apertar a tecla, a saída do receptor desliga.
Assim, deverá ser previsto circuitos do tipo flip-flop ligados na saída do microcontrolador, quando se desejar funções de ‘retenção’.

Segue o arquivo ASM do TX desta versão com chave ‘DIP’:

CR_TX_8C_SEL_ASM

Segue o arquivo HEX do TX desta versão com chave ‘DIP’:

CR_TX_8C_PROG_HEX

Segue o arquivo ASM do RX desta versão com chave ‘DIP’:

CR_RX_8C_SEL_ASM

Segue o arquivo HEX do RX desta versão com chave ‘DIP’:

CR_RX_8C_PROG_HEX

Em 15/03/2014, foi realizado modificações no receptor para que se possa escolher entre modo pulso ou retenção, alterando o ASM e recompilando. O esquema é o mesmo, apenas foi ajustado o arquivo ASM. Portanto, segue abaixo a pasta com esta nova versão configurável pino a pino de saída:

CR_8C_PROG_RET

Caso queira uma versão PWM de 8 canais e 5 botões on/off veja o artigo ‘FAÇA UM CONTROLE REMOTO PWM 8 CANAIS (1MS A 2MS) – COM PIC 16F628A’
Caso deseje outra versão PWM de 2 canais e 3 botões on/off, veja o artigo ‘FAÇA UM PEQUENO CONTROLE REMOTO PWM DE 2 CANAIS (1MS A 2MS) – COM PIC 12F675′
Caso deseje ainda outra versão PWM de 2 canais (sendo uma de 0-5v) e 3 botões on/off, veja o artigo ‘FAÇA UM ‘VERSÁTIL’ CONTROLE REMOTO REMOTO – COM PIC12F675′

Curiosidades:
Filas
Petróleo – acabará algum dia?
Gás Natural – energia para o lar
Ponte da torre – Uma entrada para Londres

Outros assuntos:
Qual o objetivo dos pais ao criar os filhos?
Como lidar com os sogros?
Desempenhem bem o papel de pais
Como reagir ao assédio sexual
Como lidar com problemas financeiros e dívidas
Converse com seus filhos sobre sexo

Assista a este vídeo: O que é um amigo de verdade?

Até o próximo artigo!!!

Deixe um Comentário

124 Comentários.

  1. olá larios venho lhe incomodar mais uma vez queria saber se é possível modificar CR 8c com deep para controlar 4 servos(1a2ms )e 4 on off?
    no qual controlaria 3servos e o ESC(esc tambem funciona com pwm de 1a2ms ´´testado no esc da hobbyking20A ubec´´ para motores brusheles) o teste foi realizado com a versao (8canal para servo e 5 on/off com mais precisao) funcionou perfetamente,a razao de usar esta versao com 8 canal é porquer tem a deep e que se poderia controlar tanto o aero como o automodelo(para quem usa servos e ESC)e sobraria 4 canais para controle diversos(luzez,perda de alcance do tx(busina)e outros. :lol:

    • Olá Morais!
      Se eu estou entendendo, você pretende usar um mesmo controle para operar 2 dispositivos diferentes (o ‘aero’ e o ‘automodelo’). Funciona sim, se forem usados ora um ora outro, alternando a chave ‘dip’.
      Mas nunca simultaneamente. No momento não poderei fazer isto, mas ficará anotado para um futuro artigo.
      Cláudio

  2. Olá. Eu sou da Romênia. Peço desculpas pela tradução do Google.
    Eu simulado no esquema Proteus com 16F628 e ele funciona perfeitamente, agora vou tentar adaptar-se a dois módulos sobre 27Mhz-Tx – Rx. Você vai comunicar o resultado.
    Bom dia!

    • Conclusão.

      Simulada por Proteus, ok, todos os pedidos simultaneamente.
      Nós interligados Tx – Rx por 10K resistência – 17-pin 17 e ele funciona.
      Mas não vá comandos 2-3-4 simultaneamente
      Nada pode ser feito em software? :?:

      • Olá Ata! Estou tendo dificuldade em entender o que está acontecendo. No Proteus funciona, mas ligando pino a pino não funciona, é isto?
        Os interruptores do tx são copiados de uma única vez para o registrador que deslocará para a saída em formato serial. Verifique a ligação deste interruptores e se estão operando a contento. Troque o resistor de 10 k por um de 220 ohms para realizar este teste pino a pino (17 a 17). Se tiver um osciloscópio, analise a forma de onda gerada no pino 17 e veja se ela está de acordo com os interruptores pressionados.
        Cláudio

        • Olá
          Proteus Simulação.
          [URL=http://www.filehost.ro/30514589/Tx_Rx_rar/]Tx Rx rar[/URL]
          Funcionando OK.

          Construído TX-RX
          só funciona cada comando, e não em conjunto 2-3-4.

          Pelo que eu entendo, foi construído com 433MHz TX, trabalhou vários comandos juntos?
          Alguém realmente fez?

          Desculpe Tradução de Google!

          • Olá Ata! Se você está usando a versão com chave ‘dip’, e está desejando usar vários conjuntos de controle remoto (tx/rx) juntos , na mesma frequência, não funcionará. Cada conjunto precisará trabalhar com uma frequência diferente (ex. 27,1mhz para um conjunto, 27,3 mhz para outro, etc). Apesar de um não controlar o outro devido ao código da chave ‘dip’, haverá interferência mutua se não usarem frequências diferentes.
            Espero que seja isto, pois estou tendo dificuldade para entender plenamente o seu problema.
            Cláudio

          • Olá Claudio !!!
            Eu encontrei o erro, ele funciona ok! :razz:

          • :razz: Obrigado por sua paciência.

          • Dragi Ata! Mă bucur că a mers! Vă mulțumim pentru feedback-ul.
            Claudio

            Ps. Google tradutor

  3. AndersonRibeiro

    Em primeiro lugar PARABÉNS pelo excelente blog.

    Sou um hobista e adoro projetos de automação e ja havia um tempo q eu vinha procurando um bom projeto de controle remoto como este aki.
    Eu gostaria de saber qual foi o compilador que vc usou, pois baixei o arquivo ASM para interpretar e ir aprendendo mais sobre ele e o meu MPLAB acusou um monte de erros, coomo eu não entendo gostaria de saber c isso varia d ecompilador mesmo e eu posso compilar e mandar gravar sem medo, poderia tbm baixar o arquivo .hex e gravar.

    OBRIGADO.

    • Olá Anderson! Agradeço por seu comentário de apreço pelo blog.
      Eu tenho usado o Mplab_ide , uma versão mais antiga. Mas o arquivo deve compilar nas versões mais novas, sem maiores problemas. Verifique quais são as mensagens de erro que o compilador apresenta ao compilar e elimine esses erros. Poderia passar quais erros dá? (copie e cole a mensagem para mim poder analisar).
      Cláudio

  4. Bom Dia Claudio…
    poderia pedir um favor a você ???
    Poderia fazer dois arquivos para mim, um RXD e outro TXD…
    Se você puder me manda um E-Mail para que possa
    te explicar melhor…
    Pois tentei achar algo mais não consegui como não manjo muito de programação peço sua ajuda…
    Desde Já te agradeço…

  5. Boa Noite Claudio…
    Seria possível aumenta o sinal para poder ser
    acionado a 1.5 Km de distancia qual circuito
    devo usar ???
    Eu tenho uma antena de 15dbi seria possível
    usar essa antena no envio de sinal ???
    Se possível teria algum esquema para me ajudar…
    Um Abraço e Obrigado…

    • Olá Wagner! A distância de funcionamento de um controle remoto tem que ver com 3 coisas: Um tx com potencia adequada , um receptor que seja ‘sensível’ para captar sinais fracos com qualidade e antenas devidamente sintonizadas e com bom ganho. Assim, um bom receptor pode compensar um sinal fraco de um transmissor. O uso de uma antena sintonizada corretamente na frequência de transmissão resulta em incrível melhoria na distancia que o sistema opera. Toda esta parte de RF não é o meu forte. Fica por conta do hobista escolher os modelos de rx e tx que desejam usar. Mas caso algum colega, leitor deste blog, que tenha alguma experiência nesta área, que deseja compartilhar conhecimento, fica aberto este espaço para receber dicas, sugestões e esquemas que poderiam ser usados.
      Cláudio

  6. Olá Claudio !!!
    Desculpe eu me referi ao interruptor e não ao dip,mais aproveitando a pergunta seri possível fazer um com 12 ou 16 interruptores, para possível uso de todos (interruptores) juntos ???
    Se possível me envie o esquema e comandos…
    Obrigado…

  7. Como faria para utilizar os 8 comandos ao mesmo tempo?Ou pelo menos 4 juntos …
    Pois queria fazer um controle para aeromodelo desde já agradeço …

    • Olá Vagner! Eu não entendi bem sua pergunta? Com oito comando você se refere aos oito interruptores? Se for, já a cada ciclo de transmissão será testado cada tecla e enviado para o receptor, sem problemas. Mas se refere a oito receptores diferentes, para que acionasse junto teriam que ser gravados com o mesmo serial number na primeira montagem ou ajustado as chaves dip para o mesmo código nos oito receptores, na segunda montagem (com chave dip). Para uso em aeromodelismo não recomendo este circuito. Prefira tx/rx comerciais com garantia de funcionamento. Estas montagens aqui publicadas são de natureza didática e não foram testadas em campo, apenas montadas em placa de protoboard. Caso queira aproveitar a ideia, monte primeiro em protoboard e faça seus testes, verificando se atende suas necessidades antes de efetivamente partir para uma montagem em placa e instalação no aeromodelo.
      Cláudio

  8. Opa tudo bom
    Gosto muito de montagem de circuitos e me interessei muito nesse, estou montando um cortador de grama a gasolina por controle remoto, e vi nesse circuito uma maneira facil de montar o controle remoto, vc poderia me mandar talvez o aquivo .hex pois o meu deu problema na gravação e na simulação no proteus com esse arquivo que vc disponibilizou.
    Tambem os arquivos .hex dos outros exemplos de controle que vc postou
    Obrigado se puder quebrar esse galho pra mim

  9. olá claudio!queria usar essa montagem no meu controle remoto(projeto de CR 8 canais com deepd 6 chaves),no qual iria substituir a deep de chave comum.Com essa deep digital será bem mais fácil localizar a combinação,basta que o pic receptor esteja com o numero de identificação,ex(no display do controle mostra por exemplo o numero 12 então o rx que está identificado com o numero 12 receberá o comando.
    morais.

    • Olá Morais! Acha que seria, mesmo assim, prático? Você teria que continuar a procurar a combinação manualmente na chave dip! Isto demora, pois vai por tentativa e erro da combinação. Não seria melhor introduzir a combinação em um teclado?
      Cláudio

  10. claudio tenho uma pergunta,seria possivel fazer uma deep eletrônica com pic para versão do controle.

    o proposito é mostrar em 2 display de 7 seguemento
    a sequencia da deep.
    ex; a deep tem 6 chaves (000000) no display mostraria o numero (00),quando no display for(01)nos pinos da deep será (000001),no display e mostrado o numero decimal e nos 6 pinos do pic fazer o numero binario,(64 posiçoes),sao necessario push buton para selecionar os numeros,nao sei se dar pra fazer com o pic 16f628a.

    morais

  11. Tem como colocar uma linha no código de modo que, ao ligar os 2 PIC’s, no receptor fique um led aceso indicando que está recebendo sinal do transmissor? Ou seja, fique transmitindo algo para o receptor, mesmo sem tecla acionada?

    • Olá Aslen! Se você não necessitar de 8 canais, poderia deixar uns dos canais ligados direto para sinalizar um led na respectiva saída do pic e usar as outras 7. Para manter os 8 canais e acrescentar mais um, exigirá novo asm, alterando significativamente o atual.
      Claudio

  12. jose luiz figueredo

    lario deixe me exclarescer melhor,pretendo fazer uma demonstração de um controle remoto de 100 canais e prentendo usar os recursos dos deeps.ex no meu controle tx vou usar um pic e no receptor quero usar proximo de 12 pic 96 leds, meu radio controle é 315 mhz,para cada posição do deep comando 8 saidas certo.ou não ficou legal ainda?

  13. jose luiz figueredo

    claudio bom dia. tanto posso usar 64 receptores para um um so tx neste controle como tambem poderei utilizar 64 pic para um so radio tx rx certo?

    • Olá José! Não entendi bem a sua pergunta. Soa meio ‘ redundante’. Para cada TX poderei controlar até 64 RX com mesmo serial e com uma das 64 posições na chave DIP, controlando um por vez, por escolher na chave DIP do TX qual receptor deverei acionar. Cada receptor ,obviamente, terá um pic.
      Claudio

  14. :smile: Olá Claudio, 100% este exemplo, montei aqui com um tx e três rx, com a configuração das chaves dip da certinho os comandos,valeu abraços….

  15. O QUE DEVO ALTERAR NA PROGRAMAÇÃO PARA UTILIZAR COM TRANSMISSOR E RECEPTOR 433MHZ?OBRIGADO.

  16. Anderson Oliveira

    Bom dia, claudios.
    sou estudante de eletrônica, quero montar o controle remoto que você fez de 8 canais com LED mesmo igual o do seu projeto, eu já tenho os PICs o TX,RX, LEDs, botoes,antena, resistores, comprei tudo, mas não sei nada sobre micro controlador, poderia me dar uma grande ajuda?
    poderia me passar a programação que vai no PIC e como faço para coloca-la no PIC?
    se puder me ajudar nesta parte da eletrônica, agradeço!

    • Olá Anderson! Para programar um pic, necessitará:
      1) Um programa para o PC para gravar o pic ( poderá usar o WinPic800, gratuito). Baixe do site e instale em seu PC.
      2) Precisará de um hardware gravador ( poderá usar o simples gravador de pic, caseiro ou comprar um gravador comercial)
      3)Precisará de um arquivo HEX. Neste blog, cada artigo tem um arquivo HEX que poderá ser usado. Deve ser aberto no programa WinPIC.

      Para iniciar, veja alguns tutorias no ‘youtube’ de como gravar pic’s. Faça exemplos simples do tipo ‘acender um led’. Leia matérias relacionadas sobre o artigo.
      Não é difícil, mas no início poderá parecer confuso.
      Claudio

  17. jose luiz figueredo

    lario eu nao tinha notado esta nova versao do controle on/off com dip.gostaria de acrescenta)_lo ao meus arquivo.so uma pergunta se caso as chaves dip do tx estiver diferente do rx neste caso nao haverá recepçao de dados e os leds nao acenderao e isto mesmo? fico no aguardo

  18. O controle de pulso momentaneo é ideal, hipotese de funcionamento; estou controlando um alto modelo DIP 1 usando 8 canais para diferente funções´´no qual sao necessario pulso momentaneos“ mais logo preciso ligar as lampadas DIP 2 e voltar a controlar o auto modelo DIP1.Para as lampadas ficarem ligadas mesmo sem sinal nas portas de saidas do pic, usarei um circuito baseado em mosfet,no qual trabalha assim;quando seu gatilho é caregado positivamente mesmo com ausencia de nivel alto(5v)
    o mosfet permanece conduzindo, so voltaria ao estado de não conduçao quando for aplicada nivel baixo(0V) o mosfete nao poderá ser ligado diretamente ao pic será necessário intervensão de transitores. Para fazer o on/off de 1 lampada usa-se 2 canais.(para melhor entender, posso testa-lo primeiro e depois postar o esquema).para tornar os circuitos de on/off mais simples estou realizando teste com portas logicas ´´flip-flop´´
    pois quero ´´economizar´´ canais,o ideal será ligar e desligar uma lampada apenas com um canal ou seja pressionando o botao do controle 1 vez a lampada liga,pressionando o mesmo botao novamente ela desliga.É de extrema nessecidade o controle de 1 receptor por vez e tem que ser momentaneo.
    qualquer duvida pegunta aí!!
    morais

  19. montei este controle funcionou muito bem,mais queria controlar mais de um equipamento, que estão em lugares diferente,teria como da uma ´´turbinada´´ neste projeto e adicionar para 4 portas restante um serial number. ficaria assim; 1 só controle e configurando a deep swicht poderia controlar até 16 receptores
    em diferentes lugares.

    • Olá Morais! Obrigado por seu comentário e suas observações positivas. Se eu entendi, a sua ideia seria usar as 4 portas restante para alterar parte do ‘serial number’, obtendo novos possíveis 16 combinações diferentes. Compartilhe para nós onde teria uso prático desta montagem com tantos ‘possíveis’ receptores?
      Claudio

      • trabalho com eletrônica e estou montando um automodelo,aproveitando o controle do mesmo quero controlar algumas lampadas e o portão(com relés e triacs é claro)controlar saídas de cabo de força também.´´tenho planos de comandar cameras e muito mais).

        morais.

        • Olá Morais! Vejo que você quer ‘automatizar’ tudo! Assim que tiver uma oportunidade vou ver o assunto. Mas, basicamente o que tem que ser feito no ASM é trocar o nibble do serial number menos significativo (LSB), pelo estado dos pinos que sobram , onde será colocado a ‘dip switch’.
          Cláudio

          • ok! entendo muito pouco sobre ASM para fazer estas modificaçoes,mais fico aguardando.
            morais

          • Olá Morais!
            Você pediu para ver a possibilidade de colocar uma chave ‘DIP’ para controlar o endereço de até 16 receptores. Até aí, sem problemas. Mas, sabendo que o sistema atual aciona de forma ‘Pulso’, você perceberá que sua atuação em um dos receptores será apenas momentânea. Quando você apontasse a chave ‘DIP’ para outro endereço, cessa a transmissão para o anterior receptor e ele desliga as saídas. Você já pensou em como contornar a situação? Seus dispositivos já tem sistema para fazer a ‘retenção’ quando recebe um breve pulso? Você poderia fazer um descritivo hipotético de uso real? Ex. endereço receptor 1 na ‘DIP’, aperto botão 5 para ….. depois , endereço receptor 16 e aperto botão 1 para…..
            Quero ter certeza que será funcional.
            Claudio

  20. jose luiz figueredo

    lario pode ser isso?porque na verdade na saida do pic estou usando resistor de 220r do modo original que funciona muito bem com o display de 28 leds nao estou usando 4,7k nem 18k pode ser por isto?

    • Olá José!
      Conforme a tensão de trabalho, temos que alterar a polarização de forma correta. Um circuito com um resistor trabalhando para 5 volts, este terá um valor diferente se a tensão de trabalho mudar. Pode até ter queimado os transistores por excesso de corrente!
      Claudio

  21. jose luiz figueredo

    lario montei o display com 12 leds por digito voce chaveia manualmente ele responde normal e acende todos os digitos porem quando liga ele no pic os resistores de base aquece e nao acende montei com 24 v tem alguma sujestao. led estao em serie conforme ultimo esquema.valeu jose luiz

  22. jose luiz figueredo

    caro colega lario o display que voce me passou o desenho funcionou 100% montei apenas um para começar agora vou montar mais 5 display, pra me montar cada digito com 12 leds o procedimento e o mesmo? somando 72 leds cada display. aguardo noticias sua obrigado.

  23. jose luiz figueredo

    lario posso usar o driver uln 2003 no lugar dos transistores nao posso? dar certo ? abraço jose luiz

  24. jose luiz figueredo

    caro colega lario tudo bom contigo,
    nao seria imprudencia da minha parte perguntar se voce tem o desenho da placa deste display nao seria?
    se tiver e querer disponibilizar eu aceito. grato jose luiz

    • Olá José!
      Não tenho o desenho, porque ainda não fiz uma aplicação com display grandes usando leds, visto que minha montagens são feitas em protoboard e componentes pequenos.
      Mas se algum leitor deste site estiver com tempo e desejar ajuda-lo…
      Cláudio

  25. jose luiz figueredo

    lario neste caso este esquema do display é catodo comum nao e? seria ando comum? grato

  26. jose luiz figueredo

    estimado lario coseguir um endereço do relogio aqui vai ele.www.elektrobilim.org/forum/pic-uygulamalari/4191-saat-tarih-sicaklik-gostergesi-[16f877-ds1302-lm35-7segment]-[ccs-c].html qualquer novidades me fale pois estou curioso de como instalar os display caseiros,cada display tem 28 leds e sao 6 displays.ficarei grato em obter a resposta. ate mais…

  27. jose luiz figueredo

    Larios desculpe nao conseguir lhe enviar o projeto completo relogio digital. o endereço pede senhaeu nao tenho acesso.mesmo assim obrigado.

  28. jose luiz figueredo

    claudio; bom saber que voce e assesivel isto mostra boas qualidades.quanto ao relogio digital eu nao tenho seu e-mail pois te enviaria o projeto no endereço.valeu pelo empenho.

  29. Olá Claudio tb! Com a sua ajuda eu consegui implementar o código no 16f877a e fazer funcionar o pwm do jeito que eu queria, mas não to conseguindo fazer o pwm rodar na frequência de mais ou menos 48zh. Para o motor de carrinho tem q ser mesmo essa faixa de frequência? vc pode me ajudar tb com um filtro para os botões. bom acho q já pedi de mais né, mas se poder me ajudar fico Gradecido.

    • Olá Mauro!
      Use a formula para a frequência de Pwm resultante fornecido no datasheet do próprio PIC16f877a, na pagina 67 ;
      PWM PERIOD
      The PWM period can be calculated using the
      following formula:
      PWM Period = [(PR2) + 1] • 4 • TOSC •
      (TMR2 Prescale Value)
      PWM frequency is defined as 1/[PWM period].

      Em alguns casos, terá de escolher outro cristal que possibilite a frequencia correta. Outras rotinas terão de ser ajustadas para a nova frequencia.
      Quanto a filtro de botão, você poderá testar o botão e após uns 2 msegundos, testar de novo para eliminar debounce. Outra maneira é decrementar um contador previamente carregado enquanto o botão estiver no nivel desejado, e se houve um ruido, mudando para o outro estado, recarregar o valor no contador, e quando sair da contagem em zero, é porque não houve
      mais ruido de chaveamento.
      Claudio

  30. jose luiz figueredo

    caro estimado ilario obrigado por responder a minha pergunta sobre o relogio digital. o relogio em questao usa o pic 16f877 esse relogio pode ser encontrado em saat_tarish_derece_7 display. pretendo fazer os display com 28 leds cada um sao 6 displays ao todos. desde ja agradeço pela atençao.

  31. Olá Claudio, na verdade so preciso de duas saídas PWM, e elas podem até ter a mesma frequência não tem problema.
    Quando aciona o b0 do TX, sai do RX CCP1 e CCP2 incrementando.
    Quando aciona o b1 do TX, sai do RX CCP1 e CCP2 decrementando.
    Desculpe pela pela falta de explicação, Grato.

  32. Olá Claudio, suas palavras de apoio e um incentivo para qualquer pessoa não desistir de seu objetivo, fico feliz por isso.
    Bom Claudio eu como explicador so melhor como pedreiro, é q não sou programador simplesmente sou apaixonado por programação e eletrônica.
    O que faço é pegar partes de programas já prontos e executáveis e vou montando e emendando pra chegar no meu objetivo, esse seu código fiz o teste no protoboard e funciona que é uma beleza.
    Vc esta certo apesar de eu já estar fazendo calo na bunda eu não to conseguindo configurar os bits e nem fazer o incremento e decremento correto. To usando o registrado res1 dessa maneira para separar e identificar o canal e mandar para o pwm para ser incrementado/decrementado.
    Ficaria assim RX:
    CCP1 PWM1 MOTOR1
    CCP2 PWM2 MOTOR2
    B1 ESQUERDA
    B2 DIREITA
    B3 FRENTE
    B4 RÉ
    E mais uns incrementos tipo buzina, farol etc. Eu vo verificar suas dicas e qualquer resultado eu posto aqui, mais uma ves Agradeço.

    • Olá Mauro!
      Gostaria de lembra-lo que com um único PWM não conseguirá controlar vários canais. Você tem que escolher um único canal para ser PWM ou usar um microcontrolador com vários PWM’s.
      Claudio

  33. Olá Claudio, vc teria um código pwm simplificado incremento e decremento em asm. para o pic16f877a. se poder me arrumar fico muito agradecido.

  34. Olá Claudio Obrigado pela atenção, Cara dizem q quem programa em assembly é louco vc é mesmo muito louco, admiro o dom q tem para programar parabéns. Bom fiz umas mudanças e deu certo agora o código tá funcionando no 16f877a, Mas não to conseguindo meu principal objetivo que é incrementar dois PMW, gostaria que me ajudasse pois to tentando aprender programação por conta própria, vou postar aqui o código.
    Meu objetivo é um carrinho controle remoto em q eu possa controlar a velocidade dos motores, Grato.

    LIST P=16F877A ;, R=DEC
    RADIX DEC
    INCLUDE “P16F877A.INC”
    ;————————–
    ERRORLEVEL -302
    __CONFIG _XT_OSC &_CP_OFF &_PWRTE_ON &_WDT_ON &_BODEN_OFF&_LVP_OFF ;&_INTRC_OSC_NOCLKOUT &_MCLRE_ON

    #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA
    #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1
    #DEFINE FLAG FLAGS,0 ;FLAG DE SITUAÇÃO
    #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA
    #DEFINE SIN PORTC,7 ;PINO 17 IN RF

    CBLOCK 0X20
    PWM_SOBE,PWM_DESCE,RES1,RES0,RES1A,RES0A,FLAGS,BITCOUNTER,LC,HC,CONT,R0,R1,R2,NOTX,NOTX1,AUX
    ENDC

    seg EQU 20h
    mili EQU 21h
    x EQU 22h
    W2 EQU 23h
    ST2 EQU 24h

    TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW
    QBYTE EQU .16 ;QUANTIDADE DE BYTES A SER RECEBIDO
    VNOTX1 EQU .1 ;HIGH TEMPO MAXIMO SEM TRANSMISSÃO PARA ZERAR SAIDAS
    VNOTX EQU .50 ;LOW TEMPO MAXIMO SEM TRANSMISSÃO PARA ZERAR SAIDAS

    ORG 0X0000
    GOTO START

    ;=============================PWM=========================
    ORG 0X0004
    movwf W2 ; salvo o W em W2
    movf STATUS,W ; W = Status original
    movwf ST2 ; Salva em ST2

    BTFSS INTCON,T0IF
    GOTO SAI_INT
    BCF INTCON,T0IF

    GOTO INCREMENTA_CCPR1L
    GOTO SAI_INT

    INCREMENTA_CCPR1L
    MOVLW .255 ;255
    XORWF CCPR1L,W
    BTFSC STATUS,Z
    GOTO SAI_INT
    INCF CCPR1L,F

    ;DECREMENTA_CCPR1L
    ; MOVLW .0 ;0
    ; XORWF CCPR1L,W
    ; BTFSC STATUS,Z
    ; GOTO SAI_INT
    ; DECF CCPR1L,F

    SAI_INT
    movf ST2,W ; le STATUS2 para w
    movwf STATUS ; e recupera
    movf W2,W ; recupero W original
    retfie ; retorna da interrupcao.
    ;=======================================================

    START:

    MOVLW 0X07
    MOVWF CMCON ;DESLIGA COMPARADORES
    MOVLW .0
    MOVWF PORTA
    MOVWF PORTB
    BANK1

    MOVLW B’11010110′
    MOVWF OPTION_REG

    MOVLW B’00000001′ ;ENTRADA RF
    MOVWF TRISA
    MOVLW B’00000000′ ;TUDO SAIDA
    MOVWF TRISB
    MOVLW B’10000000′
    movwf TRISC
    MOVLW B’00000000′
    MOVWF TRISD
    MOVLW B’00000000′
    MOVWF TRISE

    MOVLW .255
    MOVWF PR2

    BANK0
    MOVLW B’00000111′
    MOVWF CMCON
    MOVLW B’11100000′
    MOVWF INTCON
    MOVLW B’00000110′
    MOVWF T2CON
    CLRF CCPR1L
    MOVLW B’00001100′
    MOVWF CCP1CON

    CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS
    MOVLW VNOTX
    MOVWF NOTX
    MOVLW VNOTX1
    MOVWF NOTX1

    INICIO:
    BCF INTCON,T0IF

    CLRF RES1
    CLRF RES0
    MOVLW QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER
    MOVWF BITCOUNTER
    L0
    BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO
    CLRF HC
    CLRF LC
    L1
    L1H
    SS5:
    BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO
    GOTO L2 ;FLAG=0
    BTFSS SIN ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF
    GOTO M0 ; SIN=0
    L2
    BTFSS SIN ;SIN ?
    GOTO LA1 ;SIN=0
    BSF FLAG ;SIN=1
    INCF HC,F
    BTFSC STATUS,Z
    DECF HC,F
    GOTO LA2 ;VAI CONTAR TEMPO DE 50 MICRO SEGUNDOS
    LA1
    INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF
    BTFSC STATUS,Z
    DECF LC,F
    LA2
    MOVLW .11 ;.11 = 50 MICROSEG (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF)
    MOVWF CONT
    DECFSZ CONT,F
    GOTO $-1

    DECFSZ NOTX,F
    GOTO SEG_RECP
    MOVLW VNOTX
    MOVWF NOTX
    DECFSZ NOTX1,F
    GOTO SEG_RECP
    CLRF PORTB ;DESLIGA TODAS AS SAIDAS, SE NÃO HOUVER SINAL RF

    SEG_RECP

    GOTO L1
    M0
    MOVFW LC ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF
    SUBLW TMAX
    BTFSS STATUS,C
    GOTO INICIO ;C=0 (-) – LC>TMAX (REJEITAR DADO – PAUSA INICIAL)
    MOVFW HC ;OBTEM O VALOR DE ‘CARRY’(HUM OU ZERO)
    SUBWF LC,W
    RRF RES1,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO
    RRF RES0,F
    DECFSZ BITCOUNTER,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO
    GOTO L0 ;LE PROXIMO BIT
    BTFSC FLAG1 ;TESTA SE É A PRIMEIRA OU A SEGUNDA RECEPÇÃO
    GOTO PULA1
    MOVFW RES1 ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA
    MOVWF RES1A
    MOVFW RES0
    MOVWF RES0A
    BSF FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO
    GOTO INICIO
    PULA1
    BCF FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA
    MOVFW RES1
    XORWF RES1A,W
    BTFSS STATUS,Z
    GOTO ERROTX
    MOVFW RES0
    XORWF RES0A,W
    BTFSS STATUS,Z
    GOTO ERROTX ;ERRO DE RECEPÇÁO
    GOTO ACIONAR ;OK – BOA RECEPÇÃO
    ERROTX
    CLRF RES1A ; APAGA RESULTADOS DE COMPARAÇÃO
    CLRF RES0A
    GOTO INICIO
    ;============================\\ INICIO //===========================
    ACIONAR
    MOVLW 0XAA
    XORWF RES0,W
    BTFSS STATUS,Z
    GOTO INICIO
    ;===========================\\ PWM_SOBE //===============
    COMF RES1,W
    MOVWF PWM_SOBE
    MOVLW .128
    XORWF PWM_SOBE,W
    BTFSS STATUS,Z
    bCf intcon,t0if
    MOVLW .108
    MOVWF TMR0

    ;GOTO VAI

    GOTO PWM_CAI
    ;===========================\\ PWM_DESCE //==============
    PWM_CAI
    COMF RES1,W
    MOVWF PWM_DESCE
    MOVLW .8 ; 64
    XORWF PWM_DESCE,W
    BTFSC STATUS,Z
    GOTO FOI
    GOTO POE_PORTB
    ;===========================================================
    ;VAI
    ;BSF PORTB,7
    ;CALL S1
    ;BCF PORTB,7
    ;GOTO ENFRENTE
    FOI
    BSF PORTB,6
    CALL S1
    BCF PORTB,6
    GOTO ENFRENTE
    ;=============================POE NA PORTA B=================
    POE_PORTB
    COMF RES1,W ;PÕEM NA SAIDA
    MOVWF PORTB

    ;=======================LIMPA SEILA COMO SE FALA ISSO=========
    ENFRENTE
    MOVLW VNOTX ;RECARGA DO REGISTRADOR DE TX RECEBIDO
    MOVWF NOTX
    MOVLW VNOTX ;RECARGA DO REGISTRADOR DE TX RECEBIDO
    MOVWF NOTX1
    GOTO INICIO
    ;=========================DELAY 1 SEGUNDO=======================
    s1
    movlw 1
    movwf seg ; Até aqui incluindo o call gastaram-se 4 us.

    ms100
    movlw 100 ; 1 us Carrega milisegundo com 100
    movwf mili ; 1 us

    ms1
    movlw 249 ; carrega x com o valor 249 (decimal)
    movwf x ; 2 us ( 1 do movlw e 1 do movwf )
    ms2
    nop ; + 1 us
    decfsz x ; + 1 us (no último eh 2 e pula p/ decfsz seg)
    goto ms2 ; + 2 us, total 4us.(no último não passa aqui)
    ; (4 us x 249)-1 totaliza 995 us
    decfsz mili ; +1 us (na última pasagem 2 us)
    goto ms1 ; +2 us (na última passagem pula)
    ; total ms1 (1000 x 100)-1 = 99999
    decfsz seg ; + 1 us (no último eh 2 e pula p/ return)
    goto ms100 ; +2 us (na última passagem pula)

    ; Total antes do return: 4us (inicio) +10 X 100004
    ; {(1 do movlw100 + 1 do movwf milisegundo + 99999 da
    ; rotina ms1 + 1 do decfsz seg + 2 do goto)}- 1 da
    ; última passagem Total = 1000043 us
    return ; + 2 us retorna da sub-rotina apos 1.000.045 us
    ; aproximadamente 1 segundo

    ;===========================fim da rotina de 1 segundo===================

    CLRWDT
    GOTO $-1
    end

    • Olá Mauro!
      Fico feliz que esteja fazendo progresso com o programa. Quanto a ‘ser louco’ por programar em assembly , creio que vai do costume. Se você começa com “C” é difícil querer aprender em assembly. Mas, parece que o oposto também ocorre. Creio que todas as linguagens tem suas vantagens e desvantagens. Quanto ao seu código, verifique no datasheet do pic 16f877,pagina 67, como usar corretamente o PWM. O registrador CCP1L + CCP1CON nos bits 4,5 , tem que ser incrementados/decrementados para variar o tempo ‘on/off’ em plena escala. Eu achei estranho a sua rotina de interrupção, pois nela você está incrementando o CCP1L. Também, ao receber a transmissão correta, você esta usando todo o registrador res1 para comandar. Quantos botões você esta usando para aumentar e diminuir? Quantos canais serão? Como atuarão? Procure colocar no papel a sequencia de idéias, de como funcionará cada passo. Depois, comece a digitar cada porção de código. Você está indo muito bem. Não desista!
      Cláudio

  35. Olá. O que é preciso para mudar para que o código do rx funcione no pic16f877a para que eu possa ter mais opções de controle, Grato.

    • Olá Mauro! Precisará mudar os arquivos de cabeçalho de 16f628a para 16f877a. Depois, terá que escolher quais portas usará e ajustar os ‘tris’ respectivos. Leia o datasheet para determinar o que deve ser ajustado para que cada port funcione como digital, pois o portA tem conversor analógico digital.
      Cláudio

  36. jose luiz figueredo

    gostei muito deste projeto controle de 8 dispositivo com pic 16f628 via rf ideal para aplicaçao robotica
    parabens pelo genio que investiu seu tempo neste projeto e gratuitamente se dispos ajudar outros.
    eu tenho um projeto de um relogio que marca hora,data e temperatura porem os display sao multiplexado tem como adaptar para display grande feito de led. desde ja agradeço pela atençao.jose luiz tj

    • Olá José Luis!
      Obrigado por seu comentário e o incentivo. Quanto a adaptar seu relógio, dá com certeza, se você descobrir como é a multiplexação. Se for por coluna com display e linhas com os seguimentos é fácil. Basta ligar transistores que chaveiem os leds por seguimentos e outro que chaveie a alimentação do display. O display seria um ‘caseiro’? O relógio é projeto com pic ou comercial, do tipo radio/relógio?
      Cláudio

  37. Olá Claudio, gostaria de saber se você tem algum esquema de um transmissor 433mhz, que trabalhe em 3 Volts, parecido com esse seu de 27mhz ou parecido com os usados em controles 433mhz comercias, obrigado !

  38. Ola larios!!!montei um carrinho de controle remoto com o pic 16f628a utilizando o modulos tx e rx e os ci HT12d eo HT12d e os principais comandinhos sao os basicos vai para frente vai para tras vai para a direita e vai esquerda os acionamentos do motor sao por rele,meu curso esta no final e eu nao sei como fazer essa programaçao em assembly sei só basico que é ascender o led kkkkkkk se vc pudesse me ajudar eu agradeco desde de ja estou desesperado meu tcc ja é o mes que vem vlw abraços!!!

  39. OLA CLAUDIO, TUDO BOM!
    VENHO AQUI MAIS UMA VEZ TIRA UMA DUVIDA, SERIA POSSIVEL ULTIZAR CR27_RX NO MODO MISTO, SENDO 2 ON/OFF E AS OUTRAS 6 PULSO ENQUANTO ESTIVER PRESSIONADO UM DOS 6 BOTOES LIGAR AS SAIDAS SE PARA DE APERTAR DESLIGA. O OBJETIVO SERIA USA NUM CARRINHO CONTROLE REMOTO. E MUITO OBRIGADO POR DIVULGA O MEU PROJETO.
    FELIZ ANO NOVO PRA VC E FAMILIA, E TODOS COLEGAS AQUI BLOG…

    • Olá Ney! Seria sim, mas tem que acrescentar mais linhas de código. Seria um misto de pulso e retenção. Veja como pode ser feito
      neste exemplo aqui já publicado.
      Claudio

      • ola Claudio, já tinha ate dado uma olhada no código v6 publicado com (pulso ou retenção) ainda estou gateando, não consigo fazer algumas alterações, mas ainda chego-la. se vc tive um tempinho, minha ideia seria usa o pino 1 ou pino 2 para selecionar um Jumper pulso ou retenção. a montei um transmissor com frequência 433,92 Mhz para usa no luga daquele publicado de 27 Mhz facio de monta com alcance ate 100m, assim que tive bem testado irei passa pra vc posta aqui.

  40. Ok,obrigado pela atenção e vou estudar as mudanças. Valeu!!

  41. Poderia me ajudar a modificar esse seu código pra usar no PIC16F877? É porque eu precisava de mais portas de entradas e saída(pelo menos 16)Fico agradecido se puder me ajudar.

    • Olá Aslem! Qual a sua idéia para uso do circuito?
      Claudio

      • Queria fazer o mesmo controle mas com o máximo de canais de transmissão e recepção possíveis pra eu fazer um detonador de fogos à distância

        • Olá Aslem! Entendi o que você deseja fazer. Mas, trabalhos com pirotecnia exigem equipamentos profissionais com normas de segurança elevadas. Este transmissor/receptor é de caracter didático e pode apresentar falsos sinais na saída em decorrência de interferências externas, o que poderia gerar acidentes até fatais. Não recomendo, em hipótese alguma, o seu uso nesta função, visto que poderá causar, com certeza, acidentes até fatais.
          Claudio

          • Pode ficar tranquilo quanto à segurança e etc.Sou de Santo Antônio do Monte-MG,a capital brasileira dos fogos de artifício, eu já trabalhei na fabricação deles, meu pai trabalha até hoje e conheço outros detonadores sem fio e com fio.Meu projeto é didático também e mesmo que apresente falhas, o risco é mínimo devido ao conhecimento que tenho dos perigos e precauções que vou tomar.

          • Olá Aslem! Menos mau então. Para fazer o que você deseja, terá que aumentar a quantidade de bit a ser enviado em +8 bit, tanto no tx como no rx. Terá que fazer testes em mais 8 chaves, talvez colocando-as no portD. O portA é incompleta, no Pic 16f877, sendo melhor usar o portB e Portc no lugar do portA e B.
            Vai envolver muitas mudanças, com certeza. No momento, não estou com disponibilidade de tempo para isto, e também, não tenho um pic 16f877 (40 pinos) para testes. Talvez tenha um 16f872 (28 pinos) . Vai para o “caderninho”, ok.
            Claudio

  42. Amigo, como faço para alterar o endereço do startbit para usar dois TX e dois RX totalizando 16 canais,
    Desde já agradeço pela força.

    Aloisio

    • Olá Aloisio! O startbit não deve ser alterado, mas o primeiro byte pode ser usado para diferenciar um tx de outro. Veja o pedaço de código abaixo:
      INICIO:

      ;=============================
      MOVLW 0XAA ;CÓDIGO DO TX
      MOVWF RES0
      MOVFW PORTB ;PEGA INFORMAÇÃO DAS TECLAS
      XORLW 0XFF
      BTFSC STATUS,Z
      GOTO INICIO ;AGUARDA ALGUMA TECLA SER APERTADA
      MOVFW PORTB
      MOVWF RES1

      ENVIAR:

      Voce pode alterar a primeira linha acima,onde está ‘ MOVLW 0XAA ;CÓDIGO DO TX’
      para outro valor, como por exemplo, MOVLW 0X33 ;CÓDIGO DO TX .

      A mesma mudança tem que ser feito no receptor que irá receber o sinal.

      Cláudio

  43. Claudio, valeu pela direção, vou estudar, e cara, que site bom, parabéns, depois que eu estudar e fizer os testes, posto o resultado, vlw e té+.

  44. Valeu, Claudio por responder, mas eu já tava usando um resistor de 10k, mas decobri que afonte estava ruim, não tinha corrente. Consertei a fonte e agora consigo acionar o relé. Mas aproveitando o seu conhecimento, eu notei que ao apertar um botão o relé é acionado e logo desarma, mas alterei uma linha do programa e consegui fazer o relé permanecer acionado. Tem como por exemplo: 1º) Ao apertar o botão novamente desativar o rele tipo liga/Desliga, mas apertando o mesmo botão? 2º) ao apertar outro botão o 1º relé não seje alterado, a menos que eu aperte o botão que corresponda a ele?, mais uma vez obrigado Claudio.

  45. Boa noite, olha parabéns pelas informações que você disponibilizou, eu sou estudante, eu gravei o pic e montei o protoboard e funcionou perfeitamente, mas precis de sua ajuda, é que quando eu substituí os leds por relés e o relé fica ativo o tempo todo, mesmo quando não aperto nenhum botão, e quando eu monto um circuito só para o relé sem o pic com acionamento direto por botão passando enviando 5v na base do BC548 o relé funciona tem alguma idéia do que poderia ser para me ajudar, desde já antecipo meus agradecimentos.

    • Olá Gilvan! Creio que seja um simples problema de polarização. Voce deve estar usando o mesmo valor do resistor para o led na base do bc 548. Tente troca-lo por um de 10K. Lembre-se que o nivel low do Pic pode variar de 0,2 até por volta de 0,8 volts. O transistor passa a conduzir a partir de 0,5 chegando a saturação com 0,7 volts. Na situação de low com o,6 volts já faria o transistor conduzir e ligar o rele.

      Pic (pino de saida) ———————resistor de 10k ————-base do bc548

      Cláudio

  46. Olá, Claudio!

    Agradeço as dicas, tem ajudado bastante;
    Estou usando o MPLAB e simulando no PROTEUS.
    Alterei para 4 canais com retenção e separadamente funcionou; mas qdo juntei os programas no mesmo PIC, então só funciona o TX, pois ele é executado primeiro; se inverter, executando primeiro o RX, então o TX pará de funcionar e o RX funciona…Estou tentando entender a lógica de transmissão e recepção…
    Mas, se puder, dê uma olhada no programa abaixo, e se puder dar uma dica… Agradeço

    ;TRANSCEPTOR DE 4 CANAIS – BASEADO NO RX/TX DE 8 CANAIS (CLAUDIO LÁRIUS).
    ;LIGA/DESLIGAR COM 4 CANAIS, MANTENDO O ULTIMO ESTADO DE ACIONAMENTO.
    ;
    ;JAMIL RAMOS 01/11/2012
    ;

    LIST P=16F628A , R=DEC

    INCLUDE “P16F628A.INC”
    ;————————–
    ERRORLEVEL -302
    __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_ON & _LVP_OFF

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA
    #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1
    #DEFINE OUT_RF PORTA,0 ;OUT RF PINO 15
    #DEFINE BT1 PORTB,0 ;BOTÃO 1
    #DEFINE BT2 PORTB,1 ;BOTÃO 2
    #DEFINE BT3 PORTB,2 ;BOTÃO 3
    #DEFINE BT4 PORTB,3 ;BOTÃO 4
    #DEFINE FLAG FLAGS,0 ;FLAG DE SITUAÇÃO
    #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA
    #DEFINE FLAG_1 FLAGS,2 ;FLAG DE SITUAÇÃO SAIDA 1
    #DEFINE FLAG_2 FLAGS,3 ;FLAG DE SITUAÇÃO SAIDA 2
    #DEFINE FLAG_3 FLAGS,4 ;FLAG DE SITUAÇÃO SAIDA 3
    #DEFINE FLAG_4 FLAGS,5 ;FLAG DE SITUAÇÃO SAIDA 4
    #DEFINE SIN PORTA,7 ;PINO 16 IN RF
    #DEFINE LED1 PORTB,4 ;SAIDA 1 – PINO
    #DEFINE LED2 PORTB,5 ;SAIDA 2 – PINO
    #DEFINE LED3 PORTB,6 ;SAIDA 3 – PINO
    #DEFINE LED4 PORTB,7 ;SAIDA 1 – PINO

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    CBLOCK 0X20
    RES1,RES0,RES1A,RES0A,FLAGS,BITCOUNTER,LC,HC,CONT,R0,R1,R2,NOTX,
    NOTX1,AUX,OUT,RES1TX,RES0TX,R6,R5,R7,BTS ;registradores
    ENDC

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    QBYTE EQU .16 ;QUANTIDADE DE BYTES A SER ENVIADO/RECEBIDO
    TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW
    VNOTX1 EQU .1 ;HIGH TEMPO MAXIMO SEM TRANSMISSÃO PARA ZERAR SAIDAS
    VNOTX EQU .50 ;LOW TEMPO MAXIMO SEM TRANSMISSÃO PARA ZERAR SAIDAS
    FILTRO EQU .50 ;FILTRO PARA ACIONAMENTOS

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ORG 0X00
    GOTO START
    ORG 0X04
    RETFIE

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    START:
    MOVLW 0X07
    MOVWF CMCON ;DESLIGA COMPARADORES
    MOVLW .0
    MOVWF PORTA
    MOVWF PORTB
    BANK1
    CLRF OPTION_REG ;HABILITA PULL-UP

    ;DEF. PORT_B B’76543210
    MOVLW B’11111111′ ;TUDO ENTRADA
    MOVWF TRISB

    ;DEF. PORT_A B’76543210
    MOVLW B’10000000′ ;(PA7=RFIN); (PA0=RFOUT); (PA3,PA2,PA1,PA0 = LEDS 4,3,2,1)
    MOVWF TRISA

    BANK0
    CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS

    MOVLW VNOTX
    MOVWF NOTX
    MOVLW VNOTX1
    MOVWF NOTX1

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    INICIOTX:

    MOVLW 0XAA ;CÓDIGO DO TRANSMISSOR
    MOVWF RES0TX ;ENVIA CODIGO PARA O 1°BYTE DE TRANSMISSÃO
    MOVFW PORTB ;PEGA INFORMAÇÃO DAS TECLAS
    MOVWF BTS ;ENVIA PARA BTS, FORMAR 2°BYTE DE TRANSMISSÃO
    BSF BTS,7 ;IGNORA BIT 7 DA PORTA B
    BSF BTS,6 ;IGNORA BIT 6 DA PORTA B
    BSF BTS,5 ;IGNORA BIT 5 DA PORTA B
    BSF BTS,4 ;IGNORA BIT 4 DA PORTA B
    MOVFW BTS ;PEGA INFORMAÇÃO DAS TECLAS
    XORLW 0XFF ;COMPARA COM LOGICA “OU EXCLUSIVO”
    BTFSC STATUS,Z ;O RESULTADO FICA NO REGISTRADOR “STATUS,Z”
    GOTO INICIOTX ;SE RESULTADO “1″, ENTÃO AGUARDA TECLA SER APERTADA
    MOVFW BTS ;SE RESULTADO “0″, ENTÃO SERÁ O 2° BYTE DE TRANSMISSÃO
    MOVWF RES1TX ;ENCAMINHA PARA REGISTRADOR DO 2°BYTE

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ENVIAR:
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    PAUSA:
    MOVLW .23 ;23 UNIDADES BASICAS DE BIT
    MOVWF R6
    RTY:
    CALL DELAY1CK
    DECFSZ R6,F
    GOTO RTY

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    CALL STARTBIT
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    MOVLW QBYTE ;QUANTIDADE DE BITS A TRANSMITIR
    MOVWF R5
    VOLT10:
    BCF STATUS,C
    RRF RES1TX,F
    RRF RES0TX,F
    BTFSC STATUS,C
    GOTO EB1
    CALL BIT0
    VV13:
    DECFSZ R5,F
    GOTO VOLT10
    GOTO INICIOTX ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    EB1:
    CALL BIT1
    GOTO VV13
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;ROTINAS

    DELAY1CK:
    MOVLW .120
    MOVWF R7 ;158D PARA 330 MICROSEG. DE LAMBDA
    DECFSZ R7,F
    GOTO $-1
    RETURN
    BIT0:
    BCF OUT_RF
    CALL DELAY1CK
    BSF OUT_RF
    CALL DELAY1CK
    CALL DELAY1CK
    BCF OUT_RF
    RETURN
    BIT1:
    BCF OUT_RF
    CALL DELAY1CK
    CALL DELAY1CK
    BSF OUT_RF
    CALL DELAY1CK
    BCF OUT_RF
    RETURN
    STARTBIT:
    BSF OUT_RF
    CALL DELAY1CK
    BCF OUT_RF
    RETURN

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    INICIORX:

    ;BANK0
    CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS
    MOVLW VNOTX ;APAGA REGISTRADOR
    MOVWF NOTX ;APAGA REGISTRADOR
    MOVLW VNOTX1 ;APAGA REGISTRADOR
    MOVWF NOTX1 ;APAGA REGISTRADOR

    CLRF RES1 ;LIMPA REGISTRADOR DO 2°BYTE (TECLAS)
    CLRF RES0 ;LIMPA REGISTRADOR DO 1°BYTE (CÓDIGO)
    MOVLW QBYTE ;PREPARA A RECEPÇÃO PARA 16 BITS A RECEBER
    MOVWF BITCOUNTER ;ARMAZENA O VALOR DE 16 NO REG.”BITCOUNTER”
    L0
    BCF FLAG ;LIMPA O “FLAG0″, REGISTRO DE RECEPÇÃO
    CLRF HC ;LIMPA O REG.”HC”
    CLRF LC ;LIMPA O REG.”LC”
    L1
    L1H
    SS5:
    BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO
    GOTO L2 ;FLAG=0

    • Olá Jamil! Você está indo muito bem. Pense no seguinte: Cada um dos programas em sí, forma um loop fechado para funcionarem. Se voce colocar o tx antes do rx, nunca vai funcionar o rx e vice-versa. O que voce tem de fazer é ,de alguma forma , interromper o loop individual e de um passar para o outro e do outro para um. Mas tem que levar a questão da prioridade. Se uma recepção está em progresso, deverá terminar primeiro, antes de começar a transmitir, ou seja, recepção tem prioridade. A milhares de jeito diferente de fazer a coisa funcionar (e isto me maravilha!). Você poderá usar o desvio de rotina (goto) para isto. Mas , parece, olhando por cima, que se você iniciar a rotina de recepção primeiro, e escolher um ponto desta rotina em que você poderá usar um ‘call testa_tx’ para ver se algum botão foi apertado da parte da transmissão, ou seja, você vai colocar toda rotina da transmissão como se fosse uma subrotina. Se não estiver recebendo nenhum sinal, ela irá imediatamente enviar o sinal para transmissão e acabando , voltará para a rotina de recepção. O ponto critico é de onde você chamaria esta subrotina, levando em conta a prioridade da recepção (logicamente, se desejar, por ser subrotina, poderia ser chamada de varios pontos estratégicos. Você deve estudar como funciona tanto a recepção como a transmissão, que fica mais facil achar este ponto. Eu procuro, ao estudar programas de colegas, desenhar um fluxograma em uma folha de papel, a medida que vou lendo o arquivo ASM. Isto ajuda a ‘ver’ o que está acontecendo.) Espero que estas dicas te ajudem.
      Claudio

  47. Bom dia, Claudio!
    Como o 16F628A só tem 16 portas, então não dá, pois precisaria de 18 portas… Fiz alguns anos atrás um curso bem basico do pic em assembler (acender e piscar leds, etc), alguns comandos descritos no seu projeto são familiares… Como o serial é composto por 8 bits fixo (código do tx) + 8 bits (leituta da porta B), então pensei em utilizar apenas 8 bits(codigo do tx) + 4 bits(4 teclas); desta forma seria utilizado 10 portas do pic(4 teclas, 4 leds, 1 entrada, 1 saida). Mas como faço pra inserir apenas 4 bits da porta B na serialização? Pensei em utilizar o seu receptor p/ HCS PIC16F628A, por sinal muito bom, mas fica além dos meus conhecimentos, e não teria como explicar o funcional na banca do TCC… O projeto inicial eu estava fazendo com um par de HT12D e HT12E, 2 ci com portas AND, 2 ci 4013 pra manter os leds acesos (liga/desliga). A idéia do projeto é simple: é um controle remoto de luzes para 4 comodos com leds para monitorar quais comodos (luzes) estão acesos e poder ligar e desligar qualquer das 4 luzes de qualquer comodo; ao transmitir o comando pra acionar um comodo, este comando é enviado pra todos transceptores, atualizando o respectivo led de status. Pra acionar a lampada utilizo um rele ligado em um dos 4 leds com um transistor. Mas como vou colocar isto dentro do interruptor de luz, então o espaço não deu… Usando apenas o PIC + (TX e RX), então daria… Outra dúvida, como faço pra alterar as saidas em liga/desliga a cada acionamento do tx?
    Desde já agradeço

    • Olá Jamil! Você poderá baixar o MPLAB-IDE (editor,compilador e debugador), O WINPIC800 para programar e alguns datasheets dos microcontroladores que irá usar. Em seguida , ler alguns tutoriais, e tentar fazer programas simples em asm, depois compilar, usar o debugador e ver o que acontece nos registradores e saidas. Deverá providenciar um hardware para transferir o arquivo HEX para o chip (poderá usar o SIMPLES PROGRAMADOR). Depois que voce pegar o jeito, pegue o arquivo asm acima e tente rodar no debugador para estudar o funcionamento. Dai faça as alterações que deseja, no caso, a união dos dois arquivos , Altere as portas para entrada e saidas desejadas e gradativamente va testando e eliminando os ‘bugs’ (erros) que forem dando. É um pouco cansativo, mas é muito legal fazer tais programas. Para alterar a saida em modo ‘retenção’ ,voce primeiro precisa testar se está ligado ou não a saida desejada e depois inverte-la a cada sinal recebido. Precisará identificar quando ocorreu uma nova transmissão, pela ‘pausa’ entre transmissão, visto que ao apertar o botão, irá rapidamente ocorrer varias transmissões sucessivas.
      Claudio

  48. Podem ser varios tx/rx(transceptor) em “espera”( ninguém transmitindo); Ao acionar a tecla-1 do tx/rx, ele vai transmitir alguns frames de comando p/ acionar o led-1 dos demais tx/rx; Os tx/rx ao decodificar os frames, acionará a saida do led-1, mantendo-a acionada. se o prox. comando for igual, então a saida led-1 será desligada.
    Como o 16F628A tem 16 portas, então seria 4 teclas, 4 leds, 1 saida tx, 1 entrada rx, reset.

    • Olá Jamil! Creio que não terá problemas para fazer isto. Basta colocar os dois arquivos juntos (tx e rx) fazendo o loop final de um ir para o loop inicial do outro. Deverá acertar na inicialização, as io’s correspondentes aos pinos de entrada e saida em apenas um dos arquivos ( o que voce escolher como inicial). Elimine a inicialização do outro. Dai, bastaria montar varios circuitos para teste.
      Claudio

  49. Olá, Larios! A idéia é um transceptor que envia e recebe comandos, sendo de 3 ou 4 canais; exemplo:ao acionar a tecla(1), ele transmite o comando pra outros transceptores, que acionarão o led(1), que ficará aceso até receber o prox. comando da tecla(1). Como o tx e rx ficará na mesma placa, então usar só um 16F628A será show.
    Desde já, agradeço. Se quiser te envio o esquema…

    • Olá Jamil! Entendi bem. Quantos destes “transceptores” seriam montados? Se mais de 2, haveria a possibilidade de conflito de sinais, ou somente seria acionado um por vez (como em uma apresentação escolar)? Haveria diferença na frequência transmissora da receptora?
      Claudio

  50. Muito bom, todos aplicativos. Pra mim será de grande aprendizado…
    Estou fazendo meu TCC, com um projeto de Transceptor para ligar e desligar 3 leds, utilizando modulos tx e rx 433mhz e Holtek HT12D e HT12E. Se reduzir os 2 softwares p/ 3 canais, caberiam no pic? Grato

Deixe um Comentário