FAÇA UM RECEPTOR DE 4 CANAIS POR CONTROLE REMOTO INFRAVERMELHO – C/ PIC 12F675 – PROTOCOLO NEC (REF103)

0

Gostaria de controlar equipamentos a distâncias pequenas, usando um controle remoto infravermelho, destes de TV? Com capacidade de acionar até 4 aparelhos diferentes? então, veja este artigo…

Existem muitos circuitos interessantes na Internet, usando controles remotos. Um deles, oferece o recurso de controlar até 3 canais com um pic pequeno. Pensei também em montar algo desta natureza, mas usando uma maior capacidade que um pequeno pic 12f675 pode oferecer: 4 canais!

Veja o esquema abaixo:

Muitos hoje tem em suas salas, controles remotos para satélite, de protocolo geralmente ‘NEC’. Poderá usa-lo para controlar cargas no ambiente, como ventiladores, abajures, luminarias ou qualquer outro equipamento que deseje controlar.
Foi feito de maneira que possamos aprender até 4 teclas do controle remoto, de preferência, teclas não usadas, para que não ocorra o acionamento de mais de um equipamento.
Também, é igualmente possível escolher por programação, se o rele do canal escolhido atuará de forma ‘pulso’ ou ‘retenção’.

Vamos ver, então, como se procede a programação:

1) Aperte o botão ‘Prog’ por 2 segundos. Começará a piscar o led ‘Prog’ de forma normal. O led do canal 1 se acende.
2) Aperte uma tecla do controle, da sua escolha, que deseje gravar na Eeprom, para comandar o canal 1. Ao ser aceito, apagará o led do canal 1 e acenderá o led do canal 2.
3) Aperte um outra tecla do controle, para comandar o canal 2.
Ao ser aceito, apagará o led do canal 2 e acenderá o led do canal 3.
4) Novamente, aperte uma outra tecla do controle, para comandar o canal 3. Ao ser aceito, apagará o led do canal 3 e acenderá o led do canal 4.
5) E finalmente, aperte uma última tecla do controle, para comandar o canal 4. Ao ser aceito, apagará o led do canal 4 e o led ‘Prog’ começará a piscar de forma mais rápida. Isto indica que entrou na programação do ‘modo de operação’.

Siga os seguintes passos para escolher entre atuação por ‘Pulso’ ou ‘Retenção’:
1) Aperte uma das teclas do controle que foi gravada. A cada aperto, o led do canal correspondente acenderá ou apagará. Deixando aceso será modo ‘pulso’ e deixando apagado será modo ‘retenção’ para este canal.
2) Repita com as outras 3 teclas que foram gravadas.
3) Feito a gravação, aperte momentaneamente o botão ‘Prog’ para sair do modo de programação.
Caso programe uma tecla que não desejava, aperte qualquer tecla varias vezes, até começar a piscar rápido o led ‘Prog’.
Então, aperte brevemente o botão ‘Prog’ para sair de programação. Refaça os passos com as teclas corretas.
Atenção: Aprenda teclas diferentes. Se for aprendido 2 ou mais teclas iguais, somente a primeira que for aprendida é que funcionará.

Usando o receptor de 4 canais:
Ao apertar no controle remoto uma tecla previamente gravada, ela acionará uma das saídas, em modo pulso ou retenção, dependendo de como foi programado. Os reles devem ter condições de suportar as cargas de correntes em seus contatos. Poderá controlar 4 cargas diferentes, como ventiladores, abajures, luminárias em geral, bem como outros aparelhos eletrodomésticos.
Nada impede de controlar cargas DC também, visto que os contatos dos reles, nos canais, são isolados entre si.
Use controle remoto com protocolo ‘NEC’ apenas. Outros protocolos não irão funcionar.

Para a recepção do protocolo ‘NEC’ foi usado o timer 1 para medir os tempos e determinar se o bit recebido é 1 ou 0. Este protocolo tem como característica um cabeçalho de 9 milisegundos, seguido por um período de 4,5 milisegundos de pausa, antes do envio do primeiro bit. Temos 8 bits de endereços , seguidos de 8 bits de endereço invertidos, mais 8 bits de comandos e 8 bit de comandos invertidos. É a distancia entre pulsos que determina um ‘0’ ou ‘1’. Se a tecla for mantida apertada, será enviada a primeira transmissão completa, seguida de transmissões com apenas o cabeçalho e um bit ‘1’, repetindo a cada 110 milisegundos.
Já o timer 0, foi usado em modo de interrupção, para testar o botão ‘Prog’ a cada 65 mseg, acionar o led ‘Prog’ em piscadas, normais e rápidas, e atuar contadores de tempo.
A rotina foi mantida bem simples, com muitas repetições, mas facilmente compreensíveis. Apesar disto, ainda sobram muitas linhas de flash.
Com respeito alimentação de tensão para o circuito, providencie uma fonte com transformador de 12 volts, bem como diodos retificadores, capacitores de filtro e regulador 7805 para os 5 volts do PIC.

Obs. Este dispositivo é apenas didático, sendo montado apenas em protoboard e sendo sujeito a bugs não identificados. O hex gerado poderá ser usado para gravar também no Pic 12f629.

Segue o arquivo ASM (atualizado em 12/08/13):

rx_4c_infra_nec_v1_asm

Segue o arquivo HEX:

rx_4c_infra_nec_v1_hex

Veja também, esta versão que utiliza triacs na saída, mas com o mesmo Hex -> Esquema com triacs

Agora está também disponível em arquivo “C” para os que não são muito fãs do Assembly. Segue pasta zipada com os arquivos em “C”:

INFRA_NEC_4C_C

Segue o desenho da placa de circuito impresso, uma gentileza realizada pelo colaborador ‘FOXCONN’, a quem agradecemos:

CONTROLE 675 IR NEC disponivel

Segue abaixo, o esquema para acionamento de 2 motores de 12 volts (note que a tensão poderá ser alterada visto que estamos usando reles), com o objetivo didático de acionar uma persiana de janela. Após a carga do Hex no chip, deverá ser gravado 4 teclas de um controle remoto (padrão NEC), todas em modo ‘pulso’. Usa-se reed switch ou microchaves para fins de curso (proteção), os quais, ao acionar, cortam a polarização do transistor que aciona o respectivo rele:

CR_PERSIANA_ELET

Manuais:

Pic 12f675
Protocolo NEC

Curiosidades:
Petróleo — métodos de extração
Controle remoto e o gás de efeito estufa
Cirurgia robótica
Imitação das asas da gaivota
O passado e o presente dos brinquedos
Tortura à venda
“Ouro vermelho” do Mediterrâneo
Assista videos educativos

Outros assuntos:
Como criar filhos bondosos num mundo egoísta?
Como acabar com a tática do silêncio
Os milagres são possíveis – 3 objeções
Como enfrentar o bullying sem ter de partir para a briga (animação)
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos
Ensine seus filhos bons principios com atividades de colorir
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Entrevista com um bioquímico
Adolescentes- O que fazer se estou sofrendo bullying?
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?

Até o próximo artigo!!!

0

83 comments

  1. 0

    Olá Cláudio, mais uma vez!
    Gostaria de usar esse circuito com um protocolo desenvolvido pela Toshiba que é bem parecido com o Nec, porem tem os tempos inicias diferentes. Não entendo se posso alterar somente isso, ou se tem que refazer tudo.
    Não tem como usar Nec ou Sony, pois os outros botões do controle acionam um receptor feito com um Micro desenvolvido pela Toshiba.

    Esse é o protocolo usado:
    http://www.celadon.com/SC-33B-programmable-remote-control/SC-33B-TOSHIBA-IR-Protocol.pdf

    1. 0

      Olá Renato!
      Olhando por cima, parece bem parecido. Mas não é somente o tempo inicial do cabeçalho que difere, mas também a parte do código do sistema que transmite 2 vezes iguais, sendo no NEC que a segunda é invertida, e o bit de terminação que não tem no NEC. Eu tenho recebido pedidos para alterar o código para N padrões diferentes, pois sempre alguém quer aproveitar um determinado controle remoto da tv ou do som para ligar algo mais. Infelizmente, não disponho de bibliotecas que possam de alguma forma ser conjugada com algum código padrão para receptor de controle, como ocorre com algumas plataformas populares como o ARDUINO, etc. Refazer o código toma muito tempo e em especial com testes na placa experimental. Não disponho de tal tempo. Mas poderá tentar criar a partir da rotina do NEC o seu próprio código para Toshiba.
      Boa diversão para você!
      Cláudio

        1. 0

          Consegui fazer, foi bem simples.
          aterei o tempo do cabeçalho de 7000 para 3800, visto que para o Nec era 9ms + 4,5ms. A toshiba usa 4,5 + 4,5ms

          No código C a linha que era assim:
          int16 const LIMITE_BYTE_LOW=1200, PULSO_9MS=7000,PULSO_4MS=3800;

          Ficou assim:
          int16 const LIMITE_BYTE_LOW=1200, PULSO_9MS=3800,PULSO_4MS=3800;

          Para inverter o pulso do endereço foi só retirar o “!” da seguinte linha, a adicionei o código “buffer4” para gravar o bit “end”, usado no seguinte protocolo:
          if (!(buffer[0]+buffer[1]+buffer[2]+buffer[3]+0x2)){ flag_rok=1;}

          Ficou assim:
          if ((buffer[0]+buffer[1]+buffer[2]+buffer[3]+buffer[4]+0x2)){ flag_rok=1;}

          Feito isso funcionou corretamente os modos pulso e retenção.

          1. 0

            Olá Renato! Parabéns pelo sucesso e por compartilhar o resultado com o blog. A persistência sempre conduz a bons resultados!
            Cláudio

        1. 0

          Olá Marcos!
          Você diz trocar o led ultravioleta do controle remoto ( e continuar usando o controle remoto) e ligar um tx 433mhz e trocar o receptor infrared e colocar um rx433mhz? Se for isto, eu nunca tentei, mas pode funcionar visto que os tempos estão dentro do que pode ser transmitido.
          Cláudio

  2. 0

    Boa tarde, gostaria de agradecer pelos projetos interessantes aqui disponibilizados e gostaria de deixar um comentário a respeito da placa de circuíto impresso postada pelo amigo foxconn: eu gostei do projeto e resolvi construir a pci, mas ao testar a “coisa” não funcionou como esperado, conferi as ligações e não havia nada de errado, então confrontei o desenho da pci com o desenho esquemático do projeto e pude perceber alguns erros;
    1: No desenho esquemático do projeto eletronico a entrada de sinal vinda do receptor ir é gp3 (pino 4 do pic), porém, no desenho da pci postada pelo foxconn a entrada de sinal vinda do receptor ir está em gp4 (pino 3 do pic), está invertido, utilizando como está na pci o programa não funciona, então basta corrigir pelo esquema do circíto e pronto.
    2: outra observação foi quanto aos resistores de 470R, um ligado no catodo do Led Prog e o outro aterrando um lado da chave Prog, ambos estão em um posicionamento diferente na placa de circuíto impresso, mas também observei que esta troca não ocasionou erros ao programar as teclas.

    Fazendo as alterações do 1 a placa funciona e é possivel efetuar a programação das saídas e faze-las atuar como programado.

  3. 0

    Olá Larios eu fiz uma modificação no teu código para simplesmente visualizar o comando no display e sem uso da eeprom,porém ele funcionou perfeitamente ,porém quando tento tratar cada botão apertado eu não consigo visualizar no display.EX aperto bt 1 acende led 1,bt 2 acende led 2 e por aí vai.Pode dar uma olhada no código e me ajudar.Obrigado

    LIST P=16f628A , R=DEC
    INCLUDE “P16F628A.INC”

    ;PALAVRA DE CONFIGURAÇÃO
    ERRORLEVEL -302
    __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_ON & _MCLRE_OFF

    ;DEFINIÇÕES
    #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 FLAG_MR0 FLAGS,2 ;FLAG DE TRAVA
    #DEFINE FLAGGR FLAGS,3 ;FLAG DE ‘LEARN’ APRENDER
    #DEFINE FLAG_MR1 FLAGS,4 ;FLAG TRAVA
    #DEFINE FLAG_T FLAGS,5 ;FLAG T

    #DEFINE FLAG_PROG_ON FLAGS,6 ;FLAG DE MODO DE PROGRAMAÇÃO
    #DEFINE FLAG_3H FLAGS,7 ;FLAG PISCADA EM 3HZ OU 1HZ

    #DEFINE SIN PORTA,0
    #DEFINE LED0 PORTB,0
    #DEFINE LED1 PORTB,1
    #DEFINE LED2 PORTB,2

    ;DEFINIÇÕES DE PORTAS DE SAIDA

    ;RAM
    CBLOCK 0X20
    RES3,RES2,RES1,RES0,AUX,AUX1,AUX2,TEMP,QB,FLAGS,LcdDelayCounter,LcdDelayCounter1
    ADDRESS,TMP,R0,R1,R2,CONT_INT,CONT_INT1,T1_INT,STATUSTEMP,WTEMP,PASSO,ADDR_SALVO,d1,d2,d3,TECLA0,TECLA1,TECLA2,

    ENDC

    ;EQUATES

    TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW
    QBYTE EQU .32 ;QUANTIDADE DE BYTES A SER RECEBIDO (8+8+8+8)
    T_PROG EQU .30 ;TEMPO DE BOTÃO APERTADO PARA ENTRAR EM MODO DE PROGRAMAÇÃO
    T_DELAY EQU .11 ;TEMPO DE DELAY .10
    T_DELAY1 EQU .2 ;TEMPO DE DELAY .10
    ;=========================================================================================================
    ; RESET
    ;=========================================================================================================
    ORG 0X00
    GOTO START
    ;=========================================================================================================
    ; INTERRUPÇÃO
    ;=========================================================================================================

    ORG 0X04
    GOTO START

    ;=========================================================================================================
    ; INICIO DO PROGRAMA
    ;=========================================================================================================

    START:

    BANK1

    MOVLW 0x01
    MOVWF TRISA
    MOVLW 0X00
    MOVWF TRISB

    MOVLW 0X00
    MOVWF INTCON
    BANK0

    MOVLW 0X07
    MOVWF CMCON ;DESLIGA COMPARADORES
    CLRF PORTA
    CLRF PORTB

    CLRF TMR0 ;ZERA TMR0
    CLRF PASSO ;GERENCIADOR DE PASSOS
    CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS

    ;=========================================================================================================
    ; ROTINA PRINCIPAL
    ;=========================================================================================================
    INICIO:

    CLRF RES3
    CLRF RES2
    CLRF RES1
    CLRF RES0
    MOVLW QBYTE ;32 BITS PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER
    MOVWF QB
    CLRF TMR1H
    CLRF TMR1L
    BCF PIR1,TMR1IF
    BSF T1CON,TMR1ON
    CLRF PORTB
    GOTO SS5

    ;=========================================================================================================
    ; ROTINA DE RECEPÇÃO DE SINAIS DO PROTOCOLO ‘NEC’
    ; OBS. RECEPTOR INFRAVERMELHO FORNECE SINAL INVERTIDO
    ;=========================================================================================================
    RECEIVE
    SS5:
    BTFSS SIN ; ‘S’ SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE INFRAVERMELHO
    GOTO IN_1
    ;=========================================================================================================
    ;SIN=0
    BCF FLAG_MR1
    BTFSC FLAG_MR0
    GOTO SS5
    BSF FLAG_MR0
    BCF T1CON,TMR1ON ;DESLIGA TMR1
    BTFSC PIR1,TMR1IF ;TESTA FLAG DO TIMER 1
    GOTO RESETA_REC
    MOVFW TMR1H
    SUBLW 0X1F
    BTFSC STATUS,C
    GOTO CLR_TMR1
    ;——————————XXX
    SAI_TAD
    GOTO RESETA_REC ;RESETA RECEPÇÃO SE PULSO EM ‘1’ MAIOR QUE 8MS
    ;========================================================================================================
    ;ENTRADA SIN=1
    IN_1

    BCF FLAG_MR0
    BTFSC FLAG_MR1
    GOTO SS5
    BSF FLAG_MR1
    BCF T1CON,TMR1ON ;DESLIGA TMR1
    BTFSC PIR1,TMR1IF ;TESTA FLAG DO TIMER 1
    GOTO CLR_TMR1
    MOVFW TMR1H
    SUBLW 0X0F ;TESTA INTERVALO DE 4,5MS
    BTFSS STATUS,C
    GOTO CLR_TMR1 ;FOI INTERVALO DE 4,5MS

    ;=====================================================================TESTE
    MOVFW TMR1H
    SUBLW 0X05 ;TESTA POR INTERVALO DE 2,25 MS
    BTFSS STATUS,C
    CLRF CONT_INT1
    ;=====================================================================TESTE

    MOVFW TMR1H
    SUBLW 0X03 ;TESTA POR BIT ‘1’
    BTFSC STATUS,C
    GOTO SEGKW1
    BSF STATUS,C
    GOTO RODA_BYTE
    SEGKW1
    MOVFW TMR1H
    SUBLW 0X00 ;TESTA POR BIT ‘0’
    BTFSC STATUS,C
    GOTO CLR_TMR1
    BCF STATUS,C
    GOTO RODA_BYTE

    RESETA_REC
    MOVLW QBYTE ;SETUP INICIAL PARA NOVA RECEPÇÃO
    MOVWF QB
    CLRF RES3
    CLRF RES2
    CLRF RES1
    CLRF RES0

    CLR_TMR1

    ;CLRF CONT_INT1 ;ZERA CONTADOR DE TEMPO EM MODO PULSO

    CLRF TMR1L ;LIMPA TMR1
    CLRF TMR1H
    BCF PIR1,TMR1IF ;APAGA FLAG TMR1
    BSF T1CON,TMR1ON ;RELIGA TIMER1
    GOTO SS5 ;VOLTA AO LOOP

    RODA_BYTE
    RRF RES3,F ;DESLOCA BIT RECEBIDO
    RRF RES2,F
    RRF RES1,F
    RRF RES0,F
    DECFSZ QB,F ;VERIFICA SE JÁ RECEBEU TODOS OS BITS
    GOTO CLR_TMR1 ;AINDA NÃO

    ;=====================================================================
    ; RECEBEU CORRETAMENTE UM NÚMERO DE CONTROLE REMOTO ‘NEC’
    ;=====================================================================

    CLRF CONT_INT1 ;ZERA TEMPO MODO PULSO

    MOVF RES2, W
    GOTO TC0

    TC0
    MOVLW 0XA4
    MOVWF TECLA0
    MOVF RES2,W
    XORWF TECLA0,W
    BTFSS STATUS,Z
    GOTO TC1
    BSF LED0
    CALL TEMPO
    BCF LED0
    GOTO INICIO

    TC1

    MOVLW 0x68
    MOVWF TECLA1
    MOVF RES2,W
    XORWF TECLA1,W
    BTFSS STATUS,Z
    GOTO TC2
    BSF LED1
    CALL TEMPO
    BCF LED1
    GOTO INICIO
    TC2
    MOVLW 0X98
    MOVWF TECLA2
    MOVF RES2,W
    XORWF TECLA2,W
    BTFSS STATUS,Z
    GOTO INICIO
    BSF LED2
    CALL TEMPO
    BCF LED2
    GOTO INICIO

    TEMPO
    movlw 0x0D
    movwf d1
    movlw 0x46
    movwf d2
    movlw 0x04
    movwf d3
    Delay_0
    decfsz d1, f
    goto $+2
    decfsz d2, f
    goto $+2
    decfsz d3, f
    goto Delay_0
    RETURN
    END

    1. 0

      Olá Genilsonsa!
      Analisando a porção de código que você passou, notei que a temporização está sendo feita pelo método normal do ‘empaca’, ou seja, você trava o programa por um tempo e depois libera para prosseguir a execução do resto do programa. Se você fizer isto, não vai visualizar nada, porque o programa está ‘empacado’ no delay e não tem como enviar nada para o LCD. Você terá que fazer este tempo de uma forma que não trave o programa. Poderá usar um ou mais registradores em cascata, com carga inicial de tempo no momento que liga o led correspondente a saída, e dentro do loop principal, faze-los decrementar até chegar a zero, quando então desligaria o led que foi acionado. Outra possibilidade, é usar uma interrupção de um timer livre para depois de determinado número de interrupções, desligar o led que foi acionado.

      Por ex. no primeiro caso:

      Você fez assim:
      TC1

      MOVLW 0×68
      MOVWF TECLA1
      MOVF RES2,W
      XORWF TECLA1,W
      BTFSS STATUS,Z
      GOTO TC2
      BSF LED1
      CALL TEMPO
      BCF LED1
      GOTO INICIO
      TC2
      MOVLW 0X98
      MOVWF TECLA2
      MOVF RES2,W
      XORWF TECLA2,W
      BTFSS STATUS,Z
      GOTO INICIO
      BSF LED2
      CALL TEMPO
      BCF LED2
      GOTO INICIO

      Mas, ao invés de chamar a rotina de ‘call tempo’ fazer assim:

      TC1

      MOVLW 0×68
      MOVWF TECLA1
      MOVF RES2,W
      XORWF TECLA1,W
      BTFSS STATUS,Z
      GOTO TC2
      BSF LED1
      CALL carga_tempo_led1
      GOTO INICIO
      TC2
      MOVLW 0X98
      MOVWF TECLA2
      MOVF RES2,W
      XORWF TECLA2,W
      BTFSS STATUS,Z
      GOTO INICIO
      BSF LED2
      CALL carga_tempo_led2
      GOTO INICIO

      Carga_tempo_led1
      Movlw 0x60
      Movwf reg_tempo_led1a
      Movlw 0xff
      Movwf reg_tempo_led1b
      return

      Carga_tempo_led2
      Movlw 0x60
      Movwf reg_tempo_led2a
      Movlw 0xff
      Movwf reg_tempo_led2b
      return

      E no ínicio colocar os decrementos destes registradores ‘dinâmicos’ de tempo:

      INICIO:
      Decfsz reg_tempo_led1b
      Goto segue1
      Decfsz reg_tempo_led1a
      Goto segue 1
      Bcf led1
      Segue1
      Decfsz reg_tempo_led2b
      Goto segue2
      Decfsz reg_tempo_led2a
      Goto segue 2
      Bcf led2
      Segue2
      CLRF RES3
      CLRF RES2
      CLRF RES1
      CLRF RES0
      MOVLW QBYTE ;32 BITS PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER
      MOVWF QB
      CLRF TMR1H
      CLRF TMR1L
      BCF PIR1,TMR1IF
      BSF T1CON,TMR1ON
      CLRF PORTB
      ………………………….segue o programa normal

      Fazendo desta forma, não travará o programa.

      Se o tempo for pequeno demais, poderá usar quantos registradores for necessário para o tempo desejado. Em geral, 2 são suficientes. Quanto a calcular o valor a ser carregado, poderá usar o mplab ( na função ‘stopwatch’ do debug) contando quanto foi o tempo por loop, ou fazer por tentativa e erro.

      Cláudio

    2. 0

      Ola Larios eu fiz adaptação do seu código para o pic 16f628a só que sem o uso da eeprom.Demorei.porém,achei o porque que não estava visualizando o valor das teclas.Controle que estava tentando decodificar é um chinês que vende acompanhado com arduino e no manual que arrumei ele vem com código HEX de cada tecla,porém os códigos vieram todos errados então por isso não estava conseguindo visualizar no display de 7 seg duplo quando fazia a comparação da tecla escolhidas e sem osciloscopio fica ainda mais dificil,porém me virei aqui e achei todos codigos das teclas.Muito Obrigado

  4. 0

    Muito obrigado por me responder ESTOU USANDO A VERSÃO ASM.Entendi a tua explicação do protocolo NEC muito clara e objetiva.No caso do teu código os endereço ficam armazenados no registradores RES0,RES1,RES2,RES3..

      1. 0

        Olá Genilsonsa!
        A recepção é conforme a porção do código abaixo:
        RODA_BYTE
        RRF RES3,F ;DESLOCA BIT RECEBIDO
        RRF RES2,F
        RRF RES1,F
        RRF RES0,F
        DECFSZ QB,F ;VERIFICA SE JÁ RECEBEU TODOS OS BITS
        GOTO CLR_TMR1 ;AINDA NÃO

        Notou que os bits recebidos são deslocados para direita até o pleno número recebido?
        No final do processo RES0 terá o Address, RES1 o Address invertido, RES2 terá o Command, e RES3 terá o Command invertido.
        Então sua conclusão está correta!
        Cláudio

    1. 0

      Larios muito obrigado pela tua resposta fico muito agradecido pelo teus esclarecimentos.Participo do teu blog já um tempo e gostaria de saber como eu posso lhe ajudar.Pois eu vejo aqui que vc ajuda muitas pessoas

  5. 0

    Minha dúvida maior é o protocolo NEC que estou tentando entender e não consigo o que me deixa muito triste.Gostaria apenas de reconhecer a tecla e fazer uma função para cada uma delas sem precisar de guardar na EEPROM.Me ajudar aí amigo.

  6. 0

    Ola Lários excelente projeto,porém gostaria de saber se vc pode me ajudar.Gostaria de alterar esse projeto tenho um controle padrão NEC que contém 20 teclas eu queria na verdade é decodifica-la sem precisa-la guardar na EEPROM,ou seja aperto tecla 1 executa uma função,Tecla 2 outra função e por aí vai,porém eu não consigo entender em que parte do teu programa que vem com a tecla já decodificada.Pode me ajudar adapta-lo?

    1. 0

      Olá Genilsonsa!
      Você esta usando a versão ASM ou C? Quanto ao protocolo NEC, pesquise na internet sob o tema ‘NEC Infrared Transmission Protocol’ que tem um farto material explicativo. Basicamente, uma transmissão se inicia com um cabeçalho de 9 ms transmitindo seguido por uma pausa de 4,5 ms. Em seguida começa a transmitir 4 bytes de informação, sendo um byte normal e o próximo invertido.
      Após a primeira transmissão mantendo a tecla apertada no controle remoto, não mais ocorrerá a transmissão total do cabeçalho mais os 4 bytes, mas apenas uma transmissão reduzida para indicar tecla apertada e uma pausa de 110 ms . Este é chamado de ‘repeat code’. O primeiro byte recebido é do ‘address’ ou seja, qual aparelho irá operar (tv, satélite, etc), o segundo é o ‘address’ invertido em seus bits para conferência , o terceiro é o ‘command’ ou seja , o comando ou tecla apertada (ligar, números de 0 a 9, canal, etc), e o quarto e último byte é o ‘command’ invertido para conferencia da transmissão, se o sinal não foi corrompido. Em uma aplicação simples, poderá apenas comparar o byte 3 com uma tabela que chamará a rotina desejada ao ser apertado tal tecla. Terá que pesquisar quais são estes comandos e montar esta tabela com eles. Creio que esta seja uma breve explicação e espero que tenha sido de ajuda.
      Claudio

  7. 0

    Olá Larios,
    Estou montando um projeto relativamente mais simples com o pic 12f629 porém estou utilizando outro protocolo.É possível que com base no seu programa eu altere os valores de tempo e adapte esse programa
    para o protocolo que desejo?
    Se sim me indique por onde começar pois estou ainda meio perdido em seu programa.
    Agradecido- Alencar

    1. 0

      Olá Alencar! A resposta dependerá do tipo de protocolo que irá usar. Se for semelhante, pequenas modificações bastariam. Em outros casos, é melhor começar do zero. Poderá conhecer melhor os protocolos neste excelente site aqui. Com base nele, estude as diferenças e semelhanças com o NEC postado. Daí decida o que fazer. Aviso que é um pouco chato desenvolver na unha estes protocolos. Muitos preferem usar uma estrutura que já tenha bibliotecas prontas para o protocolo desejado, como por exemplo, o Arduino e similares. Alguns compiladores ‘C’ fornecem bibliotecas ou podem ser adquiridas em sites relacionados a este compilador. Verifique junto aos foruns o melhor caminho para você seguir nesta tua empreitada.
      Cláudio

    2. 0

      Olá Larios gostaria mais para fins didatico alterar este teu programa para cada tecla apertada mostrar o codigo no display de lcd.Será que é possivel?

      1. 0

        Olá Genilsonsa!
        O que você deseja seria um leitor do código enviado pelo controle remoto, geralmente em representação hexadecimal. Não se trata de fazer uma ‘simples modificação’, mas seria um projeto novo, com esta única finalidade, tendo que se acrescentar um display LCD. Ademais, terá que ser programado para o protocolo correto correspondente ao controle remoto que irá usar. Experimente ver outros sites na internet, que talvez já tenham o que você deseja, pois ainda não tenho tal ‘projetinho’.
        Cláudio

    3. 0

      Larios eu tenho um controle remoto esse que vende na china que usa no arduino tem 20 teclas eu queria que cada tecla que apertasse escrevia o co´digo do display de lcd.Será que é possivel
      alterar esse código.

  8. 0

    Boa-noite!
    Alguém dos amigos que entendam do projeto acima, inclusive linguagem para o 16f628A poderia me prestar assessoria? Gostaria muito de aprender a trabalhar com este projeto.
    Caso sim, fico muito agradecido.

    1. 0

      Caro Alederetti, boa noite.
      Tb sou amador na área de programação de microntoladores, embora não tenho a mesma competencia e criatividade do Larios.

      Ao ler sua msg, não entendi claramente a sua dificuldade, mas me coloco a sua disposição para fornecer mais informações sobre PIC16F628a. Att Rui

  9. 0

    Claudio, boa-noite!
    Excelente o site e os projetos, meus parabéns.
    Gostaria de tirar umas duvidas contigo do projeto acima, em relação a calculo de componentes do IRM, e a possibilidade de se usar o microcontrolador 16f628a. Você poderia me passar um contato para conversarmos?
    Muito obrigado.

  10. 0

    opa amigo vi o esqeuma vou testar so pintou uma duvida o arquivo hex a ser gravado é o mesmo ?
    pois se for sera que vai cortar e o micro vai desabilitar a saida ?

    1. 0

      Olá Liliano!
      Sim , o hex é o mesmo. Programe as teclas (4) em modo pulso. Quando chegar no final de curso, cortará a base do transistor e não funcionará para este lado, somente para o oposto.
      Cláudio

  11. 0

    estimado foxconn meus sinceros agradecimentos pela preocupação. desde então confirmoque eu não conseguir abrir este arquivonemno pdf e proteus 7,10 oque eu uso.

    1. 0

      🙁 Ok, me adiciona no skype ai que fica mais fácil de achar o erro que esta acontecendo blz.O nome do skype e o mesmo do e-mail que ti mandei os arquivos… :mrgreen:

    1. 0

      :mrgreen: Olá Jose Luiz, o desenho foi feito no PROTEUS 7.10 SP0, foi passado em pdf também, blz. Você não esta conseguindo abrir o desenho ou alterar alguma coisa??? Abraço e um Feliz Ano Novo a todos frequentadores deste Fórum…. 😛

  12. 0

    boa noite Claudio Larios.gostei muito dos seu projetos.gostaria de montar esse projeto!quanto vc cobra para fazer o desenho da placa?

    1. 0

      Olá Josivanio! Não tenho condições de fazer o desenho da placa, no momento. Existem vários programas que permitem realizar esta tarefa, pesquisando na internet, como o PcbExpress ( fazem a placa por encomenda). Também você tem a possibilidade de montar em placa padrão, onde as ligações serão feitas com pequenos pedaços de fio de cobre soldados. Pode ser que alguém já tenha feito o lay_out, e se desejar, poderia dispor para o Josivanio…
      Cláudio

    2. 0

      :mrgreen: Olá josivanio, qual e a sua necessidade deste projeto, e o desenho para vc confeccionar a pcb ou mesmo a pcb pronta para montar ❓ ….

        1. 0

          :mrgreen: ok josivanio, vc vai usar em um acionamento de fechadura, mais lhe pergunto, vc necessita do desenho da pcb deste projeto para vc mesmo fazer a confeccão da pcb ou mesmo a pcb já pronta para ser montada por vc.

          1. 0

            Olá josivanio, me passe o seu e-mail, que assim que fizer o desenho lhe mando ok, não tenho nem como cobrar do desenho, mesmo porque aqui e um ajudando os outros, as peças vc pode já ir providenciando ok. Tem varios sites que vende pela internet…

  13. 0

    Olá Lários! Infelizmente não tive sucesso com este programa em asm. Tentei fazer algumas modificações para usa-lo em outro projeto mas não deu certo. Vi que você também tem projetos em C da CCS. Será que você poderia fazer este em C? Obrigada pela sua atenção e continue fazendo bons projetos como este.

    1. 0

      Olá Raquel! Não prometo que vou mexer com isto agora, mas quando tiver um tempinho vou ver se sai um código “c” para esta montagem.
      Cláudio

    2. 0

      Olá Raquel! Esta disponível uma versão em C aqui. Por favor, não repare a qualidade do código, pois é coisa de iniciante, porém, funcional.
      Cláudio

  14. 0

    Claudio, vc já fez algum programa para controlar servomotor de aeromodelismo(exemplo:futaba)?Se sim, quando vc energisa o circuito o servo dá um chilik(procura uma referência, sem receber comando nenhum do pic)…Bom vc conhece algum meio de inibir esse chilik?

    1. 0

      Olá Saulo! Não tenho conhecimento desta área. Apenas arrisquei fazer algumas idéias que foram postadas. Creio que você deva procurar ajuda com colegas da área de aeromodelismo.
      Cláudio

  15. 0

    Ola Sr. Claudio, novo por aqui. Por Favor sou novato em Hex e Asm. Como faço para usar seu arquivo .Hex direto no gravador de PIC ?
    Obs: Muito bom seu site , instrutivo e construtivo.
    Grato

    1. 0

      Olá Elimu! Obrigado por seu comentário apreciativo. Ao baixar o arquivo do site, salve-o com terminação ‘.hex’ (somente se estiver com terminação’_asm.txt’) para ser aceito pelos gravadores de pic. Quando for fazer alguma alteração no arquivo ‘asm’, baixe o arquivo de extensão ‘_asm.txt’ e salve com extensão ‘.asm’ e abra ele no MPLab_ide (veja no artigo ‘como compilar…‘). Depóis de agrega-lo a um projeto (add file), poderá recompila-lo. Caso deseje, poderá fazer seu próprio ‘hardware’ programador’ conforme instruções do artigo ‘FAÇA UM SIMPLES PROGRAMADOR DE PIC (MICROCHIP) ‘.
      Cláudio

  16. 0

    Parabéns pelo projeto. Aliás, seus prjetos são os melhores em assembly que já vi. Montei este e funcionou perfeitamente. Sou iniciante em assembly e por isso estou tendo dificuldade em entender o programa. Você poderia se informar o que significa algumas de suas variáveis e label tais como: RES1, R0,QB,SEGKW1,SEGK92… E como você calculou os valores dos equates?

    1. 0

      Olá Raquel! Obrigado por seu comentário. Suas expressões de apreço são muito motivadoras. Realmente, não costumo perder muito tempo especificando as variavéis, e isto pode ser um problema para quem é iniciante. Vamos lá: As variavéis RES3 a RES0, são buffers de recepção dos bits transmitidos , usados para deslocar bit a bit, a medida que chegam. O registrador FLAGS usa seus bits como flags (como um semáforo) para os varios controles de trafego das rotinas. Os registradores AUX,AUX1,AUX2,TEMP são de uso geral, temporários. Os registradores R0,R1,R2,LcdDelayCounter,LcdDelayCounter1 são usados em rotinas de tempo (delays).
      Já STATUSTEMP,WTEMP são especificos para salvar ‘status’ e ‘w’ nas interrupções.
      O registrador ADDRESS,TMP são usados nas rotinas envolvendo leitura e escrita na Eeprom. O registrador QB é usado na recepção de bit transmitidos com a quantidade de bits a receber, decrementando a cada bit que chega até zerar e finalizar a recepção. Os registradores CONT_INT,CONT_INT1 são contadores de tempo que usa a propria interrupção para cadenciar os incrementos de tempo e é usado para determinar as piscadas dos leds em modo de programação e T1_INT ajuda para obter tempos maiores de 2 segundos . O registrador PASSO guarda a informação de qual saída está sendo programada . O registrador ADDR_SALVO é um auxiliar para busca de de controles na Eeprom. Com respeito aos Label como SEGKW1…PROXT3 não tem um significado especifico, mas são apenas endereços que o programa é desviado por instruções ‘goto’ ou ‘call’. Quanto aos ‘Equates’, a maioria são estebelecidos na prática. Por ex. coloco um valor entre 1 e 255. Rodo apenas o pedaço da rotina do equate. Meço os tempos desejados com o ‘Stop Watch’ do Debugador do MPLAB-IDE. Se falta tempo, aumento o valor e repito o processo, até obter o que desejo. Alguns valores podem ser obtidos por se saber o tempo de cada instrução e multiplicar pelo numero de operações e vice-versa. Não tem uma regra ‘mágica’. Cada caso é um caso. Sei que esta explicação não vai ajudar muito. Mas você poderia rodar o programa no MPLAB e acompanhar as variáveis e o caminho da rotina. Com o “Stimulus” você pode alterar o estado dos pinos . Estude como é o protocolo NEC. Pense no que precisa para capturar os dados enviados. Veja como o programa faz isto. Dá para passar um tempo interessante (se você REALMENTE gosta, senão você DETESTARÁ)!
      Cláudio

  17. 0

    Ola Amigo, você tem algum controle que faça a mesma coisa mas executa o infravermelho tambem? copiar um controle de infravermelho.

    1. 0

      Olá Fkkelso! Não entendi bem a sua pergunta. O que você quer dizer com ‘ faça a mesma coisa mas executa o infravermelho’?
      Cláudio

    2. 0

      Desculpa mas não expliquei direito :lol:, estou precisando um clone de controle, copia o controle e depois o proprio clone fica sendo o controle original.

          1. 0

            Olá Fkkelso!
            Não sou programador profissional. Somente como ‘hobby’, quando disponho de algum tempo, e ainda … naquilo que consigo fazer ( sou muito limitado). Se alguém trabalha com programação e se interessar em pegar seu serviço, poderá se manifestar…
            Cláudio

  18. 0

    obrigado lario montei este artigo e a precisao e nota 10 testei com varios controles e todos deu ok,obs nao tem com mudar de pic para almentar as saidas?diz que no passado muitos foram ajudados por poucos,e temos notado a sua atençao,em contribuir com estes artigos,obrigado.

  19. 0

    boa tarde lario:tem como identificar quais sao os controles remoto padrao nec? ou o mais comercial de tv. agradeço pela ajuda.

    1. 0

      Olá Luiz!
      Existe muitos padrões diferentes no comércio. Eu sei que o controle remoto do receptor de satelite Elsys trabalha neste protocolo. Alguns controles antigos para video-cassete da marca Semp também operavam neste protocolo. Consulte os fabricantes de controle remoto para obter informação.
      Claudio

    2. 0

      se o Claudio me permite a resposta .
      ja usei muitos controles phipils e CCE , sharp alguns e lg , century tb funciona que usa o mesmo ci da elsys , o vision tambem e de alguns dvds , agora o unico que não funciona é o da SONY este nenhum funcionou .

  20. 0

    lario boa noite: quero montar este circuito,voce me orienta fazer com o pic 12f675 ou 629?
    se aperto uma tecla para ligar o rele,como faço para desliga_lo? obrigado

    1. 0

      Olá José Luiz! O arquivo hex do blog está compilado para o 12f675. Você pode programar 4 teclas de um controle remoto infravermelho (padrão Nec somente, como o usado no receptor de satélite Elsys), e escolher se atuarão em modo ‘pulso’ ou ‘retenção’. Em modo ‘ pulso’, apertou irá ligar e soltando irá desligar. Em modo ‘retenção’, apertando uma vez irá ligar e apertando outra vez irá desligar.
      Cláudio

    1. 0

      Olá Liliano!
      Eu pessoalmente não gosto de sistema microcontrolados ligados direto a rede, mas irei ver isto em um artigo futuro.
      Claudio

  21. 0

    Boa tarde Claudio. Você desenvolveu algum projeto em que utilizou as 1024 divisões do conversor AD? Gostaria de saber se possui algum projeto com um programa que tenha feito isso usando este recurso, pois estou tentando usar e não consigo. Gostaria de fazer um voltímetro e utilizar esse recurso mostrando num LCD, por exemplo medindo 5 volts que em 1024 divisões fica um salto de 0,004 mV, mas só acho projetos que dividem em 255 valores. Poderia me ajudar? Lembrando que não sei inglês, só o basicão, daí não posso entender o datasheet.

    1. 0

      Olá Deivid!
      Para obter precisão usando 1024 bits do AD, com certeza, você terá de usar a biblioteca de ponto flutuante. Creio que os projetos que usam 255 valores visam facilitar os cálculos com matemática de ponto fixo. Outra forma, seria a de usar uma tensão de referência de 4,096 volts, fornecendo valores redondos para facilitar os cálculos. Só que neste caso, a escala irá de 0 a 4,096 volts. Digamos que trabalhar com AD é um pouco chato!!!
      Cláudio

  22. 0

    olá Claudio bom dia , peço uma ajuda sua , montei no sábado esse circuito e na hora de programar os botões do controle funciona certinho , mas na hora de definir a função de pulso/retenção ele não responde direito e quando termino os canais 2, 3 e 4 funciona mais ou menos direito e o canal 1 não funciona . o que pode ser ??
    o receptor de infravermelho eu tirei de um mini helicóptero velho ( rsrs ) e testei com controles diferentes ( acho que não é os controles pois na hora de programar funciona 100% ) .

    1. 0

      Olá Michel!
      Por favor, defina melhor a expressão ‘mais ou menos’. O canal 1 não opera nada? Fica direto? Gravou os mesmo número? De um descritivo do que está acontecendo na sua montagem.
      Claudio

      1. 0

        tem hora que funciona e hora não, as vezes tem que ficar esperando uns segundos para apertar o botão , tem hora que tem que apertar 2 vezes o mesmo botão para configurar . gravei números diferentes . o canal 1 só funciona na primeira configuração e depois nada . já tentei vários botões diferentes .

    2. 0

      Olá Michael!
      Ok. Realmente, as cezes demorava para programar a função pulso/reset. Alterei o asm e o hex. Por favor, recarregue o novo hex e teste se está a contento.
      Cláudio

      1. 0

        olá claudio , desculpe pela demora . gravei o pic com esse novo hex mas continua dando problema . chegou hoje um receptor infravermelho KSM603 que comprei no solda fria mas continua dando problemas .

        obs: estou usando o pic 12f629 . será que é isso?

        1. 0

          Olá Michel! Vamos tirar a prova. Você poderia eliminar do código ASM, por comentar a linha desta forma:

          ; MOVLW .0
          ; MOVWF ANSEL

          , logo no ínicio do programa e substitua o arquivo include de 12f675 para 12 f629, desta forma:

          LIST P=12f629 , R=DEC
          INCLUDE “P12F629.INC”

          Depois recompile e use o arquivo HEX para gravar o teu 12f629.
          Se funcionar desta forma…

          Cláudio

          1. 0

            bom dia claudio , testei aqui e deu um efeito um pouco diferente mas continua não respondendo direito e o canal 1 está funcionando dessa vez . tira uma dúvida sobre o controle: se funciona certinho na primeira configuração é porque é compatível ?? vou comprar um 12f675 na próxima vez que pedir material aqui para a firma e testarei assim que chegar . obrigado pela sua atenção e até mais .

          2. 0

            Olá Michel!
            Infelizmente estou sem 12f675 para testar. Peguei um lote que em 2 gravações seguidas já pifaram. Está acontecendo muito isto. Já com os 16f628a, tenho um que tem mais de 3 anos gravando e regravando sem problemas. Verifique se o seu controle realmente é padrão ‘Nec’ (controle Elsys, remoto de Semp,alguns LG). Os teste que fiz foi sobre o 12f675 e roda bem com o novo HEX.
            Cláudio

  23. 0

    amigo muito bom este projeto , agora seria interessante pegar o projeto do dimeer e ao inves de controlar a carga como dimmer acionar igual a este projeto , ou seja 4 canais com tiac seria interessane tb .
    Sucesso nos projetos amigo que Deus te ilumine cada vez mais

Comments are closed.