;************************************************************************** ; PLACA PARA CONTROLE REMOTO DE PORTÃO (VERSÃO CORRIGIDA) ; ; COMO TRANSMISSOR, USAR QUALQUER TRANSMISSOR ('CHAVEIRINHO') ; COM INTEGRADO HT6P20B. ; PARA DECODIFICAR UTILIZA UM PIC 12F629/675. ; UTILIZA 2 RELES PARA CONTROLAR UM MOTOR LIGADO A UM PORTÃO POR CREMALHEIRA. ; TRABALHA COM 2 FINS DE CURSO TIPO RED SWITCH (COM IMÃS) UM LIGADO A S1, ; E OUTRO EM S2 VIA RESISTOR DE 470 OHMS A MASSA. ; APÓS ACIONAR RELE DO MOTOR, TEM UMA TEMPORIZAÇÃO MAXIMA (TMAX) DE MODO ; QUE ESTE FICA LIGADO POR APENAS 35 SEG., REGULAVEL NO PROGRAMA. ; OBS. NÃO USA INTERRUPÇÕES. COMPATIVEL COM PLACA ; JÁ PUBLICADA (PLACA DE PORTÃO USANDO HCS200...301). ; ; CLAUDIO LÁRIOS INICIO: 25-06-2012 TERMINO:25-06-2012 ; REVISADO 24-07-2013 ;************************************************************************** ; ; GRAVAR CONTROLE: APERTE UM DOS BOTÕES DO C. REMOTO E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN' NA PLACA (PINO 2 DO PIC 12F629 A MASSA)E ; SOLTE-O EM MENOS DE 2 SEGUNDOS. DEVERÁ ACIONAR UMA SAIDA DE RELE PARA ; O MOTOR , SE FOI BEM SUCEDIDO O APRENDIZADO. O LED VERMELHO PISCARÁ 1 ; VEZ, PARA INDICAR ISTO. REPITA ISTO COM TODOS OS BOTÕES DO CONTROLE REMO ; TO,UM POR VEZ, SE DESEJAR (APRENDIZADO INDIVIDUAL). ; APAGAR TODOS OS CONTROLES DA MEMÓRIA: APERTAR BOTÃO 'LEARN' NA PLACA E ; MANTENHA PRESSIONADO POR MAIS DE 5 SEGUNDOS. O LED VERMELHO PISCARÁ ; 3 VEZES , INDICANDO O PLENO APAGAMENTO DE TODOS OS CONTROLES DA MEMÓRIA. ;*************************************************************************** ;OPÇÃO DO USUÁRIO ;============================================================================ ;escolha do microcontrolador: COMENTE O NÃO USADO E DESCOMENTE O OUTRO #define f675 ;PARA 12F675 ;#define f629 ;PARA 12F629 ;============================================================================ ifdef f629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" endif ifdef f675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" endif ;-------------------------- ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF #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 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 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,TMP_SALVO ENDC 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 .250 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO ORG H'2100' ;vetor de eeprom ORG 0X00 GOTO START ORG 0X04 RETFIE START: MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF GPIO ; RESET PORT BANK1 ifdef f675 CLRF ANSEL endif MOVLW YTRISA ; SETUP PORTA MOVWF TRISIO BSF WPU,4 ;LIGA PULLUP S2 CLRF OPTION_REG BANK0 CLRF FLAGS MOVLW TGR MOVWF Z2 CLRF Z1 INICIO: CLRF RES3 CLRF RES2 CLRF RES1 CLRF RES0 MOVLW QBYTE MOVWF BITCOUNTER 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 CALL APAGAEEPROM MOVLW TGR MOVWF Z2 CLRF Z1 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: ;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 ;------------------------------------- AÇÃO ;=========================================================== ;ROTINA PARA ELIMINAR RECEPÇÃO 'FFFFFF' (MEMÓRIA VIRGEM) MOVFW RES2 XORLW 0XFF BTFSS STATUS,Z GOTO R_CONT MOVFW RES1 XORLW 0XFF BTFSS STATUS,Z GOTO R_CONT MOVFW RES0 XORLW 0XFF BTFSS STATUS,Z GOTO R_CONT GOTO RESETAC ;RECEBEU 'FFFFFF' = ERRO R_CONT ;======================================================== ;I BTFSS LRN ;BOTÃO ESTÁ APERTADO? BSF FLAGGR CALL PPT MOVWF TMP_SALVO SUBLW .0 BTFSC STATUS,Z ; É '0'? GOTO APRENDER ;NENHUM CONTROLE FOI GRAVADO MADDRESS MOVFW TMP_SALVO 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 MOVLW .3 SUBWF TMP_SALVO,F ;ACERTA DE 3 EM 3 A POSIÇÃO DE BUSCA NA MEMÓRIA BTFSS STATUS,Z GOTO MADDRESS 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 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 ;-------------------------------------------------------------- DELAYM MOVWF R0 XC BTFSS S1 BCF M1 BTFSS S2 BCF M2 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 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 0x55 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 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 ;------------------------------------------------------------------------------ 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 0x55 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 ORG H'2100' DE .0 end