You are on page 1of 38

LINGUAGEM C ANSI PARA MICROCONTROLADOR

PIC18F4550
Belo Horizone
M!r"o #e $010
LINGUAGEM C ANSI PARA MICROCONTROLADOR
PIC18F4550
Die%o C!rr!#i
L&iz Cl'&#io #o N!()i*eno
Relatrio apresentado PCMNAS

como requisito para concluso de curso
de Microcontroladores PC18F4550 em
linguagem C ANSI+
Belo Horizone
M!r"o #e $010
RESUMO
Este proj eto tem como escopo princi pal , a util i zao do
mi crocontrol ador PC18F4550 como uni dade central para o
processamento e control e de transporte verti cal (elevadores) com as
seguintes vantagens:
A apl i cao reduz o custo fi nal evi tando a util i zao de mi cro
control ador especfi cos.
O circuito eletrnico adicional de baixo custo.
O circuito eletrnico adicional de uso geral facilmente encontrado no
mercado comercial.
Os perifricos possuem uma rampa de mudana de estado de 23ns bem
inferior a velocidade do PC garantindo estabilidade ao sistema.
A programao pode ser feita on board atravs de conectores USB
1
.
Para mais de um elevador pode ser feito Softwares especficos para
controle de trfego e at mesmo funes especiais de manobras via PC
2
1
USB - Universal Serial Bus
2
PC Computadores Compactos
SUMRIO
1. NTRODUO 03
2 CONSDERAES 03
3 PLATAFORMAS DE SMULAO 03
3.1 PROTEUS

7.2 SP6 03
3.1.1 AMBENTE DE TRABALHO PROTEUS

7.2 SP6. 04
3.1.2 ARQUVO DE COMANDO DE MPRESSO 04
3.1.3 COMANDOS DE EXPOSO 04
3.1.4 PRNCPAS COMANDOS 04
3.1.5 CONES DO DSPOSTVO 05
3.1.6 GRFCOS 2D 05
3.1.7 FERRAMENTAS DO PROJETO 05
3.1.8 EDO DE COMANDOS 06
3.1.9 ESPELHO E GRAR CONES 06
3.2 NTRODUO DE OPERAO DO PROTEUS NO MODO SS COM
MCROCONTROLADORES 06
3.2.3 CARREGAR O PROGRAMA COM OS DADOS ". HEX
GERADOS NO MPLAB

11
4 PLATAFORMAS DE PROGRAMAO C ANS. 12
4.1 MPLAB

12
4.1.1 CARREGANDO PROJETOS NO MPLAB

13
4.2 MCC18

17
5 APRESENTAO DO 74HS594 17
5.1. ESQUEMA ELETRNCO 17
5.2. FUNCONAMENTO. 18
6 APRESENTAO DO PROJETO 18
7 APRESENTAO DO PROGRAMA ESCRTO EM LNGUAGEM C ANS. 18
7.1 DEFNES 18
7.2 VARVES 19
7.3 ZERANDO VARAVES, PORTAS E REGSTRADORES PARA NCALZAR COMANDOS.
19
7.4 PREPARA PORTA PARA POCCONAR CABNE DO ELEVADOR NA PRMERA PARADA
21
7.5 DETECTA FALHA AO FECHAR A PORTA 22
7.6 PROCEDMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHLE 22
7.7 STOP DA CABNE NA POSO NFEROR 23
7. PROCEDMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHLE 24
7.! STOP DA CABNE NA POSO NFEROR 25
7.10 NVELA A CABNE PARA POSO DA PRMERA PARADA 25
7.11 PREPARA PARA ABRR PORTA 25
7.12 DETECTA FALHA AO ABRR A PORTA 26
7.13 PROCEDMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHLE 26
7.14 A EXECUTA LAO DE PROGRAMAO DEFNNDO FUNO PARA DENTFCAO DE
ANDAR 27
7.15 A FAZ VARREDURA NOS BOTES DE CHAMADA 27
7.16 TRANFERE ESPELHO DE CHAMADAS PARA VARVEL DADOS 28
7.17 REGSTRA CHAMADAS DE CABNE 28
7.1 DENTFCA DREO DE CHAMADAS SUBDA OU DESCDA 29
7.1! COMANDO DE ALTA VELOCDADE 29
7.2" PREPARA PARADA COM REVERSO DE DREO DESCDA OU SUBDA 30
7.21 PREPARACAO_DE_PARADA NA MESMA DREO 31
7.22 PARADA 31
7.23 CANCELANDO CHAMADA 31
7.24 ABRE PORTA 32
7.25 FECHA PORTA 32
7.26 CONFGURA SSTEMA 32
8 CONSDERAES FNAS OU CONCLUSO 33
! REFERNCAS BBLOGRFCAS 34
1+ INTRODU,-O
O uso de microcontroladores especficos com grandes nmeros de sadas e
entradas com gravao do programa off-board vem sendo largamente utilizado na
rea de transporte vertical, no entanto possvel obter o mesmo efeito com
qualidade , confiabilidade e significativa reduo de custo, utilizando o PC18F4550,
alm da possibilidade de gravao on-board.
A idia central realizar pequenos protocolos de comunicao serial de forma a
manter a velocidade de processamento vantajosa do PC que mesmo com atrasos
de leituras seriais ainda superior aos que hoje so utilizados.
O projeto final apresentar recursos tcnicos capaz de comunicar e interagir com as
portas do PC de forma a multiplicar a sua gama de monitoramento e comando.
$ CONSIDERA,.ES
Para melhor apresentao deste relatrio as figuras sero apresentadas conforme
desenvolvimento do documento e no em anexo conforme norma.
/ PLATAFORMAS DE SIMULA,-O
O projeto ser simulado e processado com as seguintes ferramentas
/+1 PROTEUS
0 /
1+$ SP2
Esta plataforma permite a simulao de uma gama de circuitos eletrnicos com uma
preciso de at 98% de confiabilidade depois de calculado as faixas de tolerncia
dos componentes empregados.
Em anexo 1 encontra-se passo a passo a utilizao do Proteus

neste projeto.
3
Plata#orma de simula$%o eletr&nica 'S'S
4
3.1.1 AMBIENTE DE TRABALHO PROTEUS

7.2 SP6+
/+1+$AR3UI4O DE COMANDO DE IMPRESS-O
/+1+/ COMANDOS DE E5POSI,-O
/+1+4PRINCIPAIS COMANDOS
Novo Abrir Salvar mprimir rea de Seo de Seo de
mpresso mportao Exportao
Refazer Grade Origem Cursor Bandeja Aumentar Diminuir Visualizar Lupa
Componente Ponto de Etiqueta Certificado Barra de Circuito Edio
(un$%o )ransporte Secund*rio
5
/+1+5ICONES DO DISPOSITI4O
/+1+2GR6FICOS $D
/+1+1FERRAMENTAS DO PRO7ETO
Terminais Pino Grfico Fita Adesiva Gerador Ponta de Ponta de Multmetro
Dispositivo Prova Voltagem Prova Corrente
Linha Caixa Circulo Arco Trajeto 2D Texto Smbolo

Tempo Real Snap Fio Roteador Busca Pesquisa Propriedade de Ferramentas
Nova Folha Deletar Folha Anterior Desfazer Ao mpossvel Desfazer


Valor do Material Verificao Eltrica das Trilhas Lista Lquida Ares
6
/+1+8EDI,-O DE COMANDOS
/+1+8ESPELHO E GIRAR ICONES
/+$ Inro#&"9o #e o:er!"9o #o Proe&( no *o#o ISIS )o* *i)ro)onrol!#ore(
Com o programa instalado v at o menu iniciar e clique sobre o cone SS

Estes afetam todos os objetos atualmente etiquetados.
Cpia Bloco Movimenta Deletar Bloco Girar o Bloco Seleo Dispositivo Fazer o Dispositivo Decompor
Bloco Smbolo
Pacote de Ferramentas Undo Redo Recortar Cpia Pasta

Girar no Sentido Horrio Girar Anti-Horrio Linha central de X linha central da aleta Y
7
Depois do programa aberto clique em file e escolha a opo "New design
Nesta tela selecione o formato da pagina ideal ao seu projeto e clique em OK.

As margens da rea de trabalhos sero delineadas com as medidas selecionadas


Obs.: Pode-se aumentar visibilidade da rea de trabalho alterando o zoom com a
movimentao do boto rotativo do mouse.
Selecione "Component Mode atravs do cone localizado na barra lateral direita da
tela do programa para trabalhar em modo de manipulao de componentes e
clique em ;P<
!
Neste instante aparecer a seguinte tela:
Nela digite o componente a ser utilizado, usando o campo "Keywords (indicao 1),
observe que o programa identificar o componente da biblioteca e o mostrar no
campo "Results (indicao 2) e entre parnteses na frente deste aparecer a
quantidade de resultados encontrados (indicao 3), no PAD abaixo ser indicado a
especificao detalhada dos componentes encontrados (indicao 4),.
Neste momento identifique o componente a ser utilizado usando o campo quatro (4)
e de dois clique sobre o mesmo.
Observe agora que o componente selecionado ocupou o campo "DEVCE e esta
disponvel para ser utilizado.
Repita os passos para adicionar ao "DEVCE os outros componentes a serem
utilizados durante a construo do projeto, em seguida clique em "OK para retornar
a tela de trabalho.
1 2 3 4
+este campo poder* e,istir mais de um
componente de acordo com a sua -i-lioteca
1"
J na tela de trabalho sobre o campo "DEVCE selecione com o mouse o
componente a ser colocado na rea de trabalho
Logo em seguida d apenas um clique no boto direito do mouse sobre a rea de
trabalho (figura acima). Observe que o escopo do componente aparecer na cor
rosa e poder ser movimentado para qualquer lugar dentro desta rea, escolha o
local e d mais um clique para fix-lo no ponto escolhido.
O=(+> Para girar ou inverter os lados de um componente use os comandos
localizados no rodap inferior direito do programa antes de coloc-lo na rea de
trabalho, observando sua posio mostrada na caixa de visualizao
11
/+$+/ C!rre%!r o :ro%r!*! )o* o( #!#o( ;+ HE5< %er!#o( no MPLAB

D dois clique sobre o microcontrolador que est na rea de trabalho e a seguinte


tela ser aberta:
3.3 MPLAB

1 ndica a nomenclatura do componente no projeto


2 ndica o modelo do microcontrolador utilizado
3 ndica o tipo de invlucro utilizado para confeco do circuito impresso no
ARES
4 ndica o endereo da USB utilizada na simulao
5 local para selecionar o arquivo "HEX a ser rodado na simulao
6 Campo para escolha da freqncia de simulao
7 Barra de rolagem para configurao extras do microcontrolador caso
utilizadas no programa
1
$
/
2
5
4
1
8
12
8 Local para configurao de funcionamento do microcontrolador
Para carregar o programa no microcontrolador clique sobre o cone de pasta
no campo 5 ; da figura acima e d dois clique sobre o arquivo escolhido.
Nesta hora a tela anterior voltar a ser apresentada ento configure a
freqncia de operao do microcontrolador no campo 6 e clique em "OK
Pronto voc j pode montar o restante do circuito e simular o funcionamento
do seu programa.
4 PLATAFORMAS DE PROGRAMA,-O C ANSI+
4.1 MPLAB


O MPLAB

um ambiente integrado para o estudo e desenvolvimento com a
famlia PC de microcontroladores.Sua principal caracterstica a total integrao de
seus mdulos com o ambiente Windows

, permitindo a fcil cpia de arquivos e


trechos de arquivos de um aplicativo para outro.
Esta poderosa ferramenta e capaz de transformar linguagem de baixo e alto
nvel, juntamente com compiladores especficos para o cdigo Hexadecimal usado
na gravao final do PC.
13
4.1.2 C!rre%!n#o :ro?eo( no MPLAB

Passo 1- .-ra o -loco de nota e o salve como /main.c0 em uma pasta onde ser* a-erto o
novo pro1eto.
Passo 2- 2epois de a-rir o pro3rama selecione /pro1ect 4i5ard0 para carre3ar um pro1eto no
6P7.B
Passo 3- . se3uinte tela se apresentar* cli8ue em avan$ar
Passo 5- +esta pa3ina escol9a o tipo de
compilador e lin3ua3em e cli8ue em avan$ar
no nosso caso 6CC1 para lin3ua3em C
.+S'
Passo 4- :scol9a o microcontrolador a ser
utili5ado e cli8ue em avan$ar
14
P!((o 2
Passo 7- O caminho do projeto criado, clique em avanar.
1- Cli8ue em -ro4se
3- 2i3ite um nome
para o pro1eto
4- Cli8ue em salvar
2- :scol9a a pasta
onde #oi criado main.c
Passo - :sta tela permite inserir o main.c ao
pro1eto no entanto #aremos isto posteriormente
apenas cli8ue em avan$ar
Passo !- cli8ue em concluir
Passo 1"- cli8ue com o -ot%o direito do mouse e v* em
.dd ;iles para inserir o main.c criado anteriormente
15
Obs : Se o seu projeto conter um programa de boot-loader carregue-o usando o
mesmo procedimento que foi usado no main.
Passo 11- +a tela 8ue se a-rir* selecione
/Pro1ect 2irector<0 e cli8ue duas ve5es so-re
/=cone main0 no pad
Pronto o ar8uivo main #oi adicionado
ao pro1eto
Passo 12- 2> dois cli8ue so-re o =cone main e di3ite o pro3rama a ser rodado
2i3ite a8ui seu pro3rama
16
NOTA>
Existe a possibilidade de simular o programa no ambiente MPLAB

mas no
abordaremos este tpico pois nossa simulao acontecer no PROTEUS

Passo 13- 2epois de escrito o pro3ramava em /Pro1ect0 depois em Build .ll. Se o pro3rama estiver sem erro o ar8uivo .?e, ser* 3erado dentro da pasta escol9ida para salvar o pro1eto
6ensa3em de compila$%o
com sucesso
17
4+$ MCC18

Tambm conhecido como MPLAB

C18 uma compilador C ANS compatvel para a


famlia PC18 na plataforma Windows e um componente totalmente integrado a
Microchip, permitindo a depurao da linguagem de nvel com MPLAB

.
Os Projetos, opes do compilador e vinculador personalizaes podem ser
controladas completamente dentro do MPLAB DE.
5 A:re(en!"9o #o 14HS584
O circuito integrado 74HS595 um deslocador de movimento que utiliza oito flip-
flops que so responsveis pela memorizao de dados inseridos e manipulados de
posio em posio atravs de duas entradas de clock's .Seu datasheet esta no
anexo 2 (dois).
Estes dispositivos cotem imunidade a rudos e baixo consumo de energia so de
tecnologia CMOS e podem movimentar cargas TTL-LS.
Todas as entradas so protegidas de dano devido descarga esttica interna
Com barreiras de diodo para VCC
Freqncia mudana Garantida: DC a 30 MHz.
5.1. E(@&e*! elerAni)o
1
5.2. B&n)ion!*eno+
O Programa trabalha com o deslocamento do dado inserido na entrada "DS para
isto ele colocar as duas entradas de clock's em nvel zero.
Partindo deste momento a primeira entrada clock "SH-CP ser levada em nvel
alto com isto acontecer o deslocamento deste dado para o primeiro Flip-Flop ,no
entanto cada sada e composta de dois flip-flop's em serie e um buffer controlado
pela entrada "OE ,o que indica que o dado ainda no foi transferido para a sada
com mais um clock agora em "ST-CP o dado e transferido para a sada.
No! >
Se a entrada "OE estiver em nvel baixo o dado ser visualizado na sada, se caso
o mesmo pino esteja em nvel alto esta leitura ser inibida.
6 A:re(en!"9o #o :ro?eo
AneCo rD( E/F
7 A:re(en!"9o #o :ro%r!*! e()rio e* lin%&!%e* C ANSI+
7.1 DEFINES
/** N C L U D E S ************************************************************************************/
#include <p18cxxx.h> // Necessrio para que o compilador adicione a biblioteca
// com as definies do PC selecionado no projeto, neste
//caso, o modelo 18F4550.
#include <delays.h> // Biblioteca padro de rotinas de atraso do C18 Microchip
/** D E F N E S **************************************************************************************/
#define SH_CP PORTCbits.RC0 // VARVEL DE COMUNCAO SERAL
#define NSERE_DADOS PORTCbits.RC1 // VARVEL DE COMUNCAO SERAL
#define ST_CP PORTCbits.RC2 // VARVEL DE COMUNCAO SERAL
#define LBERA_DADOS PORTCbits.RC6 // VARVEL DE COMUNCAO SERAL
#define SH_CP2 PORTAbits.RA0 // VARVEL DE COMUNCAO SERAL
#define NSERE_DADOS2 PORTAbits.RA1 // VARVEL DE COMUNCAO SERAL
#define ST_CP2 PORTAbits.RA2 // VARVEL DE COMUNCAO SERAL
#define LBERA_DADOS2 PORTAbits.RA3 // VARVEL DE COMUNCAO SERAL
#define SH_CP3 PORTBbits.RB0 // VARVEL DE COMUNCAO SERAL
1!
#define NSERE_DADOS3 PORTBbits.RB1 // VARVEL DE COMUNCAO SERAL
#define ST_CP3 PORTBbits.RB2 // VARVEL DE COMUNCAO SERAL
#define LBERA_DADOS3 PORTBbits.RB3 // VARVEL DE COMUNCAO SERAL
#define CHAMADAS PORTAbits.RA4 // VARREDURA PARA REGSTRO DAS CHAMADAS DE
//CABNE, SUBDA E DESCDA
#define PARADA PORTAbits.RA5 // SNAL DE PARADA
#define PREPARA_PARADA PORTBbits.RB5 // DEFNE ONDE SERA NCADO A PARADA
#define PORTA_ABERTA PORTBbits.RB6 // NDCAO DE PORTA ABERTA
#define PORTA_FECHADA PORTBbits.RB7 // NDCAO DE PORTA FECHADA
#define ABRE_PORTA PORTCbits.RC7 // ACONA CRCUTO PARA ABRR PORTA
#define FECHA_PORTA PORTEbits.RE2 // ACONA CRCUTO PARA FECHAR PORTA
#define POSCAOA PORTDbits.RD0 // SNAL DOS SENSORES DE POSCONAMENTO
#define POSCAOB PORTDbits.RD1 // SNAL DOS SENSORES DE POSCONAMENTO
#define POSCAOC PORTDbits.RD2 // SNAL DOS SENSORES DE POSCONAMENTO
#define POSCAOD PORTDbits.RD3 // SNAL DOS SENSORES DE POSCONAMENTO
#define SNAL_DESCE PORTBbits.RB4 // NDCA EXSTENCA DE CHAMADAS DE DESCDA
#define SNAL_SOBE PORTDbits.RD5 // NDCA EXSTENCA DE CHAMADAS DE SUBDA
#define SNAL_ALTA PORTDbits.RD6 // ACONA A BAXA VELOCDADE DO ELEVADOR
#define SNAL_BAXA PORTDbits.RD7 // ACONA A ALTA VELOCDADE DO ELEVADOR
#define LMTE_DESCDA PORTEbits.RE0 // LMTE DE POSCONAMENTO MAXMO NFEROR DA
//CABNE
#define LMTE_SUBDA PORTEbits.RE1 // LMTE DE POSCONAMENTO MAXMO SUPEROR DA
//CABNE
#define NVELAMENTO PORTDbits.RD4 // NDCA NVELAMENTO DA CABNE COM O ANDAR
7.2 4ARI64EIS
/** P R O T O T P O S P R V A D O S **************************************************************************************/
void ConfiguraSistema (void);
/** VARAVES AUXLARES *******************************************************************************************************/
unsigned char chamadas_cab[10], chamadas_sub[10],AUX_CHAM_CAB_SOB ,AUX_CHAM_CAB_DES ,AUX_CHAM_SUB , AUX_CHAM_DES,
i, chamadas_des[10],DADOS[32], ANDAR, FALHA_FECHAR_PORTA, FALHA, FALHA_ABRR_PORTA , MAOR, MENOR, AD, AS;
unsigned long int NDEX, NDEX2;

7.3 GERANDO 4ARIA4EISH PORTAS E REGISTRADORES PARA
INICIALIGAR COMANDOS+
/** FUNCAO PRNCPAL ***********************************************************************************************************/

2"
void main(void)
{
ConfiguraSistema(); //Configura quem so as entradas e sadas no PC
/** ZERA SADAS DE COMANDOS ********************************************************************************************CORRETO*/
SH_CP2 = 0;
NSERE_DADOS2 = 0;
ST_CP2 = 0;
LBERA_DADOS2 = 0;
PARADA = 0;
SNAL_DESCE = 0;
PREPARA_PARADA = 0;
SH_CP = 0;
NSERE_DADOS = 0;
ST_CP = 0;
LBERA_DADOS = 0;
ABRE_PORTA = 0;
SNAL_SOBE = 0;
SNAL_ALTA = 0;
SNAL_BAXA = 0;
FECHA_PORTA = 0;
/** ZERA CHAMADAS ******************************************************************************************************* /
for(i = 0; i < 10; i++)
{
chamadas_cab[i] = 0;
chamadas_sub[i] = 0;
chamadas_des[i] = 0;
}
/** ZERA DADOS *******************************************************************************************************/
for(i = 0; i < 32; i++)
DADOS[i] = 0 ;
/** ZERA VARAVES DE COMANDOS ************************************************************************************/
FALHA_FECHAR_PORTA = 0;
ANDAR = 0;
NDEX = 0;
FALHA = 0;
/** LMPA REGSTROS DAS SADAS DOS 74HC595 ********************************************************************/
for(i = 0; i < 32; i++)
{
LBERA_DADOS = 1; // NBE A VSUALZAO DAS SDAS DO C 74HC595 BLOCO 1
// Delay10KTCYx(18);
21
SH_CP = 0;
//Delay10KTCYx(18);
ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1
NSERE_DADOS = 0; //SERE VALOR DO BT QUE RA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
SH_CP = 1;
//Delay10KTCYx(18); //delay de 15ms
ST_CP = 1; // DESLOCA BT ATE A ULTMA PORTA DO 74HC595 BLOCO 1
//Delay10KTCYx(18); //delay de 15ms
}
7.4 PREPARA PORTA PARA POCICIONAR CABINE DO ELE4ADOR NA
PRIMEIRA PARADA
A primeira manobra que se realiza quando se liga o comando de um elevador
garantir o fechamento das portas para que o mesmo se desloque dentro do poo.
Nesta parte do programa utilizado uma tcnica diferente parecida com o delay ,
mas que cria um contador de ciclos (NDEX) dentro de uma funo "do que permite
um estouro de contagem ou a concluso da funo na ordem do que acontecer
primeiro, ela utilizada para manter o motor ligado no menor intervalo de tempo
possvel atrazando seu aquecimento durante a operao.
/** PREPARA ESTADO DE PORTA PARA REPOSCONAMENTO DA CABNE **************************************/
ABRE_PORTA = 0;
do
{
FECHA_PORTA = 1;
NDEX ++; //EXECUTA TPO UM DELAY QUE TER "off" QUANDO "do" FOR SATSFETO OU FALHA NO ESTOURO DA
//CONTAGEM
if(NDEX == 150000)
{
FECHA_PORTA = 0;
//Delay10KTCYx(240); //delay
}
/** TENTATVA 2 DE FECHAR A PORTA ********************************************************************************/
if(NDEX == 300000) // EXECUTA TPO UM DELAY QUE TER "off" QUANDO "do" FOR SATSFETO OU FALHA NO ESTOURO
//DA CONTAGEM
{
FALHA_FECHAR_PORTA = 2;
22
FECHA_PORTA = 0;
//Delay10KTCYx(240); //delay
}
/** TENTATVA 3 DE FECHAR A PORTA ***********************************************************************************/
if(NDEX == 450000) // EXECUTA TPO UM DELAY QUE TER "off" QUANDO "do" FOR SATSFETO OU FALHA NO ESTOURO
//DA CONTAGEM
{
FALHA_FECHAR_PORTA = 3;
FECHA_PORTA = 0;
//Delay10KTCYx(240); //delay
}
7.5 DETECTA FALHA AO FECHAR A PORTA
Se durante o comando ocorrer o no fechamento da porta a mesma ser desligada
por um intervalo de tempo (ajustado na obra de acordo com o operador de porta)
tentando fechar novamente em seguida.
/**FALHA DETECTADA AO FECHAR A PORTA ****************************************************************************/
if(NDEX == 600000) // EXECUTA TPO UM DELAY QUE TER "off" QUANDO "do" FOR SATSFETO OU FALHA NO ESTOURO
//DA CONTAGEM
{
FALHA_FECHAR_PORTA = 4;
FECHA_PORTA = 0;
while(1) // LAO NFNTO DE FALHA DETECTADA
{
FECHA_PORTA = 0;
ABRE_PORTA = 0;
SNAL_SOBE = 0;
SNAL_DESCE = 0;
SNAL_ALTA = 0;
SNAL_BAXA = 0;
DADOS[31] = 1;
7.6 PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO
IHILE
23
A tentativa para fechar a porta se repetira por trs vezes ao final de todas as
tentativas o elevador ira para um loop infinito que mantm um LED de falha acesso
at a interveno tcnica no equipamento.
/**PROCEDMENTO PARA ASCENDER LEDS DE FALHA DENTRO DO WHLE ******************************************* */
for(i = 0; i <= 32; i++)
{
LBERA_DADOS = 1; // NBE A VSUALZAO DAS SDAS DO C 74HC595 BLOCO 1
// Delay10KTCYx(18);
SH_CP = 0;
//Delay10KTCYx(18);
ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1
if ( DADOS[i] == 1) // CONDO
NSERE_DADOS = 1; // NSERE VALOR DO BT QUE R SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
else // OU
NSERE_DADOS = 0; // NSERE VALOR DO BT QUE RA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
SH_CP = 1;
//Delay10KTCYx(18);
ST_CP = 1;
//Delay10KTCYx(18); // DESLOCA BT AT A ULTMA PORTA DO 74HC595 BLOCO 1
}
LBERA_DADOS = 0; // LBERA NFORMAO DAS PORTAS DO 74HC595 BLOCO 1

//Delay10KTCYx(18);
}
}
}while (PORTA_FECHADA == 0);
FECHA_PORTA = 0;
//** ZERA NDEX ***************************************************************************************************************** */
NDEX = 0 ; // PREPARA VARAVEL "NDEX" PARA NOVA CONTAGEM.
do
{
NDEX ++;
7.7 STOP DA CABINE NA POSI,-O INFERIOR
Depois que as portas so fechadas o elevador deve se dirigir para o curso inferior do
poo, no intuito de se posicionar para inicio de atendimento das chamadas.
24
A tcnica utilizada aqui idntica ao do fechamento de porta a criao da varivel
(NDEX) Conta o nmero de ciclos dentro do "do para o estouro ou a satisfao da
funo, visando proteger o motor de trao na ordem do que acontecer primeiro e
ter que ser regulado de acordo com o tamanho do percurso maximo do poo do
elevador.
//** DESLOCA CABNE PARA POSO NFEROR ************************************************************************************/
SNAL_DESCE = 1;
SNAL_BAXA = 1;
if( NDEX == 4000000) // EXECUTA TPO UM DELAY QUE TER "off" QUANDO "do" FOR SATSFETO OU FALHA NO ESTOURO
DA CONTAGEM
while(1)
{ // ESTE TPO DE DELAY GARANTE A MANUTENO DO COMANDO CONTRA
FECHA_PORTA = 0; //FALHAS QUE PODEM OCORRER COM TRANSENTES NDUZDOS PELA FAO DE POO
ABRE_PORTA = 0;
SNAL_SOBE = 0;
SNAL_DESCE = 0;
SNAL_ALTA = 0;
SNAL_BAXA = 0;
DADOS[21] = 1;
7. PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO
IHILE
/**PROCEDMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHLE ************************************************************ */
for(i = 0; i <= 32; i++)
{
LBERA_DADOS = 1; // NBE A VSUALZAO DAS SDAS DO C 74HC595 BLOCO 1
//Delay10KTCYx(18);
SH_CP = 0;
//Delay10KTCYx(18);
ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1
if(DADOS[i] == 1)
NSERE_DADOS = 1; //SERE VALOR DO BT QUE RA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
else // OU
NSERE_DADOS = 0; //SERE VALOR DO BT QUE RA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
//Delay10KTCYx(18);
SH_CP = 1;
//Delay10KTCYx(18);
ST_CP = 1; // DESLOCA BT AT A ULTMA PORTA DO 74HC595 BLOCO 1
}
LBERA_DADOS = 0; // LBERA NFORMAO DAS PORTAS DO 74HC595 BLOCO 1
//Delay10KTCYx(18);
}
25
}while (LMTE_DESCDA == 1);
7.! STOP DA CABINE NA POSI,-O INFERIOR
//** STOP DA CABNE NA POSO NFEROR *************************************************************************/
SNAL_DESCE = 0;
SNAL_BAXA = 0;
7.1" NI4ELA A CABINE PARA POSI,-O DA PRIMEIRA PARADA
Depois de atingido o limite inferior do curso da cabine dentro do poo, o mesmo
deve parar e contar um tempo para reverter a direo do motor de trao sem
causar impacto sobre o mesmo.
importante perceber que o elevador passou do nvel da porta do primeiro andar
por isto necessrio subir a cabine e nivela-la sem que haja formao de degraus
ao abrir a porta
//** NVELA A CABNE PARA POSO DA PRMERA PARADA **************************************************** */
//Delay10KTCYx(180); //delay de 150ms
do
{
SNAL_SOBE = 1;
SNAL_BAXA = 1;
}while(NVELAMENTO == 0);
SNAL_SOBE = 0;
SNAL_BAXA = 0;
//Delay10KTCYx(100); //delay
7.11 PREPARA PARA ABRIR PORTA
Nesta parte do programa utilizado novamente a tcnica do contador de ciclos
(NDEX) dentro de uma funo "do que permite um estouro de contagem ou a
concluso da funo na ordem do que acontecer primeiro, ela utilizada para
manter o motor ligado no menor intervalo de tempo possvel atrazando seu
aquecimento durante a operao.
/** PREPARA ESTADO DE PORTA PARA REPOSCONAMENTO DA CABNE ***************************************************/
FECHA_PORTA = 0;
26
do
{
ABRE_PORTA = 1;
NDEX++; // CONTA TEMPO ENCREMENTANDO NDEX PARA NDENTFCAR FALHA DE PORTA FECHANDO
if(NDEX== 150000)
{
FALHA_ABRR_PORTA = 1;
ABRE_PORTA = 0;
Delay10KTCYx(240); //delay
}
/** TENTATVA 2 DE FECHAR A PORTA ******************************************************************************/
if(NDEX == 300000)
{
FALHA_ABRR_PORTA = 2;
ABRE_PORTA = 0;
//Delay10KTCYx(240); //delay
}
/** TENTATVA 3 DE FECHAR A PORTA ******************************************************************************/
if(NDEX == 450000)
{
FALHA_ABRR_PORTA = 3;
ABRE_PORTA = 0;
//Delay10KTCYx(240); //delay
}
7.12 DETECTA FALHA AO ABRIR A PORTA
/**FALHA DETECTADA AO FECHAR A PORTA ***********************************************************************/
if(NDEX == 600000)
{
FALHA_ABRR_PORTA = 4;
ABRE_PORTA = 0;
while(1)
{
FECHA_PORTA = 0;
ABRE_PORTA = 0;
SNAL_SOBE = 0;
SNAL_DESCE = 0;
SNAL_ALTA = 0;
SNAL_BAXA = 0;
DADOS[32] = 1;
27
7.13 PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO
IHILE
/**PROCEDMENTO PARA ASCENDER LED DE FALHA *****************************************************************************/
for(i = 0; i <= 32; i++)
{
LBERA_DADOS = 1; // NBE A VSUALZAO DAS SADAS DO C 74HC595 BLOCO 1
// Delay10KTCYx(18);
SH_CP = 0;
//Delay10KTCYx(18);
ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1

if( DADOS[i] == 1)
NSERE_DADOS = 1; // NSERE VALOR DO BT QUE RA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
else //OU
NSERE_DADOS = 0; // NSERE VALOR DO BT QUE RA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
SH_CP = 1;
//Delay10KTCYx(18);
ST_CP = 1;
//Delay10KTCYx(18);
}
LBERA_DADOS = 0; // MOSTRA COMPOSO DOS BT's NAS PORTAS DO 74HC595 BLOCO 1
//Delay10KTCYx(18); //delay de 15ms
}
}
}
while (PORTA_ABERTA == 0);
ABRE_PORTA = 0;
7.14 A E5ECUTA LA,O DE PROGRAMA,-O DEFININDO FUN,-O
PARA IDENTIFICA,-O DE ANDAR
O elevador utilizar esta funo para armazenar na memria ao posio em que se
encontra dentro do poo.
//** EXECUTA LAO DE PROGRAMAO ******************************************************************************/
while(1) //Lao de repetio infinita
{
/** DEFNE FUNO ANDAR ******************************************************************************/
2
ANDAR = POSCAOA*1 + POSCAOB*2 + POSCAOC*4 + POSCAOD*8; // DGTOS PARA NDENTFCAO DA POCO
DA CABNE NOS ANDARES
7.15 A FAG 4ARREDURA NOS BOT.ES DE CHAMADA
Esta parte do programa utiliza um protocolo de varredura serial, auxiliada por um
deslocador de movimento denominado 74HC595, onde um pulso alto atinge um
nico boto externo de cada vez em tempos distintos e monitorados pelo programa.
sto permite um retorno e identificao do boto pressionado e o mapeamento de
uma varivel de acordo com estes .
Vide funcionamento em anexo dois (2)
/** FAZ VARREDURA NOS BOTES DE CHAMADA ****************************************************/
NSERE_DADOS2 = 1; // NBE A VSUALZAO DAS SADAS DO C 74HC595 BLOCO 2
for(i= 0; i < 32; i++)
{
LBERA_DADOS2 =1;
SH_CP2 = 0;
//Delay10KTCYx(18);
ST_CP2 = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 DA VARREDURA DE BOTES
//Delay1KTCYx(18);
SH_CP2 = 1;
//Delay1KTCYx(18);
ST_CP2 = 1; //SETA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 DA VARREDURA DE BOTES
//Delay1KTCYx(18);
LBERA_DADOS2 = 0;
if(CHAMADAS == 1 && i < 10)
chamadas_cab[i] = 1; //SERE VALOR NA MEMORA DE CHAMADA DE CABNE
if(CHAMADAS == 1 && i >= 10 && i < 20)
chamadas_sub[i-10] = 1; //SERE VALOR NA MEMORA DE CHAMADA DE SUBDA
if(CHAMADAS == 1 && i >= 20 && i < 30)
chamadas_des[i-20] = 1; //SERE VALOR NA MEMORA DE CHAMADA DE CABNE
NSERE_DADOS2 = 0; //RETORNA ESTADO ZERO PARA DESLOCAR O PRMERO DADO (NVEL ALTO) AT A ULTMA PORTA
}
LBERA_DADOS2 = 1; //LBERA TRANSFERENCA DE DE DADOS PARA LETURA DA PORTA "CHAMADA"
7.16 TRANFERE ESPELHO DE CHAMADAS PARA 4ARIJ4EL DADOS
/** TRANFERE ESPELHO DE CHAMADAS PARA VARAVEL DADOS *********************************/
for(i= 0; i < 32; i++)
{
2!
if(i < 10)
DADOS[i] = chamadas_cab[i];
if(i > 9 && i < 20)
DADOS[i] = chamadas_sub[i-10];
if(i > 19 && i < 30)
DADOS[i] = chamadas_des[i-20];
}
7.17 REGISTRA CHAMADAS DE CABINE
Esta parte do programa transfere o sinal de solicitao de chamadas para as sadas
do 74HC595 iluminando os "LED'S correspondentes aos botes pressionados
/** REGSTRA CHAMADAS DE CABNE ****************************************************/
for(i= 0; i < 32; i++)
{
LBERA_DADOS = 1; // NBE A VSUALZAO DAS SADAS DO C 74HC595 BLOCO 1
// Delay10KTCYx(18);
SH_CP = 0;
//Delay10KTCYx(18);
ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1
if(DADOS[i] == 1)
NSERE_DADOS = 1; // NSERE VALOR NA VARAVEL DADOS PARA ASCENDER O LED DO BOTO RESPECTVO
else
NSERE_DADOS = 0;
// NSERE VALOR NA VARAVEL DADOS PARA APAGAR O LED DO BOTO no pressionado
SH_CP = 1;
//Delay10KTCYx(18);
ST_CP = 1; //SETA OS CLOCK'S DE DESLOCAMENTO DO 74HC595
//Delay10KTCYx(18);
}
LBERA_DADOS = 0; //LBERA ASCENDMENTO DAS CHAMADAS SOLCTADAS
//Delay10KTCYx(18);
7.1 IDENTIFICA DIRE,-O DE CHAMADAS SUBIDA OU DESCIDA
Define se as chamadas que esto pressionada se localizam acima ou abaixo da
cabine.
/** DREO DE CHAMADAS SUBDA ******************************************************************************/
for(i = 0; i < 10; i++)
{
if((chamadas_sub[i] || chamadas_cab[i] || chamadas_des[i] ) && ANDAR < i)
3"
{
AUX_CHAM_SUB = 1;
break ;
}
else
AUX_CHAM_SUB = 0;
}
if(AUX_CHAM_SUB && SNAL_DESCE == 0)
SNAL_SOBE = 1;
else
SNAL_SOBE = 0;
/** DREO DE CHAMADAS DESCDA ******************************************************************************/
for(i = 0; i < 10; i++)
{
if((chamadas_des[i] || chamadas_cab[i] || chamadas_sub[i] ) && ANDAR > i)
{
AUX_CHAM_DES = 1;
break ;
}
else
AUX_CHAM_DES = 0;
}
if(AUX_CHAM_DES && SNAL_SOBE == 0)
SNAL_DESCE = 1;
else
SNAL_DESCE = 0;
7.1! COMANDO DE ALTA 4ELOCIDADE
/** COMANDO DE ALTA VELOCDADE **********************************************************************************/
if((SNAL_DESCE || SNAL_SOBE ) && SNAL_BAXA == 0 && ABRE_PORTA == 0 && PORTA_FECHADA == 1 )
SNAL_ALTA = 1;
else
SNAL_ALTA = 0;
7.2" PREPARA PARADA COM RE4ERS-O DE DIRE,-O DESCIDA OU
SUBIDA
Estaciona o elevador para atender a ultima ou a nica chamada existente, com a
cabine movimentando em sentido contrario a chamada solicitada.
Ex: Uma nica chamada de descida no 4 andar com a cabine estacionada no 2
31
/** PREPARA PARADA COM REVERSO DE DREO DESCDA *********************************************************** */
for(i = 0; i < 10; i++)
if(chamadas_des[i] == 1)
{
AD = 1;//AD = 1 >>> ha chamadas de descida; AD = 0 >>> nao ha chamandas de descida
break;
}
if(SNAL_SOBE && AD)
{
MAOR = 0;
for(i = 0; i < 10; i++)
if(chamadas_cab[i] || chamadas_des[i] || chamadas_sub[i] && i > MAOR)
MAOR = i;

if((MAOR - ANDAR == 1) && PREPARA_PARADA == 1)
{
SNAL_BAXA = 1;
SNAL_ALTA = 0;
}
}
/** PREPARA PARADA COM REVERSO DE DREO SUBDA ***************************************************************************/
for(i = 0; i < 10; i++)
if(chamadas_sub[i])
{
AS = 1;//AS = 1 >>> ha chamadas de subida; AS = 0 >>> nao ha chamandas de subida
break;
}
if(SNAL_DESCE && AS)
{
MENOR = 10;
for(i = 0; i < 10; i++)
if(chamadas_cab[i] ||chamadas_sub[i] || chamadas_des[i] && i < MENOR)
MENOR = i;
if((ANDAR - MENOR == 1) && PREPARA_PARADA)
{
SNAL_BAXA = 1;
SNAL_ALTA = 0;
}
}
7.21 PREPARACAOKDEKPARADA NA MESMA DIRE,-O
/** PREPARACAO_DE_PARADA ***********************************************************************************************/
32
for(i = 0; i < 10; i++)
{
if((chamadas_cab[i] || chamadas_des[i] ) && PREPARA_PARADA && ANDAR - i == 1 && SNAL_DESCE)
{
SNAL_BAXA = 1;
SNAL_ALTA = 0;
break;
}
if((chamadas_cab[i] || chamadas_sub[i]) && PREPARA_PARADA && i - ANDAR == 1 && SNAL_SOBE)
{
SNAL_BAXA = 1;
SNAL_ALTA = 0;
break;
}
}
7.22 PARADA
/** PARADA***************************************************************************************************************************/
for(i = 0; i < 10; i++)
{
if(NVELAMENTO && ANDAR == i && SNAL_BAXA)
{
SNAL_BAXA = 0;
if(PORTA_ABERTA == 0)
PARADA = 1;
}
}
7.23 CANCELANDO CHAMADA
/** CANCELANDO CHAMADA *******************************************************************************************************/
if( PARADA && PORTA_ABERTA)
{
chamadas_cab[ANDAR] = 0;
chamadas_sub[ANDAR] = 0;
chamadas_des[ANDAR] = 0;
}
for(i = 0; i < 10; i++)
if(SNAL_SOBE == 0 && SNAL_DESCE == 0 && i == ANDAR)
{
chamadas_cab[ANDAR] = 0;
chamadas_sub[ANDAR] = 0;
chamadas_des[ANDAR] = 0;
}
33
7.24 ABRE PORTA
/** ABRE PORTA ********************************************************************************************************************************/
if(PORTA_ABERTA == 0 && PARADA && NVELAMENTO)
ABRE_PORTA = 1;
else
{
ABRE_PORTA = 0 ;
PARADA = 0;
}
7.25 FECHA PORTA
/** FECHA PORTA *********************************************************************************************************************************/
for(i=0; i<10; i++)
{
if((chamadas_cab[i] || chamadas_des[i] || chamadas_sub[i]) && PORTA_FECHADA == 0)
{
FECHA_PORTA = 1;
break;
}
else
FECHA_PORTA = 0;
}
}//end while
}//end main
7.26 CONFIGURA SISTEMA
void ConfiguraSistema (void)
{
/** Configura todas as 13 portas analgicas ANx (portas do conversor A/D) como pinos digitais*******************************************/
ADCON1 |= 0x0F; // Todos os pinos como digital

//ENTRADA
TRSAbits.TRSA4 = 1; // CHAMADAS
TRSDbits.TRSD0 = 1; // BT A DA POSO
TRSDbits.TRSD1 = 1; // BT B DA POSO
TRSDbits.TRSD2 = 1; // BT C DA POSO
TRSDbits.TRSD3 = 1; // BT D DA POSO
TRSDbits.TRSD4 = 1; // SENSOR DE NVELAMENTO DE ANDARES
TRSBbits.TRSB0 = 1; // VA
TRSBbits.TRSB1 = 1; // VB
TRSBbits.TRSB2 = 1; // VC
TRSBbits.TRSB3 = 1; // VD
TRSBbits.TRSB6 = 1; // NDCAO DE PORTA ABERTA
TRSBbits.TRSB7 = 1; // NDCAO DE PORTA FECHADA
34
TRSCbits.TRSC6 = 1; // SENSOR DE PORTA FECHADA
TRSEbits.TRSE0 = 1; // SENSOR LMTE DE DESCDA
TRSEbits.TRSE1 = 1; // SENSOR LMTE DE SUBDA
/***********************************************************************************************/
//SADAS

TRSDbits.TRSD5 = 0; // SNAL_SOBE
TRSDbits.TRSD6 = 0; // SNAL_ALTA
TRSDbits.TRSD7 = 0; // SNAL_BAXA
TRSEbits.TRSE2 = 0; // FECHA PORTA
TRSAbits.TRSA0 = 0; // SH_CP2
TRSAbits.TRSA1 = 0; // NSERE_DADOS2
TRSAbits.TRSA2 = 0; // ST_CP2
TRSAbits.TRSA3 = 0; // LBERA_DADOS2
TRSAbits.TRSA5 = 0; // PARADA
TRSCbits.TRSC7 = 0; // ABRE PORTA
TRSCbits.TRSC0 = 0; // SH_CP
TRSCbits.TRSC1 = 0; // DATA
TRSCbits.TRSC2 = 0; // ST_CP
TRSCbits.TRSC6 = 0; // LBERA_DADOS
TRSBbits.TRSB4 = 0; // SNAL DESCE
TRSBbits.TRSB5 = 0; // PREPARAO DE PARADA
}//end ConfiguraSistema
/** V E C T O R R E M A P P N G ***********************************************************/
// Seo necessria para informar ao compilador C18 onde so os novos endereos
//da memria de programa que ele deve alocar as rotinas de tratamento do evento
//de "reset" do microcontrolador.
//
//ATENO: COPAR ESTA SEO DO CODGO PARA TODO ARQUVO "main.c" DOS PROJETOS
//QUE UTLZAM O BOOTLOADER PARA GRAVAO N-CRCUT.
extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code _RESET_NTERRUPT_VECTOR = 0x000800
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code
/** EOF main.c ***************************************************************/
8 CONSIDERA,.ES FINAIS OU CONCLUS-O
Die%o Corr!#i
O curso de PC foi de grande importncia, a partir dele adquiri uma viso melhor
sobre microcontroladores e melhorei meu raciocnio com lgica digital. E ainda tive a
oportunidade de conhecer o Luiz que me ensinou muitas coisas na rea de eltrica e
35
eletrnica, ampliando minha viso na rea. Com o projeto de concluso de curso
obtive conhecimentos do funcionamento do elevador, parte de sensoriamento,
prioridades, alm de conhecer novos dispositivos eletrnicos e otimizar um projeto a
partir de portas lgicas, flip flop's, e melhorar meu raciocnio com programao de
computadores, linguagem C.
L&iz Cl'&#io
Ao participar do curso da PCMNAS no primeiro dia de aula senti dificuldades para
realizar um programa que ascendesse apenas um LED, sem conhecimento nenhum
para tal.
Acho que o programa acima diz por si prprio a evoluo que o curso proporcionou
em minha vida em apenas duas semanas.
Meus agradecimentos aos profissionais altamente classificados desta empresa.
! REFERLNCIAS BIBLIOGR6FICAS
OPICMINAS departamento educacional da empresa AXOON Solues Tecnolgicas em Sade.
Curso de linguagem C ANS para PC18F4550. CD iner!iMo+ Belo Horizonte, 2010, volume 1.
EBAH!, Pedro. MANUAL PROTEUS EM PORTUGULS+ Disponvel
Em:<http//:www.prdf.mpf.gov.br/~gazoto/monograf/revfranc> Acesso em: 04 Abr. 2010.

You might also like