;***************************************************************************************************************** ; DIMMER_REMOTO_ADJ_V2.ASM ; ; DIMMER COM CONTROLE REMOTO RF PARA VENTILADORES ; UTILIZA CONTROLES (CHAVEIRINHOS) C/ CI HT6P20B ; ; PARA DECODIFICAR UTILIZA UM PIC 12F675 (OPCIONALMENTE UM 12F629, DES- ; COMENTANDO/COMENTANDO AS LINHAS CITADAS NO TEXTO). ; ; AUTOR: CLAUDIO LÁRIOS INICIO: 24-09-2013 TERMINO:25-09-2013 ; ->INCLUIDO CALIBRAÇÃO DO OSCILADOR INTERNO ; ->INCLUIDO 2 INTERRUPTORES PARA CALIBRAÇÃO DO PONTO DE TRABALHO DO DIMMER ; ATUALIZADO EM 02-10-2013: ; ->INCLUIDO COMPARAÇÃO DA VARIAVEL REG_DIM COM R_MIN, E SE IGUAIS ; NEM SEQUER DISPARA A GATE DO TRIAC, GERANDO DESLIGAMENTO 100% DA CARGA. ; OBJETIVO: CONTROLAR VELOCIDADE DE VENTILADOR EM AC 110V, COM TRIAC TIC246 E ; MICROCONTROLADOR PIC 12F675. CONTROLES REMOTOS DEVEM SER 'APRENDIDOS' ; ANTES DO USO. ; SALVA NA EEPROM, O VALOR DA ULTIMA ATUAÇÃO NO CONTROLE REMOTO, EM CASO DE ; FALTA DE ENERGIA, SERÁ RECUPERADO AUTOMÁTICAMENTE. ; ; ANTES DE COMPILAR, ESCOLHAS SUAS DEFINIÇÕES ABAIXO (DEFINIÇÕES DE USUARIO) ;******************************************************************************************************************* ; APÓS A CARGA DO FIRMWARE NO CHIP, E ANTES DO USO, DEVEMOS APRENDER OS ; CONTROLES REMOTOS DESEJADOS E AJUSTAR OS LIMITES MÁXIMOS E MÍNIMO DE ; VELOCIDADE. ; GRAVAR CONTROLE: APERTE QUALQUER BOTÃO DO CONTROLE E MANTENHA APERTADO. ; APERTE TAMBÉM O BOTÃO 'LEARN' NA PLACA (PINO 6 DO PIC 12F675 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: 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 SENSORES DA MEMÓRIA. ; APÓS ISTO, CADA CONTROLE DEVERÁ SER 'REAPRENDIDO' NOVAMENTE PARA OPERAR. ;******************************************************************************************************************** ; AJUSTAR LIMITES MÁXIMO E MÍNIMO: ; INICIALMENTE, OS LIMITES ESTARÃO NA ATUAÇÃO MÁXIMA. ; ISTO PODERÁ GERAR MAU FUNCIONAMENTO NA CARGA INDUTIVA DO VENTILADOR, E ; SERÁ PERCEBIDO POR 'RONCOS E AQUECIMENTOS'. ; PORTANTO, OS LIMITES MÁXIMO E MÍNIMOS DEVERÃO SER AJUSTADOS IMPRETERIVELMENTE. ; LIGUE O VENTILADOR, CONFORME ESQUEMA, E PROCEDA OS AJUSTES DE LIMITES, ; CONFORME OS SEGUINTES PASSOS: ; 1) DESLIGUE A ALIMENTAÇÃO DO APARELHO. ; 2) APERTE AMBOS OS BOTÕES DE AJUSTE MÍNIMO (PINO 4) E MÁXIMO (PINO 7). ; 3) COM OS BOTÕES APERTADOS, RELIGUE A ALIMENTAÇÃO DO CIRCUITO E SOLTE-OS. ; O LED 'PROG' PISCARÁ 5 VEZES. ; 4) AJUSTE O PONTO DE TRABALHO MÍNIMO, ATUANDO NO BOTÃO DO CONTROLE REMOTO, ; NO SENTIDO DE REDUZIR A VELOCIDADE DO VENTILADOR. ; 5) QUANDO ESTIVER NO NÍVEL DESEJADO, APERTE BREVEMENTE O BOTÃO 'ADJ LIM MIN'. ; PISCARÁ O LED 'PROG' UMA VEZ. ; 6) EM SEGUIDA, AJUSTE O PONTO DE TRABALHO MÁXIMO, ATUANDO NO BOTÃO DO CONTROLE ; REMOTO, NO SENTIDO DE AUMENTAR A VELOCIDADE DO VENTILADOR. ; 7) QUANDO ESTIVER NO NÍVEL DESEJADO PARA O MÁXIMO, APERTE BREVEMENTE O BOTÃO ; 'ADJ LIM MÁX'. NOVAMENTE, IRÁ PISCAR O LED 'PROG'. ; 8) CASO OCORRA ALGUM ERRO, REPITA OS PASSOS DE 1 A 7. ;-------------------------------------------------------------------------------------------------------------------- ; OBS. ESTE CIRCUITO TRABALHA COM ALTAS TENSÕES. TODOS OS CUIDADOS DE SEGU- ; RANÇA DEVEM SER TOMADOS. NÃO INDICADO PARA INICIANTES. ; O CHIP DEVE SER GRAVADO EXTERNAMENTE AO CIRCUITO E DEPOIS COLOCADO. ; NÃO TENTE GRAVAR 'IN-CIRCUIT' SOB RISCO DE DANIFICAR SEUS EQUIPAMENTOS ; (PC) E RISCO DE ELETROCUÇÃO. ; O MONTADOR CORRERÁ OS RISCOS POR CONTA PRÓPRIA. ; ESTE DISPOSITIVO É APENAS DIDÁTICO, MONTADO APENAS EM PROTOBOARD, SUJEITO ; A BUGS AINDA NÃO IDENTIFICADOS. ; CERTIFIQUE-SE DE TER O BYTE DE CALIBRAÇÃO NO ENDEREÇO 0X3FF SALVO ;=================================================================================================================== ;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 ;=================================================================================================================== IFDEF PIC_675 LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ENDIF IFDEF PIC_629 LIST P=12f629 , R=DEC INCLUDE "P12F629.INC" ENDIF ;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_R FLAGS,2 ;FLAG DE 'LEARN' APRENDER #DEFINE FLAGGR FLAGS,3 ;FLAG DE 'LEARN' APRENDER #DEFINE FLAGX1 FLAGS,4 ;FLAG AUX #DEFINE FLAGAD FLAGS,5 ;FLAG AUX #DEFINE FLAGAA FLAGS,6 ;FLAG AUX ;DEFINIÇÕES DE PORTAS DE SAIDA #DEFINE SW_MIN GPIO,3 ;PINO 4 ENTRADA BOTÃO 'MIN' #DEFINE LED GPIO,0 ;PINO 7 SAIDA LED 'LEARN' #DEFINE SW_MAX GPIO,0 ;PINO 7 ENTRADA BOTÃO 'MÁX' #DEFINE SENSOR GPIO,5 ;PINO 2 IN SENSOR ZERO CROSS #DEFINE SIN GPIO,2 ;PINO 5- IN RF #DEFINE LRN GPIO,1 ;PINO 6- ENTRADA DO BOTÃO LEARN #DEFINE GATE GPIO,4 ;PINO 3- SAIDA DO TRIAC #DEFINE TRISGATE TRISIO,4 ;PINO 3- SAIDA DO TRIAC #DEFINE TRIS_MAX TRISIO,0 ;PINO 7- ENTRADA/SAIDA ;RAM CBLOCK 0X20 RES3,RES2,RES1,RES0,AUX,C3,C2,C1,C0,WS,TEMP,BITCOUNTER,FLAGS,TL0,TL1,TL2,Z2,Z1,Y1,Y0 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 REG_DIM,STATUSTEMP,WTEMP,R_MAX,R_MIN,MC ENDC ;EQUATES TMAX EQU .50 ;TEMPO MAXIMO DO SINAL LOW QBYTE EQU .24 ;QUANTIDADE DE BYTES A SER RECEBIDO (22 ADRESS+ 2 DADO E DESPREZA OS 4 ANTICODE) TGR EQU .255 ;TEMPO DE BOTÃO APERTADO PARA APAGAR GRAVAÇAO ;========================================================================================================= ; RESET ;========================================================================================================= ORG 0X00 GOTO START ;========================================================================================================= ; INTERRUPÇÃO ;========================================================================================================= ORG 0X04 GOTO INT_MUDANÇA_TMR0 ;========================================================================================================= ; INICIO DO PROGRAMA ;========================================================================================================= START: BANK1 CALL 0X3FF MOVWF OSCCAL ;CALIBRA OSCILADOR (CERTIFIQUE DE TER BYTE DE CALIBRAÇÃO SALVO) MOVLW B'111110' ; SETUP PORTA MOVWF TRISIO MOVLW B'00000100' ;TIMER0 /32 MOVWF OPTION_REG IFDEF PIC_675 MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD (SOMENTE 12f675) ENDIF BSF IOC,5 ;INTERRUPÇÃO POR MUDANÇA NO PINO 2 MOVLW B'000010' MOVWF WPU ;LIGA PULLUP EM GP1 BANK0 CLRF FLAGS ;APAGA REGISTRADOR DE FLAGS MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES MOVLW TGR MOVWF Z2 CLRF Z1 ;LIMPA REGISTRADORES PRESET CLRF GPIO ; RESET PORT MOVLW 0X7D CALL EEREAD MOVWF REG_DIM ;PEGA VALOR DA EEPROM MOVLW 0X7E CALL EEREAD MOVWF R_MAX ;PEGA VALOR DA EEPROM MOVLW 0X7F CALL EEREAD MOVWF R_MIN ;PEGA VALOR DA EEPROM BANK1 BSF TRIS_MAX ;VIRA ENTRADA BANK0 BTFSS SW_MAX GOTO SAI_3J BTFSC SW_MIN GOTO SAI_3J ;SE OS 2 BOTÕES ESTIVEREM LIGADOS REINICIA LIMITES MOVLW 0X60 MOVWF TMP MOVLW 0X7D CALL EEWRITE MOVLW 0XFF MOVWF TMP MOVLW 0X7E ;MAX CALL EEWRITE CLRF TMP MOVLW 0X7F ;MIN CALL EEWRITE MOVLW .5 MOVWF MC PISCA_N BANK1 BCF TRIS_MAX ;VIRA SAIDA BANK0 BSF LED MOVLW .5 CALL DELAYM BCF LED ;APAGA LED MOVLW .15 CALL DELAYM DECFSZ MC,F GOTO PISCA_N BSF FLAGAA BSF FLAGAD GOTO PRESET SAI_3J BANK1 BCF TRIS_MAX ;VIRA SAIDA BANK0 MOVLW .0 MOVWF TMR0 MOVFW GPIO ;LER PARA ZERAR FLAG BCF INTCON,GPIF BCF INTCON,T0IF BSF INTCON,GPIE ;LIGA INTERRUPÇÕES DE MUDANÇA E TMR0 OVERFLOW BSF INTCON,T0IE BSF INTCON,GIE ;========================================================================================================= ; 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 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 ;========================================================================================================= ; ROTINA PARA APAGAMENTO GERAL DOS CONTROLES ;========================================================================================================= TAPAGAMENTO ;APAGAR TODOS OS CONTROLES DA MEMÓRIA DECFSZ Z1,F GOTO L1H DECFSZ Z2,F GOTO L1H CALL APAGAEEPROM ;ATINGIU TEMPO MAXIMO: APAGAR MEMÓRIA MOVLW .3 ;PISCA 3 VEZES MOVWF AUX2 BSF LED ;ACENDE LED (UMA PISCADA) MOVLW .10 CALL DELAYM BCF LED ;APAGA LED MOVLW .10 CALL DELAYM DECFSZ AUX2,F GOTO $-7 BTFSS LRN ;AGUARDA SOLTAR BOTÃO 'LEARN' GOTO $-1 GOTO INICIO ;========================================================================================================= ; ROTINA DE AJUSTE DOS LIMITES MÁXIMOS E MÍNIMOS ;========================================================================================================= SS5: BANK1 BSF TRIS_MAX ;VIRA ENTRADA BANK0 BTFSS FLAGAA ;FLAG AUMENTA ACIONADO GOTO SS7 BTFSS SW_MAX ;TESTA BOTÃO ADJ LIM. MAX GOTO SS7 MOVFW REG_DIM MOVWF TMP MOVLW 0X7E CALL EEWRITE BCF FLAGAA BANK1 BCF TRIS_MAX BANK0 BSF LED ;ACENDE LED (UMA PISCADA) MOVLW .5 CALL DELAYM BCF LED ;APAGA LED GOTO PRESET ; SS7: BANK1 BCF TRIS_MAX BANK0 BTFSS FLAGAD GOTO SS8 BTFSC SW_MIN ;TESTA BOTÃO ADJ LIM.MIN GOTO SS8 MOVFW REG_DIM MOVWF TMP MOVLW 0X7F CALL EEWRITE BCF FLAGAD BSF LED ;ACENDE LED (UMA PISCADA) MOVLW .5 CALL DELAYM BCF LED ;APAGA LED GOTO PRESET ; SS8: ;========================================================================================================= ; ROTINA DE RECEPÇÃO DE SINAIS HT6P20B ;========================================================================================================= ;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 Y0,F GOTO J0 DECFSZ Y1,F GOTO J0 BTFSS FLAG_R GOTO J0 BCF FLAG_R MOVFW REG_DIM MOVWF TMP MOVLW 0X7D CALL EEWRITE 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 RES2,F ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF RES1,F RRF RES0,F ;H 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 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 ;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 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 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 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 DIMMER ;========================================================================================================= ACIONAR MOVFW RES3 ;RECUPERA OS BOTÕES MOVWF RES2 BTFSC RES2,7 ; TESTA BIT 7 GOTO AUMENTA BTFSC RES2,6 ;TESTA BIT 6 GOTO DIMINUE GOTO INICIO ;================================================================================================= ; ALTERAR CONTADOR DO DIMMER ;================================================================================================= DIMINUE MOVLW .5 ;PASSO DE REDUÇÃO SUBWF REG_DIM,F BTFSS STATUS,C GOTO MINIMO_ MOVFW R_MIN ;LIMITE MÍNIMO SUBWF REG_DIM,W ;COMPARA SE CHEGOU NO LIMITE ESTABELECIDO BTFSC STATUS,C GOTO SAI_REG MINIMO_ APAGA MOVFW R_MIN MOVWF REG_DIM GOTO SAI_REG AUMENTA MOVLW .5 ;PASSO DE AUMENTO ADDWF REG_DIM,F BTFSC STATUS,C GOTO P_MAX MOVFW REG_DIM SUBWF R_MAX,W ;LIMITE MÁXIMO BTFSC STATUS,C GOTO SAI_REG P_MAX MOVFW R_MAX MOVWF REG_DIM SAI_REG MOVLW 0X10 MOVWF Y1 BSF FLAG_R GOTO INICIO ;========================================================================================================= ; PONTEIRO PARA EEPROM ;========================================================================================================= PPT MOVLW .0 CALL EEREAD ;LE PONTEIRO DA EEPROM 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 BTFSC INTCON,GIE GOTO $-2 BANK1 movwf EEADR BANK0 MOVFW TMP ;PEGA PRIMEIRO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A btfsc EECON1, WR ; goto WRITE_SN_A bcf EECON1, WREN ; BANK0 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 TMP. BANK1 movwf EEADR bsf EECON1, RD ; btfsc EECON1, RD ; goto $-1 movf EEDATA,W BANK0 MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM RETURN ;========================================================================================================= ; ROTINA DE APAGAMENTO TOTAL DA EEPROM INTERNA ;========================================================================================================= ;------------------------------------------------------------------------------ APAGAEEPROM BCF INTCON,GIE ;DESLIGA INTERRUPÇÕES 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 BSF INTCON,GIE ;RELIGA INTERRUPÇÕES 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 ;============================================================================= ; 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 BTFSS INTCON,GPIF ;TESTA SE É INTERRUPÇÃO POR MUDANÇA DE ESTADO GOTO TESTA_INT_TMR0 ;NÃO É MOVFW GPIO ;OBRIGATÓRIO BCF INTCON,GPIF ;APAGA FLAG DE MUDANÇA DE ESTADO MOVFW REG_DIM ;RECARGA DE TEMPO DO TIMER0 MOVWF TMR0 BCF INTCON,T0IF ;APAGA FLAG DO TMR0 BSF INTCON,T0IE ;LIGA INTERRUPÇÃO DO TIMER0 GOTO SAI_INT ;SAI DA INTERRUPÇÃO TESTA_INT_TMR0 ;TESTA SITUAÇÃO DE REG_DIM SER IGUAL AO VALOR MÍNIMO PREVIAMENTE REGULADO ; SE FOR, NEM SEQUER OCORRERÁ O DISPARO DO TRIAC MOVFW REG_DIM XORWF R_MIN,W BTFSC STATUS,Z GOTO NEM_SEQUER_DISPARA ;DESLIGA 100% NO VALOR MÍNIMO BCF GATE BANK1 BCF TRISGATE ;SAIDA ATERRADA BANK0 MOVLW .250 ;DELAY PARA O DISPARO DO TRIAC ADDLW .1 BTFSS STATUS,Z GOTO $-2 BANK1 BSF TRISGATE ;ALTA IMPEDANCIA BANK0 NEM_SEQUER_DISPARA BCF INTCON,T0IE ;DESLIGA INTERRUPÇÃO DO TMR0 BCF INTCON,T0IF ;FLAG TIMER0 SAI_INT SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS SWAPF WTEMP,F SWAPF WTEMP,W ;RECUPERA 'W' RETFIE ;========================================================================================================= ; PRÉ-ESCRITA NA EEPROM ;========================================================================================================= ORG H'2100' DE .0 ORG H'2100' + 0X7D DE 0X60,0XFF, 0X00 ;REG_DIM,R_MAX,R_MIN end