Você está na página 1de 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
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
1
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.

2
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

3
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

4
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®.

PISO 5

PISO 4

PISO 3

PISO 2

Setas luminosas para indicar se o


PISO 1 elevador esta subindo ou descendo

TÉRREO

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.

5
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.

6
A codificaçãoo 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
segmentos (a,
a, b, c, d, e, f, g) e o estado dos LED’s (ligado ou desligado)
igado) que formam um
dígito
gito correspondente. Uma tabela pra este tipo de codificação é apresentada no
desenvolvimento deste trabalho.

Figura 2 – Display de sete segmentos nas configurações catodo


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
requer no projeto é
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
requerem se apenas os dígitos de 1 a 5 e mais um
digito que represente o térreo.

DESENVOLVIMENTO

Descrição do sistema
A descrição
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
andar, em um total de 6 push-bottons
push externos. Dentro da cabine do elevador existem
existe seis
push-bottons internos de solicitação de andar.
Um
m display de sete segmentos é utilizado para indicação da localização atual de
andar do elevador, dois 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 amarela para
indicação de descida, e seis led’s de cor verde para indicação da posição atual de andar do
elevador.

7
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.

8
Figura 3 – Fluxograma de verificação.

9
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
10
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.

11
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
a b c d e f g codificado
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.

12
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.
13
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.

14
////////////////////////////////////////////////////////////////////////////////////////
// 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
15
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;

16
// ---------------------------------------- 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 */

//-------------------------------------------------------------------------------------------------------------------------------------

17
// 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;
18
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);
19
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
20
}
}

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;
21
/* 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){

22
// 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.

23
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.

24

Você também pode gostar