;************************************************************************** ; RX_GEN_HT6P20B_V13.ASM ; ; ; RECEPTOR RF PARA CONTROLE REMOTOS (CHAVEIRINHOS) COM CI HT6P20B ; COM 2 ZONAS SEPARADAS, PODENDO GRAVAR CONTROLES SEPARADOS PARA CADA ; PAR DE SAIDA (LED0/LED1 = SAIDA 'A' E LED2/LED3 = SAÍDA 'B') ; PARA DECODIFICAR UTILIZA UM PIC 12F675 (OPCIONALMENTE UM 12F629, DES- ; COMENTANDO/COMENTANDO AS LINHAS CITADAS NO TEXTO). ; 21 CONTROLES PARA 'A' E 21 CONTROLES PARA 'B'. ; CLAUDIO LÁRIOS INICIO: 29-03-2013 TERMINO:31-03-2013 ; VERSÃO 13: ; ACIONAR COM CONTROLES DIFERENTES, 2 SAÍDAS SEPARADAS. ; ACRESCENTADO OPÇÃO DE USUARIO: PULSO OU RETENÇÃO ; ANTES DE COMPILAR, ESCOLHAS SUAS DEFINIÇÕES ABAIXO (DEFINIÇÕES DE USUARIO) ; O MODO DE APRENDIZADO FOI REFORMULADO: APENAS APRENDA UM BOTÃO, QUE OS OUTROS ; JÁ SERÃO ACEITOS. ;************************************************************************** ; ; GRAVAR CONTROLE (NA ZONA 'A' SEM JUMPER E ZONA 'B' COM JUMPER) : ; APERTE QUALQUER BOTÃO DO CONTROLE E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN' NA PLACA (PINO 7 DO PIC 12F629 A MASSA)E ; SOLTE-O EM MENOS DE 1 SEGUNDOS. O LED 'LEARN'(PINO 7) PISCARÁ 1 ; VEZ, PARA INDICAR 'CODE APRENDIDO'. OS OUTROS BOTÕES JÁ SERÃO APRENDIDOS. ; APAGAR TODOS OS CONTROLES DA MEMÓRIA SENDO: ZONA 'A' SEM JUMPER E ZONA 'B' ; COM JUMPER: ; APERTAR BOTÃO 'LEARN' NA PLACA E MANTENHA PRESSIONADO POR MAIS DE 10 SEGUNDOS. ; O LED 'LEARN' (PINO 7)PISCARÁ 3 VEZES , INDICANDO O PLENO APAGAMENTO DE ; TODOS OS CONTROLES/SENSORES DA ZONA DA MEMÓRIA ESCOLHIDA PELO JUMPER. ; APÓS ISTO, CADA CONTROLE DEVERÁ SER 'REAPRENDIDO' NOVAMENTE PARA OPERAR. ; OBS: SEMPRE RECOLOQUE O 'JUMPER'APÓS APAGAMENTO/APRENDIZADO PARA NÃO AFETAR ; O FUNCIONAMENTO (SAÍDA OPEN-COLECTOR). ;*************************************************************************** ;=================================================================================================================== ;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 ;#DEFINE PULSO ;ACENDE ENQUANTO BOTÃO ESTIVER PRESSIONADO #DEFINE RETENÇÃO ; UM TOQUE LIGA OUTRO TOQUE DESLIGA ;=================================================================================================================== 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 #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 FLAGLED0 FLAGS,3 ;FLAG DE SITUAÇÃO #DEFINE FLAGLED1 FLAGS,4 ;FLAG DE SITUAÇÃO #DEFINE FLAGLED2 FLAGS,5 ;FLAG DE SITUAÇÃO #DEFINE FLAGLED3 FLAGS,6 ;FLAG DE SITUAÇÃO #DEFINE FLAG_J FLAGS,7 ;FLAG DE JUMPER #DEFINE LRN GPIO,0 ;PINO 7 IN LEARN BOTTON #DEFINE SIN GPIO,3 ;PINO 4 IN RF #DEFINE LED GPIO,0 ;PINO 7 SAIDA LED 'LEARN' #DEFINE LED0 GPIO,5 ;PINO 2- SAIDA DO LED0 #DEFINE LED1 GPIO,1 ;PINO 6- SAIDA DO LED1 #DEFINE LED2 GPIO,2 ;PINO 5- SAIDA DO LED2 #DEFINE LED3 GPIO,4 ;PINO 3- SAIDA DO LED3 (open colector) #DEFINE JUMPER GPIO,4 ;PINO 3- ENTRADA DO JUMPER (open colector) CBLOCK 0X20 RES3,RES2,RES1,RES0,AUX,C3,C2,C1,C0,WS,TEMP,BITCOUNTER,FLAGS,TL0,TL1,TL2,Z2,Z1,Y1,Y2 LcdDelayCounter,LcdDelayCounter1,tmpLcdRegister,tmpLcdRegister1,SITUAÇÃO temp,SDATA,AUX2 ,LC,HC ,CONT,RES3A,RES2A,RES1A,RES0A,X,R0,R1,R2,R3,TMP1,TMP2,TMP3,ADDRESS,TMP,TMP_SALVO ENDC WRCFG EQU B'00000000' ; PORTB: EEPROM WRITE TRI-STATE VALUE YTRISA EQU B'001001' ; PORTA: TRI-STATE VALUE TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .28 ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO+ 4 ANTICODE) TGR EQU .255 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO T_DESL_LED EQU .20 ;TEMPO MÁXIMO QUE LEDS FICAM ACESOS APÓS CESSAR TRANSMISSÃO ORG 0X00 GOTO START ORG 0X04 RETFIE START: MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES CLRF GPIO ; RESET PORT MOVLW YTRISA ; SETUP PORTA TRIS GPIO IFDEF PIC_675 BANK1 MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD (SOMENTE 12f675) BANK0 ENDIF CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS MOVLW TGR MOVWF Z2 CLRF Z1 ;LIMPA REGISTRADORES INICIO: CLRF RES3 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 ;--------------------------------- BTFSS LRN ;TESTA BOTÃO 'LEARN' APERTADO GOTO TAPAGAMENTO ;APERTADO, COMEÇA A CONTAR TEMPO MAX. DE APAGAMENTO MOVLW TGR MOVWF Z2 ;RECARGA DO TEMPO DE APAGAMENTO CLRF Z1 ;LIMPA REGISTRADORES L1H GOTO SS5 TAPAGAMENTO ;APAGAR TODOS OS CONTROLES DA MEMÓRIA DECFSZ Z1,F GOTO L1H DECFSZ Z2,F GOTO L1H BANK1 BSF TRISIO,4 BANK0 BCF FLAG_J BTFSC JUMPER BSF FLAG_J BANK1 BCF TRISIO,4 BANK0 CALL APAGAEEPROM ;ATINGIU TEMPO MAXIMO: APAGAR MEMÓRIA BANK1 BCF TRISIO,0 ;VIRA SAIDA BANK0 MOVLW .3 ;PISCA 3 VEZES MOVWF AUX2 BSF LED ;APAGA LED (UMA PISCADA) MOVLW .10 CALL DELAYM BCF LED ;ACENDE LED MOVLW .10 CALL DELAYM DECFSZ AUX2,F GOTO $-7 BANK1 BSF TRISIO,0 ;VIRA ENTRADA BANK0 BTFSS LRN ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO $-1 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 DECFSZ Y1,F ;CONTADOR DE TEMPO DE DESLIGAMENTO DE SAIDAS GOTO J0 DECFSZ Y2,F ;CONTADOR DE TEMPO DE DESLIGAMENTO DE SAIDAS GOTO J0 ;=================================================================== ;APENAS EM MODO 'PULSO' IFDEF PULSO MOVFW ADDRESS SUBLW 0X40 BTFSC STATUS,C GOTO L_ZB12 BCF LED1 ;APAGA LED1/0 'A' BCF LED0 GOTO SAI_K9 L_ZB12 BCF LED3 ;APAGA LED3/2 'B' BCF LED2 SAI_K9 ENDIF ;=================================================================== ;APENAS EM MODO 'RETENÇÃO' IFDEF RETENÇÃO BCF FLAGLED3 BCF FLAGLED2 BCF FLAGLED1 BCF FLAGLED0 ENDIF ;================================================================== INCF Y1,F INCF Y2,F J0 MOVLW .9 ;.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 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 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 ;=========================================================== ;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? ; GOTO SEGX3 BANK1 BSF TRISIO,4 ;LED3 VIRA ENTRADA BANK0 BCF FLAG_J BTFSC JUMPER BSF FLAG_J BANK1 BCF TRISIO,4 ;LED3 VIRA SAIDA BANK0 SEGX3 BTFSS LRN ;BOTÃO ESTÁ APERTADO? GOTO SEGX9 MOVLW 0X7F ;NÃO ESTÁ APERTADO GOTO LE_NORMAL SEGX9 BSF FLAGGR ; ESTÁ APERTADO CALL PPT ;PEGA PONTEIRO CONFORME JUMPER COLOCADO OU NÃO LE_NORMAL MOVWF TMP_SALVO XORLW .0 BTFSC STATUS,Z ; É '0'? GOTO APRENDER ;NENHUM CONTROLE FOI GRAVADO MOVFW TMP_SALVO XORLW 0X40 BTFSC STATUS,Z ; É '0'? GOTO APRENDER ;NENHUM CONTROLE FOI GRAVADO MADDRESS MOVFW TMP_SALVO 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 TMP_SALVO ;CORRIGE POSIÇÃO DE PROCURA XORLW 0X43 ;DEVIDO A PRESENÇA DO PONTEIRO NO END. 0X40 BTFSS STATUS,Z GOTO SEG690 DECF TMP_SALVO,F ;=============================================================================== SEG690 MOVLW .3 SUBWF TMP_SALVO,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 BTFSC FLAG_J ;TESTA DE FLAG DE JUMPER COLOCADO GOTO V_ZA7 SUBLW 0X7E ;0X7C ;LIMITE MAXIMO DA EEPROM ZONA 'B' BTFSC STATUS,C GOTO SEG901 MOVLW 0X40 MOVWF ADDRESS ;INICIA SOBREGRAVAÇÃO SEG901 INCF ADDRESS,F ;SOMA 1 GOTO SEGY8 V_ZA7 SUBLW 0X3E ;LIMITE MAXIMO DA EEPROM ZONA 'A' BTFSS STATUS,C CLRF ADDRESS ;INICIA SOBREGRAVAÇÃO INCF ADDRESS,F ;SOMA 1 SEGY8 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 ;PONTEIRO 'A' BTFSS FLAG_J MOVLW 0X40 ;PONTEIRO 'B' CALL EEWRITE ;GRAVA NOVO ENDEREÇO DE PONTEIRO BCF FLAGGR BTFSS LRN GOTO $-1 MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BSF LED ;LIGA LED MOVLW .10 ;TEMPO DE ATRASO CALL DELAYM BCF LED ;DESLIGA ;========================================================================== ACIONAR ;========================================================================== BCF FLAG_J ;APAGA MOVFW RES3 ;RECUPERA OS BOTÕES MOVWF RES2 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; MODO RETENÇÃO IFDEF RETENÇÃO BTFSS RES2,7 ; SE OS DOIS BOTÕES ESTIVEREM ACIONADOS GOTO KJ5 ; VAI TESTAR INDIVIDUALMENTE CADA BOTÃO BTFSS RES2,6 GOTO KJ6 ; VAI TESTAR INDIVIDUALMENTE CADA BOTÃO GOTO KCONT ;NÃO FAZ 'NADA' SE 2 APERTADOS NESTA VERSÃO ;-------------------------- KJ5 ;BCF FLAGLED3 ; BCF FLAGLED1 MOVFW ADDRESS SUBLW 0X40 BTFSC STATUS,C GOTO L_ZB34 BTFSC FLAGLED0 GOTO KCONT BTFSS LED0 GOTO HG2A ;NÃO TESTA MAIS NADA BCF LED0 GOTO KSET2 HG2A BSF LED0 ;LIGA LED2 KSET2 BSF FLAGLED0 GOTO KCONT ;NÃO TESTA MAIS NADA L_ZB34 BTFSC FLAGLED2 ;TESTA SE JÁ FOI LIBERADO MUDANÇA GOTO KCONT BTFSS LED2 GOTO HG2AX ;NÃO TESTA MAIS NADA BCF LED2 GOTO KSET2X HG2AX BSF LED2 ;LIGA LED2 KSET2X BSF FLAGLED2 GOTO KCONT ;NÃO TESTA MAIS NADA ;================================================= KJ6 MOVFW ADDRESS SUBLW 0X40 BTFSC STATUS,C GOTO L_ZB39 BTFSC FLAGLED1 GOTO KCONT BTFSS LED1 GOTO HG3 BCF LED1 ;DESLIGA LED1 GOTO KSET1 ;NÃO TESTA MAIS NADA HG3 BSF LED1 ;LIGA LED1 KSET1 BSF FLAGLED1 GOTO KCONT L_ZB39 BTFSC FLAGLED3 GOTO KCONT BTFSS LED3 GOTO HG3X BCF LED3 ;DESLIGA LED1 GOTO KSET1X ;NÃO TESTA MAIS NADA HG3X BSF LED3 ;LIGA LED1 KSET1X BSF FLAGLED3 GOTO KCONT ENDIF ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;MODO PULSO IFDEF PULSO ;ACIONA UM UNICO LED (BOTÃO ESQ= LED1 ;BOTÃO DIR=LED2 ;2 BOTÕES=LED3) BTFSS RES2,7 ;TESTA QUAIS BOTÕES FORAM ACIONADOS NA TRANSMISSÃO GOTO SJ7 MOVFW ADDRESS SUBLW 0X40 BTFSC STATUS,C GOTO L_ZB7 BSF LED1 ;LIGA LED1 'A' BCF LED0 GOTO SJ6 L_ZB7 BSF LED3 ;LIGA LED3 'B' BCF LED2 GOTO SJ6 SJ7 BTFSS RES2,6 ;TESTA QUAIS BOTÕES FORAM ACIONADOS NA TRANSMISSÃO GOTO SAI_99 MOVFW ADDRESS SUBLW 0X40 BTFSC STATUS,C GOTO L_ZB9 BSF LED0 ;LIGA LED0 'A' BCF LED1 GOTO SAI_99 L_ZB9 BSF LED2 ;LIGA LED2 'B' BCF LED3 SAI_99 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ KCONT SJ6 MOVLW T_DESL_LED ;RECARGA DO TEMPORIZADOR DE DESLIGAMENTO MOVWF Y2 MOVLW .255 MOVWF Y1 GOTO INICIO ;**************************************************** ;PEGA PONTEIRO NA EEPROM - ULTIMO ENDEREÇO PPT MOVLW .0 ;JUMPER COLOCADO = ENDEREÇO DO PONTEIRO DA ZONA 'A' BTFSS FLAG_J MOVLW 0X40 ;JUMPER RETIRADO = ENDEREÇO DO PONTEIRO DA ZONA 'B' 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\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 $-1 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 BTFSC FLAG_J GOTO L_MA1 MOVLW 0X7F ;ZONA 'B' MOVWF AUX GOTO RET6 L_MA1 MOVLW 0X3F ;ZONA 'A' 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 BTFSC FLAG_J GOTO L_MA ;ZONA 'A' DECF AUX,F MOVFW AUX XORLW 0X3F ;APAGA DE 0X80 A 0X40 BTFSS STATUS,Z GOTO ESPERA GOTO S_M2 L_MA DECFSZ AUX,F GOTO ESPERA S_M2 ;======================================= BTFSS FLAG_J GOTO SEG456 CLRF TMP MOVLW .0 CALL EEWRITE GOTO SAI_Y7 SEG456 MOVLW 0X40 MOVWF TMP CALL EEWRITE GOTO SAI_Y7 ;======================================= SAI_Y7 BCF FLAG_J 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' ;'A' DE .0 ORG H'2100' + 0X40 ;'B' DE 0X40 end