25
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ COORDENAÇÃO DE ELETRÔNICA CURSO DE ENGENHARIA ELÉTRICA CRISTIANO PIVA LEANDRO DE MARCHI PINTOS MARCIO DE ANDRADE VOGT CONTROLE DE UM ELEVADOR BASEADO NA UTILIZAÇÃO DE MICROCONTROLADOR TRABALHO DE CONCLUSÃO DA DISCIPLINA DE SISTEMAS MICROCONTROLADOS PATO BRANCO 2010

Relatorio_Elevador1

Embed Size (px)

Citation preview

Page 1: Relatorio_Elevador1

UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ

COORDENAÇÃO DE ELETRÔNICA

CURSO DE ENGENHARIA ELÉTRICA

CRISTIANO PIVA

LEANDRO DE MARCHI PINTOS

MARCIO DE ANDRADE VOGT

CONTROLE DE UM ELEVADOR BASEADO NA UTILIZAÇÃO DE

MICROCONTROLADOR

TRABALHO DE CONCLUSÃO DA DISCIPLINA DE SISTEMAS

MICROCONTROLADOS

PATO BRANCO

2010

Page 2: Relatorio_Elevador1

1

CRISTIANO PIVA

LEANDRO DE MARCHI PINTOS

MÁRCIO DE ANDRADE VOGT

CONTROLE DE UM ELEVADOR BASEADO NA UTILIZAÇÃO DE

MICROCONTROLADOR

Trabalho de graduação apresentado como

requisito parcial para aprovação na disciplina de

Sistemas Microcontrolados do Curso Superior de

Engenharia Elétrica da Coordenação de

Eletrônica – COELE – da Universidade

Tecnológica Federal do Paraná Campus Pato

Branco.

Prof. Ms. Fábio Luiz Bertotti

PATO BRANCO

2010

Page 3: Relatorio_Elevador1

2

RESUMO

Este trabalho apresenta o desenvolvimento e concepção da lógica de controle de um elevador

utilizando um microcontrolador MC9S08AW60 da família HCS08A da empresa americana

Freescale®. Toda a lógica proposta para o elevador é apresentada inicialmente sobre a forma

de fluxogramas, descrita a partir alguns critérios de operação. A lógica de funcionamento é

concebida a partir de conhecimentos prévios da forma de operação de um elevador comercial,

de modo que o projeto desenvolvido seja verossímil às situações reais de implementação de

um sistema de controle para um elevador.

Palavras-Chave: Elevadores, Microcontroladores, lógica de controle.

This work presents the development and design of control logic of an elevator using a

microcontroller MC9S08AW60 family HCS08A of the U.S. company Freescale ®. All the

proposed logic for the elevator is initially presented in flowchart from some operation

criterion. The logic of operation is designed from previous knowledge of mode of operation a

commercial elevator, so that the developed project is plausible that real situations of

implementation of control systems for an elevator.

Key-words: Elevators, microcontrollers, control logic.

Page 4: Relatorio_Elevador1

3

SUMÁRIO

INTRODUÇÃO........................................................................................................................4

DESCRIÇÃO DO PROBLEMA............................................................................................4

MATERIAIS UTILIZADOS..................................................................................................5

Microcontrolador MC9S08AW60..............................................................................5

LED...............................................................................................................................6

Display de 7 Segmentos...............................................................................................6

DESENVOLVIMENTO..........................................................................................................7

Descrição do sistema....................................................................................................7

Definição dos critérios de lógica.................................................................................7

Interface com o usuário.............................................................................................10

LED’s de indicação de andar....................................................................................11

Display de 7 segmentos..............................................................................................12

Botões de Comando...................................................................................................12

Código implementado no Microcontrolador...........................................................15

CONCLUSÃO........................................................................................................................24

REFERÊNCIAS.....................................................................................................................24

Page 5: Relatorio_Elevador1

4

INTRODUÇÃO

Com a verticalização das cidades há um cenário em que o uso de elevadores torna-se

imprescindível, tanto pela comodidade e conforto quanto pelas questões de acessibilidade a

pessoas idosas ou com deficiências físicas. O plano diretor da maioria das cidades brasileiras

exige em regulamentações que edificações cujo número de pavimentos seja igual ou maior

que quatro pavimentos possuam ao menos um elevador de passageiros.

O crescimento do número de elevadores em uso leva a estudos sobre formas de

aumentar a eficiência deste tipo de sistema. Dois aspectos principais são frequentemente

usados para determinar o quão eficiente um sistema de elevadores é. O primeiro deles diz

respeito ao tempo de espera médio para os usuários do sistema. O segundo critério diz

respeito à eficiência energética do sistema, isto é, obter a melhor relação entre atendimento

das chamadas e consumo de energia.

A melhoria de ambos os critérios de eficiência em sistemas com elevadores pode ser

conseguida a partir do desenvolvimento de lógicas que levem em conta aspectos como o

tráfego de passageiros, frequência de chamadas e o tipo de edificação, entre outros.

O uso de microcontroladores em sistemas de controle em geral tem sido abordado

constantemente nos últimos anos por serem sistemas versáteis, de baixo custo e com uma

gama grande de dispositivos, que possibilitam o uso tanto em aplicações bastante especificas

e com alta demanda de processamento quanto em sistemas simples, como o controle de

luminosidade ou temperatura de um ambiente.

Se comparado a sistemas que utilizam componentes convencionais, como portas

lógicas e outros componentes analógicos, esse tipo de sistema possibilita manutenção e

atualizações mais simples e também mais confiabilidade ao sistema, já que o sistema é menos

susceptível a variações nas condições do ambiente em que é empregado.

DESCRIÇÃO DO PROBLEMA

Neste trabalho é proposta uma lógica de controle similar às dos sistemas comerciais

com um único elevador para transporte de passageiros. O projeto desenvolvido visa

implementar a lógica de controle de um elevador para um edifício com 5 andares e cuja

interface com o usuário é feita através de botões internos á cabine e botões de chamada em

Page 6: Relatorio_Elevador1

5

cada um dos andares, além de displays de sete segmentos, que indicam a posição atual do

elevador, e LED’s que indicam o sentido de movimento do elevador, o esquema proposto esta

mostrado na Figura 1.

A implementação dos algoritmos desenvolvidos é feita em um microcontrolador da

família HCS08 modelo MC9S08AW60 fornecido pela Freescale®.

TÉRREO

PISO 1

PISO 2

PISO 3

PISO 4

PISO 5

Setas luminosas para indicar se o elevador esta subindo ou descendo

Figura 1 – Esquema do Elevador no Condomínio.

MATERIAIS UTILIZADOS

Esta seção descreve todos os componentes utilizados para o desenvolvimento e

implementação do sistema de controle para elevador descrito anteriormente.

Microcontrolador MC9S08AW60

A placa de desenvolvimento utilizada possui o microcontrolador MC9S08AW60 que

possui a característica de ser um microcontrolador de baixo custo e alta performance da

família HCS08. Este microcontrolador possui uma unidade central de processamento de 8

bits, com clock interno da CPU de 40 MHz e clock de barramento de até 20 MHz.

Page 7: Relatorio_Elevador1

6

A fonte de clock pode ser interna ou externa. No caso da placa de desenvolvimento

empregada o clock é gerado por um cristal externo a uma frequência de 4 MHz e multiplicado

internamente ao microcontrolador de modo a fornecer um clock de barramento de 20 MHz.

O modelo de microcontrolador utilizado possui encapsulamento do tipo LPFQ com 64

pinos, destes sendo 54 pinos de I/O de uso geral. Características como slew-rate, pull-up

enable e opção de alta ou baixa capacidade de corrente dos pinos de I/O podem ser

configuradas diretamente via software.

O microcontrolador inclui ainda periféricos como: Conversor A/D de 16 canais com

10 bits de resolução, duas interfaces de comunicação serial, um módulo de controle para

periférico serial, contadores/módulos PWM de 16 bits e módulo de interrupções de teclado de

8 bits.

LED

O LED, do acrônimo em inglês para Light Emmiting Diode ou diodo emissor de luz, é

um tipo de diodo que quando excitado responde a excitação emitindo luz dentro do espectro

da luz visível. Para que o LED emita luz é necessário que este esteja em condução, ou seja,

assim como em um diodo convencional, o LED deve ser polarizado diretamente para estar em

um estado Ligado.

São utilizados neste projeto um total de oito LED’s, dois para sinalizar os estados de

descida ou subida do elevador, sendo um na cor vermelha e outro na cor amarela, e os seis

outros LED’s são usados para indicar o andar atual de cada elevador. Estes LED’s são

acionados pelo microcontrolador, a partir dos pinos de I/O, e segundo a lógica de

funcionamento do controle do elevador.

Display de sete segmentos

Um display de sete segmentos é formado pela conexão de 7 diodos emissores de luz

(LED) encapsulados em um único invólucro. A conexão interna destes displays pode ser de

duas formas: Anodo Comum ou Catodo Comum. Na Figura 2 são mostradas os dois tipos de

conexão possíveis. Na ligação com anodo comum os LED’s são acionados fixando os pinos

do display cujo segmento deseja-se acender em 0 V. Já para a ligação catodo comum, os

LED’s são acionados levando a tensão dos pinos referentes aos segmentos que se deseja

acender a 5 V.

Page 8: Relatorio_Elevador1

A codificação para exibição de valores alfanuméricos no display de

feita então considerando quais segmentos devem estar ligados, de modo a formar o digito

desejado. Um código deste tipo pode ser feito a partir de uma tabela contendo cada um dos

segmentos (a, b, c, d, e, f,

dígito correspondente. Uma tabela pra este tipo de codificação é apresentada no

desenvolvimento deste trabalho.

Figura 2 – Display de

A interface para representação do andar atual do elevador é feita utilizando um display

na configuração anodo comum, acionado a partir da codificação implementada no

microcontrolador. Para a representação de todos os algarismos requer

necessário apenas um display, já que em um display podem ser representados algarismos de 0

a 9, alem de outros caracteres, e no projeto requerem

digito que represente o térreo.

Descrição do sistema

A descrição do sistema se baseia na realização do controle da lógica de um elevador

de um edifício de 5 andares mais o térreo. Em cada piso existe um botão de chamada de

andar, em um total de 6 push

push-bottons internos de solicitação de andar.

Um display de sete segmentos é utilizado para indicação da localização atual de

andar do elevador, dois led’s

elevador, um de coloração

indicação de descida, e seis

elevador.

o para exibição de valores alfanuméricos no display de

feita então considerando quais segmentos devem estar ligados, de modo a formar o digito

desejado. Um código deste tipo pode ser feito a partir de uma tabela contendo cada um dos

a, b, c, d, e, f, g) e o estado dos LED’s (ligado ou desligado) que formam um

gito correspondente. Uma tabela pra este tipo de codificação é apresentada no

desenvolvimento deste trabalho.

Display de sete segmentos nas configurações catodo e anodo comum.

A interface para representação do andar atual do elevador é feita utilizando um display

na configuração anodo comum, acionado a partir da codificação implementada no

microcontrolador. Para a representação de todos os algarismos requer

necessário apenas um display, já que em um display podem ser representados algarismos de 0

a 9, alem de outros caracteres, e no projeto requerem-se apenas os dígitos de 1 a 5 e mais um

digito que represente o térreo.

DESENVOLVIMENTO

crição do sistema se baseia na realização do controle da lógica de um elevador

de um edifício de 5 andares mais o térreo. Em cada piso existe um botão de chamada de

push-bottons externos. Dentro da cabine do elevador existe

internos de solicitação de andar.

m display de sete segmentos é utilizado para indicação da localização atual de

led’s utilizados para indicação do sentido de movimentação do

elevador, um de coloração vermelha indicando uma subida e um de coloração

indicação de descida, e seis led’s de cor verde para indicação da posição atual

7

o para exibição de valores alfanuméricos no display de sete segmentos é

feita então considerando quais segmentos devem estar ligados, de modo a formar o digito

desejado. Um código deste tipo pode ser feito a partir de uma tabela contendo cada um dos

igado) que formam um

gito correspondente. Uma tabela pra este tipo de codificação é apresentada no

odo e anodo comum.

A interface para representação do andar atual do elevador é feita utilizando um display

na configuração anodo comum, acionado a partir da codificação implementada no

microcontrolador. Para a representação de todos os algarismos requeridos no projeto é

necessário apenas um display, já que em um display podem ser representados algarismos de 0

se apenas os dígitos de 1 a 5 e mais um

crição do sistema se baseia na realização do controle da lógica de um elevador

de um edifício de 5 andares mais o térreo. Em cada piso existe um botão de chamada de

do elevador existem seis

m display de sete segmentos é utilizado para indicação da localização atual de

utilizados para indicação do sentido de movimentação do

indicando uma subida e um de coloração amarela para

de cor verde para indicação da posição atual de andar do

Page 9: Relatorio_Elevador1

8

Definição dos critérios de lógica

O elevador atende á todas as chamadas válidas na direção em que está indo e

somente quando tiver atendido a todas pode mudar de direção, ou seja:

• A posição inicial do sistema é o elevador parado no Térreo;

• Se não houverem pedidos, o elevador fica parado. Se em seguida, for feito um pedido

para algum andar diferente daquele que ele estava parado, ele atenderá ao pedido;

• Quando não houver nenhuma chamada e diversas chamadas forem feitas ao mesmo

tempo, dar preferência à ordem de armazenamento de chamadas;

• A partir da posição que o elevador se encontre parado ele irá sempre dar privilégio a

chamadas internas à cabine, após atendidas as chamadas internas irá ser feita a

verificação das chamadas externas;

• Se o elevador estiver subindo ele irá até a chamada de ordem mais alta respeitando a

ordem de proximidade das chamadas internas com o andar que ele se encontra, sendo

que no percurso de subida não atenderá chamadas externas, irá até o andar mais alto

solicitado;

• Se o elevador estiver descendo respeitará a ordem de chamadas internas parando por

ordem de chamada mais próxima ao andar onde ele se encontra. No percurso de

descida o elevador atenderá chamadas externas que estiverem no seu caminho,

atendendo a elas em paralelo com a internas seguindo a ordem de proximidade;

• Se o elevador estiver subindo para um andar mais superior e for feito o pedido em um

andar mais inferior, o elevador subirá até o andar mais superior e depois atenderá ao

pedido do andar inferior;

• Se não existir chamada (quando o elevador não for solicitado), não haverá saída. Ou

seja, o elevador permanece parado.

Em seguida são apresentados os fluxogramas de verificação e de operação do

elevador. A Figura 3 apresenta o fluxograma de verificação e armazenamento de chamadas no

elevador e a Figura 4 apresenta o fluxograma de execução das ações armazenadas na lógica

do fluxograma da Figura 3.

Page 10: Relatorio_Elevador1

9

Figura 3 – Fluxograma de verificação.

Page 11: Relatorio_Elevador1

10

Figura 4 – Fluxograma de Ação.

Interface com o usuário

Um aspecto importante no controle de elevadores diz respeito à interface com o

usuário do sistema. A interface deve ser de fácil compreensão, a fim de permitir o uso por

todo o tipo de pessoa (crianças, adultos, etc.), deve ser capaz de exibir todas as informações

Page 12: Relatorio_Elevador1

11

sobre o estado atual do sistema como posição e direção de movimento, e, sobretudo permitir

que de alguma forma o usuário interaja com o sistema, fazendo requisições, no caso do

elevador.

A interface com o usuário desenvolvida neste projeto é uma versão simplificada do

que é encontrado em elevadores comerciais. Em um sistema comercial as informações são,

recorrentemente, apresentadas utilizando LED’s de indicação de sentido de movimento e

displays de sete segmentos para a indicação de localização do elevador.

Neste trabalho, apenas com intuito de demonstração do principio de funcionamento,

utilizam-se apenas um display de sete segmentos onde é informado a posição atual, dois

LED’s que indicam o sentido de movimento atual do elevador e seis LED’s que indicam o

posicionamento do andar atual do elevador. A interação com o usuário é feita utilizando 12

botões do tipo push bottom, disponibilizados em grupos de 6 botões, sendo o primeiro grupo

referido aos botões internos da cabine do elevador e o segundo representando as botoeiras de

cada um dos andares.

LED’s de indicação de andar

Em uma interface comercial é necessário que todos os andares contenham ao menos

um botão de chamada de elevador e dois LED’s para indicação da direção atual do

movimento. Todavia, para fins didáticos a utilização de apenas dois LED’s para indicação do

estado atual do sistema, independente do andar, pode ser considerada aceitável. Neste projeto

arbitra-se que o LED de cor amarela representa o elevador descendo enquanto o LED de cor

vermelha representa o estado no qual o elevador encontra-se subindo. Um terceiro LED

poderia ser utilizado para o estado em que o elevador se encontra parado, contudo,

subentende-se que se o elevador não indica estar se movimentando em nenhuma direção,

então o mesmo encontra-se parado. Ainda em referência à sinalização dos andares, foram

postos seis LED’s de coloração verde para indicação da posição atual do elevador, um por

andar.

A porta do microcontrolador utilizada para representação dos LED’s de indicação de

andar foi a Porta B. O acionamento dos LED’s é feito utilizando os pinos PTBD0 (LED_P0 –

Térreo), PTBD1 (LED_P1 – Primeiro andar), PTBD2(LED_P2 – Segundo Andar),

PTBD3(LED_P3 – Terceiro Andar), PTBD4(LED_P4 – Quarto Andar), PTBD5(LED_P5 –

Quinto Andar), PTBD6 (LED_SOBE) e PTBD7 (LED_DESCE) do microcontrolador,

seguindo a lógica de funcionamento do elevador.

Page 13: Relatorio_Elevador1

12

Display de sete segmentos

Como citado anteriormente, para que o display de sete segmentos funcione

corretamente é necessário que se estabeleça um código no qual cada dígito é representado por

uma sequência de acionamentos/desacionamentos de cada um dos segmentos do display. Um

display de sete segmentos é composto por 7 pinos referentes a cada um dos segmentos e mais

um pino que configura a acendimento ou não do ponto decimal. Como neste projeto não é

necessária a utilização do ponto, a codificação pode ser feita utilizando apenas 7 bits,

considerando que o segmento referente ao ponto fique sempre apagado. Assim, para um

display na configuração anodo comum pode-se construir a seguinte tabela. A porta do

microcontrolador utilizada para o display de sete segmentos foi a Porta A.

Tabela 1 – Codificação display de sete segmentos anodo comum.

PTAD6 PTAD5 PTAD4 PTAD3 PTAD2 PTAD1 PTAD0 Digito

Digito

codificado a b c d e f g

0 0 0 0 0 0 1 0 0x01

1 0 0 1 1 1 1 1 0x4F

0 0 1 0 0 1 0 2 0x12

0 0 0 0 1 1 0 3 0x06

1 0 0 1 1 0 0 4 0x3B

0 1 0 0 1 0 0 5 0x24

A tabela elaborada para o projeto representa o Térreo pelo número 0, e os demais

andares são representados pelos números referentes aos respectivos andares. A codificação é

elaborada apenas até o algarismo 5 pelo fato de o projeto definir um edifício de 6 andares, isto

é, 5 pavimentos e mais o térreo.

Botões de Comando

Para a realização da interface com usuário, utilizou-se um teclado matricial de quatro

linhas por quatro colunas permitindo a geração de 16 códigos independentes utilizando apenas

oito pinos da porta do microcontrolador. No entanto, serão utilizados apenas 12 chaves (push-

bottons) em razão desse ser o número de possibilidades do projeto proposto. Dessa forma, a

última coluna das chaves SW4, SW8, SW12 e SW16 é desconsiderada.

Page 14: Relatorio_Elevador1

13

Para a realização do interfaceamento com o microcontrolador, as colunas do teclado

matricial são conectadas como pinos configurados como saídas e as linhas do teclado são

conectadas a pinos configurados como entradas. Nos pinos configurados como entradas são

utilizadas resistores de pull-up. Esses resistores de pull-up são implementados internamente

ao microcontrolador. A função desse resistor é forçar um nível lógico alto no pino do

microcontrolador configurado como entrada. Caso esse resistor não seja utilizado, a entrada

do microcontrolador ficará sujeita a ruídos.

Para que se possa conectar uma chave a um pino do microcontrolador, deve-se

configurar esse pino como entrada.

Devido às chaves mecânicas possuírem micro ranhuras geradas em seu processo de

fabricação, serão gerados ruídos causados pela vibração das micro ranhuras quando essas

forem fechadas que poderão ser detectadas pelo software desenvolvido como múltiplos

cliques durante o processo de leitura. Estas vibrações que causam ruídos, também conhecidas

por contact bounce, devem ser eliminadas por hardware (capacitor, flip-flop tipo D) ou por

software, através da inserção de um atraso da leitura da chave fechada, que é o caso deste

trabalho. Esse conjunto de instruções é descrito no detalhamento da interrupção de teclado

descrita na figura 6.

Figura 6 – Configuração da conexão de teclado.

Os pinos utilizados como saídas serão utilizados para realizar a varredura do teclado

matricial. Esta varredura tem como tarefa identificar quando uma chave do teclado foi

pressionada. A varredura irá alternar os valores lógicos nos pinos configurados como saídas.

Page 15: Relatorio_Elevador1

14

Estes pinos sempre estarão configurados para que somente um deles contenha nível lógico

zero em um determinado momento. Desta forma, quando uma chave for pressionada, será

gerador um código determinado onde somente dois pinos da porta utilizada como teclado

estarão em nível lógico zero (um pino de saída e um pino de entrada).

A tabela abaixo apresenta a codificação de identificação de chaves em uma interface

com um teclado matricial. As portas G (configura como entrada de teclado) e D (configurada

como saída para teclado) do microcontrolador são utilizadas para realizar a multiplexação

necessária para realizar a interface com o teclado.

Tabela 2: Código de identificação das chaves do teclado matricial.

Codificação do Teclado

PTD2 PTD3 PTD7

PTGD0 (INT_P0) (INT_P4) (EXT_P2)

PTGD1 (INT_P1) (INT_P5) (EXT_P3)

PTGD2 (INT_P2) (EXT_P0) (EXT_P4)

PTGD3 (INT_P3) (EXT_P1) (EXT_P5)

Caso nenhuma chave for pressionada, o nível lógico dos pinos configurados como

entrada (linhas) será um, devido ao resistor de pull-up utilizado. Este pull-up será interno ao

microcontrolador.

A partir da tabela apresentada, definem-se dois vetores de constantes: o vetor

contendo os valores da varredura e o vetor que irá conter os valores relativos aos códigos de

cada tecla. O processo de varredura é inserido na interrupção do estouro de tempo do

temporizador da forma indicada no código descrito na sequência do trabalho.

O módulo de tempo é configurado para o valor (entre 20us e 50ms) de acordo com a

sensibilidade desejada para o teclado.

Se uma tecla for pressionada e a varredura estiver posicionada com nível lógico 0 na

coluna desta chave, irá ocorrer uma interrupção de teclado devido a borda de descida no pino

de entrada conectado a chave. Dentro desta interrupção podem-se tomar medidas para análise

de qual chave foi pressionada.

O código descrito abaixo foi implementado no microcontrolador descrito no decorrer

deste trabalho com o objetivo de realizar o controle do elevador proposto empregando as

condições lógicas pré-definidas.

Page 16: Relatorio_Elevador1

15

////////////////////////////////////////////////////////////////////////////////////////

// PROJETO ELEVADOR #include <hidef.h> /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ #include "MC9S08AW60.h" // PORTA B: LEDS DE PISOS E INDICAÇÃO SOBE E DESCE #define LED_P0 _PTBD.Bits.PTBD0 #define LED_P1 _PTBD.Bits.PTBD1 #define LED_P2 _PTBD.Bits.PTBD2 #define LED_P3 _PTBD.Bits.PTBD3 #define LED_P4 _PTBD.Bits.PTBD4 #define LED_P5 _PTBD.Bits.PTBD5 #define LED_SOBE _PTBD.Bits.PTBD6 #define LED_DESCE _PTBD.Bits.PTBD7 // PORTA A: DISPLAY DE 7 SEGMENTOS #define UM 0xB6; #define DOIS 0x18; #define TRES 0x30; #define QUATRO 0x26; #define CINCO 0x21; #define ZERO 0x80; unsigned char CH_INT[6] = {0,0,0,0,0,0}; // Vetor chamada interna unsigned char CH_EXT[6] = {0,0,0,0,0,0}; // Vetor chamada externa #define vect_length 6; // define tamanho do vetor unsigned char tempo_1s = 0, DisparoT1s = 0; unsigned char PISO_ATUAL = 0; void interrupt 11 timer1(void); void ini_teclado(void); void ini_cpu(void); void timer1_ini(void); void ini_pta(void); void ini_ptb(void); void escreve_display(unsigned char val_disp); unsigned char maior_chamada(void); unsigned char menor_chamada(void); void ini_leds(void); void ini_display(void); void led(unsigned char val_led); void tempo(unsigned char count_tempo); void apaga_led(unsigned char val_led); //---------------------------MAIN-------------------------------------------------------------------------------------------------- void main(void) { unsigned char ST = 0, count = 0, flag = 0, j = 0, aux1 = 0, aux2 = 0, aux3 = 0, i = 0, cmax=0, cmin=0, SUBINDO = 0, DESCENDO = 0; EnableInterrupts; /* enable interrupts */ ini_cpu(); timer1_ini(); for(;;) { // Loop Infinito

Page 17: Relatorio_Elevador1

16

switch(ST){ // MÁQUINA DE ESTADOS PRINCIPAL //---------------------------------------- ST0 ------------------------------------------------------------------------------------ case 0: // INICIALIZAÇÕES ini_pta(); ini_leds(); ini_teclado(); ini_display(); ini_ptb(); PISO_ATUAL = 0; ST=1; break; // ---------------------------------------- ST1 ----------------------------------------------------------------------------------- case 1: // VERIFICA SE HÁ CHAMADA INTERNA/EXTERNA cmax=maior_chamada(); cmin=menor_chamada(); if( (cmax-PISO_ATUAL) >= 1 ){ SUBINDO=1; tempo(2); PISO_ATUAL=PISO_ATUAL+1; escreve_display(PISO_ATUAL); ST=2; }else if( (PISO_ATUAL-cmin) >= 1 ) { DESCENDO=1; tempo(2); PISO_ATUAL=PISO_ATUAL-1; escreve_display(PISO_ATUAL); ST=2; } break; // ---------------------------------------- ST2 ----------------------------------------------------------------------------------- case 2: // VERIFICA SE É UM PISO SOLICITADO. SE FOR, LIMPA SOLICITAÇÃO E VAI PARA ST5 if(SUBINDO==1){ if(CH_INT[PISO_ATUAL]==1){ CH_INT[PISO_ATUAL]=0; // Limpar solicitação apaga_led(PISO_ATUAL); } } if(DESCENDO==1){ if( (CH_INT[PISO_ATUAL]==1)||(CH_EXT[PISO_ATUAL]==1) ){ CH_INT[PISO_ATUAL]=0; // Limpar solicitação CH_EXT[PISO_ATUAL]=0; apaga_led(PISO_ATUAL); } } ST=3; break;

Page 18: Relatorio_Elevador1

17

// ---------------------------------------- ST5 ----------------------------------------------------------------------------------- case 3: if(SUBINDO==1) ST=4; else if(DESCENDO==1) ST=5; else ST=1; // ---------------------------------------- ST6 ----------------------------------------------------------------------------------- break; case 4: // SE SUBINDO if(PISO_ATUAL==cmax){ CH_INT[PISO_ATUAL]=0; // Limpar solicitação CH_EXT[PISO_ATUAL]=0; SUBINDO=0; ST=1; apaga_led(PISO_ATUAL); } else { tempo(2); PISO_ATUAL=PISO_ATUAL+1; ST=2; } escreve_display(PISO_ATUAL); // VAI PARA ST=1 OU ST=2 // ---------------------------------------- ST6 ----------------------------------------------------------------------------------- break; case 5: // SE DESCENDO if(PISO_ATUAL==cmin){ CH_INT[PISO_ATUAL]=0; // Limpar solicitação CH_EXT[PISO_ATUAL]=0; apaga_led(PISO_ATUAL); DESCENDO=0; ST=1; } else { tempo(2); PISO_ATUAL=PISO_ATUAL-1; ST=2; } escreve_display(PISO_ATUAL); // VERIFICA SE SOLICITAÇÃO PRINCIPAL JÁ FOI ATENDIDA // VAI PARA ST=1 OU ST=2 break; }// Fim do switch principal }/* loop forever */ } //-------------------------------------------------------------------------------------------------------------------------------------

Page 19: Relatorio_Elevador1

18

// CODIFICAÇÃO TECLADO // // PTDD2 PTDD3 PTDD7 // PTGD0 (INT_P0) (INT_P4) (EXT_P2) // PTGD1 (INT_P1) (INT_P5) (EXT_P3) // PTGD2 (INT_P2) (EXT_P0) (EXT_P4) // PTGD3 (INT_P3) (EXT_P1) (EXT_P5) //-----------------------------INTERUPÇÕES------------------------------------------------------------------------------------ // INTERUPÇÃO TIMER 1 - Processamento do teclado // INTERUPÇÃO TIMER 1 - Processamento do teclado void interrupt 11 timer1(void) { static unsigned char sw_ptd = 0, tecla = 0, tcl = 0, tcl_count = 0; static unsigned int i = 0; TPM1SC_TOF=0; switch(sw_ptd){ case 0: PTDD_PTDD2 = 0; PTDD_PTDD3 = 1; PTDD_PTDD7 = 1; switch(PTGD){ case 0x1E: tecla = 1; break; case 0x1D: tecla = 2; break; case 0x1B: tecla = 3; break; case 0x17: tecla = 4; break; case 0x0F: tecla = 5; break; } break; case 1: PTDD_PTDD2 = 1; PTDD_PTDD3 = 0; PTDD_PTDD7 = 1; switch(PTGD){ case 0x1E: tecla = 6; break; case 0x1D: tecla = 7; break; case 0x1B: tecla = 8; break; case 0x17: tecla = 9; break; case 0x0F: tecla = 10; break; } break; case 2: PTDD_PTDD2 = 1; PTDD_PTDD3 = 1; PTDD_PTDD7 = 0;

Page 20: Relatorio_Elevador1

19

switch(PTGD){ case 0x1E: tecla = 11; break; case 0x1D: tecla = 12; break; } break; default: // Desativa teclado PTDD_PTDD2 = 1; PTDD_PTDD3 = 1; PTDD_PTDD7 = 1; tecla = 0; break; break; } if(sw_ptd == 2){ // Após 1 ciclo completo de varredura verifica tecla pressionada if( (tecla>0)&&(tcl == tecla) ){ tcl_count++; if(tcl_count<5) tecla = 0; }else{ tcl_count=0; tcl = tecla; } if(tcl_count >= 5){ // A tecla deve manter-se pressionada por 15ms e ter o mesmo valor durante este tempo switch(tecla){ // Mapeia tecla para vetores case 1: /* TESTE */ led(0); CH_INT[0] = 1; break; case 2: /* TESTE */ led(1); CH_INT[1] = 1; break; case 3: /* TESTE */ led(2); CH_INT[2] = 1; case 4: /* TESTE */ led(3); CH_INT[3] = 1; break; case 5: /* TESTE */ led(4); CH_INT[4] = 1; break; case 6: /* TESTE */ led(5); CH_INT[5] = 1; break; case 7: /* TESTE */ led(0); CH_EXT[0] = 1; break; case 8: /* TESTE */ led(1); CH_EXT[1] = 1; break; case 9: /* TESTE */ led(2); CH_EXT[2] = 1; break; case 10: /* TESTE */ led(3);

Page 21: Relatorio_Elevador1

20

CH_EXT[3] = 1; break; case 11: /* TESTE */ led(4); CH_EXT[4] = 1; break; case 12: /* TESTE */ led(5); CH_EXT[5] = 1; break; } tcl_count = 0; } } if(sw_ptd < 2){ // Incrementa coluna de varredura sw_ptd++; }else{ sw_ptd = 0; } if(DisparoT1s == 1){ i++; // Gerador de tempo de 1 segundo if(i==1000){ i=0; DisparoT1s = 0; tempo_1s = 1; } } TPM1SC = 0x4D; // Start no timer. } //--------------------------------FUNÇÕES---------------------------------------------------------------------------------------- void led(unsigned char val_led){ switch(val_led){ case 0: PTBD_PTBD0 = 1;break; case 1: PTBD_PTBD1 = 1;break; case 2: PTBD_PTBD2 = 1;break; case 3: PTBD_PTBD3 = 1;break; case 4: PTBD_PTBD4 = 1;break; case 5: PTBD_PTBD5 = 1;break; case 6: PTBD_PTBD5 = 1;break; // Subindo case 7: PTBD_PTBD5 = 1;break; // Descendo } } void apaga_led(unsigned char val_led){ switch(val_led){ case 0: PTBD_PTBD0 = 0;break; case 1: PTBD_PTBD1 = 0;break; case 2: PTBD_PTBD2 = 0;break; case 3: PTBD_PTBD3 = 0;break; case 4: PTBD_PTBD4 = 0;break; case 5: PTBD_PTBD5 = 0;break; case 6: PTBD_PTBD5 = 0;break; // Subindo case 7: PTBD_PTBD5 = 0;break; // Descendo

Page 22: Relatorio_Elevador1

21

} } void escreve_display(unsigned char val_disp){ switch(val_disp){ case 0: PTAD = ZERO; break; case 1: PTAD = UM; break; case 2: PTAD = DOIS; break; case 3: PTAD = TRES; break; case 4: PTAD = QUATRO; break; case 5: PTAD = CINCO; break; } } // Retorna maior andar para os vetores CH_INT e CH_EXT unsigned char maior_chamada(void){ unsigned char ind = 0, maior = 0; for(ind=0; ind < 6; ind++){ if( (CH_INT[ind] == 1)||(CH_EXT[ind] == 1) ) maior = ind; } return maior; } // Retorna menor andar para os vetores CH_INT e CH_EXT unsigned char menor_chamada(void){ unsigned char ind = 0, menor = 0; for(ind=0; ind < 6; ind++){ if((CH_INT[ind] == 1)||(CH_EXT[ind] == 1)){ menor = ind; break; } if( (ind==5)&&(menor==0) ) menor = PISO_ATUAL; } return menor; } void tempo(unsigned char count_tempo){ unsigned char count2 = 0; count2 = 0; while(count2 <= count_tempo){ DisparoT1s = 1; while(!tempo_1s); tempo_1s = 0; count2++; } } //-----------------------------INICIALIZAÇÕES-------------------------------------------------------------------------------- void ini_cpu(void){ /* SOPT: COPE=0,COPT=1,STOPE=0,??=1,??=0,??=0,??=1,??=1 */ SOPT = 0x53; /* SPMSC1: LVDF=0,LVDACK=0,LVDIE=0,LVDRE=1,LVDSE=1,LVDE=1,??=0,BGBE=0 */ SPMSC1 = 0x1C;

Page 23: Relatorio_Elevador1

22

/* SPMSC2: LVWF=0,LVWACK=0,LVDV=0,LVWV=0,PPDF=0,PPDACK=0,??=0,PPDC=0 */ SPMSC2 = 0x00; // Saída de Clock Externo do pino PTC2 desabilitado /* SMCLK: MPE=0,MCSEL=0 */ SMCLK = 0; /* Inicialização do sistema de clock */ /* ICGC1: HGO=1,RANGE=1,REFS=1,CLKS1=1,CLKS0=1,OSCSTEN=0,LOCD=0,??=0 */ ICGC1 = 0xF8; /* ICGC2: LOLRE=0,MFD2=0,MFD1=1,MFD0=1,LOCRE=0,RFD2=0,RFD1=0,RFD0=0 */ ICGC2 = 0x30; while(!ICGS1_LOCK) { /* Espera o módulo ICG estabilizar o clock configurado */ } } void timer1_ini(void) { TPM1CNT = 0x00; TPM1MOD = 625; // Timer configurado para 1ms TPM1SC = 0x4D; // DIV = 32 } void ini_pta(void){ PTADD = 0xFF; PTADS = 0xFF; PTAPE = 0x00; PTASE = 0x00; PTAD = ZERO; } void ini_ptb(void){ PTBDD = 0xFF; PTBDS = 0xFF; PTBPE = 0x00; PTBSE = 0x00; PTBD = 0x00;; } void ini_leds(void){ LED_P0 = 0; // Apaga todos! LED_P1 = 0; LED_P2 = 0; LED_P3 = 0; LED_P4 = 0; LED_P5 = 0; LED_SOBE = 0; LED_DESCE = 0; } void ini_display(void){ PTAD = ZERO; } void ini_teclado(void){

Page 24: Relatorio_Elevador1

23

// PORTA G configurada como entrada de teclado // Inicia a latch da porta G com todos os bits em zero PTGD = 0; // Todos os pinos da porta G como entradas PTGDD = 0; // Pinos do módulo de teclado da porta G configurados para pull-up PTGPE = 0x1F; // PORTA D configurada como saída para teclado // Inicia a latch da porta D com todos os bits em um (Teclas não-selecionadas) PTDD = 0xFF; // Todos os pinos da porta D como saídas PTDDD = 0xFF; // Pull-up desabilitado PTDPE = 0x00; } A seguir é mostrado na figura 7 a montagem do circuito na matriz de contatos com os

componentes descritos no decorrer deste trabalho.

Figura 7 – Circuito proposto Elevador.

Page 25: Relatorio_Elevador1

24

CONCLUSÃO

A partir do desenvolvimento do trabalho apresentado houve a verificação do

funcionamento de diversos dispositivos assim como a complexidade e a versatilidade

existente em problemas deste porte. Pode ser verificada a importância da aplicação de

elevadores, sendo que essas aplicações podem ser feitas com diversas formas de lógicas,

sendo que cada uma procura otimizar ao máximo o seu objetivo. Essas aplicações podem ser

dadas tanto em edifícios residenciais quanto comerciais, assim como hospitais, indústrias,

escolas, supermercados entre outras inúmeras aplicações.

Pelo trabalho proposto, por ser um edifício residencial contendo 5 andares mais térreo,

pode ser aplicada uma lógica intermediária que não necessita ser maior complexidade em

questão de velocidade quanto a de um hospital nem em relação ao peso como em indústrias,

por exemplo. Uma aplicação desse porte se preocupa mais com a segurança e otimização para

que o processo ocorra de forma clara, econômica e o menos complexa possível.

Dessa forma, a partir dos dispositivos empregados, os quais foram LED’s, display de

sete segmentos e um microcontrolador, pode-se desenvolver o projeto do elevador proposto.

No desenvolvimento deste trabalho foram desenvolvidas algumas técnicas de acionamentos

dos LED’s, assim como uma forma correta de utilização para que fosse garantida a extensão

de sua vida útil. Quanto ao display de sete segmentos, verificou-se a lógica de funcionamento

através da implementação do código de acionamento e desacionamento de cada um dos

segmentos do display. Quanto ao microcontrolador utilizado, fez-se um trabalho de

conhecimento de suas características, entre as quais o seu funcionamento, programação,

lógica, as formas utilizadas para o controle de dispositivos e, assim sendo, pode ser verificada

a sua ampla aplicação, sendo que, para isso, basta apenas a sua reprogramação.

Ao final do trabalho desenvolvido e a análise dos resultados obtidos, nota-se o quanto

importante se faz a utilização de microcontroladores em os mais diversos ramos de

aplicações, sendo que, sem a utilização deles, muitas das aplicações que hoje se fazem

possíveis seriam de difícil implementação ou se tornariam inviáveis.

REFERÊNCIAS

DENARDIN, Gustavo W. “Tutorial para Programação da Placa MC9S08AW60”.

MC9S08AW60. Datasheet. Disponível em www.Freescale.com.