;************************************************************************** ; PLACA PARA CONTROLE REMOTO DE PORTÃO PARA 2 MOTORES INDEPENDENTES ; ; COMO TRANSMISSOR, USAR QUALQUER TRANSMISSOR ('CHAVEIRINHO') ; COM INTEGRADO HT6P20B. ; PARA DECODIFICAR UTILIZA UM PIC 12F675 (OPCIONALMENTE 12F629). ; UTILIZA 4 RELES PARA CONTROLAR 2 MOTORES. ; TRABALHA COM 2 FINS DE CURSO POR MOTOR, TIPO 'REED SWITCH' (COM IMÃS). ; ; CLAUDIO LÁRIOS INICIO: 12-04-2013 TERMINO:15-04-2013 ; ; MATERIAL DIDÁTICO APENAS. ;************************************************************************** ; ; GRAVAR CONTROLE PARA MOTOR 'A': ; APERTE UM DOS BOTÕES DO C. REMOTO E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN_A' NA PLACA E SOLTE-O EM MENOS DE 2 ; SEGUNDOS. O LED VERMELHO 'LEARN' PISCARÁ 1 VEZ, PARA INDICAR ISTO. ; REPITA ISTO COM TODOS OS BOTÕES DO CONTROLE REMOTO , UM POR VEZ. ; APAGAR TODOS OS CONTROLES DA MEMÓRIA 'A': APERTAR BOTÃO 'LEARN_A' NA ; PLACA E MANTENHA PRESSIONADO POR MAIS DE 10 SEGUNDOS. O LED VERMELHO ; PISCARÁ 3 VEZES , INDICANDO O PLENO APAGAMENTO DE TODOS OS CONTROLES DA ; MEMÓRIA 'A'. ;*************************************************************************** ; GRAVAR CONTROLE PARA MOTOR 'B': ; APERTE UM DOS BOTÕES DO C. REMOTO E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN_B' NA PLACA E SOLTE-O EM MENOS DE 2 ; SEGUNDOS. O LED VERMELHO 'LEARN' PISCARÁ 1 VEZ, PARA INDICAR ISTO. ; REPITA ISTO COM TODOS OS BOTÕES DO CONTROLE REMOTO , UM POR VEZ. ; APAGAR TODOS OS CONTROLES DA MEMÓRIA 'B': APERTAR BOTÃO 'LEARN_A' NA ; PLACA E MANTENHA PRESSIONADO POR MAIS DE 10 SEGUNDOS. O LED VERMELHO ; PISCARÁ 3 VEZES , INDICANDO O PLENO APAGAMENTO DE TODOS OS CONTROLES DA ; MEMÓRIA 'A'. ;*************************************************************************** ; SUGESTÃO: SE UM CONTROLE DEVERÁ ACIONAR DOIS MOTORES DIFERENTES, PODERÁ ; APRENDER O BOTÃO ESQUERDO PARA O CANAL 'A' E O BOTÃO DIREITO PARA O CANAL ; 'B'. FAÇA O MESMO NOS OUTROS CONTROLES DE RESERVA. ;**************************************************************************** ;ESCOLHA ABAIXO O MODELO DE PIC (DESCOMENTE O QUE VAI USAR E COMENTE O OUTRO) ;#DEFINE F629 ;PIC12F629 #DEFINE F675 ;PIC12F675 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 FLAG_A FLAGS,3 ;FLAG AUX #DEFINE FLAG_AE FLAGS,4 ;FLAG AUX #DEFINE FLAG_BAA FLAGS,5 ;FLAG DE BOTÃOAINDA APERTADO #DEFINE SIN GPIO,3 ;PINO 4 IN RF #DEFINE LRN GPIO,0 ;PINO 7 IN LEARN BOTTON #DEFINE LED GPIO,0 ;PINO 7 OUT LED (MESMO PINO DO ACIMA) #DEFINE S2 GPIO,2 ;PINO 5- SAIDA DO RELE DO MOTOR A #DEFINE S1 GPIO,1 ;PINO 6- SAIDA DO RELE P/MOTOR A #DEFINE M2 GPIO,2 ;PINO 5- ENTRADA REED SWITCH A #DEFINE M1 GPIO,1 ;PINO 6- ENTRADA REED SWITCH A #DEFINE S4 GPIO,5 ;PINO 2- SAIDA DO RELE DO MOTOR B #DEFINE S3 GPIO,4 ;PINO 3- SAIDA DO RELE P/MOTOR B #DEFINE M4 GPIO,5 ;PINO 2- ENTRADA REED SWITCH B #DEFINE M3 GPIO,4 ;PINO 3- ENTRADA REED SWITCH B #DEFINE TLRN TRISIO,0 ;PINO 7 IN LEARN BOTTON #DEFINE TLED TRISIO,0 ;PINO 7 OUT LED (MESMO PINO DO ACIMA) #DEFINE TS2 TRISIO,2 ;PINO 5- SAIDA DO RELE DO MOTOR A #DEFINE TS1 TRISIO,1 ;PINO 6- SAIDA DO RELE P/MOTOR A #DEFINE TM2 TRISIO,2 ;PINO 5- ENTRADA REED SWITCH A #DEFINE TM1 TRISIO,1 ;PINO 6- ENTRADA REED SWITCH A #DEFINE TS4 TRISIO,5 ;PINO 2- SAIDA DO RELE DO MOTOR B #DEFINE TS3 TRISIO,4 ;PINO 3- SAIDA DO RELE P/MOTOR B #DEFINE TM4 TRISIO,5 ;PINO 2- ENTRADA REED SWITCH B #DEFINE TM3 TRISIO,4 ;PINO 3- ENTRADA REED SWITCH B CBLOCK 0X20 RES3,RES2,RES1,RES0,AUX,C3,C2,C1,C0,WS,TEMP,BITCOUNTER,FLAGS,TL0,TL1,TL2,Z2,Z1,TL0X,TL1X,TL2X LcdDelayCounter,LcdDelayCounter1,tmpLcdRegister,tmpLcdRegister1,SITUAÇÃO,SITUAÇÃO1,F_TEMP temp,SDATA,AUX2 ,LC,HC ,CONT,RES3A,RES2A,RES1A,RES0A,X,R0,R1,R2,TMP1,TMP2,TMP3,ADDRESS,TMP,TMP_SALVO,TAP1,TAP0 ENDC YTRISA EQU B'001001' ; PORTA: TRI-STATE VALUE GP5 LED/LRN COMO ENTRADA INICIALMENTE TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW TMAX_MOTORLIGADO EQU 0X03 ; TEMPO MAXIMO DO RELE DO MOTOR LIGADO (30 SEG) QBYTE EQU .28 ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+2 DADO+ 4 ANTICODE) TGR EQU .220 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO T_BAA EQU .80 ;TEMPO MAXIMO DE BOTÃO ACIONADO ANTES DE DESLIGAR/INVERTER SAIDA ORG 0X00 GOTO START ORG 0X04 RETFIE ;========================================================================================== ;CONFIGURAÇÕES DE PORTAS E REGISTRADORES START: MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF GPIO ; RESET PORT BANK1 MOVLW YTRISA ; SETUP PORTA MOVWF TRISIO IFDEF F675 CLRF ANSEL ENDIF BANK0 CLRF FLAGS MOVLW TGR MOVWF Z2 CLRF Z1 ;========================================================================================= ;INICIO DO PROGRAMA PRINCIPAL INICIO: CLRF RES3 CLRF RES2 CLRF RES1 CLRF RES0 MOVLW QBYTE MOVWF BITCOUNTER L0 BCF FLAG CLRF HC CLRF LC L1 CALL TESTA_LRN ;TESTA BOTÃO DE APRENDIZAGEM 'LEARN' MOVWF AUX XORLW .0 BTFSC STATUS,Z GOTO L1H ;NENHUM BOTÃO APERTADO MOVFW AUX XORLW .1 BTFSS STATUS,Z GOTO BSEG1 BSF FLAG_A GOTO TAPAGAMENTO ;APAGA CANAL A BSEG1 BCF FLAG_A MOVFW AUX XORLW .2 BTFSS STATUS,Z GOTO L1H BCF FLAG_A GOTO TAPAGAMENTO ;APAGA CANAL B L1H BTFSC M1 CALL L1B BTFSC M2 CALL L1C BTFSC M3 CALL L1BX BTFSC M4 CALL L1CX GOTO SS5 L1B BANK1 BSF TS2 BANK0 BTFSS S2 ;TESTA FIM DE CURSO S2 PARA M1 LIGADO GOTO L1D INCF SITUAÇÃO,F GOTO DESLMR L1C BANK1 BSF TS1 BANK0 BTFSS S1 ;TESTA FIM DE CURSO S1 PARA M2 LIGADO GOTO L1D INCF SITUAÇÃO,F GOTO DESLMR L1BX BANK1 BSF TS4 BANK0 BTFSS S4 ;TESTA FIM DE CURSO S2 PARA M3 LIGADO GOTO L1DX INCF SITUAÇÃO1,F GOTO DESLMXR ;RETORNA DAQUI L1CX BANK1 BSF TS3 BANK0 BTFSS S3 ;TESTA FIM DE CURSO S3 PARA M4 LIGADO GOTO L1DX INCF SITUAÇÃO1,F GOTO DESLMXR ;============================================================================ L1DX DECFSZ TL0X,F ; REGISTRADORES DO TEMPO QUE RELES FICAM LIGADOS RETURN DECFSZ TL1X,F RETURN DECFSZ TL2X,F RETURN INCF SITUAÇÃO1,F ;EVITA UM PULSO A MAIS NO CONTROLE DESLMXR BANK1 BCF TM3 BCF TM4 BANK0 BCF M3 BCF M4 RETURN ;===================================================================== L1D DECFSZ TL0,F ; REGISTRADORES DO TEMPO QUE RELES FICAM LIGADOS RETURN DECFSZ TL1,F RETURN DECFSZ TL2,F RETURN INCF SITUAÇÃO,F ;EVITA UM PULSO A MAIS NO CONTROLE DESLMR BANK1 BCF TM1 BCF TM2 BANK0 BCF M1 BCF M2 RETURN TAPAGAMENTO DECFSZ Z1,F GOTO L1H DECFSZ Z2,F GOTO L1H BCF M1 BCF M2 CALL APAGAEEPROM MOVLW TGR MOVWF Z2 CLRF Z1 MOVLW .3 MOVWF AUX LOOP3W BANK1 BCF TLRN ;VIRA SAIDA BANK0 BSF LED ;APAGA LED (UMA PISCADA) MOVLW .100 CALL DELAYM BCF LED ;ACENDE LED MOVLW .100 CALL DELAYM DECFSZ AUX,F GOTO LOOP3W BANK1 BSF TLRN ;VIRA ENTRADA BANK0 CALL TESTA_LRN ADDLW .0 BTFSS STATUS,Z ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO $-3 GOTO INICIO MEM_CHEIA MOVLW .10 MOVWF AUX GOTO LOOP3W 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 ;======================================================== BCF RES2,7 ;RESERVA BIT 7 PARA 'CANAL' ;I CALL TESTA_LRN MOVWF AUX XORLW .0 BTFSC STATUS,Z GOTO N_APERT MOVFW AUX XORLW .1 BTFSC STATUS,Z BSF FLAG_A ;CANAL 'A' BTFSS STATUS,Z BCF FLAG_A ;CANAL 'B' BSF FLAGGR ;FLAG MODO 'LEARN' (APRENDER CONTROLE) N_APERT MOVLW 0X7E MOVWF TMP_SALVO MADDRESS MOVFW TMP_SALVO MOVWF ADDRESS CALL EEREAD ;=========================================================== ;IDENTIFICA A QUE CANAL PERTENCE O CONTROLE LIDO NESTA POSIÇÃO ; DE MEMÓRIA MOVWF F_TEMP BCF FLAG_AE BTFSC F_TEMP,7 BSF FLAG_AE BCF F_TEMP,7 MOVFW F_TEMP ;=========================================================== 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 MOVLW .3 SUBWF TMP_SALVO,F ;ACERTA DE 3 EM 3 A POSIÇÃO DE BUSCA NA MEMÓRIA MOVFW TMP_SALVO XORLW .1 BTFSS STATUS,Z GOTO MADDRESS GOTO APRENDER ;========================================================================== ;PROCURA ENDEREÇO VAGO PEGA_VAGO MOVLW 0X7E MOVWF AUX VN56 MOVLW .3 MOVWF AUX2 VN99 MOVFW AUX CALL EEREAD XORLW 0XFF BTFSS STATUS,Z GOTO TENTA_PROX X1 DECF AUX,F DECFSZ AUX2,F GOTO VN99 MOVF AUX2,F ;TESTA AUX SE=0 BTFSS STATUS,Z GOTO N8 BSF STATUS,C INCF AUX,F MOVFW AUX ;RETORNA ENDEREÇO EM 'W' RETURN ;ACHADO ENDEREÇO VAGO TENTA_PROX MOVFW AUX2 SUBWF AUX,F N8 MOVFW AUX XORLW .1 BTFSS STATUS,Z GOTO VN56 BCF STATUS,C RETLW .0 ;NÃO ACHOU ENDEREÇO VAGO ;========================================================================== APRENDER BTFSS FLAGGR ;TESTA SE BOTÃO 'LEARN' ESTÁ PRESSIONADO GOTO INICIO ;NÃO ESTÁ. CALL PEGA_VAGO ;PROCURA 3 POSIÇÕES VAZIAS NA EEPROM BTFSS STATUS,C GOTO MEM_CHEIA MOVWF ADDRESS ;PEGA O ENDEREÇO APONTADO 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 ;========================================================= ;TESTA PARA QUAL CANAL DEVE SER MARCADO ESTE CONTROLE BSF RES2,7 BTFSS FLAG_A BCF RES2,7 ;======================================================== MOVFW RES2 MOVWF TMP MOVFW ADDRESS CALL EEWRITE BANK1 BCF TLRN ;VIRA SAIDA BANK0 BSF LED ;LIGA LED MOVLW .100 ;TEMPO DE ATRASO CALL DELAYM BANK1 BSF TLRN ;VIRA ENTRADA BANK0 BCF FLAGGR CALL TESTA_LRN ADDLW .0 BTFSS STATUS,Z GOTO $-3 GOTO INICIO ;ESTA 'ACIONAR' ACIONAR BTFSS FLAG_AE GOTO OUTRO1 INCF SITUAÇÃO,F 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 DESLM MOVFW SITUAÇÃO XORLW 0X01 BTFSC STATUS,Z ;SE IGUAL A 1 GOTO LIGAM1 MOVFW SITUAÇÃO XORLW 0X02 BTFSC STATUS,Z ;SE IGUAL A 2 GOTO DESLM ;SE IGUAL A 3 GOTO LIGAM2 OUTRO1 INCF SITUAÇÃO1,F MOVFW SITUAÇÃO1 ; ACEITA A TRANSMISSÃO IRÁ LIGAR/DESLIGAR RELES DO MOTOR ANDLW 0X03 ;LIMITA A 4 BITS A CONTAGEM (0A 3) MOVWF SITUAÇÃO1 XORLW 0X00 BTFSC STATUS,Z ;SE IGUAL A 1 GOTO DESLMX MOVFW SITUAÇÃO1 XORLW 0X01 BTFSC STATUS,Z ;SE IGUAL A 1 GOTO LIGAM3 MOVFW SITUAÇÃO1 XORLW 0X02 BTFSC STATUS,Z ;SE IGUAL A 2 GOTO DESLMX ;SE IGUAL A 3 GOTO LIGAM4 ;========================= LIGAM1 BANK1 BSF TS2 BANK0 BTFSS S2 BSF M1 BTFSC S2 ;TESTA FIM DE CURSO S2 PARA M1 LIGADO BCF M1 BCF M2 BANK1 BCF TM1 BCF TM2 BANK0 GOTO T7K LIGAM3 BANK1 BSF TS4 BANK0 BTFSS S4 BSF M3 BTFSC S4 ;TESTA FIM DE CURSO S4 PARA M3 LIGADO BCF M3 BCF M4 BANK1 BCF TM3 BCF TM4 BANK0 GOTO T7KX ;========================= LIGAM2 BANK1 BSF TS1 BANK0 BTFSS S1 BSF M2 BTFSC S1 ;TESTA FIM DE CURSO S1 PARA M2 LIGADO BCF M2 BCF M1 BANK1 BCF TM1 BCF TM2 BANK0 GOTO T7K LIGAM4 BANK1 BSF TS3 BANK0 BTFSS S3 BSF M4 BTFSC S3 ;TESTA FIM DE CURSO S3 PARA M4 LIGADO BCF M4 BCF M3 BANK1 BCF TM4 BCF TM3 BANK0 GOTO T7KX ;=========================================================== T7K MOVLW TMAX_MOTORLIGADO MOVWF TL2 CLRF TL1 DECF TL1,F CLRF TL0 DECF TL0,F GOTO TG9 T7KX MOVLW TMAX_MOTORLIGADO MOVWF TL2X CLRF TL1X DECF TL1X,F CLRF TL0X DECF TL0X,F TG9 MOVLW T_BAA MOVWF AUX2 LOOPX9 MOVLW .1 CALL DELAYM BTFSC M1 CALL L1B BTFSC M2 CALL L1C BTFSC M3 CALL L1BX BTFSC M4 CALL L1CX DECFSZ AUX2,F GOTO LOOPX9 GOTO INICIO ;=============================================================== DESLM CALL DESLMR GOTO TG9 DESLMX CALL DESLMXR GOTO TG9 ;-------------------------------------------------------------- DELAYM MOVWF R0 XC 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 .8 ;.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 BANK1 movwf EEADR bsf EECON1, RD ; FAZ UMA LEITURA clrwdt btfsc EECON1, RD ; LEITURA OK? goto $-2 movf EEDATA,W BANK0 MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM clrwdt RETURN ;================================================================================ ;TESTA INTERRUPTORES 'LEARN_A' E 'LEARN_B' TESTA_LRN BSF LRN BANK1 BCF TLRN ;VIRA SAÍDA BANK0 CALL TIME_C_CURTO ;CARREGA CAPACITOR BANK1 BSF TLRN ;VIRA ENTRADA BANK0 CALL TIME_C_LONGO BTFSS LRN ;TESTA SE AINDA É '1' RETLW .1 ;LRN_A ATERRADA (LIGADA) BCF LRN BANK1 BCF TLRN ;VIRA SAÍDA BANK0 CALL TIME_C_CURTO ;DESCARREGA CAPACITOR BANK1 BSF TLRN ;VIRA ENTRADA BANK0 CALL TIME_C_LONGO BTFSC LRN ;TESTA SE AINDA É '1' RETLW .2 ;LRN_B A0 VCC (LIGADA) RETLW .0 ;NENHUMA CHAVE LIGADA ;========================================================== ;DELAYS PARA CARGA/DESCARGA DO CAPACITOR TIME_C_CURTO MOVLW 0X02 GOTO C_CONT TIME_C_LONGO MOVLW 0X05 C_CONT MOVWF R0 DECFSZ R0,F GOTO $-1 RETURN ;------------------------------------------------------------------------------ APAGAEEPROM ;OK TESTADA E APROVADA ; ROTINA PARA APAGAR CANAL OU CANAL B,CONFORME FLAG_A MOVLW 0X7E MOVWF AUX RET6 CLRWDT MOVWF AUX CALL EEREAD ;LE MOVWF F_TEMP BTFSS F_TEMP,7 GOTO TESTA_F0 BTFSS FLAG_A GOTO PULA_APAGAMENTO GOTO C_APAGAR TESTA_F0 BTFSC FLAG_A GOTO PULA_APAGAMENTO C_APAGAR MOVLW .3 MOVWF AUX2 APAGAR MOVFW AUX 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 CALL AGUARDE ;DELAY ENTRE APAGAMENTOS DECF AUX,F DECFSZ AUX2,F GOTO APAGAR MOVFW AUX SKF XORLW .0 BTFSS STATUS,Z GOTO RET6 clrwdt RETLW 0H PULA_APAGAMENTO MOVLW .3 SUBWF AUX,F MOVFW AUX GOTO SKF end