FAÇA SUA PLACA DE CONTROLE REMOTO PARA PORTÃO AUTOMÁTICO – COM PIC 12F629 (VERSÃO PARA CI HT6P20B)

Muitos ainda tem controles remotos (‘chaveirinhos’) que usam o circuito integrado HT6P20B. Gostaria de usa-los para acionar seu portão por controle remoto?

A idéia basica é simplesmente programar o PIC12F629 com o arquivo hex abaixo e aproveitar a mesma placa usada no projeto ‘PLACA RECEPTORA DE PORTÃO AUTOMATICO COM PIC 12F629 / HCS200..301 ROLLER CODE‘. Desta forma, obtemos duas opções para usarmos: transmissores (chaveirinhos) com chip HCS 200 A 301 COM ROLLER CODE ou chip HT6P20B com código fixo.
Também, excetuando o circuito integrado usado, todas as outras funções se aplicam também a esta versão.
A vantagem deste circuito integrado é que ele vem de fábrica programado com uma uma palavra código de 64 bits que pode ser recebida e armazenada na EEprom do microcontrolador. Portanto, voce não precisa se preocupar em ter de programador o HT6P20B. Basta acionar o controle e apertar a tecla ‘Learn’ da placa para realizar o aprendizado deste controle. A desvantagem é que, se alguém quizer, pode construir um equipamento (chupa cabra) para capturar a palavra código e em outra ocasião, usa-la
para acionar o equipamento (portão).
Sobre o funcionamento do HT6P20 , veja o datasheet.

Segue o arquivo Asm com opção para 12f629 ou 675 (comentando/descomentando na opção de usuário):

PLACA_HT6P_V2.ASM

Segue o arquivo Hex para Pic12f629:

PLACA_HT6P_V2_629_HEX

Segue o arquivo Hex para Pic12f675:

PLACA_HT6P_V2_675_HEX

Para obter o esquema da placa, clique aqui.

Para obter o desenho da placa de circuito impresso, clique aqui.

Para obter o desenho da placa de circuito impresso com os componentes, clique aqui.

Obs. Caso deseje usar o ci Hcs200…301, veja este link aqui

Até o próximo artigo!!!

Curiosidades:
Cadê os Portões de Gaza?

Outros assuntos:
Aprenda a perdoar
Como lidar com sogros
Problemas financeiros e dividas
Ajuda para depressão
Porque há tantos desastres naturais?

Deixe um Comentário

57 Comentários.

  1. Salve!! Grande Larios… cara, depois de muito trabalho, consegui finalizar a central de portão… não foi nada fácil. Quero muito te agradecer porque tudo começou nesse site/post… muito obrigado mesmo… de coração. Agora, estou tentando aprimorar um pouco suas funções… tem ideia de como funciona as centrais que possuem partida e parada suave?? to pesquisando e não tenho tido muito sucesso… pelo que ja li, deve ser usado o PWM do PIC para alterar a frequência de funcionamento do motor… mas não vi nada muito didático… talvez tu possa me ajudar. Grande abraço.

    • Olá Waymovie! Parabéns pelo seu sucesso! Você irá descobrir que um projeto SEMPRE haverá algo que se possa aprimorar ! Quanto ao sistema de ‘partida suave e parada suave’, também não tenho detalhes do seu funcionamento. Mas acredito que deva controlar o disparo de um triac ( como um dimmer) na arrancada , dando em seguida a velocidade máxima ajustada e ao encontrar o sensor reduzir ao mínimo e parar após um tempo. A verdade é que não trabalho com isto. Creio que outros colegas da área, que lem este blog, poderão explicar melhor este sistema…
      Cláudio

  2. Salve! Larios… me tira uma dúvida: nesse teu projeto, quando pressionado o botão Learn, o Led deve acender?? cara, continuo com problemas para apagar os controles… talvez tenha ligado alguma coisa errada… pior que a placa ta pronta e apresenta esse problema..kkkk testei tudo, menos apagar o controle… estranho que quando pressiono o botao (+/- 10 seg) o led fica aceso todo o tempo e bem sempre pisca 3 vezes… vou monta na protoboard de novo e simular as ligações tal qual o teu projeto… Abç

  3. Salve!! Eu de novo… cara, esse teu projeto da central do portão, a programação dos fins de cursos são em nível zero, ou melhor, a lógica para desligar o motor é +/- if(!input(“fim de curso”)… isso para os dois fins de curso… pergunto porque queria alterar a ligação elétrica colocando dois resistores de 10k entre os reed switches e o pic…. é que da forma que está, se eu testar sem ligar o motor os relés funcionam certinho, mas se eu ligar o motor, os relés, as vezes, ligam e desligam em seguida… acho que é iterferência/ruído das chaves… olhei uma cetral que tenho aqui (marca “x”)… e percebi que tem um capacitor ceramico de 100nF os fins de curso… quero fazer esse teste…

    • Olá WayMovie!
      Se eu estou entendendo bem o que você quer saber, os fins de cursos acionam quando ligam ao gnd (para o motor ao ligar ao gnd no reed switch). Quanto a usar os capacitores de 0,1 uf, tente na prática e veja se resolve o problema em seu projeto.
      Claudio

      • Olá! Sim… em princípio deu certo… posso te incomodar mais uma vez (é não entendo bulhufas de ASM)?? percebi que, conforme tua programação, se ficar pressionando o botão do controle por “x” segundos e liga e desliga a saída do PIC… como uso aqueles TX CAR (controle do portão no farol do carro) ele envia sinal por cerca de três segundos… tem como tu aumentar o delay pós acinamento do controle, antes de ele aceitar um segundo acionamento… uns 4 segundos ficaria ótimo… Abraço.

        • Olá Waymovie!
          Fico feliz que consegui fazer funcionar.
          Quanto ao tempo, observe a seguinte porão do código:

          TG9
          MOVLW .10 ; aumente aqui para prolongar o tempo entre acionamentos
          CALL DELAYM
          INCF SITUAÇÃO,F
          GOTO INICIO

          Experimente aumenta de .10 para , talvez .20 ou mais e recompile no Mplab. Vai tentando até obter o tempo que deseja.

          Cláudio

  4. Ola amigo. Montei a placa gravei o PIC, mas ele nao esta apagando os controles cadastrados. Você tem alguma outra versão?

    • Olá Fábio!
      Por favor, tente regravar o arquivo hex no pic. Que problema ele está apresentando?
      Cláudio

      • Ola, obrigado por responder. Entao, ja regravei varias vezes, ele funciona tudo certo mas na hora que voce segura o botao learn por mais de 10 segundos ele nao apaga os controles cadastrado na memoria interna do PIC. O que pode ser que esta acontecendo? Fico no aguardo.

        • Olá Fábio! Vou montar no protoboard e testar, assim que tiver um tempinho. Depois, retorno.
          Cláudio

          • Salve!! E aí Larios… cara, tentei montar na protoboard esse projeto do portao e aconteceu a mesma coisa do usuário fabieraaaa…(além de outros problemas) pic não ta apagando os controles e, além disso, após pressioar o learn por vários segundos o programa “pira”. aciona sozinho os motores(motei com dois coolers de PC)… mesmo se desligar com o controle, ele volta a acionar sozinho… pra resolver, só se regravar o PIC… estranho, né?? outro problema que aconteceu: o fim de curso que tem o resistor de 10k não funcionou de forma alguma… conferi e reconferi, mas não consegui…. pode, por favor, dar uma conferida no projeto pra ver se ta funcionando ok??? Abraço

          • Olá WayMovie! Por favor, tente agora com os novos asm e hex. Realmente havia um erro. Por favor, teste também, e depois de um retorno.
            Claudio

        • Olá Fábio! Realmente, estava errado o programa na parte de apagamento. Por favor, use os novos arquivos postados no artigo, que já foram acertados , teste e depois, me de um retorno.
          Claudio

  5. E ai cara, blz. Me diga uma coisa qual seria este modelo de motor que vc está utilizando, e outra coisa, não seria necessário um capacitor em paralelo no motor para reduzir a carga inicial?

    Fico no aguardo, valeu.

    • Olá Everson!
      A placa é para qualquer motor comercial, de 3 fios. O que muda é o modelo de rele que suportem a corrente do motor. O capacitor, neste tipo de motor, faz parte do sistema de atraso de fase, e permite a reversão de sentido de rotação. Desconheço alguma aplicação em que se coloca em paralelo um capacitor com este tipo de motor , com objetivo de “reduzir a carga inicial”, exceto correção do fator de potencia na rede elétrica.

      • É isso que quis dizer. Correção do fator de potência. rsss :oops:

        A inversão da rotação do motor é pelos relês certo, conforme é feito a combinação dos fios para cada relê. Ok?

        Obrigado pelas respostas.

  6. Salve! Larios, mais um excelente projeto… parabéns pela iniciativa. Pode me tirar uma dúvida: pra qe serve os resistores de 2K2 (antes dos transistores) no projeto?

  7. Salve! Larios, mais um excelente projeto… parabéns pela iniciativa. Pode me tirar uma dúvida: pra qe serve os resistores de 2K2 (antes dos transistores) no projeto?

  8. Olá, Claudio o link com a versão >>>>usar o ci Hcs200…301, veja este link aqui.não da acesso..

  9. claudio bom dia
    na verdade e o seu projeto so colokei um resistor na saida do pic um b548 o diodo e o rele..
    enfim axo ke descobri um dos meus problemas eu mudei a fonte tipo colokei um lm317 e um pot pra regular entaum fui abaixando a tensao quando xegou em 4,5v funcionou certinho com um distancia de uns 50mts
    mas naum sei c e por causa disso mas e fica ligado sozinho depois de um tempo e como c eu tivesse apertando o botao do controle e acontece com os dois leds trokei o pic 675 pelo 629
    obrigado por me ajudar

    • Olá Fabinhos!
      Não entendi bem. Você conseguiu ou não deixar seu projeto operacional?
      Diminuir a tensão de alimentação para 4,5 volts poderá trazer instablidade no funcionamento do pic, e não recomendo.
      O problema não está na polarização da base do transistor que liga o rele? Tente colocar um resistor de 4k7 da saida do pic para a base e da base para o gnd, coloque outro de 4k7. Isto deverá eliminar para metade o nivel ’0′ do seu pic para 0,1 a 0,3 volts, não permitindo ligar o transistor. Somente com nivel ’1′ (por volta de 2,2 volts) haverá suficiente tensão para polarizar o transistor e ligar o rele.
      Claudio

  10. cladio
    eu montei td e ainda esta na protoboard
    tipo naum to mexendo com as fases ainda quando uso so com o led funciona maravilhas distanci td mais
    mas so e liga o rele ele liga de qualker distancia mas para desligar tenho ki encostar o chaveirinho no receptor
    obrigado

  11. claudio boa tarde
    axo que descobri alguma coisa
    tipo assim quando aperto o controle (so com o led)ele liga e desliga em quarker distancia
    quando aperto o controle ( com rele conectado) ele liga a qualker distancia…mas e naum desliga dae colokei o controle bem pertinho do receptor ..hehe ele deligo tipo assim tah ligado de qualker distacia mas para desligar tem ki encostar o chaveiro no receptor tipo q pode estar acontecendo?
    tipo sera ki acorrente tah caindo demais depois ki ativa o rele
    ou talvez uma interferencia?
    claudio
    Obrigado

    • Olá Fabinhos ! Parece , que ao ligar a tensão da rede para o motor, está fugindo a frequencia do receptor (alguma interferencia, como faiscamento de escovas, ou até mesmo , aumento de capacitancia nas proximidades do circuito oscilador). Tente colocar capacitores de filtro para corrente alternada (em torno de 100 nf/600 volts de fase a fase (monofásico ou entre fases , se trifasico). Afaste o circuito receptor da parte que tem o rele (poderá colocar uma blindagem entre eles e em alguns casos, poderá isolar esta etapa com um optoacoplador ). Aumente o tamanho do fio da antena entre 18 e 25 cm.
      O negócio vai ser por tentativa e erro. Divirta-se!!!
      Claudio

  12. claudio bom dia
    amigo seu prejeto funcionou certinho,fiz com 12f675.
    dae como vc sugeriu colokei uma chave contatora
    e fiz a sua sujestao de colocar um rele com bc548 e o resistor
    quando aperto o controle sem o rele ele funciona certinho ..quando coloco o rele e aperto o controle e ativa o rele …mas quando aperto o controle de novo para desligar…nao desliga e o posso fica apertando o controle que naum faiz nd naum responde fica travado ..dae so desligo um dos fios do rele ele desativa e o sistema jah volta funcionar normal… vc pode me ajudar
    pode ate ser um outro sistema apartir do led
    claudio obrigado
    abraco

    • Olá Fabinhos! A tensão de saida do PIC pode variar de 0,2 a 0,6 volts em nivel ’0′. Pode ser que seu PIC está no limite alto (0,6 v). Experimente colocar um resistor de 10k entre a saida do pic e a base do bc 548 (que aciona o rele) e não esqueça do diodo protetor de arco do coletor do bc548 ao +vcc.
      Cáudio

  13. claudio boa noite vou optar pela sua sujestao de tres reles ..
    pode ser tres de 10amperes??
    outra pergunta na saida do 629 tenho q por tres resistores e tres bc548 pra acionar os tres reles
    ou naum preciso por um pra cada?
    como devo proceder??
    muito obrigado pela sua ajuda
    abraco

    • Olá Fabinhos! Quantos amperes passam pelo motor de sua bomba? Se for, no máximo 3 amperes por fase, o de de 10 amperes deverá funcionar. Note que se precisa uma boa margem de folga, pois na partida do motor, a corrente sobe muitas vezes a corrente nominal de serviço, o que poderia ‘colar’ os reles ( grudar os contatos por efeito de ‘solda’ por arco). Os tres reles poderiam ser ligados em paralelo ao coletor de um unico transistor BD141. Poderá, se desejar, também montar cada rele com seu transistor bc548 e as resistencias de base unidas na saida do microcontrolador. Veja aqui uma sugestão.
      Claudio

  14. cladio bom dia
    intaum sua indicacao estava certa era isso ki eu precisava!!
    obrigado
    mas tenho uma duvida .. o motor e trifasico 220v
    como devo preceder na ligacao com o rele?
    em 110v sei que interrompendo a fase ou o neutro, desliga e liga..
    mas naum sei como funcions trifasico 220v?
    tipo pode me ajudar?
    obrigado

    • Olá Fabinhos! Para sistemas trifasicos você deverá trabalhar com 3 reles (ou um rele com 3 contatos separados). Cada fase TÊM que ser ligada/desligada separadamente . Uma sugestão seria voce usar um rele normal de poucos amperes acionando um contator trifasico próprio para motores elétricos. O neutro nunca deve ser interrompido, pois é a segurança do sistema (aterramento). Veja alguns conceitos aqui.
      Claudio

  15. bom dia desculpa
    e ki nah verdade eu keria fazer um interruptor de controle remoto tipo aperta o botao liga.. aperto o mesmo botao e ele desliga entende dae tv olhando um outro projeto seu com 3 leds axo q e mais facil?
    ah tipo e um jato tipo de lavar carro e ki a bomba fica a uns 50mts dae kiria liga e desliga no controle ?
    obrigado

    • Olá Fabinhos! Então, voce vai ligar uma maquina de lavar a jato de alta pressão . O esquema da placa para portão tem uma temporização que não vai permitir isto. Talvez seja melhor , realmente, usar um receptor generico com código asm para ‘retenção’ ou seja, aciona liga a saida e aciona de novo desliga a saida.
      Veja os artigos ‘receptor generico com pic’ e use a versão n.7 que permite escolher entre pulso e retenção. Na saida do led, coloque um resistor a base de um transistor BC548 e um rele no coletor (não esqueça do diodo junto a bobina do rele para não gerar alta tensão e queimar o pic). Note que o rele tem que aguentar altas correntes do motor. Use rele de forno de microondas (20 amperes).
      Cláudio

  16. claudio boa noite!!
    amigo gostaria de usar seu para um outro fim …
    tipo pra ligar uma bonba de agua ki fica um pouco longe.
    mas gostaria de eu poder ligar e desligar a hora ki eu kisesse…creio ki dae teria ki muda td?
    e ki 33seg e pouco tempo pra min…vc disse ki dah pra aumentar gostaria c possivel aumentar pra tipo uns 10 minutos isso e possivel na programacao ??
    ou uma dica
    claudio obrigado desde ja
    abraco

    • Olá Fabinhos! Deixa ver seu eu entendi bem. Voce quer controlar um motor eletrico de uma bomba de agua a distancia, é isto? Não seria melhor colocar uma boia eletrica que ao encher a caixa desliga-se automaticamente?
      Claudio

  17. fiz alguns testes e quase tudo funciona, nao consigo desaprender (esquecer) o controle memorizado.
    com relação a chave de segurança, coloquei um bc548 curtocicuitando o pino 7 do pic e impedindo o sistema de funcionar pelo controle remoto e juntei os dois resistores de fim de curso em uma unica chave para parada de emergencia e tambem coloquei em paralelo com a chave um outro bc 548 polarizado por um reistor de 0,1R ligado do lado negativo do motor pra parar tudo por estol do motor. so falta agora dar um jeitinho de colocar o fim de curso que ta no pino 3 e 4 funcionar so em um pino e usar o outro pra fazer acoisa funcionar com um botao manual na caixa do aparelho. To na luta, vou tentando e errando mais que acertando, se puder dar mais uma maozinha te agradeço.
    Grande abraço
    Fernando Ricciardi
    PS.Gostaria de mandar o esquema pra voce ver mas nao sei como postar uma imagem.

    • Olá Fernando! Tenho certeza que voce vai achar, não uma, mas varias soluções para seu projeto. Encare como desafio que você consegue fazer se PERSISTIR . Quanto ao esquema, se você tiver paciência (aliás, é bom para testar e aprender a ter) poderá usar o método de usar os simbolos do teclado para criar um pseudo esquema neste comentário. veja o exemplo aqui .
      Claudio

  18. Vou cair dentro desse codigo a fundo ate entender tudo isso (ou quase tudo).
    Não tenho palavras para expressar minha gratidão e tenho a dizer que se metade desse mundo tivesse a disposição de ajudar como voce tem teriamos um lugar bem melhor de viver.
    Estou aqui em Curitiba a sua disposição pra qualquer coisa.
    Grande abraço e um otimo final de semana.
    Fernando Ricciardi
    fricciardiuk@yahoo.com.br

  19. Valeu Claudio…
    Gostaria muito de poder dedicar todo esse tempo aos programas mas minha vida é muito corrida tentando atender meus clientes correndo em centro cirurgico, concertando essa porcariada toda que(graças a Deus)vivem quebrando e tentando sobreviver nesse mundinho cibernetico que dividimos agora. Tenho 52 anos e pretendo parar daqui 3 anos e depois, sim, me dedicar às coisas que realmente gosto que é fazer meus projetos e construi-los e tenha ceteza que seguirei suas ideis e aprenderei assembler pois ja percebi que é o unico modo de conversar realmente com estes pestinhas dos pics, atms, e outros cerebros encapsulados que temos hoje em dia. O basic pra mim é fácil pois aprendi ja faz algum tempinho (coisa de uns 30 anos) e atualmente uso o PICSIMULATORIDE que me ajuda bastante pois alem de programar ele simula muitas das peças que usamos (menos o radinho que preciso agora)e isso facilita um bocado as coisas, alem de fazer um codigo final bem enxuto que cabe com facilidade nos meus preferidos (12f629/675/683).
    Grande abraço e peço a liberdade de poder incomoda-lo quando a coisa apertar por aqui.
    PS se for possivel gostaria que me mostrasse em seu codigo da placa do portao a parte referente somente á leitura do codigo do radio ou seja, como se voce quisesse simplesmente aprender o controle e guardar na memoria e mais nada.
    Mais uma vez muito obrigado por sua gentileza em me atender.

    • Olá Fernando! Sei o que você quer dizer com ‘correria’. Muitas vezes queria acabar um projeto e levava meses para sobrar umas miseras horas. Parece que nunca acabaria a correria. Mas um dia, a ‘bonanza’ virá após a tempestade.
      Quanto a parte de recepção, ela está amarrada com variavéis, subrotinas e pedaços de código espalhado pelas linhas de código em todo o programa. Veja abaixo, que tentarei marcar com alguns comentarios estas regiões:

      ;**************************************************************************

      LIST P=12f629 , R=DEC ;aqui define o modelo e o ‘radix’ (os números são aceitos em decimal)
      INCLUDE “P12F629.INC” ; aqui pede o arquivo com as instruções relativas ao microcontrolador
      ;————————–
      ERRORLEVEL -302 ;aqui só elimina uma mensagem chata de mudança entre bancos após compilar
      __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF ;aqui é os fusebits (programar para oscilador interno ou esterno, usar watchdog,etc)

      #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA ; aqui tem uma facilidade para troca de bancos
      #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1
      #DEFINE FLAG FLAGS,0 ;FLAG DE SITUAÇÃO
      #DEFINE FLAG1 FLAGS,1 ;FLAG DE NOVA LEITURA
      #DEFINE FLAGGR FLAGS,2 ;FLAG DE ‘LEARN’ APRENDER
      #DEFINE SIN GPIO,0 ;PINO 7 IN RF
      #DEFINE LRN GPIO,5 ;PINO 2 IN LEARN BOTTON
      #DEFINE LED GPIO,5 ;PINO 2 OUT LED (MESMO PINO DO ACIMA)
      #DEFINE S2 GPIO,4 ;PINO 3- ENTRADA DE S2 ,ACIONA COM NEGATIVO
      #DEFINE M1 GPIO,2 ;PINO 5- SAIDA DO RELE P/MOTOR
      #DEFINE M2 GPIO,1 ;PINO 6- SAIDA DO RELE P/MOTOR
      #DEFINE S1 GPIO,3 ;PINO 4- ENTRADA DE S1 ,ACIONA COM NEGATIVO
      ; aqui temos os registradores da memória ram a serem usados, começando do endereço 20h.
      CBLOCK 0X20
      RES3,RES2,RES1,RES0,AUX,C3,C2,C1,C0,WS,TEMP,BITCOUNTER,FLAGS,TL0,TL1,TL2,Z2,Z1
      LcdDelayCounter,LcdDelayCounter1,tmpLcdRegister,tmpLcdRegister1,SITUAÇÃO
      temp,SDATA,AUX2 ,LC,HC ,CONT,RES3A,RES2A,RES1A,RES0A,X,R0,R1,R2,TMP1,TMP2,TMP3,ADDRESS,TMP
      ENDC
      ;aqui temos variavéis com apelidos que facilitam na hora de alterar valores.
      WRCFG EQU B’00000000′ ; PORTB: EEPROM WRITE TRI-STATE VALUE
      YTRISA EQU B’111001′ ; PORTA: TRI-STATE VALUE GP5 LED/LRN COMO ENTRADA INICIALMENTE
      TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW
      TMAX_MOTORLIGADO EQU 0X0A ; TEMPO MAXIMO DO RELE DO MOTOR LIGADO (33 SEG)
      QBYTE EQU .28 ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+2 DADO+ 4 ANTICODE)
      TGR EQU .255 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO
      ORG H’2100′ ;vetor de eeprom

      ;aqui o inicio da flash
      ORG 0X00
      GOTO START
      ORG 0X04
      RETFIE

      START:
      MOVLW 0X07
      MOVWF CMCON ;DESLIGA COMPARADORES
      CLRF GPIO ; RESET PORT
      BANK1
      MOVLW YTRISA ; SETUP PORTA
      MOVWF TRISIO
      BSF WPU,4 ;LIGA PULLUP S2
      CLRF OPTION_REG
      BANK0
      CLRF FLAGS

      INICIO:
      MOVLW TGR
      MOVWF Z2
      CLRF Z1

      CLRF RES3
      CLRF RES2
      CLRF RES1
      CLRF RES0
      MOVLW QBYTE
      MOVWF BITCOUNTER

      ;aqui começa o loop para a recepção dos sinais de rf vinda do receptor de 433mhz

      L0
      BCF FLAG
      CLRF HC
      CLRF LC
      L1
      ;———————————

      BTFSS LRN
      GOTO TAPAGAMENTO

      L1H
      BTFSC M1
      GOTO L1B
      BTFSC M2
      GOTO L1C
      GOTO SS5

      TAPAGAMENTO
      DECFSZ Z1,F
      GOTO L1H
      DECFSZ Z2,F
      GOTO L1H
      BCF M1
      BCF M2
      ;==========================================================================================
      ; aqui começa a operação de apagamento dos controles quando o botão learn fica apertado por mais de 5 segundos
      CALL APAGAEEPROM
      BANK1
      BCF TRISIO,5 ;VIRA SAIDA
      BANK0
      BSF LED ;APAGA LED (UMA PISCADA)
      MOVLW .10
      CALL DELAYM
      BCF LED ;ACENDE LED
      MOVLW .10
      CALL DELAYM
      BSF LED ;APAGA LED (UMA PISCADA)
      MOVLW .10
      CALL DELAYM
      BCF LED ;ACENDE LED
      MOVLW .10
      CALL DELAYM
      BSF LED ;APAGA LED (UMA PISCADA)
      MOVLW .10
      CALL DELAYM
      BCF LED ;ACENDE LED
      MOVLW .10
      CALL DELAYM
      BANK1
      BSF TRISIO,5 ;VIRA ENTRADA
      BANK0

      BTFSS LRN ;AGUARDA SOLTAR BOTÃO ‘LEARN’
      GOTO $-1
      GOTO INICIO
      ;=============================================================================

      L1B

      BTFSS S1 ;TESTA FIM DE CURSO S1
      GOTO DESLM
      GOTO L1D
      L1C
      BTFSS S2 ;TESTA FIM DE CURSO S2
      GOTO DESLM
      L1D
      DECFSZ TL0,F ; REGISTRADORES DO TEMPO QUE RELES FICAM LIGADOS
      GOTO SS5
      DECFSZ TL1,F
      GOTO SS5
      DECFSZ TL2,F
      GOTO SS5
      BCF M1 ;TEMPO MAXIMO LIGADO ATINGIDO
      BCF M2
      INCF SITUAÇÃO,F ;EVITA UM PULSO A MAIS NO CONTROLE
      SS5:

      ; aqui começa a rotina principal de recepção do receptor de rf
      ;A
      BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO
      GOTO L2 ;FLAG=0
      ;——————————–
      ;B
      BTFSS SIN ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF
      GOTO M0 ; SIN=0
      ;———————————-
      L2
      ;C
      BTFSS SIN ;SIN ?
      GOTO LA1 ;SIN=0
      ;————————————-
      ;E
      BSF FLAG ;SIN=1
      INCF HC,F
      BTFSC STATUS,Z
      DECF HC,F
      GOTO LA2 ;VAI CONTAR TEMPO DE 50 MICRO SEGUNDOS
      ;———————————————————
      LA1
      ;D
      INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF
      BTFSC STATUS,Z
      DECF LC,F
      LA2

      MOVLW .11 ;.12 = 50 MICROSEG (ACERTA TEMPO ENTRE LEITURAS DA ENTRADA DE RF)
      MOVWF CONT
      DECFSZ CONT,F
      GOTO $-1
      GOTO L1

      M0
      ;———————————-
      ;F
      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)
      ;———————————–
      ;G
      MOVFW HC ;OBTEM O VALOR DE ‘CARRY’(HUM OU ZERO)
      SUBWF LC,W

      RRF RES3,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO
      RRF RES2,F
      RRF RES1,F
      RRF RES0,F
      ;————————————-
      ;H
      DECFSZ BITCOUNTER,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO
      GOTO L0 ;LE PROXIMO BIT

      MOVLW .4 ;DESPREZA OS BITS DE ‘ANTICODE’ 1010
      MOVWF BITCOUNTER
      ACERTA
      BCF STATUS,C
      RRF RES3,F
      RRF RES2,F
      RRF RES1,F
      RRF RES0,F ;RESULTADO FICA SOMENTE EM RES2 A RES0,DESPREZA RES3
      DECFSZ BITCOUNTER,F
      GOTO ACERTA

      BTFSC FLAG1 ;TESTA SE É A PRIMEIRA OU A SEGUNDA RECEPÇÃO
      GOTO PULA1
      MOVFW RES2 ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA
      MOVWF RES2A
      MOVFW RES1
      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 RES2
      XORWF RES2A,W
      BTFSS STATUS,Z
      GOTO RESETAC
      MOVFW RES1
      XORWF RES1A,W
      BTFSS STATUS,Z
      GOTO RESETAC
      MOVFW RES0
      XORWF RES0A,W
      BTFSS STATUS,Z
      GOTO RESETAC ;ERRO DE RECEPÇÁO
      GOTO AÇÃO ;OK – BOA RECEPÇÃO

      RESETAC
      CLRF RES3A ; APAGA RESULTADOS DE COMPARAÇÃO
      CLRF RES2A
      CLRF RES1A
      CLRF RES0A
      GOTO INICIO

      ;fim da rotina principal de recepção
      ;===================================================================
      ;aqui começa a rotina de ação após uma boa recepção que passará a procurar se está cadastrado ou para aprender o novo tx
      AÇÃO
      ;I
      BTFSS LRN ;BOTÃO ESTÁ APERTADO?
      BSF FLAGGR
      CALL PPT
      SUBLW .0
      BTFSC STATUS,Z ; É ’0′?
      GOTO APRENDER ;NENHUM CONTROLE FOI GRAVADO
      MADDRESS
      MOVFW TMP
      MOVWF ADDRESS
      CALL EEREAD
      XORWF RES2,W ;COMPARA COM RES3
      BTFSS STATUS,Z
      GOTO PROXIMO
      DECF ADDRESS,F
      MOVFW ADDRESS
      CALL EEREAD
      XORWF RES1,W ;COMPARA COM RES3
      BTFSS STATUS,Z
      GOTO PROXIMO
      DECF ADDRESS,F
      MOVFW ADDRESS
      CALL EEREAD
      XORWF RES0,W ;COMPARA COM RES3
      BTFSC STATUS,Z
      GOTO ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA

      PROXIMO

      MOVFW ADDRESS
      MOVWF TMP
      MOVLW .3
      SUBWF TMP,F ;ACERTA DE 3 EM 3 A POSIÇÃO DE BUSCA NA MEMÓRIA
      BTFSS STATUS,Z
      GOTO MADDRESS

      ;aqui começa a rotina para aprender um transmissor recebido
      APRENDER
      BTFSS FLAGGR ;TESTA SE BOTÃO ‘LEARN’ ESTÁ PRESSIONADO
      GOTO INICIO ;NÃO ESTÁ.
      CALL PPT ;ESTÁ, PEGA PONTEIRO
      MOVWF ADDRESS ;PEGA O ENDEREÇO APONTADO
      SUBLW 0X7E ;LIMITE MAXIMO DA EEPROM (128-1 /3= 42 aparelhos)
      BTFSS STATUS,C
      CLRF ADDRESS ;INICIA SOBREGRAVAÇÃO
      INCF ADDRESS,F ;SOMA 1
      MOVFW RES0
      MOVWF TMP ;COLOCA EM ‘TMP’
      MOVFW ADDRESS ;DA O POSIÇÃO DE MEMORIA A SER GRAVADO
      CALL EEWRITE ;ROTINA DE ESCRITA NA EEPROM
      INCF ADDRESS,F ;PROXIMA POSIÇÃO DE ESCRITA NA EEPROM
      MOVFW RES1
      MOVWF TMP
      MOVFW ADDRESS
      CALL EEWRITE
      INCF ADDRESS,F
      MOVFW RES2
      MOVWF TMP
      MOVFW ADDRESS
      CALL EEWRITE
      MOVFW ADDRESS
      MOVWF TMP
      MOVLW .0
      CALL EEWRITE ;GRAVA NOVO ENDEREÇO DE PONTEIRO
      BCF FLAGGR
      BTFSS LRN
      GOTO $-1
      MOVLW .10 ;TEMPO DE ATRASO
      CALL DELAYM
      BANK1
      BCF TRISIO,5 ;VIRA SAIDA
      BANK0
      BCF LED ;LIGA LED
      MOVLW .10 ;TEMPO DE ATRASO
      CALL DELAYM
      BANK1
      BSF TRISIO,5 ;VIRA ENTRADA
      BANK0
      GOTO ACIONAR
      ; aqui começa a operação de acionamento dos reles, quando encontra um tx cadastrado
      ACIONAR
      MOVFW SITUAÇÃO ; ACEITA A TRANSMISSÃO IRÁ LIGAR/DESLIGAR RELES DO MOTOR
      ANDLW 0X03 ;LIMITA A 4 BITS A CONTAGEM (0A 3)

      MOVWF SITUAÇÃO
      XORLW 0X00
      BTFSC STATUS,Z ;SE IGUAL A 1
      GOTO LIGAM1

      MOVFW SITUAÇÃO
      XORLW 0X01
      BTFSC STATUS,Z ;SE IGUAL A 1
      GOTO DESLM

      MOVFW SITUAÇÃO
      XORLW 0X02
      BTFSC STATUS,Z ;SE IGUAL A 2
      GOTO LIGAM2
      GOTO DESLM ;SE IGUAL A 3

      T7K
      MOVLW TMAX_MOTORLIGADO
      MOVWF TL2
      MOVLW 0XFF
      MOVWF TL1
      MOVLW 0XFF
      MOVWF TL0
      TG9
      MOVLW .10
      CALL DELAYM
      INCF SITUAÇÃO,F
      GOTO INICIO

      LIGAM1
      BSF M1
      BCF M2
      GOTO T7K
      LIGAM2
      BSF M2
      BCF M1
      GOTO T7K
      DESLM
      BCF M1
      BCF M2
      GOTO TG9

      ; aqui começa rotina de tempo de delay (atrasos)
      ;————————————————————–
      DELAYM
      MOVWF R0
      XC
      CALL AGUARDE
      DECFSZ R0,F
      GOTO XC
      RETURN

      ;****************************************************
      ;PEGA PONTEIRO NA EEPROM – ULTIMO ENDEREÇO
      PPT
      MOVLW .0
      CALL EEREAD ;LE PONTEIRO DA EEPROM
      RETURN

      AGUARDE ;ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM

      MOVLW .64
      MOVWF R1
      CG2
      CLRWDT
      MOVLW .255
      MOVWF R2

      DECFSZ R2,F
      GOTO $-1
      DECFSZ R1,F
      GOTO CG2
      RETURN

      ; aqui rotinas de escrita na eeprom dos dados do tx a aprender
      EEWRITE

      ; ******* EEPROM WRITE ENABLE ******************
      ;endereço esta em ADDRESS
      ;DADOS A ESCREVER ESTA EM TMP(MSB)

      BANK1
      movwf EEADR
      BANK0
      MOVFW TMP ;PEGA PRIMEIRO DADO
      BANK1
      movwf EEDATA
      bcf EECON1, EEIF
      bsf EECON1, WREN ; enable Write\par
      movlw 0×55
      movwf EECON2
      movlw 0xAA
      movwf EECON2
      bsf EECON1, WR
      WRITE_SN_A clrwdt
      btfsc EECON1, WR ; Write complete ?\par
      goto WRITE_SN_A
      bcf EECON1, WREN ; disable Write\par
      BANK0

      clrwdt

      ESPERA1 ;DELAY ENTRE APAGAMENTOS
      CALL AGUARDE
      RETURN

      ;aqui rotina de leitura de dados da eeprom
      EEREAD
      ;endereço esta em ADDRESS
      ;DADOS LIDOS SERÃO ESCRITOS EM TMP0

      clrwdt
      ; MOVFW ADDRESS

      BANK1
      movwf EEADR
      bsf EECON1, RD ; do a read\par
      clrwdt
      btfsc EECON1, RD ; Read done ?\par
      goto $-2
      movf EEDATA,W
      BANK0
      MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM
      clrwdt

      RETURN

      ; aqui rotina para apagamento total de todas as posições da eeprom, apagando todos os controles
      ;——————————————————————————
      APAGAEEPROM ;OK TESTADA E APROVADA
      ; ROTINA PARA APAGAR TODAS AS POSIÇOES DA EEPROM DO 16F628

      MOVLW 0X80 ;TOTAL DE 128 + 1 BYTES DE EEPROM
      MOVWF AUX
      RET6
      CLRWDT
      MOVFW AUX
      MOVLW .1 ;ACERTA ENDEREÇO TIRANDO 1
      SUBWF AUX,W
      BANK1
      movwf EEADR
      MOVLW 0XFF
      movwf EEDATA
      bcf EECON1, EEIF
      bsf EECON1, WREN ; enable Write\par
      movlw 0×55
      movwf EECON2
      movlw 0xAA
      movwf EECON2
      bsf EECON1, WR
      WRITE_SN_C clrwdt
      btfsc EECON1, WR ; Write complete ?\par
      goto WRITE_SN_C
      bcf EECON1, WREN ; disable Write\par
      BANK0
      DECFSZ AUX,F
      GOTO ESPERA
      clrwdt
      RETLW 0H
      ESPERA ;DELAY ENTRE APAGAMENTOS
      MOVLW .8
      MOVWF R1
      CG1
      MOVLW .255
      MOVWF R2

      DECFSZ R2,F
      GOTO $-1
      DECFSZ R1,F
      GOTO CG1
      GOTO RET6

      ; aqui, na hora de gravar no chip, já grava a primeira posção da eeprom com ’0′.
      ORG H’2100′
      DE .0

      end

      ;===========================================================================================

      Sugiro que você leia o artigo ‘Receptor Generico” que talvez você possa entender melhor as rotinas.

      Claudio

  20. Mais uma vez, obrigado por sua atenção. Dei uma olhada nos doc que vc sugeriu e deu uma clariadinha nas coisas, vou tentar aplicar isso no basic que programo desde 1980 quando comecei meus sofrimentos e minhas alegrias pois é muito bom escrever um codigo e ver quando a coisa funciona. preciso aprender melhor sobre pic mas com a ajuda de pessoas como vc a coisa fica mais fácil. Minha área é eletrônica e com enfase em equipamentos médicos e se puder ajudar é so falar.
    Grande abraço.
    Fernando Ricciardi
    fricciardiuk@yahoo.com.br

    • Olá Fernando!
      Para iniciante, o basic é muito bom, pois já tem muitas rotinas prontas, bastando ‘chama-las’ . Mas se voce quer realmente entender o PIC, comece a programa-lo usando linguagem ASSEMBLER (o famoso ‘.asm’ da vida). Use o compilador gratuito fornecido pela Microchip chamado MPLAB_IDE , onde você poderá digitar programas com as instruções asm , compilar, rodar no debugador, ver o que
      acontece com cada registrador e se voce tiver um dos programadores alistados, enviar direto para o chip a ser programado. Uma verdadeira ‘mão na roda’ para quem quer realmente aprender PIC. Pegue exemplos simples e compile. Os comandos (instruções) de cada PIC você obtém nos datasheets respectivos. Com o tempo você se lembrará de cada um, mas no inicio tem que olhar a ‘listinha’. Com o tempo, passará a usar interrupções simples de timers, depois de mudança de estado, etc. Dicas:1)Tenha paciência com você mesmo. 2) Não quer funcionar, então voce para, vai fazer outra coisa, que, quando você voltar você, vai encontrar o motivo.3) Nunca desista.Apenas adie até ter mais informações (nem que seja um ano).4) Estude os programas com terminação .asm dos colegas ‘abnegados’ que postaram na internet. Tem aos milhares. Veja como foi conseguido o objetivo e que tipo de instruções foi usada. Note que existe muitos jeitos certos de fazer a mesma coisa, só que um poderá gastar muito código e outro pouco, um ser eficiente e outro não. 5) Ao iniciar um projeto, tente passar para o papel, um esquema com os componentes, incluindo o pic , reles, leds,etc (ou seja, o equipamento que quer fazer). Depois é que você fará o software, levantando em pinos determinado componente está ligado (faça uma listinha, por ex: porta,1 = led1 ; portb,5= saida para o transistor do rele, portb,0= entrada da chave,etc). 6) Após funcionar o projeto, pense onde poderia mexer para aperfeiçoar, eliminar bugs(malditos ‘bugs), reduzir código, mudar método de realizar a mesma função,etc. Lembre-se que um projeto NUNCA fica pronto definitivamente, sempre haverá um próxima versão a ser feita. Basta ter tempo.
      Quanto ao uso do MPLAB-IDE, existe varios tutoriais que lhe darão um bom começo. Veja este video e um exemplo de como compilar com pic 16f877 aqui e um exemplo asm para piscar um led aqui..
      As linguagens de alto nivel com C, basic , etc são boas para migrar programas de uma familia para outra, ou de,por exemplo, um Texas para um Atmel, com poucas mudanças de código. Elas tem o inconveniente de gerar muitas linhas de código (fica muito pesado o programa), sendo difícil trabalhar com pouca memória, como os 1k dos PIC 12f629.
      Mas, você NUNCA entenderá os microcontroladores usando somente estas linguagens. Sempre terá dificuldades em achar soluções que somente as linhas de código em assembler podem dar. Assim, PRIMEIRO aprenda assembler e depois as linguagens de alto nivel.
      Espero ter te ajudado.
      Claudio

  21. Ok, Claudio, te agradeço demais por sua atenção e vou continuar usando o 12f629/675 pois acho que são os melhores que existe dadas as suas limitações e pelo tamanho reduzido da placa final.
    vou tentar fazer alguma coisa para testes e qualquer coisa posto aqui pra trocar umas ideias.
    Precisava que voce, se puder me desse uma aula de como fazer o pic entender o sinal que vem do radio assim poderei quebrar minha cuca com modificações pois nao preciso usar os dois transistores pois posso usar um só rele duplo para fazer o que quero e assim sobrar um pino para as outras funções.
    Grande abraço e mais uma vez muito obrigado por sua atenção
    Fernando Ricciardi

  22. Caro claudio, obrigado por ter respondido.
    Estou usando o arquivo que esta nesse link “http://larios.tecnologia.ws/iBlog/archives/1075″.
    É que estou usando um motor DC de 12V para acionar um mecanismo(isso não é o problema, uso os mesmos reles so que ligados de forma diferente). só que gostaria que tivesse um botao manual ligado ao pic do tipo Abre/para/fecha/para, que fizesse como o botao do controle faz mas manualmente. E um pino do pic que quando estivesse com nivel alto paralizasse todo o sistema, como uma chave de segurança e que um lede piscasse avisando este estado de paralização. Ja fiz o botão ativando cada transistor atraves de um fliflop (funciona mas usa mais peça) e usei um 3ºrele para desligar tudo e ligar um led que pisca sozinho. funciona mas gostaria disso tudo no proprio pic.
    Mais uma vez agradeço sua atenção.
    Grande abraço
    Fernando Ricciardi.

    • Olá Fernando! Entendi! Mas o problema é que, com o pic 12F629, não temos mais pinos sobrando para estas funções adicionais. Teria que migrar para um pic 16F628a, ou memo um pic 16f676 , como exemplo, com mais pinos, para estas funções adicionais.
      Claudio

  23. boa noite Larios, encontrei seu blog e encontrei tambem a solução para um grande problema que tenho. seu projeto usando o pic 12f629/675/683(com pwm)é muito bom e estou usando ele em um projeto que estou desenvolvendo e so me falta é colocar mais duas funções. a primeira um botao de acionamento manual e a segunda um inibidor por tensão que impessa o sistema de operar. ja fiz alguma coisa por hardware mas gostaria de fazer por software mas infelizmente nao manjo nada de assemble. faço alguma coisa com basic no picsimulatoride. se voce puder me ajudar a dar essa incrementada te agradeço muito. fricciardiuk@yahoo.com.br
    Grande abraço
    Fernando

    • Olá “fricciardiuk”! Fico feliz que os projetos lhe sejam utéis, de alguma forma. Eu não entendi exatamente qual projeto você se refere. Você esta montando uma placa de acionamento para portão automático? Botão de acionamento manual para acionar o portão? E inibidor com que objetivo? Uma chave liga desliga? Quando acionará?
      Por favor, tente descrever o que você está fazendo e quais são as suas necessidades, com mais clareza e mais ‘detalhes’. Talvez possa ajuda-lo.
      Cláudio

Deixe um Comentário