andrepereira@ig.com.br
Todo o conteúdo da apostila está escrito aqui no blog para quem quiser fazer este projeto que agora é free. Continuando o assunto ....
Uma
outra observação é com relação ao capacitor eletrolítico de
10uF-16V, este deve ser considerado como polaridade descrita a baixo
não esqueça disso.
Apêndice A
Receptor
IR
Transmissor
IR
Apêndice B
Receptor
IR
Transmissor
IR
Apêndice C
Código ASM do PIC12F629 do receptor
;___________________________________________________________________________
; Projeto controle
remoto de três canais , adaptado para o PIC12F629
; oscilador interno de
4Mhz
; MPLAB 7.30 ou maior ,
assembler
; formato RC5 , 36Khz ,
35% de ciclo ativo
; Endereço do
dispositivo 0X0B -- 00001011 deve ser mudado ao gosto do usuário
; SW1 =
GP1 = 0X01
; SW2 =
GP3 = 0X02
; SW3 = GP2 = 0X03
; IR = GP0 = IR
; Bit Toggle sempre é
lido como 0
;
andrepereira@ig.com.br ,qualquer doação será bem vinda,em resposta
ao reconhecimento
; desta obra,
aperfeiçoada e adaptada para o português.
;
;----------------------------------------------------------------------------------------------------------------------
; Programa do receptor
RX
;-----------------------------------------------------------------------------------------------------------------------
list
P=12F629
#include
#DEFINE IR GPIO,3 ;
Entrada do sinal RC5 com R de 10K pull-up para vcc
#DEFINE OUT1 GPIO,0 ;
controle da saída 1
#DEFINE OUT2 GPIO,1 ;
controle da saída 2
#DEFINE OUT3 GPIO,2 ;
controle da saída 3
#DEFINE OUT1_M 0x01
#DEFINE OUT2_M 0x02
#DEFINE OUT3_M 0x04
#DEFINE TOG_BIT TOGGLE,0
#DEFINE ADDRS 0X0B ; 0000 1011 ; 0000 1110 , verificar na tabela o endereço desejado
#DEFINE CH1_CMD 0X01
#DEFINE CH2_CMD 0X02
#DEFINE CH3_CMD 0X03
CNT1 EQU 20H
CNT2 EQU 21H
CNT3 EQU 22H
CNT4 EQU 23H
TEMP EQU 24H
TOGGLE EQU 25H
ADDR EQU 26H
CMD EQU 27H
ORG 000
BSF STATUS,RP0
CALL 0X3FF
MOVWF OSCCAL
BCF STATUS,RP0
CALL DEBOUNCE
MOVLW 0X07
MOVWF CMCON ;
Configura registro GPIO em digital
BSF STATUS,RP0
MOVLW 0X01
MOVWF OPTION_REG
MOVLW B'00001000'
MOVWF TRISIO
CLRF IOCB
BCF STATUS,RP0
BCF INTCON,GIE
CLRF GPIO ; Desliga
todas as entradas
;
MAIN:
CALL DELAY3500
CALL GET_RC5
BTFSC STATUS,C
GOTO MAIN
;
MOVF ADDR,W
XORLW ADDRS
BTFSS STATUS,Z
GOTO MAIN ;endereço
inválido
;
MOVF CMD,W
ANDLW 0X03 ; mascara
2 LSB
ADDWF PCL,F
GOTO MAIN ; COMMANDo
0X00 Não usado Ou comando errado
GOTO DO_CH1
GOTO DO_CH2
GOTO DO_CH3
DO_CH1:
MOVLW OUT1_M
GOTO CHANGE
;
DO_CH2: MOVLW OUT2_M
GOTO CHANGE
;
DO_CH3: MOVLW OUT3_M
CHANGE: XORWF GPIO,F
GOTO MAIN
;======================================
; Leitura do formato
RC5
; OUTPUT :
TOGGLE.7 = TOGGLE BIT
;
ADDR = endereço de 5 BIT
; CDM = comando
de 6 BIT
; C = 0 sinal
RC5 OK
; = 1 sinal RC5
inválido
;======================================
GET_RC5:BTFSC IR
GOTO GET_RC5 ;
Aguarda início do sinal RC5
CLRF TMR0 ;
Limpa timer0
NOP
BCF INTCON,T0IF ;
limpa bit TOIF da interrupção TMR0
NOP
;
BTFSC INTCON,T0IF
GOTO ERR1
;
BTFSS IR
GOTO $-3
;
MOVF TMR0,W
;MOVLW 0xC8 ; só
desabilite para testar
MOVWF TEMP
MOVLW 0XFF ;
1020 mS = 255*4
SUBWF TEMP,W
BTFSC STATUS,C
GOTO ERR1 ;
inválido se Tempo > 1020 uS
MOVLW 0XC8 ;
800 mS
SUBWF TEMP,W
BTFSS STATUS,C
GOTO ERR1 ; inválido
se Tempo < 800 uS (C8h * TM0 Prescaler = 800 uS )
;
BTFSC IR ; tempo de
sinal válido 800uS-1020uS
GOTO $-1 ; Espera
chegar a zero (Syn BIT)
CALL DELAY1252 ;
atraso de 3/4 do BIT comprimento=1252 uS
;
BTFSS IR
BCF TOGGLE,7
BTFSC IR
BSF TOGGLE,7
;
BTFSS IR
GOTO $+4
BTFSC IR
GOTO $-1
GOTO READ
;
BTFSS IR
GOTO $-1
;====== Leitura de
endereço de 5 BIT ===========
; ler primeiro os MSB
;
READ: MOVLW 5
MOVWF TEMP ;
LOOP
CLRF ADDR
;
READ1: CALL DELAY1252
BTFSS IR
BCF STATUS,C
BTFSC IR
BSF STATUS,C
RLF ADDR,F ; rotaciona
endereço para esquerda
;
BTFSS IR
GOTO $+4
BTFSC IR ; aguardar
chegar a zero
GOTO $-1
GOTO $+3
;
BTFSS IR
GOTO $-1
;
DECFSZ TEMP,F
GOTO READ1
;
;====== leitura de
comando de 6 BIT ===========
; ler primeiro os MSB
;
MOVLW 6
MOVWF TEMP ;
LOOP
CLRF CMD
;
CMD1: CALL DELAY1252
BTFSS IR
BCF STATUS,C
BTFSC IR
BSF STATUS,C
RLF CMD,F ; Rotaciona
comando a esquerda
;
BTFSS IR
GOTO $+4
BTFSC IR
GOTO $-1
GOTO $+3
;
BTFSS IR
GOTO $-1
;
DECFSZ TEMP,F
GOTO CMD1
;
MOVLW 0X3F ;
0011 1111
ANDWF CMD,F
MOVLW 0X1F ;
0001 1111
ANDWF ADDR,F
BCF STATUS,C ;
C=0 válido
RETURN
;
ERR1: BSF STATUS,C ;
C=1 inválido
RETURN
;======================================
; tratamento de
DEBOUNCE
; atraso de 15 mS
;======================================
DEBOUNCE:
MOVLW .1 ;
1
MOVWF CNT1 ;
1
DEL_1: MOVLW .20
MOVWF CNT2 ;
1
DEL_2: CLRF CNT3 ;
1
DEL_3: DECFSZ CNT3,F ;
1/2
GOTO DEL_3 ;
2
DECFSZ CNT2,F ;
1/2
GOTO DEL_2 ;
2
DECFSZ CNT1,F ;
1/2
GOTO DEL_1 ;
2
RETLW 0 ; 2
;======================================
; atraso de 1.252mS
;======================================
DELAY1252:
MOVLW .1 ;
1
MOVWF CNT1 ;
1
REP_1: MOVLW .5
MOVWF CNT2 ;
1
REP_2: MOVLW .81
MOVWF CNT3 ;
1
REP_3: DECFSZ CNT3,F ;
1/2
GOTO REP_3 ;
2
DECFSZ CNT2,F ;
1/2
GOTO REP_2 ;
2
DECFSZ CNT1,F ;
1/2
GOTO REP_1 ;
2
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
RETURN ;
2 ciclos de máquina
DELAY3500:
MOVLW .1 ; 1
MOVWF CNT1 ; 1
MOVLW .23
MOVWF CNT2 ; 1
MOVLW .50
MOVWF CNT3
DECFSZ CNT3,F ; 1/2
GOTO $-1 ; 2
DECFSZ CNT2,F ; 1/2
GOTO $-5 ;
2
DECFSZ CNT1,F ;
1/2
GOTO $-9 ;
2
RETLW 0 ;
2
END
Código ASM do PIC12F629 de
transmissor
;___________________________________________________________________________
; Projeto controle
remoto de três canais , adaptado para o PIC12F629
; oscilador interno de
4Mhz
; MPLAB 7.30 ,
assembler
; formato RC5 , 36Khz ,
35% de ciclo ativo
; Endereço do
dispositivo 0X0B -- 00001011 deve ser mudado ao gosto do usuário
; SW1 =
GP1 = 0X01
; SW2 =
GP3 = 0X02
; SW3 = GP2 = 0X03
; IR = GP0 = IR
; Bit Toggle sempre é
lido como 0
;
andrepereira@ig.com.br ,qualquer doação será bem vinda,em resposta
ao reconhecimento
; desta
obra,aperfeiçoada e adaptada para o português
;PROJETO : 3 Canais IR
Transmissor MPLAB : 7.11
;--------------------------------------------------------------------------------------------
list
P=12F629
#include
;__config
_WDT_OFF & _XT_OSC & _CP_ON & _CPD_ON & _BODEN_OFF &
_MCLRE_OFF & _PWRTE_ON
#DEFINE CH1 GPIO,0 ;
CONECTA TRANSMISSÃO PELO CANAL 1
#DEFINE CH2 GPIO,1 ;
CONECTA TRANSMISSÃO PELO CANAL 2
#DEFINE CH3 GPIO,3 ;
CONECTA TRANSMISSÃO PELO CANAL 3
#DEFINE IR GPIO,2 ;
SAÍDA DE SINAL INFRAVERMELHO
#DEFINE TOG_BIT
TOGGLE,0 ; NÃO É USADO SEMPRE É LIDO COMO 0
#DEFINE CH1_CMD 0X01 ;
COMANDO DO CANAL 1
#DEFINE CH2_CMD 0X02 ;
COMANDO DO CANAL 2
#DEFINE CH3_CMD 0X03 ;
COMANDO DO CANAL 3
CNT1 EQU 20H
CNT2 EQU 21H
CNT3 EQU 22H
CNT4 EQU 23H
TOGGLE EQU 24H
CMD EQU 25H ; Registro
temporário do Commando IR
ORG 000
BCF IR
BSF STATUS,RP0
CALL 0X3FF
MOVWF OSCCAL
BCF STATUS,RP0
CALL DEBOUNCE
;
MOVLW 0X07
MOVWF CMCON ; Faz GPIO
como sendo digital
BSF STATUS,RP0
BCF OPTION_REG,7
; abilita WEAK PULL-UP
BCF WPU,2 ;
desabilita WEAK PULL-UP para GPIO2
MOVLW B'00001011' ;
GPIO<0> = entrada , GPIO 2 = saída0>
MOVWF TRISIO
BSF IOCB,IOCB0
BSF IOCB,IOCB1
BSF IOCB,IOCB3
BSF INTCON,GPIE
BCF STATUS,RP0
BCF INTCON,GIE
BCF TOG_BIT
;------------------------------------
; LOOP
principal
MAIN: SLEEP ; entra no
modo sleep para poupar energia
BTFSS CH1
GOTO DO_CH1
BTFSS CH2
GOTO DO_CH2
BTFSS CH3
GOTO DO_CH3
GOTO MAIN
;------------------------------------
DO_CH1:
CALL DEBOUNCE
BTFSC CH1
GOTO MAIN
MOVLW CH1_CMD ;
Carrega comando para o canal 1
MOVWF CMD
CALL SEND_RC5
;
BTFSS CH1
GOTO $-1 ; espera
botão ser solto
;
CALL DEBOUNCE ; atraso
do botão solto (após apertá-lo)
GOTO MAIN
;------------------------------------
DO_CH2:
CALL DEBOUNCE
BTFSC CH2
GOTO MAIN
MOVLW CH2_CMD ;
carrega comando para o canal 2
MOVWF CMD
CALL SEND_RC5
;
BTFSS CH2
GOTO $-1 ; espera
botão ser solto
;
CALL DEBOUNCE ; atraso
do botão solto (após apertá-lo)
GOTO MAIN
;
;------------------------------------
DO_CH3: CALL DEBOUNCE
BTFSC CH3
GOTO MAIN
MOVLW CH3_CMD ;
carrega comando para o canal 3
MOVWF CMD
CALL SEND_RC5
;
BTFSS CH3
GOTO $-1 ; espera
botão ser solto
;
CALL DEBOUNCE ; atraso
do botão solto (após apertá-lo)
GOTO MAIN
;
;======================================
; envia lógica 0
;======================================
LOGIC0: MOVLW .32 ; 1
MOVWF CNT1 ; 1
;
LOG0_1: BSF IR ; 1 faz
IR alto por 35% de ciclo ativo = 9 uS
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
;
;===================================
BCF IR ; 1 faz IR
baixo por 17 uS
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
NOP ; 1
;
DECFSZ CNT1,F ;
½
GOTO LOG0_1 ;
2 26 uS
;
CALL DELAY_OFF
RETURN ;
2
;
;======================================
; envia
lógica 1
;======================================
LOGIC1: CALL DELAY_OFF ;
atraso de 899 uS
MOVLW .32 ;
1
MOVWF CNT1 ; 1
;
LOG1_1: BSF IR ; 1 Faz
IR alto por 35% de ciclo ativo = 9 uS
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
;
;===================================
BCF IR ; 1 Faz IR
baixo por 17 uS
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
GOTO $+1
NOP ; 1
;
DECFSZ CNT1,F ;
½
GOTO LOG1_1 ;
2
;
RETURN ;
2
;
;======================================
; Atraso de nenhum
sinal
; de aproximadamente
835 uS
;======================================
DELAY_OFF:
MOVLW 5 ;
1
MOVWF CNT3 ;
1
MOVLW .54 ;
1
MOVWF CNT4 ;
1
DECFSZ CNT4,F ;
½
GOTO $-1 ;
2
DECFSZ CNT3,F
; ½
GOTO $-5 ;
2
RETURN ;
2
;======================================
; envia comando RC5
para o receptor
; entrada : CMD
(comando IR de 6 BIT )
;======================================
SEND_RC5:
; SEND 2
START BIT
CALL LOGIC1
CALL LOGIC1
; SEND
TOGGLE BIT
BTFSS TOG_BIT
GOTO $+3
CALL LOGIC1
GOTO $+2
CALL LOGIC0
;
envia endereço de 5 BIT fixo em 01011 (0X0B) pode ser mudado pelo
usuário
CALL LOGIC0 ;
0 primeiros MSB ( BIT 4)
CALL LOGIC1 ;
1
CALL LOGIC0 ;
0
CALL LOGIC1 ;
1
CALL LOGIC1 ;
1 LSB BIT 0
;
; envio de comando de
6 BIT(00HH LLLL) MSB
BCF STATUS,C
RLF CMD,F ; após
primeira rotação 0HHL LLL0
RLF CMD,F ; após
segunda rotação HHLL LL00
;
MOVLW 6
MOVWF CNT2
;
RLF CMD,F ; envia
os primeiros MSB
BTFSS STATUS,C
GOTO $+3
CALL LOGIC1
GOTO $+2
;
CALL LOGIC0
DECFSZ CNT2,F
GOTO $-7
;
RETLW 0
;
;======================================
; atraso para DEBOUNCE
; de 15 mS
;======================================
DEBOUNCE:
MOVLW .1 ;
1
MOVWF CNT1 ;
1
DEL_1: MOVLW .20
MOVWF CNT2 ;
1
DEL_2: CLRF CNT3 ;
1
DEL_3: DECFSZ CNT3,F ;
½
GOTO DEL_3 ;
2
DECFSZ CNT2,F ;
½
GOTO DEL_2 ;
2
DECFSZ CNT1,F ;
½
GOTO DEL_1 ;
2
RETLW 0 ;
2
END
Finalização
Se
você gostou deste projeto , escreva um e-mail para que eu possa
saber.Se desejar fazer alguma crítica ou mesmo dar uma sugestão ,me
escreva .
Obrigado
.
André
Pereira da Silva
andrepereira@ig.com.br
Técnico
industrial / Eletrotécnico.
21 –
91267264
Rio de
Janeiro.
Nenhum comentário:
Postar um comentário