Ir ao conteúdo
  • Cadastre-se
Evaristo.Bruno

Projeto Elevador Usando PIC 16F877A

Recommended Posts

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.

Compartilhar este post


Link para o post
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

  • Curtir 1

Compartilhar este post


Link para o post
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

Editado por Bcpetronzio
Unir postes seguidos em menos de 24 horas.

Compartilhar este post


Link para o post
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.

Editado por vtrx
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

vtrx,

Vou seguir suas instruções e dicas. Me ajudou muito com a ideia de criar mais uma variável para armazenar as chamadas.

Durante a semana eu vou trabalhar em cima da programação e te mantenho informado.

Obrigado mesmo!

Compartilhar este post


Link para o post
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

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

A informação é apenas um auxilio,tipo,se voce definir o clock como:

#define Clock 400000

voce pode fazer referencia a palavra Clock que o compilador vai traduzir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×