;************************************************************************** ; RX_PRESENCA_ALARME_V1.ASM ; ; ; RECEPTOR RF POR PRESENÇA DE EMISSOR COM CI HT6P20B ; OBJETIVO: APLICAR EM VEICULOS COMO OPÇÃO DE SEGURANÇA CONTRA ROUBO. ; FUNCIONAMENTO: ENQUANTO O EMISSOR ESTIVER NA PROXIMIDADE, ELE EMI- ; TIRÁ SINAL A CADA 20 SEGUNDOS.ISTO PERMITIRÁ QUE UM RELE POSSA SER ; ACIONADO, LIBERANDO A BOMBA DE COMBUSTIVEL OU MESMO, A BOBINA DE ; IGNIÇÃO. ; SE NÃO HOUVER RECEPÇÃO POR DISTANCIAMENTO DO TRANSMISSOR DE BOLSO, ; E A CHAVE DE CONTATO LIGADA OU PORTAS FOREM ABERTAS, DISPARARÁ UMA ; SIRENE E OS PISCAS, AVISANDO QUE HOUVE UMA INVASÃO. ; ; PARA DECODIFICAR UTILIZA UM PIC 12F675 (OPCIONALMENTE UM 12F629, DES- ; COMENTANDO/COMENTANDO AS LINHAS CITADAS NO TEXTO). ; ; CLAUDIO LÁRIOS INICIO: 22-05-2013 TERMINO:22-05-2013 ; REVISADO EM 29-05-2013 ;************************************************************************** ; ; GRAVAR EMISSOR: RETIRE A BATERIA DO CHAVEIRO EMISSOR. ; APERTE O BOTÃO 'LEARN' NA PLACA (PINO 4 DO PIC 12F629 A MASSA),LIGUE ; RAPIDAMENTE A BATERIA E SOLTE O BOTÃO 'LEARN' EM MENOS DE 1 SEGUNDOS. ; O LED 'LEARN'(PINO 2) PISCARÁ 1 VEZ, PARA INDICAR 'CODE APRENDIDO'. ; ; APAGAR EMISSOR DA MEMÓRIA: APERTAR BOTÃO 'LEARN' NA PLACA E ; MANTENHA PRESSIONADO POR MAIS DE 10 SEGUNDOS. O LED 'LEARN' (PINO 2) PISCARÁ ; 3 VEZES , INDICANDO O PLENO APAGAMENTO DE TODOS EMISSORES DA MEMÓRIA. ; APÓS ISTO, CADA EMISSOR DEVERÁ SER 'REAPRENDIDO' NOVAMENTE PARA OPERAR. ;*************************************************************************** ;=================================================================================================================== ;DEFINIÇÕES DO USUARIO (DESCOMENTE A OPÇÃO DESEJADA E COMENTE AS OUTRAS) ; #DEFINE PIC_629 ;ESCOLHE MICROCONTROLADOR PIC12F629 #DEFINE PIC_675 ;ESCOLHE MICROCONTROLADOR PIC12F675 ;=================================================================================================================== ;DEFINIÇÕES DE TEMPORIZAÇÃO TEMPO_DISPARADO EQU .5 ;TEMPO QUE ALARME FICARÁ ACIONADO (EM MINUTOS) TEMPO_SEM_TX EQU .45 ;TEMPO MÁXIMO SEM RECEBER UMA TRANSMISSÃO (EM SEGUNDOS) ;=================================================================================================================== IFDEF PIC_675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ENDIF IFDEF PIC_629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ENDIF ;-------------------------- ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF ;BANCOS DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;FLAGS DA ROTINA DE RECEPÇÃO #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 FLAG_TRAVA_AP FLAGS,3 ;FLAG DE TRAVA ;FLAGS DA ROTINA DO ALARME #DEFINE FLAG_BLOQ FLAGS,4 ;FLAG DE ALARME DISPARADO #DEFINE FLAG_AL FLAGS,5 ;FLAG DE PAUSA NO DISPARO #DEFINE FLAG_DISP FLAGS,6 ;FLAG DE TRAVA EM PAUSA #DEFINE FLAG_ALARM_STANDBYE FLAGS,7 ;FLAG DE TRAVA ;DEFINIÇÕES DE PINOS #DEFINE SIN GPIO,0 ;PINO 7 IN RF #DEFINE LRN GPIO,5 ;PINO 2 IN LEARN BOTTON #DEFINE LED GPIO,5 ;PINO 2 SAIDA LED 'LEARN' #DEFINE RELE_S GPIO,2 ;PINO 5- SAIDA DO RELE SIRENE #DEFINE RELE_B GPIO,1 ;PINO 6- SAIDA P/RELE BOMBA #DEFINE RELE_SETA GPIO,4 ;PINO 3- SAIDA DDAS SETAS #DEFINE V15 GPIO,3 ;PINO 4- ENTRADA 12V POS CHAVE #DEFINE TRISLED TRISIO,5 ;IN/OUT PARA O PINO 2 CBLOCK 0X20 RES3,RES2,RES1,RES0,AUX,C3,C2,C1,C0,WS,TEMP,BITCOUNTER,FLAGS,STATUSTEMP,WTEMP CTI,CTI_AUX, CTI_SEG,CTI_MIN,AUX2,R0,R1,R2 LC,HC ,CONT,RES3A,RES2A,RES1A,RES0A,TMP1,TMP2,TMP3,ADDRESS,TMP ENDC YTRISA EQU B'101001' ; PORTA: TRI-STATE VALUE TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .24 ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO+ 4 ANTICODE) ORG 0X00 GOTO START ;*********************************************************************************** ; ROTINA DE INTERRUPÇÃO DO TMR1 ;*********************************************************************************** ORG 0X04 INT_TIMER1 MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BANK0 INCF CTI_AUX,F ;TEMPO PARA PISCADAS INCF CTI,F BTFSS CTI,2 ;OBTEM 1 SEGUNDO GOTO SAI_INT BCF CTI,2 INCF CTI_SEG,F MOVFW CTI_SEG XORLW .60 BTFSS STATUS,Z GOTO SAI_INT CLRF CTI_SEG INCF CTI_MIN,F SAI_INT MOVLW 0X0B ;PRÉ-CARGA PARA TEMPO MÁXIMO = 62496 MICROSEG MOVWF TMR1H MOVLW 0XE0 MOVWF TMR1L BCF PIR1,TMR1IF ;APAGA FLAG DO TIMER 1 SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS MOVFW WTEMP ;RECUPERA 'W' RETFIE ;*********************************************************************************** ; INICIO DO PROGRAMA PRINCIPAL ;*********************************************************************************** START: BANK1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW YTRISA ; SETUP PORTA MOVWF TRISIO IFDEF PIC_675 CLRF ANSEL ;LIBERA PORTAS DO AD (SOMENTE 12f675) ENDIF MOVLW B'00000001' MOVWF PIE1 ;LIGA INTERRUPÇÃO DO TMR1 BANK0 BSF INTCON,GIE ;CHAVE GERAL DE INTERRUPÇÃO BSF INTCON,PEIE ;CHAVE GERAL DOS PERIFÉRICOS MOVLW B'00100001' ;PRESCALLER = TMR1 /4 MOVWF T1CON ;LIGA TIMER 1 MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF GPIO ; RESET PORT BSF LED ;APAGA LED 'LEARN' CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS INICIO: CLRF RES2 CLRF RES1 CLRF RES0 MOVLW QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF BITCOUNTER L0 BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC CLRF LC L1 ;--------------------------------- BANK1 BSF TRISLED ;VIRA ENTRADA BANK0 BTFSS LRN ;TESTA BOTÃO 'LEARN' APERTADO GOTO TAPAGAMENTO ;APERTADO, COMEÇA A CONTAR TEMPO MAX. DE APAGAMENTO BANK1 BCF TRISLED ; VIRA SAIDA BANK0 BCF FLAG_TRAVA_AP L1H GOTO SS5 TAPAGAMENTO ;APAGAR TODOS OS CONTROLES DA MEMÓRIA BANK1 BCF TRISLED ;VIRA SAIDA BANK0 BTFSS FLAG_TRAVA_AP CALL ZERA_ALL_TIMER BSF FLAG_TRAVA_AP MOVFW CTI_SEG XORLW .10 ;10 SEGS BTFSS STATUS,Z GOTO L1H CALL APAGAEEPROM ;ATINGIU TEMPO MAXIMO: APAGAR MEMÓRIA BCF FLAG_TRAVA_AP MOVLW .3 ;PISCA 3 VEZES MOVWF AUX2 RET99 BCF LED ;ACENDE LED (UMA PISCADA) MOVLW .10 CALL DELAYM BSF LED ;APAGA LED MOVLW .10 CALL DELAYM DECFSZ AUX2,F GOTO RET99 BANK1 BSF TRISLED ;ENTRADA BANK0 BTFSS LRN ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO $-1 BANK1 BCF TRISLED ;SAIDA BANK0 BSF LED ;MANTEM APAGADO GOTO INICIO ;===================ROTINA DE RECEPÇÃO========================== 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 ;================================================================================ ;INICIO DA ROTINA DO ALARME/BLOQUEIO BTFSC FLAG_BLOQ GOTO TESTA_STANDBYE BTFSC V15 BSF RELE_B BTFSS V15 BCF RELE_B TESTA_STANDBYE BTFSS FLAG_ALARM_STANDBYE GOTO TESTA_45SEG BTFSS V15 ;TESTA CONTATO E PORTAS GOTO TESTA_SE_DISPARADO; estava 'TESTA_45SEG' BSF FLAG_AL TESTA_45SEG MOVFW CTI_SEG XORLW TEMPO_SEM_TX ;COMPARA COM 45 SEGUNDOS BTFSS STATUS,Z GOTO TESTA_SE_DISPARADO BTFSS FLAG_AL ;TESTA GOTO LIGAR_FLAG_ALL ;VAI LIGAR BCF RELE_B ;DESLIGA RELE DA BOMBA BSF FLAG_BLOQ ;BLOQUEIA EM DESLIGADO GOTO TESTA_SE_DISPARADO LIGAR_FLAG_ALL BSF FLAG_AL ;SETA FLAG_AL CALL ZERA_ALL_TIMER ;ZERA CONTADORES DE TEMPO TESTA_SE_DISPARADO BTFSS FLAG_AL GOTO JX0 BCF FLAG_ALARM_STANDBYE BTFSC FLAG_DISP GOTO TESTA_V15X ; ESTAVA 'LIGA_SIRENE' BTFSS V15 ;TESTA CONTATO E PORTAS GOTO JX0 BSF FLAG_DISP CALL ZERA_ALL_TIMER ;ZERA CONTADORES DE TEMPO LIGA_SIRENE BSF RELE_S ;LIGA A SIRENE BTFSS CTI_AUX,0 GOTO TESTA_TEMPO_MAX CLRF CTI_AUX ;ZERA CONTADOR AUXILIAR BTFSS RELE_SETA GOTO LIG_SETA BCF RELE_SETA GOTO TESTA_TEMPO_MAX LIG_SETA BSF RELE_SETA TESTA_TEMPO_MAX MOVFW CTI_MIN XORLW TEMPO_DISPARADO ;TESTA SE CHEGOU NO TEMPO MÁXIMO DE DISPARO BTFSS STATUS,Z GOTO J0 BCF FLAG_AL BSF FLAG_ALARM_STANDBYE BCF RELE_S BCF RELE_SETA CALL ZERA_ALL_TIMER GOTO J0 TESTA_V15X BTFSC V15 ;SE PORTA ABERTA OU CONTATO LIGADO CLRF CTI_MIN ;ZERA TEMPO GOTO LIGA_SIRENE JX0 CLRF CTI_MIN ;================================================================================= J0 MOVLW .12 ;.9 = 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) ;F' ;----------------------------------- ;G MOVFW HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) SUBWF LC,W RRF RES2,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF RES1,F RRF RES0,F ;------------------------------------- ;H DECFSZ BITCOUNTER,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 ;LE PROXIMO BIT 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 MOVFW RES2 MOVWF RES3 ;SALVA RES2 EM RES3 MOVLW B'00111111' ANDWF RES2,F ;APAGA BOTÕES MOVFW RES2 ;ELIMINA CODIGO 0X000000 XORLW .0 BTFSC STATUS,Z GOTO RESETAC ;ERRO DE RECEPÇÁO MOVFW RES1 XORLW .0 BTFSC STATUS,Z GOTO RESETAC ;ERRO DE RECEPÇÁO MOVFW RES0 XORLW .0 BTFSC 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 ;I BANK1 BSF TRISIO,5 ;VIRA ENTRADA BANK0 BTFSS LRN ;BOTÃO ESTÁ APERTADO? BSF FLAGGR BANK1 BCF TRISIO,5 ;VIRA SAIDA BANK0 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 RES2 BTFSS STATUS,Z GOTO PROXIMO DECF ADDRESS,F MOVFW ADDRESS CALL EEREAD XORWF RES1,W ;COMPARA COM RES1 BTFSS STATUS,Z GOTO PROXIMO DECF ADDRESS,F MOVFW ADDRESS CALL EEREAD XORWF RES0,W ;COMPARA COM RES0 BTFSC STATUS,Z GOTO ACIONAR ;ENCONTRADO CONTROLE NA MEMÓRIA PROXIMO ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA PROCURAR.... MOVFW ADDRESS MOVWF TMP MOVLW .3 SUBWF TMP,F ;ACERTA DE 3 EM 3 A POSIÇÃO DE BUSCA NA MEMÓRIA BTFSS STATUS,C GOTO APRENDER BTFSS STATUS,Z GOTO MADDRESS ;VOLTA A BUSCA 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 BOTÕES OU 24 CONTROLES) 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 BCF LED ;LIGA MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BANK1 BSF TRISIO,5 ;VIRA ENTRADA BANK0 BTFSS LRN GOTO $-1 BANK1 BCF TRISIO,5 ;VIRA SAÍDA BANK0 BSF LED ;DEIXA APAGADO ;========================================================================== ; TRANSMISSOR NAS PROXIMIDADES ;========================================================================== ACIONAR ;========================================================================== BCF FLAG_DISP ;DESLIGA O FLAG DE DISPARO BCF RELE_S ;DESLIGA RELE DA SIRENE BCF RELE_SETA ;DESLIGA LED DE BLOQUEIO BCF FLAG_ALARM_STANDBYE BCF FLAG_BLOQ BCF FLAG_AL CALL ZERA_ALL_TIMER GOTO INICIO ;**************************************************** ;PEGA PONTEIRO NA EEPROM - ULTIMO ENDEREÇO PPT MOVLW .0 CALL EEREAD ;LE PONTEIRO DA EEPROM RETURN ;-------------------------------------------------------------- DELAYM ; DELAY= 50 milisegundos X 'W' MOVWF R0 XC CALL AGUARDE DECFSZ R0,F GOTO XC RETURN AGUARDE ; ROTINA DE ATRASO ENTRE OPERAÇÕES DE EEPROM (50 MSEG) MOVLW .50 MOVWF R2 CALL DELAY_1MS ;ROTINA DE 1 MILISEGUNDOS DECFSZ R2,F GOTO $-2 RETURN DELAY_1MS MOVLW .199 MOVWF R1 CLRWDT NOP DECFSZ R1,F GOTO $-3 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 movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A btfsc EECON1, WR ; Write complete ? goto WRITE_SN_A bcf EECON1, WREN ; disable Write BANK0 ESPERA1 ;DELAY ENTRE APAGAMENTOS CALL AGUARDE RETURN EEREAD ;endereço esta em ADDRESS ;DADOS LIDOS SERÃO ESCRITOS EM TMP0 BANK1 movwf EEADR bsf EECON1, RD ; do a read\par btfsc EECON1, RD ; Read done ?\par goto $-1 movf EEDATA,W BANK0 MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM 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 ZERA_ALL_TIMER CLRF CTI CLRF CTI_AUX CLRF CTI_SEG CLRF CTI_MIN RETURN ORG H'2100' DE .0 end