Busque no blog

sábado, 13 de outubro de 2012

Controle remoto com PIC12f629 - parte2

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ída
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