Advertisement
Guest User

Untitled

a guest
Nov 11th, 2018
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 12.09 KB | None | 0 0
  1. ; ***************************************
  2. ; PROJETO 2 - MICROCOMPUTADORES         *
  3. ;                                       *
  4. ; MCU: PIC16F877A   CLOCK: 4MHZ         *
  5. ;                                       *
  6. ; AUTORES: DAVID RIFF DE F. TENORIO     *
  7. ;          DIEGO MAIA HAMILTON          *
  8. ;                                       *
  9. ; VERSAO: 1.0 (COM INTERRUPCAO)         *
  10. ; DATA: NOVEMBRO DE 2018                *
  11. ; ***************************************
  12.  
  13. #INCLUDE <P16F877A.INC>
  14.  
  15.     LIST        P=16F877A
  16.  
  17. ; --- FUSE BITS ---
  18.     __CONFIG     _BOREN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF
  19.  
  20. ; --- PAGINACAO DE MEMORIA ---
  21. BANK0   MACRO
  22.         BCF     STATUS, RP0
  23.         BCF     STATUS, RP1
  24.         ENDM
  25.  
  26. BANK1   MACRO
  27.         BSF     STATUS, RP0
  28.         BCF     STATUS, RP1
  29.         ENDM
  30.  
  31. BANK2   MACRO
  32.         BCF     STATUS, RP0
  33.         BSF     STATUS, RP1
  34.         ENDM
  35.  
  36. BANK3   MACRO
  37.         BSF     STATUS, RP0
  38.         BSF     STATUS, RP1
  39.         ENDM              
  40.  
  41. ; --- CONSTANTES ---
  42. DELAY_2S    EQU     D'236'
  43. LUZ_BAIXA   EQU     D'85'
  44. LUZ_MEDIA   EQU     D'170'
  45. TEMP_BAIXA  EQU     D'102'
  46. TEMP_MEDIA  EQU     D'128'
  47. TEMP_ALTA   EQU     D'154'
  48. PWM_10      EQU     D'26'
  49. PWM_25      EQU     D'64'
  50. PWM_75      EQU     D'192'
  51. PWM_90      EQU     D'230'    
  52.  
  53. ; --- ENTRADAS ---
  54. #DEFINE     PRESENCA        PORTB, RB0   ; ENTRADA DIGITAL COM INTERRUPCAO
  55. #DEFINE     TEMPERATURA     PORTA, RA0   ; ENTRADA ANALOGICA
  56. #DEFINE     LUMINOSIDADE    PORTA, RA1   ; ENTRADA ANALOGICA
  57. #DEFINE     PARTIDA         PORTB, RB1   ; ENTRADA DIGITAL
  58.  
  59. ; --- SAIDAS ---
  60. #DEFINE     VENTILADOR      PORTC, RC2   ; SAIDA PWM
  61. #DEFINE     ARCONDICIONADO  PORTB, RB2   ; DIGITAL
  62. #DEFINE     LUZ1            PORTB, RB3   ; DIGITAL
  63. #DEFINE     LUZ2            PORTB, RB4   ; DIGITAL
  64. #DEFINE     ON              PORTB, RB5   ; DIGITAL
  65.  
  66. ; --- DEFINICOES GERAIS ---
  67. #DEFINE     THAB        INTCON, TOIE     ; HABILITA INTERRUPCAO
  68. #DEFINE     TFLAG       INTCON, T0IF     ; TIMER OVERFLOW
  69. #DEFINE     EXTFLAG     INTCON, INTF     ; INTERRUPCAO EXTERNA
  70. #DEFINE     RFLAG       INTCON, RBIF     ; INTERRUPCAO DE MUDANCA DE ESTADO RB4 - RB7
  71. #DEFINE     INTEDGE     OPTION_REG, 6    ; BORDA DA INTERRUPCAO EXTERNA
  72. #DEFINE     PWM_VAL     CCPR1L           ; COMPRIMENTO DO PULSO DO PWM
  73. #DEFINE     START_CONV  ADCON0, 2        ; BIT DE CONTROLE DA CONVERSÃO A/D
  74.  
  75.  
  76. ; --- REGISTRADORES DE USO GERAL ---
  77.     CBLOCK 0X20
  78.         W_TEMP
  79.         STATUS_TEMP
  80.         PCLATH_TEMP
  81.        
  82.         MINUTO
  83.         TEMPERATURA_F
  84.         LUMINOSIDADE_F
  85.  
  86.         ; --- ARGUMENTOS PARA ROTINA DE COMPARACAO ---
  87.         NUMERO1
  88.         NUMERO2
  89.         RESULTADO
  90.     ENDC
  91.  
  92. ; --- VETOR DE RESET ---
  93.     ORG         H'0000'                 ; ORIGEM NO ENDERECO 0 DE MEMORIA
  94.     GOTO        SETUP                   ; DESVIA DO VETOR DE INTERRUPCAO
  95.  
  96. ; --- VETOR DE INTERRUPCAO ---              
  97.     ORG         H'0004'
  98.  
  99. ; --- SALVA CONTEXTO ---
  100.     MOVWF       W_TEMP                  ; COPY W TO TEMP REGISTER
  101.     SWAPF       STATUS, W               ; SWAP STATUS TO BE SAVED INTO W
  102.     CLRF        STATUS                  ; BANK 0, REGARDLESS OF CURRENT BANK, CLEARS IRP, RP1, RP0
  103.     MOVWF       STATUS_TEMP             ; SAVE STATUS TO BANK ZERO STATUS_TEMP REGISTER
  104.     MOVF        PCLATH, W               ; ONLY REQUIRED IF USING PAGES 1, 2 AND/OR 3
  105.     MOVWF       PCLATH_TEMP             ; SAVE PCLATH INTO W
  106.     CLRF        PCLATH                  ; PAGE ZERO, REGARDLESS OF CURRENT PAGE
  107.  
  108. ; --- TRATAMENTO DA ISR ---
  109.     BTFSC       EXTFLAG
  110.     GOTO        LIGA_INTERRUPCAO
  111.    
  112.     BTFSC       PRESENCA
  113.     GOTO        TRATA_ISR
  114.     CALL        DESLIGA_TUDO
  115.     GOTO        EXIT_ISR
  116.  
  117. LIGA_INTERRUPCAO:
  118.     BCF         EXTFLAG
  119.     BSF         INTCON, TMR0IE
  120.     BSF         ADCON0, ADON
  121.     BCF         T1CON,0                 ; DESATIVA TIMER1 (PWM)
  122.  
  123. TRATA_ISR:
  124.     BTFSC       TFLAG
  125.     CALL        CONTADOR
  126.  
  127. ; --- RECUPERACAO DE CONTEXTO ---
  128. EXIT_ISR:
  129.     MOVF        PCLATH_TEMP, W           ; RESTORE PCLATH
  130.     MOVWF       PCLATH                   ; MOVE W INTO PCLATH
  131.     SWAPF       STATUS_TEMP, W           ; SWAP STATUS_TEMP REGISTER INTO W
  132.                                          ; (SETS BANK TO ORIGINAL STATE)
  133.    
  134.     MOVWF       STATUS                   ; MOVE W INTO STATUS REGISTER
  135.     SWAPF       W_TEMP, F                ; SWAP W_TEMP
  136.     SWAPF       W_TEMP, W                ; SWAP W_TEMP INTO W
  137.     RETFIE
  138.  
  139. ; --- SUBROTINAS ---
  140. DESLIGA_TUDO:
  141.     BCF         EXTFLAG
  142.     BCF         INTCON, TMR0IE
  143.     BCF         ADCON0, ADON
  144.     BCF         LUZ1
  145.     BCF         LUZ2
  146.     BCF         ARCONDICIONADO
  147.     CALL        RESET_TIMER
  148.     BCF         T1CON,0                 ; DESATIVA TIMER1 (PWM)
  149.     CLRF        PWM_VAL
  150.     BCF         ARCONDICIONADO
  151.     RETURN
  152.  
  153. MEDE_TEMPERATURA:
  154.     BANKSEL     ADCON0
  155.     MOVF        ADCON0,W                ; ARMAZENA VALOR DE ADCON0 EM W
  156.     ANDLW       B'11000111'             ; LIMPA BITS DE SELECAO DO CANAL
  157.     XORLW       B'00000000'             ; CONFIGURA CANAL 0
  158.     MOVWF       ADCON0                  ; SALVA CONFIGURACAO EM ADCON0
  159.  
  160.     BSF         START_CONV              ; INICIA CONVERSAO
  161.     BTFSC       START_CONV              ; TESTA FIM DE CONVERSAO
  162.     GOTO        $-1                     ; ESPERA FIM DE CONVERSAO
  163.     BANKSEL     ADRESH
  164.     MOVF        ADRESH, W               ; MOVE RESULTADO DA CONVERSAO PARA W
  165.     BANKSEL     TEMPERATURA_F
  166.     MOVWF       TEMPERATURA_F
  167.     CALL        COMPARA_TEMPERATURA
  168.  
  169.     RETURN
  170.  
  171. COMPARA_TEMPERATURA:
  172.     MOVF        TEMPERATURA_F, W
  173.     MOVWF       NUMERO1                 ; CARREGA VALOR DE LUMINOSIDADE PARA ROTINAS DE COMPARA��O
  174. TESTA_TEMP_BAIXA:
  175.     MOVLW       TEMP_BAIXA
  176.     MOVWF       NUMERO2                 ; CARREGA PRIMEIRO LIMITE DE LUMINOSIDADE EM NUMERO2
  177.     CALL        MAIOR_QUE               ; VERIFICA SE LUMINOSIDADE � MAIOR QUE PRIMEIRO LIMITE
  178.     BTFSS       RESULTADO,0            
  179.     GOTO        TRATA_TEMP_BAIXA        ; SE LUMINOSIDADE MENOR QUE PRIMEIRO LIMITE, ACENDE TUDO
  180. TESTA_TEMP_MEDIA:
  181.     MOVLW       TEMP_MEDIA
  182.     MOVWF       NUMERO2                 ; CARREGA SEGUNDO LIMITE DE LUMINOSIDADE EM NUMERO2
  183.     CALL        MAIOR_QUE
  184.     BTFSS       RESULTADO,0
  185.     GOTO        TRATA_TEMP_MEDIA            ; SE LUMINOSIDADE MENOR QUE SEGUNDO LIMITE, ACENDE METADE
  186. TESTA_TEMP_ALTA:
  187.     MOVLW       TEMP_ALTA
  188.     MOVWF       NUMERO2
  189.     CALL        MAIOR_QUE
  190.     BTFSS       RESULTADO,0
  191.     GOTO        TRATA_TEMP_ALTA
  192.     GOTO        TRATA_TEMP_MUITO_ALTA
  193. TRATA_TEMP_BAIXA:
  194.     MOVLW       PWM_10                  ;
  195.     MOVWF       PWM_VAL                 ;
  196.     BCF         ARCONDICIONADO
  197.     GOTO        END_TEMPERATURA
  198. TRATA_TEMP_MEDIA:  
  199.     MOVLW       PWM_25                  ;
  200.     MOVWF       PWM_VAL                 ;
  201.     BCF         ARCONDICIONADO
  202. GOTO        END_TEMPERATURA
  203. TRATA_TEMP_ALTA:
  204.     MOVLW       PWM_75                  ;
  205.     MOVWF       PWM_VAL                 ;
  206.     BSF         ARCONDICIONADO
  207.     GOTO        END_TEMPERATURA
  208. TRATA_TEMP_MUITO_ALTA:
  209.     MOVLW       PWM_90                  ;
  210.     MOVWF       PWM_VAL                 ;
  211.     BSF         ARCONDICIONADO
  212. END_TEMPERATURA:
  213.     RETURN
  214.  
  215. MEDE_LUMINOSIDADE:
  216.     BANKSEL     ADCON0
  217.     MOVF        ADCON0,W                ; ARMAZENA VALOR DE ADCON0 EM W
  218.     ANDLW       B'11000111'             ; LIMPA BITS DE SELECAO DO CANAL
  219.     XORLW       B'00001000'             ; CONFIGURA CANAL 1
  220.     MOVWF       ADCON0                  ; SALVA CONFIGURACAO EM ADCON0
  221.  
  222.     BSF         START_CONV              ; INICIA CONVERSAO
  223.     BTFSC       START_CONV              ; TESTA FIM DE CONVERSAO
  224.     GOTO        $-1                     ; ESPERA FIM DE CONVERSAO
  225.     BANKSEL     ADRESH
  226.     MOVF        ADRESH, W               ; MOVE RESULTADO DA CONVERSAO PARA W
  227.     BANKSEL     LUMINOSIDADE_F
  228.     MOVWF       LUMINOSIDADE_F
  229.     CALL        COMPARA_LUMINOSIDADE    ; OPERA LUZES DE ACORDO COM A LUMINOSIDADE
  230.    
  231.     RETURN
  232.  
  233. COMPARA_LUMINOSIDADE:
  234.     MOVF        LUMINOSIDADE_F, W
  235.     MOVWF       NUMERO1                 ; CARREGA VALOR DE LUMINOSIDADE PARA ROTINAS DE COMPARA��O
  236. TESTA_LUZ_BAIXA:
  237.     MOVLW       LUZ_BAIXA
  238.     MOVWF       NUMERO2                 ; CARREGA PRIMEIRO LIMITE DE LUMINOSIDADE EM NUMERO2
  239.     CALL        MAIOR_QUE               ; VERIFICA SE LUMINOSIDADE � MAIOR QUE PRIMEIRO LIMITE
  240.     BTFSS       RESULTADO,0            
  241.     GOTO        TRATA_LUZ_BAIXA         ; SE LUMINOSIDADE MENOR QUE PRIMEIRO LIMITE, ACENDE TUDO
  242. TESTA_LUZ_MEDIA:
  243.     MOVLW       LUZ_MEDIA
  244.     MOVWF       NUMERO2                 ; CARREGA SEGUNDO LIMITE DE LUMINOSIDADE EM NUMERO2
  245.     CALL        MAIOR_QUE
  246.     BTFSS       RESULTADO,0
  247.     GOTO        TRATA_LUZ_MEDIA         ; SE LUMINOSIDADE MENOR QUE SEGUNDO LIMITE, ACENDE METADE
  248.     GOTO        TRATA_LUZ_ALTA          ; SE LUMINOSIDADE MAIOR QUE SEGUNDO LIMITE, APAGA TUDO
  249. TRATA_LUZ_BAIXA:
  250.     BSF         LUZ1                    ; ACENDE LUZ1
  251.     BSF         LUZ2                    ; ACENDE LUZ2
  252.     GOTO        END_LUMINOSIDADE
  253. TRATA_LUZ_MEDIA:
  254.     BSF         LUZ1                    ; ACENDE LUZ1
  255.     BCF         LUZ2                    ; APAGA LUZ2
  256.     GOTO        END_LUMINOSIDADE
  257. TRATA_LUZ_ALTA:
  258.     BCF         LUZ1                    ; APAGA LUZ1
  259.     BCF         LUZ2                    ; APAGA LUZ2
  260. END_LUMINOSIDADE:
  261.     RETURN
  262.  
  263. CONTADOR:
  264.     BCF         TFLAG
  265.     CALL        RESET_TIMER
  266.     DECFSZ      MINUTO                   ; SE PASSOU UM MINUTO, TRATA TEMPERATURA
  267.     GOTO        TRATA_LUMINOSIDADE       ; CASO CONTRÁRIO, TRATA LUMINOSIDADE
  268. TRATA_TEMPERATURA:
  269.     CALL        MEDE_TEMPERATURA
  270.     MOVLW       D'30'                  
  271.     MOVWF       MINUTO                   ; RECARREGA CONTADOR DE MINUTO
  272.     GOTO        END_CONTADOR
  273. TRATA_LUMINOSIDADE:
  274.     CALL        MEDE_LUMINOSIDADE
  275. END_CONTADOR:
  276.     RETURN
  277.  
  278. MAIOR_QUE:
  279.     CLRF        RESULTADO
  280.     MOVF        NUMERO1, W
  281.     SUBWF       NUMERO2, W
  282.     BTFSC       STATUS, Z
  283.     GOTO        END_COMP
  284.     BTFSC       STATUS, C
  285.     GOTO        END_COMP
  286.     MOVLW       H'01'                    ; NUMERO1 E MAIOR QUE NUMERO2
  287.     MOVWF       RESULTADO
  288. END_COMP:
  289.     RETURN
  290.  
  291. RESET_TIMER:
  292.     MOVLW      DELAY_2S
  293.     MOVWF      TMR0
  294.     RETURN
  295.  
  296. ; --- PROGRAMA PRINCIPAL ---
  297. SETUP:
  298.     BANKSEL     TRISD
  299.     CLRF        PORTD
  300.     CLRF        TRISD                   ; CONFIGURA PORTA D COMO SAÍDA            
  301.  
  302.     BANKSEL     TRISC
  303.     CLRF        PORTC
  304.     CLRF        TRISC                   ; CONFIGURA PORTA C COMO SAÍDA            
  305.    
  306.     BANKSEL     OPTION_REG
  307.     MOVLW       B'11110001'             ; HABILITA CLOCK EXTERNO
  308.     MOVWF       OPTION_REG              ; DEFINE OPCOES DE OPERACAO: PULLUPS DA PORTAB DESATIVADOS
  309.                                         ; BORDA DE SUBIDA EM RB0, PRESCALER DE 1:2 DO TMR0
  310.  
  311.     ; -- CONFIGURACAO DO PWM --
  312.     BANKSEL     T1CON
  313.     BSF         T1CON,0                 ; ATIVA TIMER1
  314.     MOVWF       T1CON
  315.     MOVLW       B'00001100'             ; CONFIGURA 2 LSB DO DUTY CYCLE DO PWM PARA 0
  316.                                         ; CONFIGURA TIMER 1 NO MODO PWM
  317.     MOVWF       CCP1CON
  318.  
  319.     ; -- CONFIGURACAO DE I/O --
  320.     BANKSEL     PORTB                   ; SELECIONA BANK0
  321.     CLRF        PORTB                   ; LIMPA SAIDAS EM PORTB
  322.     BANKSEL     TRISB
  323.     MOVLW       H'03'
  324.     MOVWF       TRISB                   ; CONFIGURA RB<1:0> COMO INPUTS
  325.  
  326.     BANKSEL     INTCON
  327.     MOVLW       H'00'
  328.     MOVWF       INTCON                  ; INICIA COM TODAS AS INTERRUPCOES DESATIVADAS
  329.  
  330.     BANKSEL     PORTC
  331.     CLRF        PORTC
  332.     BANKSEL     TRISC
  333.     CLRF        TRISC                   ; CONFIGURA RC0 COMO OUTPUT
  334.  
  335.      ; -- CONFIGURACAO DO CONVERSOR A/D --
  336.     BANKSEL     PORTA                   ; SELECIONA BANK0
  337.     CLRF        PORTA                   ; LIMPA OS OUTPUTS NA PORTA
  338.     BANKSEL     ADCON1                  ; SELECIONA O BANK1
  339.     MOVLW       B'00000100'             ; CONFIGURA RA<1:0> COMO ENTRADAS ANALOGICAS, VDD/VSS COMO REFERENCIA
  340.                                         ; CONFIGURA FOSC/2
  341.                                         ; CONFIGURA JUSTIFICADO A ESQUERDA
  342.     MOVWF       ADCON1
  343.     BANKSEL     TRISA
  344.     MOVLW       B'00000011'             ; CONFIGURA RA<1:0> COMO INPUTS
  345.     MOVWF       TRISA
  346.     BANKSEL     ADCON0
  347.     MOVLW       B'00000001'
  348.     MOVWF       ADCON0                  ; CONFIGURA FOSC/2, LIGA CONVERSOR              
  349.  
  350.     CLRF        TMR0
  351.     BCF         TFLAG
  352.     MOVLW       DELAY_2S
  353.     MOVWF       TMR0
  354.  
  355.     MOVLW       D'30'
  356.     MOVWF       MINUTO
  357.  
  358.     CLRF       PWM_VAL
  359.  
  360. MAIN:
  361.     BTFSS      PARTIDA
  362.     GOTO       MAIN
  363.     BSF        ON
  364.     BANKSEL    INTCON
  365.     MOVLW      B'10111000'              ; ATIVA INTERRUPCAO: GLOBAL, TIMER0, RB0, RB4-7
  366.     MOVWF      INTCON
  367.     ; BANKSEL    PIE1
  368.     ; MOVLW      B'01000000'              ; ATIVA INTERRUPCAO DO CONVERSOR A/D
  369.     ; MOVWF      PIE1
  370.     GOTO        $
  371.  
  372.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement