;****************************************************************************************** ; RX_GEN_629_NOHOP.ASM ; VERSÃO COM OPÇÃO PARA MODO 'PULSO' OU 'RETENÇÃO' NAS SAIDAS ; FUNÇÃO: RECEBER SINAL DE UM HCS200/201/300/301 SEM USAR SISTEMA HOPPING CODE ; ACIONANDO SAIDAS TEMPORIZADAS NO PIC. ; NESTA MONTAGEM, NÃO NECESSITA DE 'CHAVE' DE ENCRIPTAÇÃO, USANDO SOMENTE O ; NUMERO SERIAL DO CONTROLE E A INFORMAÇÃO DOS BOTÕES APERTADOS. ; QUALQUER CONTROLE COMERCIAL, USANDO HCS200..301, DE QUALQUER FABRICANTE, ; OPERANDO A 400US DE TE, DEVERÁ FUNCIONAR E SER 'APRENDIDO'. ; ATUALIZAÇÃO: CLAUDIO LÁRIOS 18/02/2013 ;------------------------------------------------------------------------------ ; PROJETO ORIGINAL MODIFICADO PARA FUNCIONAR COM EEPROM INTERNA DO ; PIC 12F629. USE OSCILADOR INTERNO DE 4 MHZ. RESET INTERNO (PINO COMO ENTRADA) ; PINAGEM DO PIC 12F629(675): ; PINO 1- +VCC ; PINO 3- NÃO USADO ; PINO 2- LED A MASSA VIA RESISTOR DE 1K (LED 'LEARN') ; PINO 4- PULLUP 10K AO VCC E CHAVE 'LEARN' A MASSA APERTE PARA APRENDER TRANSMISSOR NOVO) ; PINO 5- SAIDA 2 VIA RESISTOR DE 470 OHMS (LIGA APARELHO AQUI) ; PINO 6- SAIDA 1 VIA RESISTOR DE 470 OHMS (LIGA APARELHO AQUI) ; PINO 7- IN RF (ENTRADA DE PULSOS) ; PINO 8- GND ; BLOG 'LARIOS.TECNOLOGIA.WS' ; 15/08/2012 - ADAPTADO POR CLÁUDIO LÁRIOS - BASEADO EM 'NOTES APPLICATION MICROCHIP' ; 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. ; QUANTIDADE MÁXIMA DE CONTROLES: 30 CONTROLES COM CI HCS 200..301. ; (NÃO USA HOPPING CODE, APENAS O NÚMERO FIXO DO SERIAL NUMBER). ;*************************************************************************** ;====================================================================================================== ; ATENÇÃO: ESCOLHA AQUI O MODELO DE MICROCONTROLADOR (COMENTE O NÃO USADO/DESCOMENTE O ESCOLHIDO): #DEFINE PIC629 ;ESCOLHA PARA PIC 12F629 ;#DEFINE PIC675 ;ESCOLHA PARA PIC 12F675 ;====================================================================================================== ;ESCOLHA AQUI PARA MODO 'PULSO' OU 'RETENÇÃO' NAS SAÍDAS (COMENTE O NÃO USADO/DESCOMENTE O ESCOLHIDO): ;#DEFINE PULSO #DEFINE RETENCAO ;====================================================================================================== ERRORLEVEL -302 ;ELIMINA AVISO CHATO DO COMPILADOR SOBRE BANCOS __CONFIG _CP_OFF & _PWRTE_ON & _WDT_ON & _INTRC_OSC_NOCLKOUT & _BODEN_OFF & _MCLRE_OFF ;CONFIGURAÇÃO #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 IFDEF PIC629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ENDIF IFDEF PIC675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ENDIF ; RAM RTCC EQU 01H ; REAL TIME COUNTER CLOCK FLAGS EQU 20H ; USER FLAG REGISTER ADDRESS EQU 21H ; ADDRESS REGISTER TXNUM EQU 22H ; CURRENT TX OUTBYT EQU 23H ; GENERAL DATA REGISTER TMP_CNT EQU OUTBYT ; TEMPORARY COUNTER CNT0 EQU 24H ; LOOP COUNTERS CNT1 EQU 25H CNT2 EQU 26H CNT_HI EQU 27H ; 16 BIT CLOCK COUNTER CNT_LW EQU 28H CSR0 EQU 29H ; 64 BIT RECEIVE SHIFT REGISTER CSR1 EQU 2AH CSR2 EQU 2BH CSR3 EQU 2CH CSR4 EQU 2DH CSR5 EQU 2EH CSR6 EQU 2FH CSR7 EQU 30H TMP1 EQU 31H ; TEMP REGISTER FOR READ AND WRITE TMP2 EQU 32H ; TEMP REGISTER FOR READ AND WRITE AUX EQU 39H R1 EQU 3AH R2 EQU 3BH AUX3 EQU 40H BYTE_SW EQU 45H ;SALVA BOTÕES Z1 EQU 46H Z0 EQU 47H SER_0 EQU CSR7 ; 28 BIT SERIAL NUMBER SER_1 EQU CSR6 SER_2 EQU CSR5 SER_3 EQU CSR4 CNTR_HI EQU CSR1 ; 16 BIT RX COUNTER HIGH BYTE CNTR_LW EQU CSR0 ; 16 BIT RX COUNTER LOW BYTE ;PINAGEM DO MICROCONTROLADOR #DEFINE RFIN GPIO,0 ;PINO 7 #DEFINE LRN GPIO,3 ;PINO 4 #DEFINE LED GPIO,5 ;PINO 2 #DEFINE S0 GPIO,1 ;PINO 6 #DEFINE S1 GPIO,2 ;PINO 5 NBITS EQU .64 ; MAXIMUM TRANSMISSION BIT LENGTH MIN EQU .560 ; TRANSMISSION HEADER MINIMUM LENGTH [ S] BITIN EQU 0H ; RF BIT VALUE LRNF EQU 1H ; LEARN FLAG RELEARN EQU 3H ; RELEARNING A TRANSMITTER TRAVA1 EQU 4H ;FLAG TRAVA1 TRAVA2 EQU 5H ;FLAG TRAVA2 ;TRAVA3 EQU 6H ;FLAG TRAVA3 LRNPTR EQU 0X7F ; PONTEIRO PARA A MEMÓRIA EEPROM C_TEMPO_APAG_FLAG EQU 0X10 ;CARGA DE TEMPO PARA REGISTRADORES AUXILIARES ;---------------------------------------------------- MAX_USERS EQU .30 ; NÚMERO MÁXIMO DE CONTROLES PARA ESTA MONTAGEM ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ORG H'2100' + (LRNPTR-1) ; ZERA PONTEIRO DE EEPROM , INICIALMENTE DE .0 ;------------------------------------------------------------------------------ ORG 00H GOTO RESET ORG 04H RETFIE RESET CLRF GPIO ; LIMPA GPIO CLRF FLAGS ; RESET FLAGS MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES MOVLW B'000111' ; SETUP RTCC PRESCALER OPTION IFDEF PIC675 BANK1 MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD BANK0 ENDIF MOVLW B'011001' ; AJUSTA IO'S TRIS GPIO MOVLW C_TEMPO_APAG_FLAG ;PRÉ-CARGA MOVWF Z1 CLRF Z0 GOTO MAIN_LOOP ; GOTO MAIN PROGRAM LOOP ;--------------------------------------------------------------- TST_RTCC CLRWDT ; RESET WATCHDOG TIMER BTFSS RTCC,7 ; TEST FOR 32MS TIMEOUT ON RTCC MSB RETLW .0 ; ... DO QUICK RETURN TO RECEIVE ROUTINE ; **** INCREASE 16 BIT CLOCK TIMER ******* BCF RTCC,7 ; CLEAR MSB OF RTCC INCF CNT_LW,F ; INCREASE 16 COUNTER SKPNZ ; INCREASE UPPER BYTE IF ZERO ( OVERFLOW ) INCF CNT_HI,F RETLW .0 TST_TIMER ; ***** TEST FOR 500 MS TIMEMOUT ON OUTPUTS ********** BTFSS CNT_LW,4 ; TEST FOR 500 MS TIMEOUT GOTO TST_30 ; ... IF NOT TEST 30S TIMEOUT ; MOVLW 0F0H ; ANDWF PORTB,F ; DOWN ALL PULSE OUTPUTS ;========================================================= IFDEF PULSO ;MODO PULSO APENAS CLRF GPIO ;DESLIGA SAIDAS ;FIM MODO PULSO ENDIF ;=========================================================== ; ********* TEST FOR 30 S LEARN TIMEOUT ************* TST_30 BTFSS FLAGS,LRNF GOTO TST_END BTFSC CNT_HI,2 ; TEST FOR LEARN TIMEOUT GOTO RESET ; ... IF LEARN TIMEMOUT FORCE SOFT RESET TST_END RETLW 0H ;------------------------------------------------------------------------------ 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 TMP1(MSB) E TMP2 (LSB) CALL AGUARDE clrwdt movfw ADDRESS MOVWF AUX BCF STATUS,C RLF AUX,F ;AUXILIAR X 2 MOVFW AUX BANK1 movwf EEADR BANK0 MOVFW TMP1 ;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 INCF AUX,F MOVFW AUX BANK1 movwf EEADR BANK0 MOVFW TMP2 ;PEGA SEGUNDO 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_B clrwdt btfsc EECON1, WR ; Write complete ?\par goto WRITE_SN_B bcf EECON1, WREN ; disable Write\par BANK0 CALL AGUARDE RETURN EEREAD ;endereço esta em ADDRESS ;DADOS LIDOS SERÃO ESCRITOS EM TMP1(MSB) E TMP2 (LSB) clrwdt MOVFW ADDRESS MOVWF AUX BCF STATUS,C RLF AUX,F MOVFW AUX BANK1 movwf EEADR bsf EECON1, RD ; do a read\par clrwdt btfsc EECON1, RD ; Read done ?\par goto $-2 movf EEDATA,W BANK0 MOVWF TMP1 ;RECUPERA PRIMEIRO NUMERO DA EEPROM clrwdt INCF AUX,F MOVFW AUX BANK1 movwf EEADR bsf EECON1, RD ; do a read\par clrwdt btfsc EECON1, RD ; Read done ?\par goto $-2 movf EEDATA,W BANK0 MOVWF TMP2 ;RECUPERA SEGUNDO NUMERO DA EEPROM clrwdt RETLW 0H ;------------------------------------------------------------------------------ APAGAEEPROM ; ROTINA PARA APAGAR TODAS AS POSIÇOES DA EEPROM 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 ;ROTINA DE RECEPÇÃO DE SINAL RF ORIUNDOS DO RX RECEIVE BTFSS RFIN ; INPUT LOW? GOTO RMT_0 ; YES; RECEIVE ERROR MOVLW .10 ; 10 ms TIMER MOVWF CNT1 RCV0 MOVLW .200 MOVWF CNT0 RCV1 BTFSS RFIN ; [2] INPUT HIGH? GOTO RCV2 ; [0] NO, JUMP OUT OF LOOP DECFSZ CNT0,1 ; [1] YES, CONTINUE WITH TIMING LOOP GOTO RCV1 ; [2] 5 us X CNT0 DECFSZ CNT1,1 ; [0] DO 1 ms LOOP CNT1 TIMES GOTO RCV0 ; [0] RCV2 CLRF CNT0 ; [1] CLEAR CALIB COUNTER LOW BYTE CLRF CNT1 ; [1] CLEAR CALIB COUNTER HIGH BYTE RCV3 BTFSC RFIN ; [2][2] INPUT HIGH? GOTO RCV6 ; [0][0] YES--END CALIBRATION INCF CNT0,1 ; [1] INCREMENT 16BIT COUNTER SKPNZ ; [2] INCF CNT1,1 ; [0] CLRWDT ; [1] RESET WATCH DOG TIMER NOP ; [1] BTFSS CNT1,3 ; [1] GOTO RCV3 ; [2] GOTO RMT_0 ; [0] ; TOTAL = 10 RCV6 CLRC ; [1] DIVIDE CNT1:CNT0 BY 8 (600/8=75) RRF CNT1,1 ; [1] RRF CNT0,1 ; [1] RRF CNT1,1 ; [1] RRF CNT0,1 ; [1] RRF CNT1,1 ; [1] RRF CNT0,1 ; [1] MOVLW MIN/80 ; [1] SUBWF CNT0,W ; [1] BTFSS STATUS,C ; [2] NEGATIVE? GOTO RMT_0 ; [0] YES--HEADER SHORTER THAN MIN. RCV7 MOVLW NBITS ; [1] VALID START MARKER WAS RECEIVED MOVWF CNT1 ; [1] MOVF CNT0,W ; [1] MOVWF CNT2 ; [1] CNT2 = CNT0 MOVLW 6H ; [1] SEE NOTE BELOW SUBWF CNT2,1 ; [1] GOTO DL1 ; [2] COMPENSATE FOR FIRST BIT ; TOTAL = 8 RCV8 MOVLW 4H ; [1] WAIT A MAXIMUM OF 4 Te MOVWF TMP_CNT ; [1] SET TEMP LOOP COUNTER RCV10A MOVFW CNT0 ; [1] and CSR processing MOVWF CNT2 ; [1] Refer to explanation above RCV10B BTFSC RFIN ; [2] Wait for rising edge GOTO RCV11 ; [0] Edge found--Process CLRWDT ; [1] Clear watchdog Timer BTFSC RFIN ; [2] Wait for Next rising edge GOTO RCV11 ; [0] Edge found--Process DECFSZ CNT2,1 ; [1] Decrement Timeout counter GOTO RCV10B ; [2] Loop Back ; TOTAL = 8, RFIN CHECKED EVERY 4uS ON AVERAGE DECFSZ TMP_CNT,1 ; [1] ALL Te PERIODS GOTO RCV10A ; [2] ... NO, THEN WAIT FOR NEXT ONE GOTO RMT01 ; [0] ... YES, [0] TIMEOUT--no edge found RCV11 MOVLW 3H ; [1] SEE NOTE BELOW SUBWF CNT0,W ; [1] MOVWF CNT2 ; [1] DL1 CLRWDT ; [1] RESET WATCHDOG TIMER DECFSZ CNT2,1 ; [1] [2, IF SKIP] GOTO DL1 ; [2] CNT0 X 4 us SAMPLE1 BTFSS RFIN ; [2] INPUT HIGH? FIRST SAMPLE GOTO RMT01 ; [0] NO--ERROR MOVF CNT0,W ; [1] CALIBRATION COUNTER MOVWF CNT2 ; [1] (NOMINALLY 75 FOR 300 us PULSE) DECF CNT2,1 ; [1] SUBTRACT 2 FROM FINAL CALIB COUNTER TO COMPENATE FOR THIS GOTO $+1 ; [2] NOP ; [1] ; TOTAL = 8 => 1 LOOP COUNTER DL2 CLRWDT ; [1] RESET WATCHDOG TIMER GOTO $+1 ; [2] WASTE TIME GOTO $+1 ; [2] WASTE TIME DECFSZ CNT2,1 ; [1] GOTO DL2 ; [2] CNT0 X 8 us [ CNT0 x Te ] SAMPLE2 BCF FLAGS,BITIN ; [1] CLEAR BIT POSITION BTFSS RFIN ; [1.5] LEAVE 0 IF LINE HIGH BSF FLAGS,BITIN ; [0.5] MAKE 1 IF LINE LOW ; SUB TOTAL = 3 CYCLES CALL ROT_SHIFT ; [11]+[2] CSR SHIFT + CALL BCF CSR7,7 ; [1] BTFSC FLAGS,BITIN ; [1.5] BSF CSR7,7 ; [0.5] ; SUB TOTAL = 16 CYCLES MOVF CNT0,W ; [1] CALIBRATION COUNTER MOVWF CNT2 ; [1] (NOMINALLY 75 FOR 300 us PULSE) MOVLW .3 ; [1] SEE CALCULATION BELOW SUBWF CNT2,1 ; [1] NOP ; [1] ; SUB TOTAL = 5 CYCLE ; TOTAL = 24 => 24/8 = 3 LOOP COUNTERS DL3 GOTO $+1 ; [2] WASTE TIME GOTO $+1 ; [2] WASTE TIME CLRWDT ; [1] RESET WATCHDOG TIMER DECFSZ CNT2,1 GOTO DL3 ; [2] CNT0 X 8 us [ CNT0 X Te ] SAMPLE3 BTFSC RFIN ; [2] INPUT LOW? THIRD SAMPLE GOTO RMT0 ; [0] NO--RECEIVE ERROR CALL TST_RTCC ; [11] CHECK RTCC DECFSZ CNT1,1 ; [1] LAST BIT? GOTO RCV8 ; [2] ... NO, GET NEXT BIT GOTO RMT1 ; TOTAL = 14 CYCLES RMT_0 RMT0 RMT01 BSF STATUS,C ; INVALID TRANSMISSION RETLW .1 ; RETURN RMT1 MOVFW SER_0 MOVWF BYTE_SW ;SALVA VALOR DOS BOTÕES PRESSIONADOS BSF LED ; VALID TRANSMISSION FORMAT, LED ON MOVLW 0FH ; FORCE OPEN BUTTON CODES TO ZERO ANDWF SER_0,1 CLRC ; VALID SERIAL NUMBER => VALID TX RETLW .0 ; RETURN ;=============ROTINA PRINCIPAL================== NO_RX_LOOP ;=============================================== ;APENAS EM MODO RETENÇÃO NAS SAIDAS IFDEF RETENCAO DECFSZ Z0,F GOTO MAIN_LOOP DECFSZ Z1,F GOTO MAIN_LOOP MOVLW C_TEMPO_APAG_FLAG MOVWF Z1 CLRF Z0 BCF FLAGS,TRAVA1 BCF FLAGS,TRAVA2 ENDIF ;FIM MODO RETENÇÃO ;================================================ MAIN_LOOP BCF LED ;APAGA LED 'LEARN' BTFSS LRN ;TESTA BOTÃO 'LEARN' GOTO LEARN ; TEST & HANDLE LEARN BUTTON APERTADO CALL TST_RTCC ; UPDATE TIMER CALL TST_TIMER ; HANDLE TIMER - UPDATE OUTPUTS CALL RECEIVE ; RECEIVE TRANSMISSION BC NO_RX_LOOP ; CHECK IF TRANSMISSION VALID M_SEARCH CLRF TXNUM ; ******* COMPARA SERIAL NUMBER ******** M_SERIAL CALL TX_LOOKUP ; GET TX BASE ADDRESS CALL EEREAD ; READ LOWER 16-BITS OF SER# FROM EEPROM MOVFW TMP1 ; COMPARE RX AND EEPROM VALUES XORWF SER_2,W BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES XORWF SER_3,W BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT ; ******* COMPARA UPPER WORD OF SERIAL NUMBER ******** M_SERIAL2 INCF ADDRESS,F ; POINT TO NEXT ENTRY CALL EEREAD ; READ UPPER 16-BITS OF SER# FROM EEPROM MOVFW TMP1 ; COMPARE RX AND EEPROM VALUES XORWF SER_0,W BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES XORWF SER_1,W BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT BTFSS FLAGS,LRNF ; LEARN MODE GOTO AÇÃO ; FOUND TRANSMITTER BSF FLAGS,RELEARN ; SET RELEARN FLAG GOTO LEARN_F ; FOUND TRANSMITTER - LEARN ; **** SEARCH NEXT POSITION FOR SERIAL NUMBER ***** M_NEXT INCF TXNUM,F ; POINT TO NEXT TRANSMITTER POSITION MOVLW MAX_USERS ; TEST FOR LAST POSITION SUBWF TXNUM,W BTFSS STATUS,C ; NOT FOUND IN MAP GOTO M_SERIAL ; TRY NEXT POSITION M_NF BTFSS FLAGS,LRNF ; LEARN MODE GOTO MAIN_LOOP ; NO... INVALID SERIAL NUMBER GOTO LEARN_NF ; NEW TRANSMITTER - USE POINTER FOR LEARN AÇÃO IFDEF PULSO ;============================================================================== ;MODO PULSO ;COLOCA NA SAIDA O VALOR DOS BOTÕES PRESSIONADOS BCF GPIO,2 ;[ S2 S1 S0 S3 X X X X ] BTFSC BYTE_SW,6 BSF GPIO,2 BCF GPIO,1 BTFSC BYTE_SW,5 BSF GPIO,1 ;FIM DO MODO PULSO ;============================================================================ ENDIF ;============================================================================ IFDEF RETENCAO ;MODO RETENÇÃO MOVLW C_TEMPO_APAG_FLAG ;PRÉ-CARGA MOVWF Z1 CLRF Z0 BTFSC FLAGS,TRAVA1 GOTO PROX_TESTE1 BTFSS BYTE_SW,5 GOTO PROX_TESTE1 BTFSC S0 GOTO ON_S0 BSF S0 BSF FLAGS,TRAVA1 GOTO PROX_TESTE1 ON_S0 BCF S0 BSF FLAGS,TRAVA1 GOTO SAIR_ PROX_TESTE1 BTFSC FLAGS,TRAVA2 GOTO PROX_TESTE2 BTFSS BYTE_SW,6 GOTO PROX_TESTE2 BTFSC S1 GOTO ON_S1 BSF S1 BSF FLAGS,TRAVA2 GOTO SAIR_ ON_S1 BCF S1 BSF FLAGS,TRAVA2 GOTO SAIR_ PROX_TESTE2 SAIR_ ;FIM DO MODO RETENÇÃO ;=========================================================== ENDIF ;=========================================================== M_TZERO CLRF CNT_HI ; RESET RTCC CLOCK CLRF CNT_LW M_END GOTO MAIN_LOOP ; WAIT FOR NEXT TRANMISSION LEARN CLRF CNT_LW ; RESET TIMER CLRF CNT_HI LEARN1 BSF LED ; LED ON CALL TST_RTCC ; UPDATE TIMER BTFSC LRN ; TEST FOR BUTTON RELEASE GOTO LEARN2 ; ENTER LEARN MODE BTFSS CNT_HI,0 ; TEST FOR ERASE ALL GOTO LEARN1 ; LOOP BACK ; ******* APAGA TODA A EEPROM ****************** CALL APAGAEEPROM BCF LED MOVLW .8 MOVWF AUX3 VHJ1 CLRF CNT_LW BTFSS LED GOTO LIGA_LED BCF LED GHJ1 CALL TST_RTCC ;PISCA LED 'LEARN' 3 VEZES PARA INDICAR APAGAMENTO TOTAL BTFSS CNT_LW,3 GOTO GHJ1 DECFSZ AUX3,F GOTO VHJ1 BCF LED CLRWDT BTFSS LRN GOTO $-2 ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO RESET ; REINICIA LIGA_LED BSF LED GOTO GHJ1 LEARN2 BCF LED ; APAGA LED 'LEARN' BSF FLAGS,LRNF ; SETA FLAG 'LEARN' LEARN3 CALL TST_RTCC ; UPDATE TIMER CALL TST_TIMER ; VERIFICA FIM DO TEMPO DE APRENDIZADO CALL RECEIVE ; ROTINA DE RECEPÇÃO DE TRANSMISSÃO BC LEARN3 ; VERIFICA SE A TRANSMISSÃO É VALIDA GOTO M_SEARCH ; VAI PROCURAR PELO SERIAL NUMBER DO APARELHO LEARN_NF MOVLW LRNPTR ; BUSCA ENDEREÇO NO PONTEIRO DA EEPROM MOVWF ADDRESS CALL EEREAD ; READ LEARN POINTER FROM EEPROM MOVF TMP2,W ; CHECK LOWER BYTE MOVLW 0H ; LOAD 0 DEFAULT BTFSC STATUS,Z ; IF LOWER != 0 LEARN ON 0 MOVF TMP1,W ; ELSE LEARN ON TMP1 VALUE MOVWF TXNUM ; LOAD TXNUM LEARN_F CALL TX_LOOKUP MOVFW SER_2 ; GET LOWER 16 BIT OF SERIAL NUMBER MOVWF TMP1 MOVFW SER_3 MOVWF TMP2 CALL EEWRITE ; ... AND WRITE TO EEPROM INCF ADDRESS,F ;TESTE SOMA 2 MOVFW SER_0 ; GET UPPER 16 BIT OF SERIAL NUMBER MOVWF TMP1 MOVFW SER_1 MOVWF TMP2 CALL EEWRITE ; ... AND WRITE TO EEPROM LEARN_DEC LEARN_UP BTFSC FLAGS,RELEARN ; IF RELEARN GOTO BYPASS_POINTER_WRITE ; DONT UPDATE POINTER INCF TXNUM,F ; INCREMENT LEARN POINTER MOVLW MAX_USERS ; ALLOW 0 .. MAX_USERS - 1 SUBWF TXNUM,W MOVLW 0H ; IF MAX WRAP TO 0 BTFSS STATUS,C MOVF TXNUM,W ; ELSE USE TXNUM MOVWF TMP1 ; FOR WRITE OPERATION CLRF TMP2 ; CLEAR LOWER BYTE MOVLW LRNPTR ; POINT TO LEARN POINTER MOVWF ADDRESS CALL EEWRITE ; UPDATE LEARN POINTER IN EEPROM BYPASS_POINTER_WRITE BSF LED ; LED ON TO INDICATE VALID LEARN CLRF CNT_LW ; CLEAR COUNTER LOW BYTE SUCCESS CALL TST_RTCC ; INDICATE SUCCESSFUL LEARN BTFSS CNT_LW,4 ; LED ON FOR 0.5 SEC GOTO SUCCESS ; LOOP BACK CANCEL_LEARN BCF FLAGS,LRNF ; CLEAR LEARN FLAG BCF FLAGS,RELEARN ; CLEAR RELEARN FLAG GOTO MAIN_LOOP ; RETURN TO MAIN LOOP - LED OFF TX_LOOKUP MOVF TXNUM,W ; USE TRANSMITTER NUMBER TO CALCULATE MOVWF ADDRESS ; ADDRESS OF TRANSMITER BLOCK CLRC ; MULTIPLY BY 4 RLF ADDRESS,F RETLW .0 ; RETURN ROT_SHIFT RRF CSR7,F RRF CSR6,F RRF CSR5,F RRF CSR4,F RRF CSR3,F RRF CSR2,F RRF CSR1,F RRF CSR0,F RETLW .0 END