;************************************************************************************** ; ; recp_4c_infra_nec_V1.asm ; ; Receptor de 4 canais por controle remoto infravermelho, com Pic 12f675, ; usando protocolo 'NEC' ; ; Objetivo desta montagem: ; Controlar cargas por meio de reles, acionados por controle remoto ; com números que podem ser escolhidos e programados pelo usuário. ; Tem 4 canais diferentes e isolados entre sí. Podem controlar cargas ; AC (110 v) ou cargas DC ( 12 volts ,etc). O acionamento pode ser ; programado por canal, em modo pulso ou retenção. ; ; Autor: Cláudio Lários Início: 07-08-2013 Termino:08-08-2013 ; Revisado: 12-08-13 - Alteração na rotina de aprendizado Pulso/Retenção ; ; ;************************************************************************************* ; Como programar incialmente: ; 1) Aperte o botão 'Prog' por 2 segundos. Começará a piscar o led Prog ; de forma normal. O led do canal 1 se acende. ; 2) Aperte um botão do controle, da sua escolha, que deseje gravar na ; Eeprom, para comandar o canal 1. Ao ser aceito, apagará o led do canal ; 1 e acenderá o led do canal 2. ; 3) Aperte um outro botão do controle, para comandar o canal 2. ; Ao ser aceito, apagará o led do canal 2 e acenderá o led do canal 3. ; 4) Novamente, aperte um outro botão do controle, para comandar o canal 3. ; Ao ser aceito, apagará o led do canal 3 e acenderá o led do canal 4. ; 5) E finalmente, aperte um outro botão do controle, para comandar o canal 4. ; Ao ser aceito, apagará o led do canal 4 e o led Prog começará a piscar ; de forma mais rápida. Isto indica que entramos na programação do modo ; de operação. ; Siga os seguintes passos para escolher entre atuação 'Pulso' ou 'Retenção': ; 1) Aperte um dos botões do controle que foi gravado. A cada aperto, o led ; do canal correspondente acenderá ou apagará. Deixando aceso será modo 'pulso' ; e deixando apagado será modo 'retenção' para este canal. ; 2) Repita com os outros 3 botões que foram gravados. ; 3) Feito a gravação, aperte momentaneamente o botão 'Prog' para sair do ; modo de programação. ; ; Uso desta montagem: ; Ao apertar no controle remoto um botão previamente gravado, ele acionará ; uma das saídas, em modo pulso ou retenção, dependendo de como foi programa- ; do. Os reles devem ter condições de suportar as cargas de correntes em ; seus contatos. Poderá controlar 4 cargas diferentes, como ventiladores, ; abajures, luminárias em geral, bem como outros aparelhos eletrodomésticos. ; Use controle remoto com protocolo 'NEC' apenas. Outros protocolos não irão ; funcionar. ;====================================================================================== ; Obs. Este dispositivo é apenas didático, sendo montado apenas em protoboard ; e sendo sujeito a bugs não identificados. O hex gerado poderá ser usado para ; gravar também no Pic 12f629. ;************************************************************************************** LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ;PALAVRA DE CONFIGURAÇÃO ERRORLEVEL -302 __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF ;DEFINIÇÕES #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 FLAG_MR0 FLAGS,2 ;FLAG DE TRAVA #DEFINE FLAGGR FLAGS,3 ;FLAG DE 'LEARN' APRENDER #DEFINE FLAG_MR1 FLAGS,4 ;FLAG TRAVA #DEFINE FLAG_T FLAGS,5 ;FLAG T #DEFINE FLAG_PROG_ON FLAGS,6 ;FLAG DE MODO DE PROGRAMAÇÃO #DEFINE FLAG_3H FLAGS,7 ;FLAG PISCADA EM 3HZ OU 1HZ ;DEFINIÇÕES DE PORTAS DE SAIDA #DEFINE LED GPIO,5 ;PINO 2 SAIDA LED 'PROG'- AO GND #DEFINE PROG GPIO,5 ;PINO 2 IN BOTÃO PROG - AO GND #DEFINE RELE4 GPIO,0 ;PINO 7 RELE 4 #DEFINE RELE3 GPIO,1 ;PINO 6- RELE 3 #DEFINE RELE2 GPIO,2 ;PINO 5- RELE 2 #DEFINE RELE1 GPIO,4 ;PINO 3- RELE 1 #DEFINE SIN GPIO,3 ;PINO 4- RECEPTOR INFRAVERMELHO #DEFINE TRIS_PROG TRISIO,5 ;DIREÇÃO BOTÃO/LED PROG ;RAM CBLOCK 0X20 RES3,RES2,RES1,RES0,AUX,AUX1,AUX2,TEMP,QB,FLAGS,LcdDelayCounter,LcdDelayCounter1 ADDRESS,TMP,R0,R1,R2,CONT_INT,CONT_INT1,T1_INT,STATUSTEMP,WTEMP,PASSO,ADDR_SALVO ENDC ;EQUATES TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .32 ;QUANTIDADE DE BYTES A SER RECEBIDO (8+8+8+8) T_PROG EQU .30 ;TEMPO DE BOTÃO APERTADO PARA ENTRAR EM MODO DE PROGRAMAÇÃO T_DELAY EQU .11 ;TEMPO DE DELAY .10 T_DELAY1 EQU .2 ;TEMPO DE DELAY .10 ;========================================================================================================= ; RESET ;========================================================================================================= ORG 0X00 GOTO START ;========================================================================================================= ; INTERRUPÇÃO ;========================================================================================================= ORG 0X04 GOTO INT_MUDANÇA_TMR0 ;========================================================================================================= ; SALTO GOTO PARA GERENCIADOR DE PASSOS ;========================================================================================================= GET_PASSO CLRF PCLATH MOVFW PASSO ANDLW 0X07 ADDWF PCL,F GOTO PASSO_0 ;GRAVAR O PRIMEIRO BOTÃO GOTO PASSO_1 ;GRAVAR O SEGUNDO BOTÃO GOTO PASSO_2 ;GRAVAR O TERCEIRO BOTÃO GOTO PASSO_3 ;GRAVAR O QUARTO BOTÃO GOTO PASSO_4 ;GRAVAR OPÇÕES DE PULSO OU RETENÇÃO GOTO PASSO_5 ;NÃO USADOS GOTO PASSO_6 GOTO PASSO_7 ;========================================================================================================= ; INICIO DO PROGRAMA ;========================================================================================================= START: MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES BANK1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW B'001000' ; SETUP PORTA MOVWF TRISIO MOVLW B'00000111' ;timer 0 /256 ;15=3h 5=1h MOVWF OPTION_REG MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD MOVLW B'100000' MOVWF WPU ;LIGA PULLUP EM GP5 PINO 2 BANK0 CLRF GPIO MOVFW GPIO ;LER PARA ZERAR FLAG CLRF TMR0 ;ZERA TMR0 BSF INTCON,T0IE ;LIGA INTERRUPÇÃO DO TMR0 BSF INTCON,GIE MOVLW T_PROG ;TEMPO INICIAL COM BOTÃO PROG APERTADO PARA ENTRAR EM MP MOVWF T1_INT CLRF PASSO ;GERENCIADOR DE PASSOS CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS ;========================================================================================================= ; ROTINA PRINCIPAL ;========================================================================================================= INICIO: CLRF RES3 CLRF RES2 CLRF RES1 CLRF RES0 MOVLW QBYTE ;PREPARA PARA A RECEPÇÃO COM NUMERO DE BITS A RECEBER MOVWF QB CLRF TMR1H CLRF TMR1L BCF PIR1,TMR1IF BSF T1CON,TMR1ON L1 ;========================================================================================================= ; ROTINA DE DESLIGAMENTO DAS SAIDAS EM MODO PULSO APENAS ;========================================================================================================= BTFSC FLAG_PROG_ON ;TESTA SE ESTÁ EM MODO DE PROGRAMAÇÃO GOTO L1H ;ESTÁ, ENTÃO PULA ESTA ROTINA BTFSS RELE1 GOTO PROXRELE MOVLW .13 CALL EEREAD BTFSC STATUS,Z GOTO PROXRELE ;ESTÁ EM RETENÇÃO BTFSS CONT_INT1,2 ;TESTA TEMPO GOTO PROXRELE BCF RELE1 ;DESLIGA RELE1 EM MODO PULSO PROXRELE BTFSS RELE2 GOTO PROXRELE2 MOVLW .14 CALL EEREAD BTFSC STATUS,Z GOTO PROXRELE2 ;ESTÁ EM RETENÇÃO BTFSS CONT_INT1,2 ;TESTA TEMPO GOTO PROXRELE2 BCF RELE2 ;DESLIGA RELE2 EM MODO PULSO PROXRELE2 BTFSS RELE3 GOTO PROXRELE3 MOVLW .15 CALL EEREAD BTFSC STATUS,Z GOTO PROXRELE3 ;ESTÁ EM RETENÇÃO BTFSS CONT_INT1,2 ;TESTA TEMPO GOTO PROXRELE3 BCF RELE3 ;DESLIGA RELE3 EM MODO PULSO PROXRELE3 BTFSS RELE4 GOTO L1H MOVLW .16 CALL EEREAD BTFSC STATUS,Z GOTO L1H ;ESTÁ EM RETENÇÃO BTFSS CONT_INT1,2 ;TESTA TEMPO GOTO L1H BCF RELE4 ;DESLIGA RELE4 EM MODO PULSO L1H GOTO SS5 ;========================================================================================================= ; ROTINA DE RECEPÇÃO DE SINAIS DO PROTOCOLO 'NEC' ; OBS. RECEPTOR INFRAVERMELHO FORNECE SINAL INVERTIDO ;========================================================================================================= RECEIVE SS5: BTFSS SIN ; 'S' SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE INFRAVERMELHO GOTO IN_1 ;========================================================================================================= ;SIN=0 BCF FLAG_MR1 BTFSC FLAG_MR0 GOTO L1 BSF FLAG_MR0 BCF T1CON,TMR1ON ;DESLIGA TMR1 BTFSC PIR1,TMR1IF ;TESTA FLAG DO TIMER 1 GOTO RESETA_REC MOVFW TMR1H SUBLW 0X1F BTFSC STATUS,C GOTO CLR_TMR1 ;------------------------------XXX SAI_TAD GOTO RESETA_REC ;RESETA RECEPÇÃO SE PULSO EM '1' MAIOR QUE 8MS ;======================================================================================================== ;ENTRADA SIN=1 IN_1 BCF FLAG_MR0 BTFSC FLAG_MR1 GOTO L1 BSF FLAG_MR1 BCF T1CON,TMR1ON ;DESLIGA TMR1 BTFSC PIR1,TMR1IF ;TESTA FLAG DO TIMER 1 GOTO CLR_TMR1 MOVFW TMR1H SUBLW 0X0F ;TESTA INTERVALO DE 4,5MS BTFSS STATUS,C GOTO CLR_TMR1 ;FOI INTERVALO DE 4,5MS ;=====================================================================TESTE MOVFW TMR1H SUBLW 0X05 ;TESTA POR INTERVALO DE 2,25 MS BTFSS STATUS,C CLRF CONT_INT1 ;=====================================================================TESTE MOVFW TMR1H SUBLW 0X03 ;TESTA POR BIT '1' BTFSC STATUS,C GOTO SEGKW1 BSF STATUS,C GOTO RODA_BYTE SEGKW1 MOVFW TMR1H SUBLW 0X00 ;TESTA POR BIT '0' BTFSC STATUS,C GOTO CLR_TMR1 BCF STATUS,C GOTO RODA_BYTE RESETA_REC MOVLW QBYTE ;SETUP INICIAL PARA NOVA RECEPÇÃO MOVWF QB CLRF RES3 CLRF RES2 CLRF RES1 CLRF RES0 CLR_TMR1 ;CLRF CONT_INT1 ;ZERA CONTADOR DE TEMPO EM MODO PULSO CLRF TMR1L ;LIMPA TMR1 CLRF TMR1H BCF PIR1,TMR1IF ;APAGA FLAG TMR1 BSF T1CON,TMR1ON ;RELIGA TIMER1 GOTO L1 ;VOLTA AO LOOP RODA_BYTE RRF RES3,F ;DESLOCA BIT RECEBIDO RRF RES2,F RRF RES1,F RRF RES0,F DECFSZ QB,F ;VERIFICA SE JÁ RECEBEU TODOS OS BITS GOTO CLR_TMR1 ;AINDA NÃO ;===================================================================== ; RECEBEU CORRETAMENTE UM NÚMERO DE CONTROLE REMOTO 'NEC' ;===================================================================== AÇÃO ;I CLRF CONT_INT1 ;ZERA TEMPO MODO PULSO BTFSC FLAG_PROG_ON ;ESTÁ EM MODO DE PROGRAMAÇÃO? GOTO PROGRAMAR_4N ;===================================================================== ; ACIONAR SAIDA CORRESPONDENTE AO BOTÃO APERTADO PREVIAMENTE PROGRAMADO ;===================================================================== CALL PROCURA_NUM ;FOI GRAVADO? BTFSS STATUS,C GOTO INICIO ;NÃO FOI. MOVFW ADDRESS ;PEGA ENDEREÇO XORLW .2 ;COMPARA BTFSS STATUS,Z ;TESTA IGUALDADE COM '2' GOTO PROXW1 ;NÃO É RELE1 MOVLW .13 ; ENDEREÇO NA EEPROM COM DADO PULSO/RET CALL EEREAD ;LE SE PULSO/RETENÇÃO BTFSS STATUS,Z ;TESTA SE TEM 0 OU 1 EM 'W' GOTO IR_PULSO ;É MODO PULSO BTFSS RELE1 ;É MODO RETENÇÃO GOTO LIG_RELE1 ;VAI PARA LIGAR RELE1 BCF RELE1 ;DESLIGA RELE1 GOTO SEGK92 ;VAI SAIR DA ROTINA IR_PULSO LIG_RELE1 BSF RELE1 ;LIGA RELE1 SEGK92 GOTO SAI_ROTP ;SAI DA ROTINA COM TEMPORIZAÇÃO PROXW1 MOVFW ADDRESS ;PEGA ENDEREÇO XORLW .5 ;COMPARA BTFSS STATUS,Z ;TESTA IGUALDADE COM '5' GOTO PROXW2 ;NÃO É RELE2 MOVLW .14 ; ENDEREÇO NA EEPROM COM DADO PULSO/RET CALL EEREAD ;LE SE PULSO/RETENÇÃO BTFSS STATUS,Z ;TESTA SE TEM 0 OU 1 EM 'W' GOTO IR_PULSO2 ;É MODO PULSO BTFSS RELE2 ;É MODO RETENÇÃO GOTO LIG_RELE2 ;VAI PARA LIGAR RELE2 BCF RELE2 ;DESLIGA RELE2 GOTO SEGK93 ;VAI SAIR DA ROTINA IR_PULSO2 LIG_RELE2 BSF RELE2 ;LIGA RELE2 SEGK93 GOTO SAI_ROTP ;SAI DA ROTINA COM TEMPORIZAÇÃO PROXW2 MOVFW ADDRESS ;PEGA ENDEREÇO XORLW .8 ;COMPARA BTFSS STATUS,Z ;TESTA IGUALDADE COM '5' GOTO PROXW3 ;NÃO É RELE3 MOVLW .15 ; ENDEREÇO NA EEPROM COM DADO PULSO/RET CALL EEREAD ;LE SE PULSO/RETENÇÃO BTFSS STATUS,Z ;TESTA SE TEM 0 OU 1 EM 'W' GOTO IR_PULSO3 ;É MODO PULSO BTFSS RELE3 ;É MODO RETENÇÃO GOTO LIG_RELE3 ;VAI PARA LIGAR RELE3 BCF RELE3 ;DESLIGA RELE3 GOTO SEGK94 ;VAI SAIR DA ROTINA IR_PULSO3 LIG_RELE3 BSF RELE3 ;LIGA RELE3 SEGK94 GOTO SAI_ROTP ;SAI DA ROTINA COM TEMPORIZAÇÃO PROXW3 MOVFW ADDRESS ;PEGA ENDEREÇO XORLW .11 ;COMPARA BTFSS STATUS,Z ;TESTA IGUALDADE COM '11' GOTO INICIO ;NÃO É RELE4 MOVLW .16 ; ENDEREÇO NA EEPROM COM DADO PULSO/RET CALL EEREAD ;LE SE PULSO/RETENÇÃO BTFSS STATUS,Z ;TESTA SE TEM 0 OU 1 EM 'W' GOTO IR_PULSO4 ;É MODO PULSO BTFSS RELE4 ;É MODO RETENÇÃO GOTO LIG_RELE4 ;VAI PARA LIGAR RELE4 BCF RELE4 ;DESLIGA RELE4 GOTO SEGK95 ;VAI SAIR DA ROTINA IR_PULSO4 LIG_RELE4 BSF RELE4 ;LIGA RELE4 SEGK95 GOTO SAI_ROTP ;SAI DA ROTINA COM TEMPORIZAÇÃO PROGRAMAR_4N ;===================================================================== ; PROGRAMAR 4 NÚMEROS NA EEPROM ;===================================================================== GOTO GET_PASSO ;VERIFICA EM QUAL PASSO ESTÁ. PASSO_0 MOVFW RES2 MOVWF TMP MOVLW .0 CALL EEWRITE MOVFW RES1 MOVWF TMP MOVLW .1 CALL EEWRITE MOVFW RES0 MOVWF TMP MOVLW .2 CALL EEWRITE MOVLW .1 MOVWF PASSO BCF RELE1 BSF RELE2 MOVLW T_DELAY CALL DELAYM GOTO INICIO ;BUSCA PELO PRÓXIMO NÚMERO A GRAVAR PASSO_1 MOVFW RES2 MOVWF TMP MOVLW .3 CALL EEWRITE MOVFW RES1 MOVWF TMP MOVLW .4 CALL EEWRITE MOVFW RES0 MOVWF TMP MOVLW .5 CALL EEWRITE MOVLW .2 MOVWF PASSO BCF RELE2 BSF RELE3 MOVLW T_DELAY CALL DELAYM GOTO INICIO ;BUSCA PELO PRÓXIMO NÚMERO A GRAVAR PASSO_2 MOVFW RES2 MOVWF TMP MOVLW .6 CALL EEWRITE MOVFW RES1 MOVWF TMP MOVLW .7 CALL EEWRITE MOVFW RES0 MOVWF TMP MOVLW .8 CALL EEWRITE MOVLW .3 MOVWF PASSO BCF RELE3 BSF RELE4 MOVLW T_DELAY CALL DELAYM GOTO INICIO ;BUSCA PELO PRÓXIMO NÚMERO A GRAVAR PASSO_3 MOVFW RES2 MOVWF TMP MOVLW .9 CALL EEWRITE MOVFW RES1 MOVWF TMP MOVLW .10 CALL EEWRITE MOVFW RES0 MOVWF TMP MOVLW .11 CALL EEWRITE MOVLW .4 MOVWF PASSO BCF RELE4 BSF FLAG_3H CALL PUT_RET ;ZERA MEMÓRIA DE RETENÇÃO/PULSO MOVLW T_DELAY CALL DELAYM GOTO INICIO ;BUSCA PELO PRÓXIMO NÚMERO A GRAVAR ;=================================================================================== ; GRAVAR OPÇÕES DE PULSO OU RETENÇÃO PARA O ACIONAMENTO DOS CANAIS ;=================================================================================== PASSO_4 PASSO_5 PASSO_6 PASSO_7 CALL PROCURA_NUM ;OBTÊM QUAL CANAL SERÁ AJUSTADO PARA PULSO/RETENÇÃO BTFSS STATUS,C ;TESTA 'C' GOTO INICIO ;NENHUM CADASTRADO SEGGR1 MOVFW ADDRESS XORLW .2 BTFSS STATUS,Z GOTO PROXT1 MOVLW .13 CALL EEREAD XORLW .1 MOVWF TMP ;SALVA MOVLW .13 CALL EEWRITE MOVFW TMP BTFSS STATUS,Z BSF RELE1 BTFSC STATUS,Z BCF RELE1 GOTO SAI_ROTP PROXT1 MOVFW ADDRESS XORLW .5 BTFSS STATUS,Z GOTO PROXT2 MOVLW .14 CALL EEREAD XORLW .1 MOVWF TMP ;SALVA MOVLW .14 CALL EEWRITE MOVFW TMP BTFSS STATUS,Z BSF RELE2 BTFSC STATUS,Z BCF RELE2 GOTO SAI_ROTP PROXT2 MOVFW ADDRESS XORLW .8 BTFSS STATUS,Z GOTO PROXT3 MOVLW .15 CALL EEREAD XORLW .1 MOVWF TMP ;SALVA MOVLW .15 CALL EEWRITE MOVFW TMP BTFSS STATUS,Z BSF RELE3 BTFSC STATUS,Z BCF RELE3 GOTO SAI_ROTP PROXT3 MOVFW ADDRESS XORLW .11 BTFSS STATUS,Z GOTO SAI_ROTP MOVLW .16 CALL EEREAD XORLW .1 MOVWF TMP ;SALVA MOVLW .16 CALL EEWRITE MOVFW TMP BTFSS STATUS,Z BSF RELE4 BTFSC STATUS,Z BCF RELE4 GOTO SAI_ROTP SAI_ROTP MOVLW T_DELAY1 ;SAI DA ROTINA TEMPORIZANDO CALL DELAYM GOTO INICIO ;============================================================================== ; SUBROTINAS ;============================================================================= ;============================================================================= ; PROCURA NÚMERO DE BOTÃO DE CONTROLE NA EEPROM ; 'C' = '1'-> ENCONTRADO (COM POSIÇÃO EM ADDRESS -2) / 'C' = '0'-> NÃO ACHADO ;============================================================================= PROCURA_NUM MOVLW .0 MOVWF ADDRESS MOVWF ADDR_SALVO LOOPJ4 CALL EEREAD XORWF RES2,W ;COMPARA COM RES2 BTFSS STATUS,Z GOTO PROXIMO INCF ADDRESS,F MOVFW ADDRESS CALL EEREAD XORWF RES1,W ;COMPARA COM RES1 BTFSS STATUS,Z GOTO PROXIMO INCF ADDRESS,F MOVFW ADDRESS CALL EEREAD XORWF RES0,W ;COMPARA COM RES0 BTFSC STATUS,Z GOTO ACHOU ;ENCONTRADO CONTROLE NA MEMÓRIA PROXIMO ;VAI PARA O PROXIMO ENDEREÇO DE MEMÓRIA PROCURAR.... MOVFW ADDR_SALVO ADDLW .3 MOVWF ADDR_SALVO XORLW .12 BTFSC STATUS,Z GOTO N_ACHOU MOVFW ADDR_SALVO MOVWF ADDRESS GOTO LOOPJ4 ACHOU BSF STATUS,C RETURN N_ACHOU BCF STATUS,C RETURN ;========================================================================================================= ; COLOCA TODAS AS SAÍDA EM RETENÇÃO COMO PADRÃO ;========================================================================================================= PUT_RET CLRF TMP MOVLW .13 CALL EEWRITE CLRF TMP MOVLW .14 CALL EEWRITE CLRF TMP MOVLW .15 CALL EEWRITE CLRF TMP MOVLW .16 CALL EEWRITE RETURN ;========================================================================================================= ; ROTINAS DE DELAY ;========================================================================================================= 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 ;========================================================================================================= ; ESCREVER NA EEPROM INTERNA ;========================================================================================================= EEWRITE ;endereço esta em ADDRESS ;DADOS A ESCREVER ESTA EM TMP(MSB) BCF INTCON,GIE 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 BSF INTCON,GIE CALL AGUARDE ; BSF INTCON,GIE RETURN ;========================================================================================================= ; LER A EEPROM INTERNA ;========================================================================================================= 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 ;============================================================================= ; INTERRUPÇOES DO TIMER0 E MUDANÇA DE ESTADO DO PINO SENSOR ;============================================================================= INT_MUDANÇA_TMR0 MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BANK0 INCF CONT_INT1,F ;CONTADOR DE TEMPO INCF CONT_INT,F ;CONTADOR DE TEMPO PARA PISCADAS BANK1 BSF TRIS_PROG ;VIRA ENTRADA P/ TESTE DE BOTÃO PROG BANK0 BTFSC FLAG_PROG_ON ;VERIFICA SE JÁ ESTÁ EM MODO DE PROG GOTO SEGD1 ;JÁ ESTÁ BTFSC PROG ;AINDA NÃO. TESTA BOTÃO PROG. ESTÁ APERTADO? GOTO SEGUEX1 ;NÃO DECFSZ T1_INT,F ;SIM, DECREMENTA TEMPORIZADOR DE 2 SEG. GOTO SEGUEZ1 ; E SEGUE BSF FLAG_PROG_ON ;ATINGIU O TEMPO. SETA FLAG DE PROGRAMAÇÃO LIGADA BCF FLAG_3H CLRF GPIO ;DESLIGA LED E RELES BSF RELE1 ;LIGA RELE1 GOTO SEGUEX1 SEGD1 BTFSS FLAG_3H ;TESTA SE FINALIZOU A PROGRAMAÇÃO DE CONTROLES GOTO SEGUEX1 ;NÃO BTFSC PROG ;SIM, TESTA SE BOTÃO PROG ESTÁ APERTADO GOTO SEGUEX1 ;NÃO ESTÁ BCF FLAG_PROG_ON ;ESTÁ, ENTÃO SAI DO MODO DE PROGRAMAÇÃO BCF FLAG_3H ;RESETA FLAG DE 3 HZ CLRF PASSO ;ZERA GERENCIADOR CLRF GPIO ;DESLIGA LED E RELES SEGUEX1 MOVLW T_PROG ;TEMPO PARA ENTRAR EM MODO DE PROGRAMAÇÃO (2SEG) MOVWF T1_INT SEGUEZ1 BANK1 BCF TRIS_PROG ;VOLTA A SER SAIDA PARA LED BANK0 SEGX2 BTFSC FLAG_PROG_ON GOTO SEGX4 BCF LED ;MANTEM APAGADO LED DE PROGRAMAÇÃO GOTO SAI_INT ;============================================================================= ; EM MODO DE PROGRAMAÇÃO ;============================================================================= SEGX4 BTFSS FLAG_3H ;TESTA SE DEVE PISCAR RÁPIDO OU LENTO GOTO P1H ;============================================================================ ; LED IRÁ PISCAR A 3 HERTZ ;============================================================================ BTFSS CONT_INT,0 GOTO PROS_1 BCF CONT_INT,0 REPETE1 BTFSS LED GOTO ACEND_LED BCF LED GOTO PROS_1 ACEND_LED BSF LED PROS_1 GOTO SAI_INT ;============================================================================ ; LED IRÁ PISCAR A 1 HERTZ ;============================================================================ P1H BTFSS CONT_INT,2 GOTO PROS_1 BCF CONT_INT,2 GOTO REPETE1 SAI_INT BCF INTCON,T0IF ;FLAG TIMER0 SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS SWAPF WTEMP,F SWAPF WTEMP,W ;RECUPERA 'W' RETFIE end