Ir ao conteúdo
  • Cadastre-se

Projeto Elevador Usando PIC 16F877A


Evaristo.Bruno

Posts recomendados

Boa tarde pessoal!

Esse é meu primeiro acesso aqui, e já vou começar com uma pergunta.

Estou fazendo um projeto de um elevador de 4 andares, e no decorrer da programação ( em assembly no MPLAB), não conseguir prosseguir pois me perguntei como farei para armazenar as solicitações de chamadas tanto dentro da cabine quanto nos pavimentos e como irei fazer uma leitura simultânea dos botões se o programa é sequencial? Alguém teria alguma ideia?

Obrigado.

Link para o comentário
Compartilhar em outros sites

Oi Evaristo, bem vindo ao Fórum !

voce vai simplesmente ler os botões um a um, sequencial mesmo, e ver qual está apertado e tratar, esqueçe isso de ler ao mesmo tempo, pois um elevador não tem nenhum problema de alguém apertar um botão milissegundos antes de outro e ter a preferência, concorda ?

voce vai precisar implementar sensores de posição, um em cada andar.

E usar duas pontes H para controlar um motor Dc, com uma boa caixa de redução, e para subir ou descer voce inverte o motor com a duas pontes H.

Agora, fazer isso em Assembly..... Uma linguagem de alto nível seria muito mais simples.

Paulo

Link para o comentário
Compartilhar em outros sites

Aphawk, já montei toda essa estrutura, inclusive estou testando no proteus todo o sistema, como abertura de porta, posicionamento do elevador caso fique fora dos sensores e indicação dos andares no display e inclusive estou programando em assembly. Realmente estou com dificuldades para armazer as solicitações de chamadas e depois buscá-las em um registrador. Por exemplo estou no 3º andar, depois tenho que atender o 2º e nesse instante fizeram uma chada no térreo. Entende minha dificuldade?

Senhores, desde já agradeço!

Vtrx, segue parte da minha programação.



#DEFINE BANCO0 BCF STATUS,RP0; SELEÇÃO DE BANCO0
#DEFINE BANCO1 BSF STATUS,RP0; SELEÇÃO DE BANCO1

;NOMEANDO PORTD
#DEFINE BIN3 PORTD,0 ; NOMEIA PINO
#DEFINE BIN2 PORTD,1 ; NOMEIA PINO
#DEFINE BIN1 PORTD,2 ; NOMEIA PINO
#DEFINE BIN0 PORTD,3 ; NOMEIA PINO
#DEFINE BIN_OPEN PORTD,4 ; NOMEIA PINO
#DEFINE BIN_CLOSED PORTD,5 ; NOMEIA PINO
#DEFINE BIN_EMERG PORTD,6 ; NOMEIA PINO
#DEFINE BEX_0 PORTD,7 ; NOMEIA PINO

;NOMEANDO PORTC
#DEFINE PWM1 PORTC,1 ; NOMEIA PINO
#DEFINE PWM2 PORTC,2 ; NOMEIA PINO
#DEFINE OPEN PORTC,3 ; NOMEIA PINO
#DEFINE CLOSED PORTC,4 ; NOMEIA PINO
#DEFINE BUZZY PORTC,5 ; NOMEIA PINO
#DEFINE UP PORTC,6 ; NOMEIA PINO
#DEFINE DOWN PORTC,7 ; NOMEIA PINO

;NOMEANDO PORTA
#DEFINE SC PORTA,0 ; NOMEIA PINO
#DEFINE SOPEN PORTA,1 ; NOMEIA PINO
#DEFINE S0 PORTA,2 ; NOMEIA PINO
#DEFINE S1 PORTA,3 ; NOMEIA PINO
#DEFINE S2 PORTA,5 ; NOMEIA PINO

;NOMEANDO PORTE
#DEFINE S3 PORTE,0 ; NOMEIA PINO

;NOMEANDO PORTB
#DEFINE SFLUX PORTA,0 ; NOMEIA PINO
#DEFINE DISPLAY PORTA,1 ; NOMEIA PINO
#DEFINE DISPLA1 PORTA,2 ; NOMEIA PINO
#DEFINE BEX_3 PORTA,3 ; NOMEIA PINO
#DEFINE BEX_2_UP PORTA,4 ; NOMEIA PINO
#DEFINE BEX_2_D PORTA,5 ; NOMEIA PINO
#DEFINE BEX_1_UP PORTA,6 ; NOMEIA PINO
#DEFINE BEX_1_D PORTA,7 ; NOMEIA PINO



;-------------------------------------------------
TEMP EQU 0X20
TEMP1 EQU 0X21
TEMP2 EQU 0X22
TEMP3 EQU 0X23
TEMP4 EQU 0X24
TEMP5 EQU 0X25


;-------------------------------------------------

ORG 0X00
GOTO SETUP
;-------------------------------------------------

;CONFIGURAÇÃO DAS ENTRADAS E SAÍDAS / DESLIGANDO COMPARADORES / CONFIGURANDO ENTRADAS COMO DIGITAIS

SETUP: BANCO1; CONTÉM TRISA, ADCON E CMCON
MOVLW 0XFF; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISA; CONFIGURA PORTA COMO ENTRADA
MOVLW 0XF9; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISB; CONFIGURA PORTB COMO SAÍDA/ENTRADA
MOVLW 0X00; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISC; CONFIGURA TODOS BITS DO PORTC COMO SAÍDA
MOVLW 0XFF; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISD; CONFIGURA TODOS BITS DO PORTD COMO ENTRADA
MOVLW 0X07; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISE; CONFIGURA TODOS BITS DO PORTE COMO ENTRADA


MOVLW 0X07;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF CMCON; DESLIGA COMPARADOR
MOVLW 0X07;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF ADCON1; DESLIGA COMPARADOR

;-------------------------------------------------

BANCO0
CLRF PORTA; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTA
CLRF PORTB; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTB
CLRF PORTC; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTC
CLRF PORTD; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTD
CLRF PORTE; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTE



GOTO ALARME; VAI PARA PROGRAMA PRINCIPAL

;IDENTIFICAÇÃO E INDICAÇÃO DOS ANDARES ATRAVÉS DO DISPLAY E TESTE DE PORTA

ALARME: BSF BUZZY ; SETA BIT 5 - RC5 ; LIGA ALARME SONORO
INICIO: BTFSS S0 ; VERIFICA SE O SENSOR DO TÉRREO ESTÁ ACIONADO, OU SEJA, SE O ELEVADOR ESTÁ NO TÉRREO - S0
GOTO DESC1 ; SE O SENSOR S0, NÃO ESTIVER ACIONADO FAZ A LEITURA DO SENSOR DO 1º ANDAR - S1
GOTO AND0 ; SE O SENSOR S0,ESTIVER ACIONADO, INDICA NO DISPLAY O N° DO ANDAR

DESC1: BTFSS S1 ; VERIFICA SE O SENSOR DO 1º ANDAR ESTÁ ACIONADO, OU SEJA, SE O ELEVADOR ESTÁ NO 1º ANDAR - S1
GOTO DESC2 ; SE O SENSOR S1, NÃO ESTIVER ACIONADO FAZ A LEITURA DO SENSOR DO 2º ANDAR - S2
GOTO AND1 ; SE O SENSOR S1,ESTIVER ACIONADO, INDICA NO DISPLAY O N° DO ANDAR

DESC2: BTFSS S2 ; VERIFICA SE O SENSOR DO 2º ANDAR ESTÁ ACIONADO, OU SEJA, SE O ELEVADOR ESTÁ NO 2º ANDAR - S2
GOTO DESC3 ; SE O SENSOR S2, NÃO ESTIVER ACIONADO FAZ A LEITURA DO SENSOR DO 3º ANDAR - S3
GOTO AND2 ; SE O SENSOR S2,ESTIVER ACIONADO, INDICA NO DISPLAY O N° DO ANDAR

DESC3: BTFSS S3 ; VERIFICA SE O SENSOR DO 3º ANDAR ESTÁ ACIONADO, OU SEJA, SE O ELEVADOR ESTÁ NO 3º ANDAR - S2
GOTO POSIÇ ; SE O SENSORES S3,S2,S1 E S0 NÃO ESTIVEREM ACIONADOS, O ELEVADOR SERÁ REPOSICIONADO PARA O ANDAR DE BAIXO.
GOTO AND3 ; SE O SENSOR S3,ESTIVER ACIONADO, INDICA NO DISPLAY O N° DO ANDAR

AND0: BCF DOWN ; PÁRA DESCIDA DO ELEVADOR
BCF PORTB,1 ;RESETA BIT 1 - RB1 ; VALOR "ZERO" NO DISPLAY
BCF PORTB,2 ;RESETA BIT 1 - RB2 ; VALOR "ZERO" NO DISPLAY
CALL SEGURA ;VAI PARA SEGURA
GOTO ESPERA0 ; ESPERA CHAMADA


AND1: BCF DOWN ; PÁRA DESCIDA DO ELEVADOR
BSF PORTB,1 ;SETA BIT 1 - RB1 ; VALOR "UM" NO DISPLAY
BCF PORTB,2 ;RESETA BIT 2 - RB2 ; VALOR "UM" NO DISPLAY
CALL SEGURA ; VAI PARA SEGURA
GOTO ESPERA0 ; ESPERA CHAMADA

AND2: BCF DOWN ; PÁRA DESCIDA DO ELEVADOR
BCF PORTB,1 ;RESETA BIT 1 - RB1 ; VALOR "DOIS" NO DISPLAY
BSF PORTB,2 ;SETA BIT 2 - RB2 ; VALOR "DOIS" NO DISPLAY
CALL SEGURA ; VAI PARA SEGURA
GOTO ESPERA0 ; ESPERA CHAMADA


AND3: BCF DOWN ; PÁRA DESCIDA DO ELEVADOR
BSF PORTB,1 ;SETA BIT 1 - RB1 ; VALOR "TRÊS" NO DISPLAY
BSF PORTB,2 ;SETA BIT 2 - RB2 ; VALOR "TRÊS" NO DISPLAY
CALL SEGURA ; VAI PARA SEGURA
GOTO ESPERA0 ; ESPERA CHAMADA


; TEMPO DE ALARME SONORO ACIONADO//TESTE ABERTURA E FECHAMENTO DA PORTA//TEMPO PARA FECHAMENTO DE PORTA

POSIÇ: CALL SEGURA ; FAZ A ROTINA PARA VERIFICAR ESTADO DA PORTA
BSF DOWN ; MANDA O ELEVADOR DESCER ATÉ ENCONTRAR UM SENSOR
GOTO INICIO ; VOLTA PARA INICIO E VERIFICA SE algum SENSOR FOI ATIVADO

; SUB ROTINA PORTA
SEGURA: MOVLW .10 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP2 ;CARREGA A CONSTANTE COM O VALOR 4
LOOP2: MOVLW .100 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP ;CARREGA A CONSTANTE COM O VALOR 100
LOOP: MOVLW .250 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP1 ;CARREGA A CONSTANTE COM O VALOR 250

LOOP1: NOP ;GASTA 1us.
DECFSZ TEMP1,F ;DECREMENTA CONSTANTE TEMP1; GASTA 1us.
GOTO LOOP1 ;TEMP1 DIFERENTE DE ZERO, VAI PARA LOOP1 ; GASTA 2us
DECFSZ TEMP,F ;DECREMENTA CONSTANTE TEMP; GASTA 1us.
GOTO LOOP ;TEMP DIFERENTE DE ZERO, VAI PARA LOOP ; GASTA 2us
DECFSZ TEMP2,F ;DECREMENTA CONSTANTE TEMP2; GASTA 1us.
GOTO LOOP2 ;TEMP2 DIFERENTE DE ZERO, VAI PARA LOOP2 ; GASTA 2us
BCF BUZZY ;RESETA BIT 5 - RC5 ; DESLIGA ALARME SONORO
GOTO ABERTA

; TESTE ABERTURA E FECHAMENTO DA PORTA / TEMPO FECHAMENTO DE PORTA

ABERTA: BTFSS SOPEN ; SE 1 PORTA ABERTA
GOTO FECHADA ; VAI PARA PORTA FECHADA
DOOR: BSF CLOSED ;SETA BIT 4 - RC4 ;FECHA PORTA
BTFSS SC ; VERIFICA SE A PORTA FECHOU
GOTO DOOR ; VOLTA PARA DOOR
BCF CLOSED ; DESLIGA FECHAMENTO DE PORTA
GOTO FECHADA ; INICIO DE FUNCIONAMENTO, ESPERA DE CHAMADA

FECHADA:BTFSS SC ; CASO A PORTA NO MOMENTO DA INICIALIZAÇÃO ESTEJA FORA DE POSIÇÃO, ELE MANDARÁ FECHAR PORTA.
GOTO DOOR ; MANDA FECHAR A PORTA
RETURN ; RETORNA A PROXIMA INSTRUÇÃO DE ONDE FOI CHAMADA

; ESPERA DE CHAMADA

ESPERA0:BTFSS BEX_0 ;VER SE O BOTÃO EXTERNO DO TÉRREO FOI ACIONADO
GOTO ESPERA0
CALL ABRIR ; VAI PARA A SUB ROTINA

BTFSS BIN1 ; VERIFICA SE O BOTÃO INTERNO PARA O 1º ANDAR O ESTÁ ACIONADO
GOTO ESPERAO
INCF 0X27 ; GUARDA STATUS DO BOTÃO EXTERNO DO TÉRREO
BTFSS BIN2 ; VERIFICA SE O BOTÃO INTERNO PARA O 1º ANDAR O ESTÁ ACIONADO
GOTO ESPERAO
INCF 0X28 ; GUARDA STATUS DO BOTÃO EXTERNO DO TÉRREO
BTFSS BIN3 ; VERIFICA SE O BOTÃO INTERNO PARA O 1º ANDAR O ESTÁ ACIONADO
GOTO ESPERAO
INCF 0X29 ; GUARDA STATUS DO BOTÃO EXTERNO DO TÉRREO






; SUB ROTINA ABERTURA DE PORTA PARA PASSAGEM DE PESSOAS
ABRIR: BSF OPEN ;SETA BIT3 - RC3 ;ABRI PORTA
BTFSS SOPEN ; SE 1 PORTA ABERTA
GOTO ABRIR ; CONTINUA ABRINDO PORTA
BCF OPEN ;RESETA BIT - RC3 ;ABRI PORTA

;TEMPO DE PORTA ABERTA
MOVLW .10 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP3 ;CARREGA A CONSTANTE COM O VALOR 4
LOOP3: MOVLW .100 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP4 ;CARREGA A CONSTANTE COM O VALOR 100
LOOP4: MOVLW .250 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP5 ;CARREGA A CONSTANTE COM O VALOR 250

LOOP5: NOP ;GASTA 1us.
DECFSZ TEMP5,F ;DECREMENTA CONSTANTE TEMP5; GASTA 1us.
GOTO LOOP5 ;TEMP1 DIFERENTE DE ZERO, VAI PARA LOOP5 ; GASTA 2us
DECFSZ TEMP4,F ;DECREMENTA CONSTANTE TEMP4; GASTA 1us.
GOTO LOOP4 ;TEMP DIFERENTE DE ZERO, VAI PARA LOOP4 ; GASTA 2us
DECFSZ TEMP3,F ;DECREMENTA CONSTANTE TEMP3; GASTA 1us.
GOTO LOOP3 ;TEMP2 DIFERENTE DE ZERO, VAI PARA LOOP3 ; GASTA 2us
VOL: BSF CLOSED ;SETA BIT 4 - RC4 ;FECHA PORTA
BTFSS SC ; VERIFICA SE A PORTA FECHOU
GOTO VOL ; VOLTA PARA DOOR
BCF CLOSED ; DESLIGA FECHAMENTO DE PORTA
RETURN

END
#INCLUDE <P16F877A.INC>; CHAMA BIBLIOTECA DO PIC

Aphawk, já montei toda essa estrutura, inclusive estou testando no proteus todo o sistema, como abertura de porta, posicionamento do elevador caso fique fora dos sensores e indicação dos andares no display e inclusive estou programando em assembly. Realmente estou com dificuldades para armazer as solicitações de chamadas e depois buscá-las em um registrador. Por exemplo estou no 3º andar, depois tenho que atender o 2º e nesse instante fizeram uma chada no térreo. Entende minha dificuldade?

Senhores, desde já agradeço!

Vtrx, segue parte da minha programação.



#DEFINE BANCO0 BCF STATUS,RP0; SELEÇÃO DE BANCO0
#DEFINE BANCO1 BSF STATUS,RP0; SELEÇÃO DE BANCO1

;NOMEANDO PORTD
#DEFINE BIN3 PORTD,0 ; NOMEIA PINO
#DEFINE BIN2 PORTD,1 ; NOMEIA PINO
#DEFINE BIN1 PORTD,2 ; NOMEIA PINO
#DEFINE BIN0 PORTD,3 ; NOMEIA PINO
#DEFINE BIN_OPEN PORTD,4 ; NOMEIA PINO
#DEFINE BIN_CLOSED PORTD,5 ; NOMEIA PINO
#DEFINE BIN_EMERG PORTD,6 ; NOMEIA PINO
#DEFINE BEX_0 PORTD,7 ; NOMEIA PINO

;NOMEANDO PORTC
#DEFINE PWM1 PORTC,1 ; NOMEIA PINO
#DEFINE PWM2 PORTC,2 ; NOMEIA PINO
#DEFINE OPEN PORTC,3 ; NOMEIA PINO
#DEFINE CLOSED PORTC,4 ; NOMEIA PINO
#DEFINE BUZZY PORTC,5 ; NOMEIA PINO
#DEFINE UP PORTC,6 ; NOMEIA PINO
#DEFINE DOWN PORTC,7 ; NOMEIA PINO

;NOMEANDO PORTA
#DEFINE SC PORTA,0 ; NOMEIA PINO
#DEFINE SOPEN PORTA,1 ; NOMEIA PINO
#DEFINE S0 PORTA,2 ; NOMEIA PINO
#DEFINE S1 PORTA,3 ; NOMEIA PINO
#DEFINE S2 PORTA,5 ; NOMEIA PINO

;NOMEANDO PORTE
#DEFINE S3 PORTE,0 ; NOMEIA PINO

;NOMEANDO PORTB
#DEFINE SFLUX PORTA,0 ; NOMEIA PINO
#DEFINE DISPLAY PORTA,1 ; NOMEIA PINO
#DEFINE DISPLA1 PORTA,2 ; NOMEIA PINO
#DEFINE BEX_3 PORTA,3 ; NOMEIA PINO
#DEFINE BEX_2_UP PORTA,4 ; NOMEIA PINO
#DEFINE BEX_2_D PORTA,5 ; NOMEIA PINO
#DEFINE BEX_1_UP PORTA,6 ; NOMEIA PINO
#DEFINE BEX_1_D PORTA,7 ; NOMEIA PINO



;-------------------------------------------------
TEMP EQU 0X20
TEMP1 EQU 0X21
TEMP2 EQU 0X22
TEMP3 EQU 0X23
TEMP4 EQU 0X24
TEMP5 EQU 0X25


;-------------------------------------------------

ORG 0X00
GOTO SETUP
;-------------------------------------------------

;CONFIGURAÇÃO DAS ENTRADAS E SAÍDAS / DESLIGANDO COMPARADORES / CONFIGURANDO ENTRADAS COMO DIGITAIS

SETUP: BANCO1; CONTÉM TRISA, ADCON E CMCON
MOVLW 0XFF; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISA; CONFIGURA PORTA COMO ENTRADA
MOVLW 0XF9; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISB; CONFIGURA PORTB COMO SAÍDA/ENTRADA
MOVLW 0X00; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISC; CONFIGURA TODOS BITS DO PORTC COMO SAÍDA
MOVLW 0XFF; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISD; CONFIGURA TODOS BITS DO PORTD COMO ENTRADA
MOVLW 0X07; COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TRISE; CONFIGURA TODOS BITS DO PORTE COMO ENTRADA


MOVLW 0X07;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF CMCON; DESLIGA COMPARADOR
MOVLW 0X07;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF ADCON1; DESLIGA COMPARADOR

;-------------------------------------------------

BANCO0
CLRF PORTA; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTA
CLRF PORTB; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTB
CLRF PORTC; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTC
CLRF PORTD; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTD
CLRF PORTE; MANDA NÍVEL LÓGICO ZERO PARA TODOS OS PINOS DO PORTE



GOTO ALARME; VAI PARA PROGRAMA PRINCIPAL

;IDENTIFICAÇÃO E INDICAÇÃO DOS ANDARES ATRAVÉS DO DISPLAY E TESTE DE PORTA

ALARME: BSF BUZZY ; SETA BIT 5 - RC5 ; LIGA ALARME SONORO
INICIO: BTFSS S0 ; VERIFICA SE O SENSOR DO TÉRREO ESTÁ ACIONADO, OU SEJA, SE O ELEVADOR ESTÁ NO TÉRREO - S0
GOTO DESC1 ; SE O SENSOR S0, NÃO ESTIVER ACIONADO FAZ A LEITURA DO SENSOR DO 1º ANDAR - S1
GOTO AND0 ; SE O SENSOR S0,ESTIVER ACIONADO, INDICA NO DISPLAY O N° DO ANDAR

DESC1: BTFSS S1 ; VERIFICA SE O SENSOR DO 1º ANDAR ESTÁ ACIONADO, OU SEJA, SE O ELEVADOR ESTÁ NO 1º ANDAR - S1
GOTO DESC2 ; SE O SENSOR S1, NÃO ESTIVER ACIONADO FAZ A LEITURA DO SENSOR DO 2º ANDAR - S2
GOTO AND1 ; SE O SENSOR S1,ESTIVER ACIONADO, INDICA NO DISPLAY O N° DO ANDAR

DESC2: BTFSS S2 ; VERIFICA SE O SENSOR DO 2º ANDAR ESTÁ ACIONADO, OU SEJA, SE O ELEVADOR ESTÁ NO 2º ANDAR - S2
GOTO DESC3 ; SE O SENSOR S2, NÃO ESTIVER ACIONADO FAZ A LEITURA DO SENSOR DO 3º ANDAR - S3
GOTO AND2 ; SE O SENSOR S2,ESTIVER ACIONADO, INDICA NO DISPLAY O N° DO ANDAR

DESC3: BTFSS S3 ; VERIFICA SE O SENSOR DO 3º ANDAR ESTÁ ACIONADO, OU SEJA, SE O ELEVADOR ESTÁ NO 3º ANDAR - S2
GOTO POSIÇ ; SE O SENSORES S3,S2,S1 E S0 NÃO ESTIVEREM ACIONADOS, O ELEVADOR SERÁ REPOSICIONADO PARA O ANDAR DE BAIXO.
GOTO AND3 ; SE O SENSOR S3,ESTIVER ACIONADO, INDICA NO DISPLAY O N° DO ANDAR

AND0: BCF DOWN ; PÁRA DESCIDA DO ELEVADOR
BCF PORTB,1 ;RESETA BIT 1 - RB1 ; VALOR "ZERO" NO DISPLAY
BCF PORTB,2 ;RESETA BIT 1 - RB2 ; VALOR "ZERO" NO DISPLAY
CALL SEGURA ;VAI PARA SEGURA
GOTO ESPERA0 ; ESPERA CHAMADA


AND1: BCF DOWN ; PÁRA DESCIDA DO ELEVADOR
BSF PORTB,1 ;SETA BIT 1 - RB1 ; VALOR "UM" NO DISPLAY
BCF PORTB,2 ;RESETA BIT 2 - RB2 ; VALOR "UM" NO DISPLAY
CALL SEGURA ; VAI PARA SEGURA
GOTO ESPERA0 ; ESPERA CHAMADA

AND2: BCF DOWN ; PÁRA DESCIDA DO ELEVADOR
BCF PORTB,1 ;RESETA BIT 1 - RB1 ; VALOR "DOIS" NO DISPLAY
BSF PORTB,2 ;SETA BIT 2 - RB2 ; VALOR "DOIS" NO DISPLAY
CALL SEGURA ; VAI PARA SEGURA
GOTO ESPERA0 ; ESPERA CHAMADA


AND3: BCF DOWN ; PÁRA DESCIDA DO ELEVADOR
BSF PORTB,1 ;SETA BIT 1 - RB1 ; VALOR "TRÊS" NO DISPLAY
BSF PORTB,2 ;SETA BIT 2 - RB2 ; VALOR "TRÊS" NO DISPLAY
CALL SEGURA ; VAI PARA SEGURA
GOTO ESPERA0 ; ESPERA CHAMADA


; TEMPO DE ALARME SONORO ACIONADO//TESTE ABERTURA E FECHAMENTO DA PORTA//TEMPO PARA FECHAMENTO DE PORTA

POSIÇ: CALL SEGURA ; FAZ A ROTINA PARA VERIFICAR ESTADO DA PORTA
BSF DOWN ; MANDA O ELEVADOR DESCER ATÉ ENCONTRAR UM SENSOR
GOTO INICIO ; VOLTA PARA INICIO E VERIFICA SE algum SENSOR FOI ATIVADO

; SUB ROTINA PORTA
SEGURA: MOVLW .10 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP2 ;CARREGA A CONSTANTE COM O VALOR 4
LOOP2: MOVLW .100 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP ;CARREGA A CONSTANTE COM O VALOR 100
LOOP: MOVLW .250 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP1 ;CARREGA A CONSTANTE COM O VALOR 250

LOOP1: NOP ;GASTA 1us.
DECFSZ TEMP1,F ;DECREMENTA CONSTANTE TEMP1; GASTA 1us.
GOTO LOOP1 ;TEMP1 DIFERENTE DE ZERO, VAI PARA LOOP1 ; GASTA 2us
DECFSZ TEMP,F ;DECREMENTA CONSTANTE TEMP; GASTA 1us.
GOTO LOOP ;TEMP DIFERENTE DE ZERO, VAI PARA LOOP ; GASTA 2us
DECFSZ TEMP2,F ;DECREMENTA CONSTANTE TEMP2; GASTA 1us.
GOTO LOOP2 ;TEMP2 DIFERENTE DE ZERO, VAI PARA LOOP2 ; GASTA 2us
BCF BUZZY ;RESETA BIT 5 - RC5 ; DESLIGA ALARME SONORO
GOTO ABERTA

; TESTE ABERTURA E FECHAMENTO DA PORTA / TEMPO FECHAMENTO DE PORTA

ABERTA: BTFSS SOPEN ; SE 1 PORTA ABERTA
GOTO FECHADA ; VAI PARA PORTA FECHADA
DOOR: BSF CLOSED ;SETA BIT 4 - RC4 ;FECHA PORTA
BTFSS SC ; VERIFICA SE A PORTA FECHOU
GOTO DOOR ; VOLTA PARA DOOR
BCF CLOSED ; DESLIGA FECHAMENTO DE PORTA
GOTO FECHADA ; INICIO DE FUNCIONAMENTO, ESPERA DE CHAMADA

FECHADA:BTFSS SC ; CASO A PORTA NO MOMENTO DA INICIALIZAÇÃO ESTEJA FORA DE POSIÇÃO, ELE MANDARÁ FECHAR PORTA.
GOTO DOOR ; MANDA FECHAR A PORTA
RETURN ; RETORNA A PROXIMA INSTRUÇÃO DE ONDE FOI CHAMADA

; ESPERA DE CHAMADA

ESPERA0:BTFSS BEX_0 ;VER SE O BOTÃO EXTERNO DO TÉRREO FOI ACIONADO
GOTO ESPERA0
CALL ABRIR ; VAI PARA A SUB ROTINA

BTFSS BIN1 ; VERIFICA SE O BOTÃO INTERNO PARA O 1º ANDAR O ESTÁ ACIONADO
GOTO ESPERAO
INCF 0X27 ; GUARDA STATUS DO BOTÃO EXTERNO DO TÉRREO
BTFSS BIN2 ; VERIFICA SE O BOTÃO INTERNO PARA O 1º ANDAR O ESTÁ ACIONADO
GOTO ESPERAO
INCF 0X28 ; GUARDA STATUS DO BOTÃO EXTERNO DO TÉRREO
BTFSS BIN3 ; VERIFICA SE O BOTÃO INTERNO PARA O 1º ANDAR O ESTÁ ACIONADO
GOTO ESPERAO
INCF 0X29 ; GUARDA STATUS DO BOTÃO EXTERNO DO TÉRREO






; SUB ROTINA ABERTURA DE PORTA PARA PASSAGEM DE PESSOAS
ABRIR: BSF OPEN ;SETA BIT3 - RC3 ;ABRI PORTA
BTFSS SOPEN ; SE 1 PORTA ABERTA
GOTO ABRIR ; CONTINUA ABRINDO PORTA
BCF OPEN ;RESETA BIT - RC3 ;ABRI PORTA

;TEMPO DE PORTA ABERTA
MOVLW .10 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP3 ;CARREGA A CONSTANTE COM O VALOR 4
LOOP3: MOVLW .100 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP4 ;CARREGA A CONSTANTE COM O VALOR 100
LOOP4: MOVLW .250 ;COLOCA UMA LITERAL NO REGISTRADOR W
MOVWF TEMP5 ;CARREGA A CONSTANTE COM O VALOR 250

LOOP5: NOP ;GASTA 1us.
DECFSZ TEMP5,F ;DECREMENTA CONSTANTE TEMP5; GASTA 1us.
GOTO LOOP5 ;TEMP1 DIFERENTE DE ZERO, VAI PARA LOOP5 ; GASTA 2us
DECFSZ TEMP4,F ;DECREMENTA CONSTANTE TEMP4; GASTA 1us.
GOTO LOOP4 ;TEMP DIFERENTE DE ZERO, VAI PARA LOOP4 ; GASTA 2us
DECFSZ TEMP3,F ;DECREMENTA CONSTANTE TEMP3; GASTA 1us.
GOTO LOOP3 ;TEMP2 DIFERENTE DE ZERO, VAI PARA LOOP3 ; GASTA 2us
VOL: BSF CLOSED ;SETA BIT 4 - RC4 ;FECHA PORTA
BTFSS SC ; VERIFICA SE A PORTA FECHOU
GOTO VOL ; VOLTA PARA DOOR
BCF CLOSED ; DESLIGA FECHAMENTO DE PORTA
RETURN

END
#INCLUDE <P16F877A.INC>; CHAMA BIBLIOTECA DO PIC

post-1056991-13884966486945_thumb.jpg

post-1056991-13884966487649_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Para judar a organizar o seu programa,vai uma dica:

Nas suas variáveis;

TEMP EQU 0X20

TEMP1 EQU 0X21

TEMP2 EQU 0X22

TEMP3 EQU 0X23

TEMP4 EQU 0X24

TEMP5 EQU 0X25

Deixe o compilador 'pensar' por voce,use a diretiva 'CBLOCK',essa diretiva separa para voce as variáveis a partir do endereço inicial das variáveis deste micro.

	CBLOCK 0x20
TEMP
TEMP1
TEMP2
TEMP3
TEMP4
TEMP5
FILA
ENDC

Assim voce não precisa especificar os endereços na sequencia,o compilador começa a alocar espaço na memória a partir do endereço 0x20 até achar ENDC.

Para armarzenar as chamadas,voce pode criar uma variável para isto,no exemplo criei a variável 'FILA'.

Ela deve começar zerada e cada botão do 'andar' deve 'setar' um bit desta variavel,assim voce verificar se a variável está vazia e se não for vazia(= 0),voce verifica qual BIT(andar)está setado e executa uma rotina,é só uma ideia.

Sobre a litura simultanea dos botões,é assim mesmo,todo microcontrolador executa as instruções sequencialmente,a velocidade é que da a impressão que esta fazendo tudo junto.

Se voce puder postar o programa completo,talvez possamos fazer juntos pois o código postado fica faltando rotinas e o MPLAB não compila.

Link para o comentário
Compartilhar em outros sites

amigo, eu trabalhei 1 ano e pouco em uma empresa de manutenção de elevador, e tem umas questões interessantes se quiser deixar idêntico kkkkkkk

então vamos la

em um elevador o sistema de chamadas , da certas prioridades, por exemplo, se eu acabo de entrar em um elevador e estou subindo, ele não atende nenhum chamado externo, só atende os chamados externos quando estiver descendo, ha outras formas de prioridades em chamado tipo qual esta mais perto, ou o qual chamado sera mais rápido de atender, mas acho que o mais importante é o primeiro que te expliquei

pode fazer assim, (é até um pouquinho da ideia do vtrx) mas você para cada botão, seta um bit, e verifica qual andar você esta primeiro, ai saberá se terá de subir ou descer, ai sobe ou desce e vá verificando em que andar você esta, e quando passar por um andar que o bit correspondente estiver setado para o elevador

ha outras duas condições notaveis tambem

o elevador só anda com a porta fechada

é preferencial reduzir a velocidade e ir parando aos poucos para isso o sensor deve estar posicionado antes do andar e ter mais que 1

poste mais detalhes do projeto

flow

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Olá pessoal!

Fiquei um tempo sem mexer na programação do elevador e nesse fim de semana fui testar o meu gravador que comprei (pickit2), simulei tanto no MPLAB como no proteus e o circuito funcionou corretamente. Mas quando montei o circuito no protoboard após a gravação do programa, nada funcionou.

Já testei os bits de configuração, verifiquei a ligação, mas a única coisa que está me chamando a atenção é quando vou habitar o MCLR (_MCLRE_ON), o programa não aceita essa instrução. Estou usando um cristal de 4MHz e dois capacitores de 15pF.

Link para o comentário
Compartilhar em outros sites

Mister Nintendo,

Primeiramente obrigado pela sua resposta anterior a essa.

Agora está explicado muito obrigado!

Estava dando uma estuda em um material aqui na net, e vi que não configurei o valor da frequência que irei trabalhar e se iria usar clock externo ou interno. Será que pode ser isso que fez o circuito não funcionar?

http://www.antoniosergiosena.com/files/curso_pic/10_PICmicro_OSC_EEPROM_RESET___senaeng.com.pdf

Link para o comentário
Compartilhar em outros sites

olha com certeza deve-se configurar o clock, mas nesse pic não existe clock interno, deve-se configurar se o clock vira de um circuito com capacitor e resistor, ou se de cristal ou de circuitos osciladores entre outros, deve-se configurar para que o pic prepare o circuito interno para para auxiliar, de modo correto, a fonte de clock, e até onde sei, não precisa informar ao compilador a frequência, porque a rotina sera inteiramente feita por você, que calculara tudo para fazer delays etc .... então o compilador ne precisa dessa informação

flow

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...