;*************************************************************************************************** ; ; PROJETO : TEMPORIZADOR PARA 2 RELES COM 2 BOTÕES DE ACIONAMENTO ; ; OBJETIVO: AO ACIONAR BOTÃO 1 LIGAR RELE 1 PELO TEMPO AJUSTADO NO POTENCIOMETRO DE 10K LIGADO AO ; PINO 7 (ENTRADA COM AD).O MESMO ACONTECE PARA O BOTÃO 2 E RELE 2. ; NOTA: TEMPO ÚNICO PARA OS DOIS CANAIS, MEDIANTE A POSIÇÃO DO POTENCIOMETRO (PODERÁ FAZER UMA ESCALA ; JUNTO AO KNOB DO POTENCIOMETRO,COMMARCAÇÃO DE TEMPO). ; EXEMPLO: AJUSTE POTENCIOMETRO PARA 20 SEGUNDOS. APERTO BOTÃO 1, LIGANDO RELE 1. AGUARDO 10 SEGUNDOS E ; APERTO BOTÃO 2, LIGANDO O RELE 2. PASSARÁ MAIS 10 SEGUNDOS E DESLIGARÁ RELE1 E DEPOIS MAIS 10 SEGUNDOS ; E DESLIGARÁ O RELE 2. ; INICIO : 19/04/13 TERM.:19/04/13 ; AUTOR: CLÁUDIO CARMONA LÁRIOS ; PROCESSADOR: PIC 12F675 ; PROJETO DIDÁTICO APENAS. ; PINAGEM: ; PINO 1 = VCC ; PINO 2 = BOTÃO B2 AO GND ; PINO 3 = LED ; PINO 4 = BOTÃO B1 AO GND ; PINO 5 = SAÍDA RELE1 ; PINO 6 = SAÍDA RELE2 ; PINO 7 = POTENCIOMETRO PARA O AD ; PINO 8 = GND ;___________________________________________________________________________________________________ ; LIST P=12f675 , R=DEC INCLUDE "P12F675.INC" ;ARQUIVO PADRAO ERRORLEVEL -302 ;ELIMINA MENSAGEM DE ERRO ;PALAVRA DE CONFIGURAÇÃO: __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _MCLRE_OFF ;PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS DA RAM CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA TEMP ;TEMPORÁRIO AUX ;IDEM AUX1 ;IDEM AUX2 ;IDEM C0 C1 C0A C1A C0B C1B FLAGS ;FLAGS ENDC ;*********************************************************************************************** ; CONSTANTES #DEFINE LIGAC ADCON0,1 ;DEFINE PALAVRA PARA LIGAR/DESLIGAR CONVERSÃO #DEFINE POT GPIO,0 ;PINO 7 #DEFINE B1 GPIO,5 ;PINO 2 BOTÃO B1 #DEFINE B2 GPIO,3 ;PINO 4 BOTÃO B2 #DEFINE RL1 GPIO,2 ;PINO 5 RELE1 #DEFINE RL2 GPIO,1 ;PINO 6 RELE2 #DEFINE LED GPIO,4 ;PINO 3 LED #DEFINE FLAG_LF FLAGS,0 ;FLAG DE CONTROLE #DEFINE FLAG_LF1 FLAGS,1 ;FLAG DE CONTROLE TEMPO_DELAY EQU .250 ;TEMPO PARA 4 MIN MÁXIMO ;========================================================================================= ; VETOR DE RESET ORG 0X00 GOTO INICIO ;========================================================================================= ; VETOR DE INTERRUPCAO ORG 0X04 RETFIE ;========================================================================================= ; ;================================================================================== ; INICIO DO PROGRAMA ;================================================================================== ;CONFIGURAÇÕES INICIAIS DOS REGISTRADORES E PORTAS INICIO BANK1 ;BANCO 1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW .0 MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES MOVLW b'11101001' ;DEFINE ENTRADAS (1) E SAIDAS (0) NA PIO MOVWF TRISIO ; MOVLW B'00000000' ;HABILITA PULL-UP DA PIO MOVWF OPTION_REG ;IDEM CLRF ANSEL BSF ANSEL,5 ;SELECIONA OSC/32 BSF ANSEL,0 ;SELECIONA PARA O AN_0 COMO AD CLRF VRCON ;DESLIGA TENSÃO DE REFERENCIA BANK0 MOVLW .7 ;DESLIGA COMPARADORES ANALÓGICOS MOVWF CMCON MOVLW B'10000001';LIGA CONVERSOR AN/DIG (USA TVCC COMO REFERÊNCIA) MOVWF ADCON0 ;ESCOLHE CANAL 0/REF AO VCC/MODO DE SAIDA PARA DIREITA CLRF GPIO ;LIMPA PORTA E C CLRF FLAGS ;IDEM FLAGS MOVLW TEMPO_DELAY ; CARGA INICIAL DE TEMPO DE DELAY MOVWF AUX1 MOVLW .250 ;RECARGA MOVWF AUX ;============================================================================================ ; LOOP PRINCIPAL ;============================================================================================ MAIN CLRF AUX2 ;LIMPA REGISTRADOR PARA DEBUNCE DE CHAVE TDN1 BTFSC B1 ;TESTA BOTÃO SE ACIONADO GOTO F8 ;DEBOUNCE DE TECLA DE 3,3 MS GOTO $+1 ;ATRASA 8 CICLOS GOTO $+1 GOTO $+1 GOTO $+1 DECFSZ AUX2,F GOTO TDN1 ;VAI TESTAR DE NOVO, SE CONTINUA APERTADO GOTO ACIONAR_RL1 ;VAI ACIONAR RELE1 F8 CLRF AUX2 ;LIMPA REGISTRADOR PARA DEBUNCE DE CHAVE TDN2 BTFSC B2 ;TESTA BOTÃO SE ACIONADO GOTO CONTA_TEMPO ;DEBOUNCE DE TECLA DE 3,3 MS GOTO $+1 ;ATRASA 8 CICLOS GOTO $+1 GOTO $+1 GOTO $+1 DECFSZ AUX2,F GOTO TDN2 GOTO ACIONAR_RL2 ;VAI ACIONAR RELE2 ACIONAR_RL2 BSF RL2 BSF LED ; BCF FLAG_LF1 ;ACEITA RECARGA DO TEMPO SE BOTÃO FOR REAPERTADO BTFSS B2 ;ESPERA SOLTAR TECLA GOTO $-1 BTFSC FLAG_LF1 GOTO CONTA_TEMPO CALL LE_POTENCIOMETRO ;LE TENSÃO DO POTENCIOMETRO COMF C0,W ;INVERTE MOVWF C0A COMF C1,W MOVWF C1A BSF FLAG_LF1 GOTO CONTA_TEMPO ACIONAR_RL1 BSF RL1 BSF LED ; BCF FLAG_LF ;ACEITA RECARGA DO TEMPO SE BOTÃO FOR REAPERTADO BTFSS B1 ;ESPERA SOLTAR TECLA GOTO $-1 ;LER1 BTFSC FLAG_LF GOTO CONTA_TEMPO ;VAI CONTAR TEMPO POR INCREMENTOS CALL LE_POTENCIOMETRO COMF C0,W ;INVERTE MOVWF C0B COMF C1,W MOVWF C1B BSF FLAG_LF CONTA_TEMPO ;========================================= ; ACIONA LED SE ESTIVER CONTANDO TEMPO DE ALGUM BOTÃO BTFSC FLAG_LF ;TESTA FLAG GOTO SSF1 BTFSC FLAG_LF1 ;TESTA OUTRO FLAG GOTO SSF1 BCF LED ;APAGA LED GOTO SSF2 SSF1 BSF LED ;MANTEM LED ACESO ;============================================= ;CONTA TEMPO PARA OS DOIS RELES DE FORMA INDEPENDENTE SSF2 INCFSZ C0B,F GOTO SEG7 INCFSZ C1B,F GOTO SEG7 BCF RL1 ;TEMPO AJUSTADO FOI ALCANÇADO, DESLIGA RELE1 BCF FLAG_LF ;RESETA FLAG GOTO MAIN ;VOLTA A ROTINA PRINCIPAL SEG7 INCFSZ C0A,F GOTO T_ADICIONAL INCFSZ C1A,F GOTO T_ADICIONAL BCF RL2 ;TEMPO AJUSTADO FOI ALCANÇADO, DESLIGA RELE2 BCF FLAG_LF1 ;RESETA FLAG GOTO MAIN ;VOLTA A ROTINA PRINCIPAL T_ADICIONAL ; GOTO $+1 ;DESCOMENTE ESTES DOIS 'GOTO $+1' PARA DOBRAR O TEMPO MÁXIMO ; GOTO $+1 NOP DECFSZ AUX,F ;DELAY 1 MILISEGUNDO GOTO T_ADICIONAL MOVLW .250 ;RECARGA MOVWF AUX DECFSZ AUX1,1 GOTO T_ADICIONAL MOVLW TEMPO_DELAY ;RECARGA ; N X 1 MILISEGUNDOS MOVWF AUX1 GOTO MAIN ;============================================================================================ ; SUBROTINAS ;============================================================================================ LE_POTENCIOMETRO ; LE ENTRADA DO PINO 7, LIGADO AO POTENCIOMETRO DE ESCOLHA DE TEMPO. BSF LIGAC ;INICIA CONVERSÃO BTFSC LIGAC ;TESTA SE CHEGOU AO FIM DA CONVERSÃO GOTO $-1 ;SE NÃO LOOP ATÉ TERMINO DA CONVERSÃO MOVFW ADRESH MOVWF C1 ;CARREGA CONTADOR AUXILIAR COM RESULTADO ALTO BANK1 MOVFW ADRESL ;OBTEM A PARTE BAIXA DA CONVERSÃO BANK0 MOVWF C0 ;CARREGA CONTADOR AUXILIAR 1 COM RESULTADO BAIXO RETURN END