Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* TITULO: CONTROLE DE SAÍDA DE VEÍCULOS DE GARAGEM *
- ;* *
- ;* *
- ;* DESENVOLVIDO PELO GRUPO: *
- ;* => ALICE DUQUE BELFORT DE OLIVEIRA *
- ;* => PEDRO JORGE AMÉRICO ISHIMARU *
- ;* *
- ;* *
- ;* VERSÃO: ALFA DATA: 8/05/2016 *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* DESCRIÇÃO DO ARQUIVO *
- ;*-----------------------------------------------------------------*
- ;* COMENTÁRIOS E DESCRIÇÃO DO PROBLEMA PROPOSTO: *
- ;* MODELO DE PROGRAMA PARA OS ALUNOS DE MICROCOMPUTADORES *
- ;* *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* ARQUIVOS DE DEFINIÇÕES *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- #INCLUDE <P16F628A.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628A
- __CONFIG _BOREN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* PAGINAÇÃO DE MEMÓRIA *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA
- #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
- #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MEMÓRIA
- ;*************************************************************************
- ;* DEFINIÇÕES GERAIS *
- ;*************************************************************************
- ;DEFINIÇÃO DE MNEMÔNICOS PARA ACESSO A BITS DE REGISTRADORES ESPECIAIS
- #DEFINE GENHAB INTCON, GIE ;HABILITA A INTERRUPÇÃO GERAL
- #DEFINE TIMHAB INTCON, T0IE ;HABILITA A INTERRUPÇÃO POR TIMER0
- #DEFINE RB47FLAG INTCON, RBIF ;FLAG SINALIZADOR DE INTERRUPÇÃO EM RB4-7
- #DEFINE TFLAG INTCON, T0IF ;FLAG SINALIZADOR DE ESTOURO DO TIMER
- #DEFINE RB0FLAG INTCON, INTF ;FLAG SINALIZADOR DE INTERRUPÇÃO EM RB0
- #DEFINE ANFLAG PIR1, CMIF ;FLAG SINALIZADOR DE MUDANÇA NO COMPARADOR
- ;ANALOGICO
- #DEFINE RB47HAB INTCON, RBIE ;HABILITA A INTERRUPÇAO POR RB4-7
- #DEFINE RB0HAB INTCON, INTE ;HABILITA A INTERRUPÇÃO POR RB0
- #DEFINE C2 CMCON, C2OUT
- #DEFINE C1 CMCON, C1OUT
- ;************************************************************************
- ;* VARIÁVEIS *
- ;************************************************************************
- ;DEFINIÇÃO DO BLOCO DE VARIÁVEIS
- CBLOCK 0x20 ;ENDEREÇO INICIAL DA MÉMORIA DO USUÁRIO
- CRACHA ;VARIÁVEL DE ARMAZENAR NUMERO DE CRACHAS
- COUNT
- W_TEMP
- STATUS_TEMP
- ESTADO
- COUNTTIMER ;VARIÁVEL PARA CONTAR ESTOUROS DO TIMER -PJ
- ENDC ;FIM DE BLOCO DE VARIÁVEIS
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* FLAGS *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA
- #DEFINE ZERO STATUS,Z ;FLAG Z DO REGISTRADOR STATUS
- ;PARA IDENFICAR SE O RESULTADO DA
- ;ULTIMA OPERAÇÃO FOI ZERO
- ;(NÃO => Z=0, SIM => Z=1 )
- ;************************************************************************
- ;* CONSTANTES *
- ;************************************************************************
- ;DEFINIÇÃO DAS CONSTANTES UTILIZADAS NO PROGRAMA
- ;BASE DE TEMPO DO TIMER SERÁ DE 10HZ. O DELAY PODE SER CALCULADO USANDO A
- ;EXPRESSÃO: D=((CONTMAX - N)*PRESCALER)/F;
- ;ONDE D= DELAY DESEJADO EM SEGUNDO, N= CONSTANTE A SER COLOCADO NO REGISTRO TIMER
- ; F= FREQUENCIA DO OSCILADOR EXERNO EM HERTZ , CONTMAX = 256 PARA TMR0
- CICLO_DELAY EQU .36 ;DELAY DE 10MS PARA CLOCK INTERNO DE 48KHZ
- ; A RELAÇAO É: CICLO_TOTAL = 3*4x + 10*4
- ; LOGO PARA F = 48000, CICLO_TOTAL = 480
- ; ENTAO CICLOS_DELAY = (480-40)/12 = 36.
- CRACHAMAX EQU .2 ;NUMERO MAX DE CRACHAS ACEITOS
- LIMTIMER EQU .15 ;NUMERO DE VEZES QUE O TIMER VAI ESTORAR PARA PASSAR 10mS -PJ
- ;************************************************************************
- ;PARA ESCREVER EM HEXA: 0x1F
- ;PARA ESCREVER EM DECIMAL: .132
- ;PARA ESCREVER EM BINÁRIO: B'10010000'
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* ENTRADAS *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA
- #DEFINE START PORTB,5 ;BOTÃO DE PARTIDA
- #DEFINE L1 PORTB,4 ;LAÇO 1 (1: carro detectado)
- #DEFINE L2 PORTB,0 ;LAÇO 2
- #DEFINE SLUZ PORTA,2 ;SENSOR DE LUMINOSIDADE
- #DEFINE REFLUZ1 PORTA,0 ;REFERENCIA 1 PARA LUZ
- #DEFINE REFLUZ2 PORTA,1 ;REFERENCIA 2 PARA LUZ
- #DEFINE PRESENCA PORTB,6 ;DETECTA PRESENÇA (1: SER detectado)
- #DEFINE CIN PORTB,7 ;ENTRADA DE CRACHÁ
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* SAÍDAS *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA
- ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1)
- #DEFINE RED PORTA,7 ;LED VERMELHO
- #DEFINE YELLOW PORTB,2 ;LED AMARELO
- #DEFINE GREEN PORTB,1 ;LED VERDE
- #DEFINE GATE PORTB,3 ;ABRE E FECHA A CANCELA
- #DEFINE LUZ1 PORTA,4 ;ACENDE LUZ 1
- #DEFINE LUZ2 PORTA,3 ;ACENDE LUZ 2
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* VETOR DE RESET *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO
- GOTO INICIO
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* INICIO DA INTERRUPÇÃO *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO
- MOVWF W_TEMP ;COPIA W PARA W_TEMP
- SWAPF STATUS,W
- MOVWF STATUS_TEMP ;COPIA STATUS PARA STATUS_TEMP
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* ROTINA DE ATENDIMENTO DA INTERRUPÇÃO *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- BCF GENHAB ;DESABILITA INTERRUPÇÃO
- BTFSC TFLAG ;OCORREU UMA INTERRUPCAO DO TIMER? -PJ
- GOTO INT_TIMER ;SIM, VA PARA ROTINA DE ESTOURO DO TIMER -PJ
- BTFSC ANFLAG ;NAO, OCORREU INTERRUPÇAO DO COMPARADOR ANALOGICO?
- GOTO INT_LUZ ;SIM, VA TRATAR A ILUMINAÇAO
- BTFSC RB0FLAG ;NAO, OCORREU UMA INTERRUPÇÃO DE RB0 (L2)?
- GOTO INT_L2 ;SIM, VA PARA ROTINA DE L2
- BTFSC RB47FLAG ;NAO, OCORREU UMA INTERRUPCAO EM RB4-7?
- GOTO INT_RB47 ;SIM, VA PARA ROTINA DE RB4-7
- GOTO SAI_INT ;NAO, SAI DA INTERRUPCAO
- INT_L2 ;DETECTA BORDA DE DESCIDA DO LAÇO 2
- BCF RB0FLAG ;LIMPAR O FLAG
- MOVLW .3
- XORWF ESTADO,0
- BTFSC ZERO
- GOTO $+2
- GOTO SAI_INT
- BSF GATE ;ENVIA SINAL DE PULSO PARA FECHAR A CANCELA
- ;****;ENVIANDO PULSO;****** -PJ
- BCF RB0HAB ;DESABILITA INTERRUPÇÃO DE RB0
- BCF RB47HAB ;DESABILITA INTERRUPÇÃO DE RB4-7
- BSF TIMHAB ;HABILITA INTERRUPÇÃO POR TEMPO (ELE VAI DESABILITAR UMA VEZ QUE TIVER ENVIADO O PULSO)
- ;**************************
- BCF GATE
- BCF YELLOW
- BSF GREEN
- MOVLW .1
- MOVWF ESTADO
- BCF RB0HAB
- BSF RB47HAB
- GOTO SAI_INT
- INT_RB47
- BTFSC L1 ;L1 FOI ACIONADO?
- GOTO INT_L1 ;SIM, TRATA L1
- BTFSC START ;NAO, START FOI ACIONADO?
- GOTO INT_START ;SIM, TRATA START
- BTFSC CIN ;NAO, ENTROU CRACHA?
- GOTO INT_CIN ;SIM, TRATA CRACHA
- GOTO INT_PRESENCA ;NAO, SO SOBROU PRESENÇA, TRATA PRESENÇA
- INT_L1
- BCF RB47FLAG
- MOVLW .1
- XORWF ESTADO,0
- BTFSC ZERO
- GOTO $+2
- GOTO SAI_INT
- BCF GREEN
- BSF YELLOW
- MOVLW .2
- MOVWF ESTADO
- ;****;ENVIANDO PULSO;****** -PJ
- BCF RB0HAB ;DESABILITA INTERRUPÇÃO DE RB0
- BCF RB47HAB ;DESABILITA INTERRUPÇÃO DE RB4-7
- BSF TIMHAB ;HABILITA INTERRUPÇÃO POR TEMPO (ELE VAI DESABILITAR UMA VEZ QUE TIVER ENVIADO O PULSO)
- ;**************************
- BCF RB0HAB
- BSF RB47HAB
- GOTO SAI_INT
- INT_START
- BCF RB47FLAG
- MOVLW .1
- MOVWF ESTADO
- BSF GREEN
- BCF RB0HAB
- BSF RB47HAB
- GOTO SAI_INT
- INT_CIN
- BCF RB47FLAG
- MOVLW .2
- XORWF ESTADO,0
- BTFSC ZERO
- GOTO $+2
- GOTO SAI_INT
- DECF CRACHA
- BSF GATE
- CALL SET_DELAY10
- BCF GATE
- MOVLW .3
- MOVWF ESTADO
- BSF RB0HAB
- BCF RB47HAB
- GOTO SAI_INT
- INT_PRESENCA
- BCF RB47FLAG
- BTFSS PRESENCA
- GOTO APAGA_LUZ
- GOTO SAI_INT
- APAGA_LUZ
- BCF LUZ1
- BCF LUZ2
- GOTO SAI_INT
- INT_LUZ
- BCF ANFLAG
- BTFSC C2 ;Vin > Vref2?
- GOTO LUZ_ACESA ;SIM? ACENDE TUDO
- BTFSC C1 ;NAO? VIN > Vref1?
- GOTO MEIA_LUZ ;SIM? ACENDE METADE
- GOTO APAGA_LUZ ;NAO? APAGA LUZ
- LUZ_ACESA
- BSF LUZ1
- BSF LUZ2
- GOTO SAI_INT
- MEIA_LUZ
- BSF LUZ1
- BCF LUZ2
- GOTO SAI_INT
- INT_TIMER ;-PJ
- XORWF COUNTTIMER,0 ;VERIFICA SE O CONTADOR ESTÁ EM ZERO
- BTFSC ZERO ;VERIFICA O FLAG ZERO NA SAÍDA
- GOTO REINICIATIMER ;VAI PARA REINICIAR O DELAY
- DECFSZ COUNTTIMER ;NÃO? DECREMENTA O CONTADOR DO TEMPO
- GOTO SAI_INT
- REINICIATIMER ;-PJ
- BCF TIMHAB ;DESABILITA INTERRUPÇÃO POR TIMER.
- MOVLW LIMTIMER ;REINICIA O VALOR DO CONTADOR
- MOVWF COUNTTIMER ;REINICIA O VALOR DO CONTADOR
- GOTO SAI_INT ;SAI DA INTERRUPÇÃO
- ;*************************************************************************
- ;* SAÍDA DA INTERRUPÇÃO *
- ;*************************************************************************
- SAI_INT
- SWAPF STATUS_TEMP,W
- MOVWF STATUS ;MOVE STATUS_TEMP PARA STATUS
- SWAPF W_TEMP,W ;MOVE W_TEMP PARA W
- RETFIE
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* DEFINIÇÃO DE ROTINAS E SUB-ROTINAS: *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;LIMPA_TUDO ;CONDIÇÕES INICIAIS
- ; CLRF CONTADOR ;ZERAR CONTADOR DE NUMERO DE CICLOS DE ATIVAÇÃO
- ; CLRF PORTA ;ZERAR PORTA A
- ; CLRF PORTB ;ZERAR PORTA B
- ; RETURN
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;DELAY ;ROTINA DE 1 SEGUNDOS
- ; CLRF TMR0 ;
- ; BCF TFLAG ;LIMPA O FLAG DE ESTOURO DE CONTAGEM DO TMR0
- ; MOVLW DELAY_1S ;MOVE O VALOR DE DELAY DE 1 SEG PARA W
- ; MOVWF TMR0 ;MOVE O VALOR DE DELAY DE 1 SEG PARA TMR0
- ;DELAY1
- ; BTFSS TFLAG ;A CONTAGEM DE 1 SEGUNDO TERMINOU?
- ; GOTO DELAY1 ;NÃO, VOLTA PARA TESTAR
- ; RETURN
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- SET_DELAY10 ;SETA O DELAY
- ;A ROTINA LEVA 6 CICLOS PARA CHEGAR NO DECREMENTAL
- ;O DECREMENTAL (DELAY10) LEVA 3 CICLOS POR DECREMENTO
- ;(EM MEDIA, CONSIDERANDO O CICLO DE RETURN NO FINAL)
- ;LEVA 3 CICLO PRA VOLTAR AO PROGRAMA PRINCIPAL
- ;DEPOIS QUE ELE VOLTA PRO PROGRAMA, AINDA TEM UM CICLO
- ;PRA DESLIGAR O BIT. LOGO SAO 4 CICLOS NO TOTAL.
- MOVLW CICLO_DELAY
- MOVWF COUNT
- CALL DELAY10
- RETURN
- DELAY10
- DECFSZ COUNT
- GOTO $-1
- RETURN
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* INICIO DO PROGRAMA *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- INICIO
- BANK1 ;ALTERA PARA O BANCO 1
- MOVLW B'00100111' ;IN: RA0,RA1,RA2,RA5 / OUT: RA3,RA4,RA6,RA7
- MOVWF TRISA ;CONFIGURA ENTRADAS E SAÍDAS DA PORTA A
- MOVLW B'11110001' ;IN:RB0,RB4,RB5,RB6,RB7 / OUT:RB1,RB3
- MOVWF TRISB ;CONFIGURA ENTRADAS E SAÍDAS DA PORTA B
- MOVLW B'10000100' ;PULL-UPS DESABILITADOS E PRESCALER NO TMR0 DIVDINDO A FREQUENCIA PARA 1500HZ -PJ
- MOVWF OPTION_REG ;DEFINE OPÇÕES DE OPERAÇÃO
- MOVLW B'00000000' ;UTILIZAR CRISTAL INTERNO DE 48KHz
- MOVWF PCON
- MOVLW B'01000000' ;ATIVAR INTERRUPÇAO DO COMPARADOR ANALOGICO
- MOVWF PIE1
- BANK0 ;ALTERA PARA O BANCO 0
- MOVLW B'00000011' ;ENTRADAS ANALOGICAS NA CONFIGURAÇAO DESEJADA
- MOVWF CMCON
- MOVLW B'11011000'
- MOVWF INTCON ;DEFINE OPÇÕES DE INTERRUPÇÃO
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;* ROTINA PRINCIPAL *
- ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- MAIN
- MOVLW .0
- MOVWF ESTADO
- BCF RB0HAB
- BCF RED
- BCF YELLOW
- BCF GREEN
- BCF GATE
- BSF LUZ1
- BCF LUZ2
- MOVLW CRACHAMAX ;SETAR O VALOR MAXIMO DE CRACHAS PERMITIDO
- MOVWF CRACHA
- BSF GENHAB
- GOTO TESTAR_PARTIDA
- TESTAR_PARTIDA
- SLEEP
- MOVLW .1 ;VERIFICA SE A INTERRUPÇÃO QUE ACORDOU FOI O START
- XORWF ESTADO,0
- BTFSC ZERO
- GOTO STANDBY ;SE SIM, VAI PARA STANDBY
- GOTO TESTAR_PARTIDA ;SE NAO, ESPERA A PARTIDA NOVAMENTE
- STANDBY ;AQUI SE STÁ SEMPRE TESTANDO A LOTAÇAO DE CRACHAS:
- SLEEP
- MOVLW B'00000000' ;OPERAÇAO XOR COM O BYTE 0
- XORWF CRACHA,0
- BTFSC ZERO ;TESTA O FLAG ZERO DA SAIDA
- GOTO CRACHAFULL ;CASO ESTEJA ACIONADO, O TOTEM ESTA CHEIO DE CRACHAS
- GOTO STANDBY ;CASO CONTRARIO, AGUARDAR CARRO SE APROXIMAR
- CRACHAFULL ;NAO CABE MAIS CRACHA NO TOTEM
- BCF GENHAB
- BCF GREEN ;DESLIGAR LUZ VERDE
- BSF RED ;LIGAR LUZ VERMELHA
- GOTO CRACHAFULL ;AGUARDA O OPERADOR DAR RESET
- ;STANDBY ;TESTA PRIMEIRO LAÇO MAGNETICO
- ; BSF GREEN;
- ; BCF RED;
- ; BCF YELLOW;
- ; SLEEP ;L1 ACORDA
- ; NOP
- ; SLEEP ;CIN ACORDA
- ; NOP
- ; SLEEP ;QUEDA DE L2 ACORDA
- ; NOP
- ; GOTO TESTAR_CRACHA
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement