Ir ao conteúdo
  • Cadastre-se

Alarme Residencial - PIC16F877A Assembly


Posts recomendados

ola a todos, 

 

 recentemente como trabalho de aplicação em curso de graduação recebi a tarefa de confeccionar um alarme residencial implementado 

no  pic16f877a, programado em assembly, apos elaboração do programa e simulação do proteus, o mesmo não executa as tarefas solicitadas,

creio que seja algo alem da configuração de entradas e saídas.

estarei postando abaixo o código inicial, para que se possível  alguém dos sr's possa me ajudar.

 

ressaltando, ainda está na fase de elaboração, alguns passos ou rotinas podem estar incorretos.

 

o funcionamento básico se deve por meio de sensores que quando em nível baixo ativam as rotinas de alarme, uma chave para ligar e desligar o alarme, 

como saídas, leds de advertência, uma sirene e um discador para sms.

 

 

;;;;;;;;;;;;;;;;;alarme residencial;;;;;;;;;;;;;;;;;;

    list p=16f877a
    #include     

    __config h'3f32'
    errorlevel -302,-305

    cblock 0x20
    contador,contador1,contador2,contador3
    endc

    org        0x00
    goto    inicio
    nop
    nop
    nop

inicio:
    bcf        status,rp0
    bcf        status,rp1
    bsf        status,rp1
    movlw    0x0e
    movwf    adcon1
    movlw    0xff
    movwf    trisa
    movwf    trise
    clrf    trisb
    clrf    trisd
    clrf    trisc
    bcf        status,rp0
    clrf    contador        ; limpa valores do contador

 

principal:    
    call    delay05        ; gasto de tempo para refazer os testes
    btfss    porte,1        ; testa porta e0 se for um pula pra rotina de teste dos sensores
    btfsc    porte,1        ; testa porta e0 se for zero pula para rotina de gasto de tempo
    goto    teste        ; vai para rotina de testes dos sensores
    goto    principal    ; vai para principal testar a porta novamente (alarme não esta ligado)

 

;;;;;;;;;;;;;;;;;;delay de 500ms;;;;;;;;;;;;;;;;;;    
delay05:                
    movlw    d'181'
    movwf    contador1
    movlw    d'175'
    movwf    contador2
    movlw    d'13'
    movwf    contador3
    decfsz    contador1,1
    goto    $-1
    decfsz    contador2,1
    goto    $-3
    decfsz    contador3,1
    goto    $-5
    return

;;;;;;;;;;;;;;;;;;delay de 3ms;;;;;;;;;;;;;;;;;;    
delay03:
    movlw    d'147'
    movwf    contador1
    movlw    d'16'
    movwf    contador2
    decfsz    contador1,f
    goto    $-1
    decfsz    contador2,1
    goto    $-3
    return

;;;;;;;;;;;;;;;;;;delay de 15s;;;;;;;;;;;;;;;;;;
delay15:
    nop
    return

 

;;;;;;;;;;;;;;;;;;teste das chaves;;;;;;;;;;;;;;;;;;    
; porta com nivel alto está ok.
; porta com nivel baixo starta a contagem.

teste:
    goto t1

t1:
    call    delay05
    btfss    porta,0        ; janela 1 está trancada?
    btfsc    porta,0        ; janela 1 foi aberta?
    goto    t2            ; trancada!! testa outro sensor.
    goto    alarme1        ; destrancada!! vai para alarme1.
            
t2:
    call    delay05
    btfss    porta,1        ; janela 1 está trancada?
    btfsc    porta,1        ; janela 1 foi aberta?
    goto    t3            ; trancada!! testa outro sensor.
    goto    alarme2        ; destrancada!! vai para alarme2.

t3:
    call    delay05
    btfss    porta,2        ; porta 1 está trancada?
    btfsc    porta,2        ; porta 1 foi aberta?
    goto    t4            ; trancada!! testa outro sensor.
    goto    alarme3        ; destrancada!! vai para alarme3.

t4:
    call    delay05
    btfss    porta,3        ; tem alguem na casa?
    btfsc    porta,3        ; tem alguem na casa?
    goto    t5            ; não! testa outro sensor.
    goto    alarme4        ; sim!! vai para alarme4

t5:
    call    delay05
    btfss    porta,4        ; casa ta pengando fogo?
    btfsc    porta,4        ; casa ta pegando fogo?
    goto    t6            ; não!! testa outro sensor.
    goto    alarme5        ; sim!!!! vai pra alarme5

t6:
    call    delay05
    btfss    porta,5        ; porta 2 está trancada?
    btfsc    porta,5        ; porta 2 foi aberta?
    goto    t7            ; trancada!! testa outro sensor.
    goto    alarme6        ; destrancada!! vai para alarme6.

t7:
    call    delay05
    btfss    porte,0        ; alguem passou no infrared?
    btfsc    porte,0        ; alguem passou no infrared?
    goto    ok            ; não! então volta e verifica tudo
    goto    alarme7        ; passou!! vai para alarme7

ok:
    goto teste

 

;;;;;;;;;;;;;;;;;;alarmes;;;;;;;;;;;;;;;;;;
alarme1:
    call    delay15        ; conta 15 segundos tempo para desabilitar o alarme.
    btfss    porte,1        ; testa porta e0 se for um pula para acionamento das sirenes.
    goto     principal    ; desligaram a chave, alarme desligado
    goto    sirene1        ; vai para rotina sinalização.

alarme2:
    call    delay15        ; conta 15 segundos tempo para desabilitar o alarme.
    btfss    porte,1        ; testa porta e0 se for um pula para acionamento das sirenes.
    goto     principal    ; desligaram a chave, alarme desligado
    goto    sirene2        ; vai para rotina sinalização.

alarme3:

    call    delay15        ; conta 15 segundos tempo para desabilitar o alarme.
    btfss    porte,1        ; testa porta e0 se for um pula para acionamento das sirenes.
    goto     principal    ; desligaram a chave, alarme desligado
    goto    sirene3        ; vai para rotina sinalização.

alarme4:
    call    delay15        ; conta 15 segundos tempo para desabilitar o alarme.
    btfss    porte,1        ; testa porta e0 se for um pula para acionamento das sirenes.
    goto     principal    ; desligaram a chave, alarme desligado
    goto    sirene4        ; vai para rotina sinalização.

alarme5:
    call    delay15        ; conta 15 segundos tempo para desabilitar o alarme.
    btfss    porte,1        ; testa porta e0 se for um pula para acionamento das sirenes.
    goto     principal    ; desligaram a chave, alarme desligado
    goto    sirene5        ; vai para rotina sinalização.

alarme6:
    call    delay15        ; conta 15 segundos tempo para desabilitar o alarme.
    btfss    porte,1        ; testa porta e0 se for um pula para acionamento das sirenes.
    goto     principal    ; desligaram a chave, alarme desligado
    goto    sirene6        ; vai para rotina sinalização.

alarme7:
    call    delay15        ; conta 15 segundos tempo para desabilitar o alarme
    btfss    porte,1        ; testa porta e0 se for um pula para acionamento das sirenes
    goto     principal    ; desligaram a chave, alarme desligado
    goto    sirene7        ; vai para rotina sinalização.

 

;;;;;;;;;;;;;;;;;;sirenes;;;;;;;;;;;;;;;;;;

sirene1:
    bsf        portb,0        ; move nivel alto para led do alarme
    bsf        portd,0        ; move nivel alto para sirene
    bsf        portd,1        ; move nivel alto para o discador
    goto    standyby    ; apos acionamento fica esperando resetarem.

sirene2:
    bsf        portb,1        ; move nivel alto para led do alarme
    bsf        portd,0        ; move nivel alto para sirene.
    bsf        portd,1        ; move nivel alto para o discador.
    goto    standyby    ; apos acionamento fica esperando resetarem.

sirene3:
    bsf        portb,2        ; move nivel alto para led do alarme
    bsf        portd,0        ; move nivel alto para sirene.
    bsf        portd,1        ; move nivel alto para o discador.
    goto    standyby    ; apos acionamento fica esperando resetarem.

sirene4:
    bsf        portb,3        ; move nivel alto para led do alarme
    bsf        portd,0        ; move nivel alto para sirene.
    bsf        portd,1        ; move nivel alto para o discador.
    goto    standyby    ; apos acionamento fica esperando resetarem.

sirene5:
    bsf        portb,4        ; move nivel alto para led do alarme
    bsf        portd,0        ; move nivel alto para sirene.
    bsf        portd,1        ; move nivel alto para o discador.
    goto    standyby    ; apos acionamento fica esperando resetarem.

sirene6:
    bsf        portb,5        ; move nivel alto para led do alarme
    bsf        portd,0        ; move nivel alto para sirene.
    bsf        portd,1        ; move nivel alto para o discador.
    goto    standyby    ; apos acionamento fica esperando resetarem.

sirene7:
    bsf        portb,6        ; move nivel alto para led do alarme
    bsf        portd,0        ; move nivel alto para sirene.
    bsf        portd,1        ; move nivel alto para o discador.
    goto    standyby    ; apos acionamento fica esperando resetarem.


;;;;;;;;;;;;;;;;;;standyby;;;;;;;;;;;;;;;;;;
standyby:
    call    delay05        ; gasta 0,5s para novo teste
    btfsc    porte,1        ; testa porta e0 se for zero pula para principal
    goto    $-2            ; volta e faz novo teste.
    goto    desligando    ; desligaram o alarme, desliga tudo.


;;;;;;;;;;;;;;;;;;desligando;;;;;;;;;;;;;;;;;;
desligando:
    clrf    trisb
    clrf    trisd
    goto    principal

    end

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...