;********************************************************************************************************************* ; ; SORTEADOR_REV_V3.ASM ; ; ; ; ; C/ PIC 12F675 E ; TRANSMISSOR DE CONTROLE REMOTO COMERCIAL (CHAVEIRINHO)COM CI HT6P20B ; INICIO : 14/10/13 TERMINO : 14/10/13 ; AUTOR: CLAUDIO LARIOS ; OBJETIVO: ESCOLHER DENTRO DE UMA FAIXA PREVIAMENTE PROGRAMADA, UM DETERMINADO ; APERTO DE BOTÃO, DE FORMA PSEUDO-RANDOMICA. ; USO: SORTEIO PARA REVISTA DE EMPREGADOS EM PORTARIAS DE EMPRESAS ; OS EMPREGADOS AO SAIR PELA PORTARIA, APERTAM UM BOTÃO NO APARELHO. SE ACENDER O ; LED 'VERDE' PODERÁ SAIR SEM REVISTA. NO ENTANTO, SE ACENDER O LED 'VERMELHO', ; DEVERÁ SER REVISTADO. ; VERSÃO COM RECEPÇÃO DE CHAVEIRINHO, QUE OBRIGA O PRÓXIMO APERTO A SER 'PARE' ; GRAVAR CONTROLE: APERTE UM BOTÃO DO CONTROLE E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN' NA PLACA (PINO 4 DO PIC 12F629 A MASSA)E ; SOLTE-O EM MENOS DE 1 SEGUNDOS. O LED 'LEARN'(PINO 2) PISCARÁ 1 ; VEZ, PARA INDICAR 'CODE APRENDIDO'. REPITA ISTO COM TODOS OS CONTROLES REMOTOS ; QUE FOR UTILIZAR, UM POR VEZ. ; APAGAR TODOS OS CONTROLES 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 OS SENSORES DA MEMÓRIA. ; APÓS ISTO, CADA CONTROLE DEVERÁ SER 'REAPRENDIDO' NOVAMENTE PARA OPERAR. ;*************************************************************************** ;********************************************************************************************************************** ;ARQUIVOS PARA COMPILAÇÃO LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ;ARQUIVO PADRAO ERRORLEVEL -302 ;-202 ;ELIMINA MENSAGEM DE ERRO ;============================================================================================================== ;PALAVRA DE CONFIGURAÇÃO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF ;=============================================================================================================== ;TROCA DE BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;PORTS #DEFINE SW GPIO,3 ;PINO 4 - BOTÃO DE SORTEIO #DEFINE LED_VERDE GPIO,4 ;PINO 3 - LED VERDE 'SIGA' #DEFINE LED_VERM GPIO,5 ;PINO 2 - LED VEMELHO 'PARE' #DEFINE SOM GPIO,2 ;PINO 5 - SIRENE #DEFINE SIN GPIO,1 ;PINO 6 IN RF #DEFINE LRN GPIO,0 ;PINO 7 IN LEARN BOTTON #DEFINE LED GPIO,0 ;PINO 7 SAIDA LED 'LEARN' #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_JM FLAGS,3 ;FLAG TRAVA #DEFINE FLAG_AC FLAGS,4 ;FLAG TRAVA #DEFINE FLAG_TAP FLAGS,5 ;FLAG TRAVA #DEFINE ROK FLAGS,6 ;FLAG RECEPÇÃO OK #DEFINE TRIS_LEARN TRISIO,0 ;IN /OUT 'LEARN' ;EQUATES DO RX TMAX EQU .30 ;.50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .24 ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO+ DESPREZA OS 4 BITS DE ANTICODE) TGR EQU .255 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO T_ENTRE_ACION_BOTÃO EQU 0X01 ;TEMPO ENTRE ACIONAMENTOS DO BOTÃO ;================================================================================================== ; ESCOLHA AQUI A FAIXA DE TRABALHO DO SORTEADOR ;================================================================================================== ;EQUATES V_FAIXA EQU .15 ;SORTEIA ENTRE 1 E 15 ;================================================================================================================ ;RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA TEMP2,TEMP1,TEMP,TEMP4,AUX2,AUX1,AUX,PONT DEL2,DEL1,DEL0,RANDOM,Q_APERTO,CONT RES3,RES2,RES1,RES0,BITCOUNTER FLAGS,TMP,ADDRESS LC,HC ,RES3A,RES2A,RES1A,RES0A,R0,R1,R2,TMP1 WTEMP,STATUSTEMP,TIMERX,TIMERX1,TIMERX2 ENDC ; ;================================================================================================== ; VETOR DE RESET ;================================================================================================== ORG 0X00 GOTO START ;================================================================================================== ; VETOR DE INTERRUPÇÃO ;================================================================================================== ORG 0X04 MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BANK0 INCFSZ TIMERX1,F GOTO PUL78 INCF TIMERX2,F PUL78 BTFSS FLAG_AC GOTO PUL5 INCF TIMERX,F MOVFW TIMERX XORLW .100 BTFSS STATUS,Z GOTO PUL5 CLRF TIMERX BCF FLAG_AC PUL5 BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO GOTO L2 ;FLAG=0 BTFSS SIN ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF GOTO M0 ; SIN=0 L2 BTFSS SIN ;SIN ? GOTO LA1 ;SIN=0 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 GOTO SAI_INT M0 MOVFW LC ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF SUBLW TMAX BTFSC STATUS,C GOTO SEG10 CALL REC_INIT GOTO SAI_INT ;C=0 (-) - LC>TMAX (REJEITAR DADO - PAUSA INICIAL) SEG10 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 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 CALL REC_INIT GOTO SAI_INT L0 CALL REC_LIMPA ;LE O PROXIMO BIT GOTO SAI_INT 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 CALL REC_INIT GOTO SAI_INT AÇÃO ;I BTFSS LRN ;BOTÃO ESTÁ APERTADO? BSF FLAGGR 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 CONTROLES NOVOS ;========================================================================================================= APRENDER BTFSC FLAGGR ;TESTA SE BOTÃO 'LEARN' ESTÁ PRESSIONADO GOTO V6S ;NÃO ESTÁ. CALL REC_INIT GOTO SAI_INT V6S 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 BANK1 BCF TRIS_LEARN BANK0 BSF LED ;APAGA LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BCF LED ;LIGA LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BSF LED ;DESLIGA BANK1 BSF TRIS_LEARN BANK0 BTFSS LRN GOTO $-1 ;========================================================================================================= ; HOUVE UMA RECEPÇÃO OK ;========================================================================================================= ACIONAR MOVFW RES3 ;RECUPERA OS BOTÕES MOVWF RES2 CALL REC_INIT BSF ROK ;BOA RECEPÇÃO SAI_INT MOVLW .156 MOVWF TMR0 BCF INTCON,T0IF SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS SWAPF WTEMP,F SWAPF WTEMP,W ;RECUPERA 'W' RETFIE ;================================================================================================= ; INICIO DO PROGRAMA ;================================================================================================= START BANK1 ;BANCO 1 MOVLW B'00001011' MOVWF TRISIO ;ACERTA ENTRADAS E SAÍDAS CLRF ANSEL MOVLW B'00001000' MOVWF OPTION_REG ;HABILITA PULL UP BANK0 MOVLW .7 ;DESLIGA COMPARADORES MOVWF CMCON CLRF GPIO ;ZERA SAIDAS MOVLW .1 ;CONDIÇÃO INICIAL MOVWF Q_APERTO CLRF CONT CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS CALL REC_INIT BCF INTCON,T0IF ;LIGA INTERRUPÇÕES BSF INTCON,T0IE BSF INTCON,GIE ;================================================================================================= ; PROGRAMA PRINCIPAL ;================================================================================================= INICIO: BTFSS ROK ;TESTA POR RECEPÇÃO DO CONTROLE REMOTO GOTO PULA_R ;NÃO HOUVE ;============================================================================ ; ACIONA REVISTA NO PRÓXIMO ACIONAMENTO ;=========================================================================== BTFSC RES2,7 ;RECEBEU TX CALL ALTERA ;OBRIGA O PRÓXIMO APERTO A SER REVISTADO BTFSC RES2,6 CALL ALTERA PULA_R CALL SORTEIO ;ROTINA DE SORTEIO ;============================================================================ ; TESTA POR APAGAMENTO DA EEPROM ;=========================================================================== PLR1 BANK1 BSF TRIS_LEARN BANK0 BTFSC LRN GOTO INICIO BTFSC FLAG_TAP GOTO TESTA_TEMPO_APAG BSF FLAG_TAP CLRF TIMERX1 CLRF TIMERX2 TESTA_TEMPO_APAG MOVFW TIMERX2 SUBLW .110 BTFSC STATUS,C GOTO PLR1 CALL APAGAEEPROM MOVLW .5 MOVWF TEMP4 BANK1 BCF TRIS_LEARN BANK0 RTY1 BCF LED ;PISCA LED 5 VEZES PARA INDICAR APAGAMENTO CLRF TIMERX2 BTFSS TIMERX2,4 GOTO $-1 BSF LED CLRF TIMERX2 BTFSS TIMERX2,4 GOTO $-1 DECFSZ TEMP4,F GOTO RTY1 BANK1 BSF TRIS_LEARN BANK0 BTFSS LRN GOTO $-1 BCF FLAG_TAP GOTO INICIO ;============================================================================ ; ROTINAS DE EEPROM ;=========================================================================== 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 ; HABILITA ESCRITA movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A btfsc EECON1, WR ; ESCRITA FEITA? goto WRITE_SN_A bcf EECON1, WREN BANK0 RETURN EEREAD ;endereço esta em ADDRESS ;DADOS LIDOS SERÃO ESCRITOS EM TMP0 BANK1 movwf EEADR bsf EECON1, RD ; LEITURA OK? btfsc EECON1, RD goto $-1 movf EEDATA,W BANK0 MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM RETURN ;------------------------------------------------------------------------------ APAGAEEPROM ; ROTINA PARA APAGAR TODAS AS POSIÇOES DA EEPROM BCF INTCON,GIE 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 ; HABILITA ESCRITA movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_C btfsc EECON1, WR ; ACABOU ESCRITA? goto WRITE_SN_C bcf EECON1, WREN BANK0 DECFSZ AUX,F GOTO RET6 BSF INTCON,GIE RETURN 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 ;**************************************************** ;PEGA PONTEIRO NA EEPROM - ULTIMO ENDEREÇO PPT MOVLW .0 CALL EEREAD ;LE PONTEIRO DA EEPROM RETURN ;================================================================================================= ; ROTINA DO SORTEADOR ;================================================================================================= SORTEIO BANK0 ;================================================================================================= ; TESTA CHAVE DE SORTEIO ;================================================================================================= INCF RANDOM,F MOVFW RANDOM SUBLW V_FAIXA BTFSS STATUS,C CLRF RANDOM BTFSC SW RETURN ;NÃO FOI APERTADA BTFSC FLAG_AC RETURN BSF FLAG_AC INCF CONT,F MOVFW CONT SUBLW V_FAIXA BTFSS STATUS,C CLRF CONT MOVFW CONT XORWF Q_APERTO,W BTFSS STATUS,Z GOTO N_IGUAL ;NÃO IGUAL MOVFW RANDOM MOVWF Q_APERTO ;NOVO VALOR DE SORTEIO BCF FLAG_JM ;LIBERA PARA ACEITAR MUDANÇA PARA ACIONAR AO PRÓXIMO APERTO MOVLW .7 MOVWF TEMP BSF LED_VERM VV4 MOVLW .3 CALL DELAYW_SOM MOVLW .3 CALL DELAYW DECFSZ TEMP,F GOTO VV4 BCF LED_VERM CLRF CONT RETURN N_IGUAL BSF LED_VERDE MOVLW .3 CALL DELAYW_SOM MOVLW .7 CALL DELAYW BCF LED_VERDE RETURN ALTERA BTFSC FLAG_JM ;TESTA TRAVA RETURN CLRF Q_APERTO CLRF CONT INCF Q_APERTO,F BSF FLAG_JM ;JÁ OCORREU MUDANÇA PARA ACIONAR AO PRÓXIMO APERTO BCF ROK ;APAGA FLAG DE RECEPÇÃO RETURN ;============================================================================== ; ROTINAS DE DELAY ;============================================================================== DELAYW_SOM ; CARGA DE 'W' X 50 MS MOVWF DEL2 CALL DELAY_50MS_SOM DECFSZ DEL2,F GOTO $-2 RETURN DELAY_50MS_SOM MOVLW .25 DELAY_MS_SOM ;TEMPO EM MS PASSADO EM 'W' MOVWF DEL1 CLRF DEL0 VV7 BSF DEL0,7 BSF DEL0,6 BSF SOM DECFSZ DEL0,F GOTO $-1 BSF DEL0,7 BSF DEL0,6 BCF SOM DECFSZ DEL0,F GOTO $-1 DECFSZ DEL1,F GOTO VV7 RETURN ;-------------------------------------------------------------- DELAYM MOVWF R0 XC CALL AGUARDE DECFSZ R0,F GOTO XC RETURN AGUARDE ;ROTINA DE ATRASO MOVLW .64 MOVWF R1 CG2 CLRWDT MOVLW .255 MOVWF R2 DECFSZ R2,F GOTO $-1 DECFSZ R1,F GOTO CG2 RETURN DELAYW ; CARGA DE 'W' X 50 MS MOVWF DEL2 CALL DELAY_50MS DECFSZ DEL2,F GOTO $-2 RETURN DELAY_50MS MOVLW .25 DELAY_MS ;TEMPO EM MS PASSADO EM 'W' MOVWF DEL1 CLRF DEL0 NOP DECFSZ DEL0,F GOTO $-2 DECFSZ DEL1,F GOTO $-5 RETURN ;================================================================================== ; ROTINA DE INICIALIZAÇÃO DE REGISTRADORES DA RECEPÇÃO ;================================================================================== REC_INIT MOVLW QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF BITCOUNTER REC_LIMPA BCF FLAG ;LIMPA FLAG E REGISTRADORES DE RECEPÇÃO CLRF HC CLRF LC RETURN ;================================================================================== ; INICIALIZAÇÃO DA EEPROM ;================================================================================== ORG H'2100' DE .0 END