Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ***************************************
- ; PROJETO 2 - MICROCOMPUTADORES *
- ; *
- ; MCU: PIC16F877A CLOCK: 4MHZ *
- ; *
- ; AUTORES: DAVID RIFF DE F. TENORIO *
- ; DIEGO MAIA HAMILTON *
- ; *
- ; VERSAO: 1.0 (COM INTERRUPCAO) *
- ; DATA: NOVEMBRO DE 2018 *
- ; ***************************************
- #INCLUDE <P16F877A.INC>
- LIST P=16F877A
- ; --- FUSE BITS ---
- __CONFIG _BOREN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF
- ; --- PAGINACAO DE MEMORIA ---
- BANK0 MACRO
- BCF STATUS, RP0
- BCF STATUS, RP1
- ENDM
- BANK1 MACRO
- BSF STATUS, RP0
- BCF STATUS, RP1
- ENDM
- BANK2 MACRO
- BCF STATUS, RP0
- BSF STATUS, RP1
- ENDM
- BANK3 MACRO
- BSF STATUS, RP0
- BSF STATUS, RP1
- ENDM
- ; --- CONSTANTES ---
- DELAY_2S EQU D'236'
- LUZ_BAIXA EQU D'85'
- LUZ_MEDIA EQU D'170'
- TEMP_BAIXA EQU D'102'
- TEMP_MEDIA EQU D'128'
- TEMP_ALTA EQU D'154'
- PWM_10 EQU D'26'
- PWM_25 EQU D'64'
- PWM_75 EQU D'192'
- PWM_90 EQU D'230'
- ; --- ENTRADAS ---
- #DEFINE PRESENCA PORTB, RB0 ; ENTRADA DIGITAL COM INTERRUPCAO
- #DEFINE TEMPERATURA PORTA, RA0 ; ENTRADA ANALOGICA
- #DEFINE LUMINOSIDADE PORTA, RA1 ; ENTRADA ANALOGICA
- #DEFINE PARTIDA PORTB, RB1 ; ENTRADA DIGITAL
- ; --- SAIDAS ---
- #DEFINE VENTILADOR PORTC, RC2 ; SAIDA PWM
- #DEFINE ARCONDICIONADO PORTB, RB2 ; DIGITAL
- #DEFINE LUZ1 PORTB, RB3 ; DIGITAL
- #DEFINE LUZ2 PORTB, RB4 ; DIGITAL
- #DEFINE ON PORTB, RB5 ; DIGITAL
- ; --- DEFINICOES GERAIS ---
- #DEFINE THAB INTCON, TOIE ; HABILITA INTERRUPCAO
- #DEFINE TFLAG INTCON, T0IF ; TIMER OVERFLOW
- #DEFINE EXTFLAG INTCON, INTF ; INTERRUPCAO EXTERNA
- #DEFINE RFLAG INTCON, RBIF ; INTERRUPCAO DE MUDANCA DE ESTADO RB4 - RB7
- #DEFINE INTEDGE OPTION_REG, 6 ; BORDA DA INTERRUPCAO EXTERNA
- #DEFINE PWM_VAL CCPR1L ; COMPRIMENTO DO PULSO DO PWM
- #DEFINE START_CONV ADCON0, 2 ; BIT DE CONTROLE DA CONVERSÃO A/D
- ; --- REGISTRADORES DE USO GERAL ---
- CBLOCK 0X20
- W_TEMP
- STATUS_TEMP
- PCLATH_TEMP
- MINUTO
- TEMPERATURA_F
- LUMINOSIDADE_F
- ; --- ARGUMENTOS PARA ROTINA DE COMPARACAO ---
- NUMERO1
- NUMERO2
- RESULTADO
- ENDC
- ; --- VETOR DE RESET ---
- ORG H'0000' ; ORIGEM NO ENDERECO 0 DE MEMORIA
- GOTO SETUP ; DESVIA DO VETOR DE INTERRUPCAO
- ; --- VETOR DE INTERRUPCAO ---
- ORG H'0004'
- ; --- SALVA CONTEXTO ---
- MOVWF W_TEMP ; COPY W TO TEMP REGISTER
- SWAPF STATUS, W ; SWAP STATUS TO BE SAVED INTO W
- CLRF STATUS ; BANK 0, REGARDLESS OF CURRENT BANK, CLEARS IRP, RP1, RP0
- MOVWF STATUS_TEMP ; SAVE STATUS TO BANK ZERO STATUS_TEMP REGISTER
- MOVF PCLATH, W ; ONLY REQUIRED IF USING PAGES 1, 2 AND/OR 3
- MOVWF PCLATH_TEMP ; SAVE PCLATH INTO W
- CLRF PCLATH ; PAGE ZERO, REGARDLESS OF CURRENT PAGE
- ; --- TRATAMENTO DA ISR ---
- BTFSC EXTFLAG
- GOTO LIGA_INTERRUPCAO
- BTFSC PRESENCA
- GOTO TRATA_ISR
- CALL DESLIGA_TUDO
- GOTO EXIT_ISR
- LIGA_INTERRUPCAO:
- BCF EXTFLAG
- BSF INTCON, TMR0IE
- BSF ADCON0, ADON
- BCF T1CON,0 ; DESATIVA TIMER1 (PWM)
- TRATA_ISR:
- BTFSC TFLAG
- CALL CONTADOR
- ; --- RECUPERACAO DE CONTEXTO ---
- EXIT_ISR:
- MOVF PCLATH_TEMP, W ; RESTORE PCLATH
- MOVWF PCLATH ; MOVE W INTO PCLATH
- SWAPF STATUS_TEMP, W ; SWAP STATUS_TEMP REGISTER INTO W
- ; (SETS BANK TO ORIGINAL STATE)
- MOVWF STATUS ; MOVE W INTO STATUS REGISTER
- SWAPF W_TEMP, F ; SWAP W_TEMP
- SWAPF W_TEMP, W ; SWAP W_TEMP INTO W
- RETFIE
- ; --- SUBROTINAS ---
- DESLIGA_TUDO:
- BCF EXTFLAG
- BCF INTCON, TMR0IE
- BCF ADCON0, ADON
- BCF LUZ1
- BCF LUZ2
- BCF ARCONDICIONADO
- CALL RESET_TIMER
- BCF T1CON,0 ; DESATIVA TIMER1 (PWM)
- CLRF PWM_VAL
- BCF ARCONDICIONADO
- RETURN
- MEDE_TEMPERATURA:
- BANKSEL ADCON0
- MOVF ADCON0,W ; ARMAZENA VALOR DE ADCON0 EM W
- ANDLW B'11000111' ; LIMPA BITS DE SELECAO DO CANAL
- XORLW B'00000000' ; CONFIGURA CANAL 0
- MOVWF ADCON0 ; SALVA CONFIGURACAO EM ADCON0
- BSF START_CONV ; INICIA CONVERSAO
- BTFSC START_CONV ; TESTA FIM DE CONVERSAO
- GOTO $-1 ; ESPERA FIM DE CONVERSAO
- BANKSEL ADRESH
- MOVF ADRESH, W ; MOVE RESULTADO DA CONVERSAO PARA W
- BANKSEL TEMPERATURA_F
- MOVWF TEMPERATURA_F
- CALL COMPARA_TEMPERATURA
- RETURN
- COMPARA_TEMPERATURA:
- MOVF TEMPERATURA_F, W
- MOVWF NUMERO1 ; CARREGA VALOR DE LUMINOSIDADE PARA ROTINAS DE COMPARA��O
- TESTA_TEMP_BAIXA:
- MOVLW TEMP_BAIXA
- MOVWF NUMERO2 ; CARREGA PRIMEIRO LIMITE DE LUMINOSIDADE EM NUMERO2
- CALL MAIOR_QUE ; VERIFICA SE LUMINOSIDADE � MAIOR QUE PRIMEIRO LIMITE
- BTFSS RESULTADO,0
- GOTO TRATA_TEMP_BAIXA ; SE LUMINOSIDADE MENOR QUE PRIMEIRO LIMITE, ACENDE TUDO
- TESTA_TEMP_MEDIA:
- MOVLW TEMP_MEDIA
- MOVWF NUMERO2 ; CARREGA SEGUNDO LIMITE DE LUMINOSIDADE EM NUMERO2
- CALL MAIOR_QUE
- BTFSS RESULTADO,0
- GOTO TRATA_TEMP_MEDIA ; SE LUMINOSIDADE MENOR QUE SEGUNDO LIMITE, ACENDE METADE
- TESTA_TEMP_ALTA:
- MOVLW TEMP_ALTA
- MOVWF NUMERO2
- CALL MAIOR_QUE
- BTFSS RESULTADO,0
- GOTO TRATA_TEMP_ALTA
- GOTO TRATA_TEMP_MUITO_ALTA
- TRATA_TEMP_BAIXA:
- MOVLW PWM_10 ;
- MOVWF PWM_VAL ;
- BCF ARCONDICIONADO
- GOTO END_TEMPERATURA
- TRATA_TEMP_MEDIA:
- MOVLW PWM_25 ;
- MOVWF PWM_VAL ;
- BCF ARCONDICIONADO
- GOTO END_TEMPERATURA
- TRATA_TEMP_ALTA:
- MOVLW PWM_75 ;
- MOVWF PWM_VAL ;
- BSF ARCONDICIONADO
- GOTO END_TEMPERATURA
- TRATA_TEMP_MUITO_ALTA:
- MOVLW PWM_90 ;
- MOVWF PWM_VAL ;
- BSF ARCONDICIONADO
- END_TEMPERATURA:
- RETURN
- MEDE_LUMINOSIDADE:
- BANKSEL ADCON0
- MOVF ADCON0,W ; ARMAZENA VALOR DE ADCON0 EM W
- ANDLW B'11000111' ; LIMPA BITS DE SELECAO DO CANAL
- XORLW B'00001000' ; CONFIGURA CANAL 1
- MOVWF ADCON0 ; SALVA CONFIGURACAO EM ADCON0
- BSF START_CONV ; INICIA CONVERSAO
- BTFSC START_CONV ; TESTA FIM DE CONVERSAO
- GOTO $-1 ; ESPERA FIM DE CONVERSAO
- BANKSEL ADRESH
- MOVF ADRESH, W ; MOVE RESULTADO DA CONVERSAO PARA W
- BANKSEL LUMINOSIDADE_F
- MOVWF LUMINOSIDADE_F
- CALL COMPARA_LUMINOSIDADE ; OPERA LUZES DE ACORDO COM A LUMINOSIDADE
- RETURN
- COMPARA_LUMINOSIDADE:
- MOVF LUMINOSIDADE_F, W
- MOVWF NUMERO1 ; CARREGA VALOR DE LUMINOSIDADE PARA ROTINAS DE COMPARA��O
- TESTA_LUZ_BAIXA:
- MOVLW LUZ_BAIXA
- MOVWF NUMERO2 ; CARREGA PRIMEIRO LIMITE DE LUMINOSIDADE EM NUMERO2
- CALL MAIOR_QUE ; VERIFICA SE LUMINOSIDADE � MAIOR QUE PRIMEIRO LIMITE
- BTFSS RESULTADO,0
- GOTO TRATA_LUZ_BAIXA ; SE LUMINOSIDADE MENOR QUE PRIMEIRO LIMITE, ACENDE TUDO
- TESTA_LUZ_MEDIA:
- MOVLW LUZ_MEDIA
- MOVWF NUMERO2 ; CARREGA SEGUNDO LIMITE DE LUMINOSIDADE EM NUMERO2
- CALL MAIOR_QUE
- BTFSS RESULTADO,0
- GOTO TRATA_LUZ_MEDIA ; SE LUMINOSIDADE MENOR QUE SEGUNDO LIMITE, ACENDE METADE
- GOTO TRATA_LUZ_ALTA ; SE LUMINOSIDADE MAIOR QUE SEGUNDO LIMITE, APAGA TUDO
- TRATA_LUZ_BAIXA:
- BSF LUZ1 ; ACENDE LUZ1
- BSF LUZ2 ; ACENDE LUZ2
- GOTO END_LUMINOSIDADE
- TRATA_LUZ_MEDIA:
- BSF LUZ1 ; ACENDE LUZ1
- BCF LUZ2 ; APAGA LUZ2
- GOTO END_LUMINOSIDADE
- TRATA_LUZ_ALTA:
- BCF LUZ1 ; APAGA LUZ1
- BCF LUZ2 ; APAGA LUZ2
- END_LUMINOSIDADE:
- RETURN
- CONTADOR:
- BCF TFLAG
- CALL RESET_TIMER
- DECFSZ MINUTO ; SE PASSOU UM MINUTO, TRATA TEMPERATURA
- GOTO TRATA_LUMINOSIDADE ; CASO CONTRÁRIO, TRATA LUMINOSIDADE
- TRATA_TEMPERATURA:
- CALL MEDE_TEMPERATURA
- MOVLW D'30'
- MOVWF MINUTO ; RECARREGA CONTADOR DE MINUTO
- GOTO END_CONTADOR
- TRATA_LUMINOSIDADE:
- CALL MEDE_LUMINOSIDADE
- END_CONTADOR:
- RETURN
- MAIOR_QUE:
- CLRF RESULTADO
- MOVF NUMERO1, W
- SUBWF NUMERO2, W
- BTFSC STATUS, Z
- GOTO END_COMP
- BTFSC STATUS, C
- GOTO END_COMP
- MOVLW H'01' ; NUMERO1 E MAIOR QUE NUMERO2
- MOVWF RESULTADO
- END_COMP:
- RETURN
- RESET_TIMER:
- MOVLW DELAY_2S
- MOVWF TMR0
- RETURN
- ; --- PROGRAMA PRINCIPAL ---
- SETUP:
- BANKSEL TRISD
- CLRF PORTD
- CLRF TRISD ; CONFIGURA PORTA D COMO SAÍDA
- BANKSEL TRISC
- CLRF PORTC
- CLRF TRISC ; CONFIGURA PORTA C COMO SAÍDA
- BANKSEL OPTION_REG
- MOVLW B'11110001' ; HABILITA CLOCK EXTERNO
- MOVWF OPTION_REG ; DEFINE OPCOES DE OPERACAO: PULLUPS DA PORTAB DESATIVADOS
- ; BORDA DE SUBIDA EM RB0, PRESCALER DE 1:2 DO TMR0
- ; -- CONFIGURACAO DO PWM --
- BANKSEL T1CON
- BSF T1CON,0 ; ATIVA TIMER1
- MOVWF T1CON
- MOVLW B'00001100' ; CONFIGURA 2 LSB DO DUTY CYCLE DO PWM PARA 0
- ; CONFIGURA TIMER 1 NO MODO PWM
- MOVWF CCP1CON
- ; -- CONFIGURACAO DE I/O --
- BANKSEL PORTB ; SELECIONA BANK0
- CLRF PORTB ; LIMPA SAIDAS EM PORTB
- BANKSEL TRISB
- MOVLW H'03'
- MOVWF TRISB ; CONFIGURA RB<1:0> COMO INPUTS
- BANKSEL INTCON
- MOVLW H'00'
- MOVWF INTCON ; INICIA COM TODAS AS INTERRUPCOES DESATIVADAS
- BANKSEL PORTC
- CLRF PORTC
- BANKSEL TRISC
- CLRF TRISC ; CONFIGURA RC0 COMO OUTPUT
- ; -- CONFIGURACAO DO CONVERSOR A/D --
- BANKSEL PORTA ; SELECIONA BANK0
- CLRF PORTA ; LIMPA OS OUTPUTS NA PORTA
- BANKSEL ADCON1 ; SELECIONA O BANK1
- MOVLW B'00000100' ; CONFIGURA RA<1:0> COMO ENTRADAS ANALOGICAS, VDD/VSS COMO REFERENCIA
- ; CONFIGURA FOSC/2
- ; CONFIGURA JUSTIFICADO A ESQUERDA
- MOVWF ADCON1
- BANKSEL TRISA
- MOVLW B'00000011' ; CONFIGURA RA<1:0> COMO INPUTS
- MOVWF TRISA
- BANKSEL ADCON0
- MOVLW B'00000001'
- MOVWF ADCON0 ; CONFIGURA FOSC/2, LIGA CONVERSOR
- CLRF TMR0
- BCF TFLAG
- MOVLW DELAY_2S
- MOVWF TMR0
- MOVLW D'30'
- MOVWF MINUTO
- CLRF PWM_VAL
- MAIN:
- BTFSS PARTIDA
- GOTO MAIN
- BSF ON
- BANKSEL INTCON
- MOVLW B'10111000' ; ATIVA INTERRUPCAO: GLOBAL, TIMER0, RB0, RB4-7
- MOVWF INTCON
- ; BANKSEL PIE1
- ; MOVLW B'01000000' ; ATIVA INTERRUPCAO DO CONVERSOR A/D
- ; MOVWF PIE1
- GOTO $
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement