Você está na página 1de 39

LINGUAGEM PIC18F4550

ANSI

PARA

MICROCONTROLADOR

Belo Horizonte Maro de 2010

LINGUAGEM PIC18F4550

ANSI

PARA

MICROCONTROLADOR

Diego Carradi Luiz Cludio do Nascimento

Relatrio de

apresentado

PICMINAS

como requisito para concluso de curso Microcontroladores PIC18F4550 em linguagem C ANSI.

Belo Horizonte Maro de 2010

RESUMO

Este

projeto

tem

como

escopo como

principal, unidade

utilizao para

do o

microcontrolador

PIC18F4550

central

processamento e controle de transporte vertical (elevadores) com as seguintes vantagens:

A aplicao reduz o custo final evitando a utilizao de micro controlador especficos. 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 PIC garantindo estabilidade ao sistema. A programao pode ser feita on board atravs de conectores USB1. Para mais de um elevador pode ser feito Softwares especficos para controle de trfego e at mesmo funes especiais de manobras via PC2

1 2

USB - Universal Serial Bus PC Computadores Compactos

SUMRIO
1. INTRODUO 03 03 03 03 04 04 04 04 05 05 05 06 06

2 3

CONSIDERAES PLATAFORMAS DE SIMULAO

3.1

PROTEUS 7.2 SP6

3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2

AMBIENTE DE TRABALHO PROTEUS 7.2 SP6. ARQUIVO DE COMANDO DE IMPRESSO COMANDOS DE EXPOSIO PRINCIPAIS COMANDOS ICONES DO DISPOSITIVO GRFICOS 2D FERRAMENTAS DO PROJETO EDIO DE COMANDOS ESPELHO E GIRAR ICONES INTRODUO DE OPERAO DO PROTEUS NO MODO ISIS COM

MICROCONTROLADORES 3.2.3 CARREGAR O PROGRAMA COM OS DADOS . HEX GERADOS NO MPLAB

06 11 12 12 13 17 17 17

PLATAFORMAS DE PROGRAMAO C ANSI. 4.1 MPLAB 4.1.1 CARREGANDO PROJETOS NO MPLAB 4.2 MCC18

APRESENTAO DO 74HS594

5.1. 5.2. 6 7

ESQUEMA ELETRNICO

FUNCIONAMENTO. 18 18 18 19

18

APRESENTAO DO PROJETO APRESENTAO DO PROGRAMA ESCRITO EM LINGUAGEM C ANSI.

7.1 DEFINES 7.2 7.3 7.4 7.5 7.6 7.7


VARIVEIS

ZERANDO VARIAVEIS, PORTAS E REGISTRADORES PARA INICIALIZAR COMANDOS. 19 PREPARA PORTA PARA POCICIONAR CABINE DO ELEVADOR NA PRIMEIRA PARADA 21 DETECTA FALHA AO FECHAR A PORTA PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE STOP DA CABINE NA POSIO INFERIOR 22 22 23

7.8 7.9 7.11

PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE STOP DA CABINE NA POSIO INFERIOR CABINE PARA POSIO DA PRIMEIRA PARADA

24 25 25 25 26 26

7.10 NIVELA A

PREPARA PARA ABRIR PORTA

7.12 DETECTA FALHA AO ABRIR A PORTA 7.13 PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE
ANDAR

7.14 A EXECUTA LAO DE PROGRAMAO DEFININDO FUNO PARA IDENTIFICAO DE


27 27 28 28 29 29 30 31 31 31 32 32 32 33 34

7.15 A FAZ VARREDURA NOS BOTES DE CHAMADA 7.16 TRANFERE ESPELHO DE CHAMADAS PARA VARIVEL DADOS 7.17 REGISTRA CHAMADAS DE CABINE 7.18 IDENTIFICA
DIREO DE CHAMADAS SUBIDA OU DESCIDA

7.19 COMANDO DE ALTA VELOCIDADE 7.20 PREPARA PARADA COM REVERSO DE DIREO DESCIDA OU SUBIDA 7.21 PREPARACAO_DE_PARADA NA MESMA DIREO 7.22 PARADA 7.23 CANCELANDO CHAMADA 7.24 ABRE PORTA 7.25 FECHA PORTA 7.26 CONFIGURA SISTEMA 8 9
CONSIDERAES FINAIS OU CONCLUSO REFERNCIAS BIBLIOGRFICAS

1. INTRODUO

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 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 PIC 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 PIC de forma a multiplicar a sua gama de monitoramento e comando. 2 CONSIDERAES Para melhor apresentao deste relatrio as figuras sero apresentadas conforme desenvolvimento do documento e no em anexo conforme norma. o mesmo efeito com qualidade , confiabilidade e significativa reduo de custo, utilizando o PIC18F4550,

3 PLATAFORMAS DE SIMULAO O projeto ser simulado e processado com as seguintes ferramentas 3.1 PROTEUS 3 7.2 SP6

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.

Plataforma de simulao eletrnica ISIS

3.1.1

AMBIENTE DE TRABALHO PROTEUS 7.2 SP6.

3.1.2 ARQUIVO DE COMANDO DE IMPRESSO

Novo

Abrir

Salvar

Imprimir

rea de Impresso

Seo de Importao

Seo de Exportao

3.1.3 COMANDOS DE EXPOSIO

Refazer

Grade

Origem

Cursor

Bandeja

Aumentar

Diminuir

Visualizar

Lupa

3.1.4 PRINCIPAIS COMANDOS

Componente

Ponto de

Etiqueta

Certificado

Barra de

Circuito

Edio

Juno

Transporte

Secundrio

3.1.5 ICONES DO DISPOSITIVO

Terminais

Pino Dispositivo

Grfico

Fita Adesiva

Gerador

Ponta de Ponta de Multmetro Prova Voltagem Prova Corrente

3.1.6 GRFICOS 2D

Linha

Caixa

Circulo

Arco

Trajeto 2D

Texto

Smbolo

3.1.7 FERRAMENTAS DO PROJETO

Tempo Real Snap

Fio Roteador

Busca Pesquisa

Propriedade de Ferramentas

Nova Folha

Deletar

Folha Anterior

Desfazer Ao

Impossvel Desfazer

Valor do Material

Verificao Eltrica das Trilhas

Lista Lquida Ares

3.1.8 EDIO DE COMANDOS Estes afetam todos os objetos atualmente etiquetados.

Cpia Bloco

Movimenta Bloco

Deletar Bloco

Girar o Bloco

Seleo Dispositivo Smbolo

Fazer o Dispositivo

Decompor

Pacote de Ferramentas

Undo

Redo

Recortar

Cpia

Pasta

3.1.9 ESPELHO E GIRAR ICONES

Girar no Sentido Horrio

Girar Anti-Horrio

Linha central de X

linha central da aleta Y

3.2 Introduo de operao do Proteus no modo ISIS com microcontroladores Com o programa instalado v at o menu iniciar e clique sobre o cone ISIS

Depois do programa aberto clique em file e escolha a opo New design

N 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 clique em P para trabalhar em modo de manipulao de componentes e

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.

Neste campo poder existir mais de um componente de acordo com a sua biblioteca

Observe agora que o componente selecionado ocupou o campo DEVICE e esta disponvel para ser utilizado. Repita os passos para adicionar ao DEVICE os outros componentes a serem utilizados durante a construo do projeto, em seguida clique em OK para retornar a tela de trabalho.

10

J na tela de trabalho sobre o campo DEVICE 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. Obs.: 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

3.2.3 Carregar o programa com os dados . HEX gerados no MPLAB D dois clique sobre o microcontrolador que est na rea de trabalho e a seguinte 1 tela ser aberta: 4 2 3

3.3 MPLAB 8

1 Indica a nomenclatura do componente no projeto 2 Indica o modelo do microcontrolador utilizado 3 Indica o tipo de invlucro utilizado para confeco do circuito impresso no ARES 4 Indica 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

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 PROGRAMAO C ANSI. 4.1 MPLAB O MPLAB um ambiente integrado para o estudo e desenvolvimento com a famlia PIC 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 PIC.

13

4.1.2 Carregando projetos no MPLAB

Passo 1- Abra o bloco de nota e o salve como main.c em uma pasta onde ser aberto o novo projeto. Passo 2- Depois de abrir o programa selecione project wizard para carregar um projeto no MPLAB

Passo 3- A seguinte tela se apresentar clique em avanar

Passo 4- Escolha o microcontrolador a ser u utilizado e clique em avanar

Passo 5- Nesta pagina escolha o tipo de compilador e linguagem e clique em avanar no nosso caso MCC18 para linguagem C A ANSI

14

Passo 6 1- Clique em browse 2- Escolha a pasta o onde foi criado main.c 3- Digite um nome para o projeto

4- Clique em salvar

Passo 7- O caminho do projeto criado, clique em avanar.

Passo 8- Esta tela permite inserir o main.c ao projeto no entanto faremos isto posteriormente a apenas clique em avanar

P Passo 9- clique em concluir

Passo 10- clique com o boto direito do mouse e v em A Add Files para inserir o main.c criado anteriormente

15

Passo 11- Na tela que se abrir selecione Project Directory e clique duas vezes sobre cone main no pad

Pronto o arquivo main foi adicionado a ao projeto

Obs : Se o seu projeto conter um programa de boot-loader carregue-o usando o m mesmo procedimento que foi usado no main.

Passo 12- D dois clique sobre o cone main e digite o programa a ser rodado Digite aqui seu programa

16

P Passo 13- Depois de escrito o programava em Project depois em Build All. Se o programa estiver sem erro o arquivo .H

Mensagem de compilao com sucesso

NOTA: Existe a possibilidade de simular o programa no ambiente MPLAB mas no abordaremos este tpico pois nossa simulao acontecer no PROTEUS

17

4.2 MCC18 Tambm conhecido como MPLAB C18 uma compilador C ANSI compatvel para a famlia PIC18 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 IDE. 5 Apresentao do 74HS594

O circuito integrado 74HS595 um deslocador de movimento que utiliza oito flipflops que so responsveis pela memorizao de dados inseridos e manipulados de posio em posio atravs de duas entradas de clocks .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. Esquema eletrnico

18

5.2.

funcionamento.

O Programa trabalha com o deslocamento do dado inserido na entrada DS para isto ele colocar as duas entradas de clocks 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-flops 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. Nota : 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.

Apresentao do projeto

Anexo trs (3) 7 Apresentao do programa escrito em linguagem C ANSI. 7.1 DEFINES
/** I N C L U D E S ************************************************************************************/ #include <p18cxxx.h> // Necessrio para que o compilador adicione a biblioteca // com as definies do PIC selecionado no projeto, neste //caso, o modelo 18F4550. #include <delays.h> // Biblioteca padro de rotinas de atraso do C18 Microchip

/** D E F I N E S **************************************************************************************/

#define #define #define #define #define #define #define #define #define

SH_CP INSERE_DADOS ST_CP LIBERA_DADOS SH_CP2 INSERE_DADOS2 ST_CP2 LIBERA_DADOS2 SH_CP3

PORTCbits.RC0 PORTCbits.RC1 PORTCbits.RC2 PORTCbits.RC6 PORTAbits.RA0 PORTAbits.RA1 PORTAbits.RA2 PORTAbits.RA3 PORTBbits.RB0

// VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL

19

#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define

INSERE_DADOS3 ST_CP3 LIBERA_DADOS3 CHAMADAS PARADA PREPARA_PARADA PORTA_ABERTA PORTA_FECHADA ABRE_PORTA FECHA_PORTA POSICAOA POSICAOB POSICAOC POSICAOD SINAL_DESCE SINAL_SOBE SINAL_ALTA SINAL_BAIXA LIMITE_DESCIDA LIMITE_SUBIDA NIVELAMENTO

PORTBbits.RB1 PORTBbits.RB2 PORTBbits.RB3 PORTAbits.RA4 PORTAbits.RA5 PORTBbits.RB5 PORTBbits.RB6 PORTBbits.RB7 PORTCbits.RC7 PORTEbits.RE2 PORTDbits.RD0 PORTDbits.RD1 PORTDbits.RD2 PORTDbits.RD3 PORTBbits.RB4 PORTDbits.RD5 PORTDbits.RD6 PORTDbits.RD7 PORTEbits.RE0 PORTEbits.RE1 PORTDbits.RD4

// VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARIVEL DE COMUNICAO SERIAL // VARREDURA PARA REGISTRO DAS CHAMADAS DE //CABINE, SUBIDA E DESCIDA // SINAL DE PARADA // DEFINE ONDE SERA INICIADO A PARADA // INDICAO DE PORTA ABERTA // INDICAO DE PORTA FECHADA // ACIONA CIRCUITO PARA ABRIR PORTA // ACIONA CIRCUITO PARA FECHAR PORTA // SINAL DOS SENSORES DE POSICIONAMENTO // SINAL DOS SENSORES DE POSICIONAMENTO // SINAL DOS SENSORES DE POSICIONAMENTO // SINAL DOS SENSORES DE POSICIONAMENTO // INDICA EXISTENCIA DE CHAMADAS DE DESCIDA // INDICA EXISTENCIA DE CHAMADAS DE SUBIDA // ACIONA A BAIXA VELOCIDADE DO ELEVADOR // ACIONA A ALTA VELOCIDADE DO ELEVADOR // LIMITE DE POSICIONAMENTO MAXIMO INFERIOR DA //CABINE // LIMITE DE POSICIONAMENTO MAXIMO SUPERIOR DA //CABINE // INDICA NIVELAMENTO DA CABINE COM O ANDAR

7.2 VARIVEIS
/** P R O T O T I P O S P R I V A D O S **************************************************************************************/

void ConfiguraSistema (void);

/** VARIAVEIS AUXILIARES *******************************************************************************************************/

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_ABRIR_PORTA , MAIOR, MENOR, AD, AS; unsigned long int INDEX, INDEX2;

7.3 ZERANDO VARIAVEIS, PORTAS E REGISTRADORES PARA INICIALIZAR COMANDOS.

/** FUNCAO PRINCIPAL ***********************************************************************************************************/

20

void main(void) {

ConfiguraSistema(); //Configura quem so as entradas e sadas no PIC

/** ZERA SAIDAS DE COMANDOS ********************************************************************************************CORRETO*/

SH_CP2 = 0; INSERE_DADOS2 = 0; ST_CP2 = 0; LIBERA_DADOS2 = 0; PARADA = 0; SINAL_DESCE = 0; PREPARA_PARADA = 0; SH_CP = 0; INSERE_DADOS = 0; ST_CP = 0; LIBERA_DADOS = 0; ABRE_PORTA = 0; SINAL_SOBE = 0; SINAL_ALTA = 0; SINAL_BAIXA = 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 VARIAVEIS DE COMANDOS ************************************************************************************/

FALHA_FECHAR_PORTA = 0; ANDAR = 0; INDEX = 0; FALHA = 0;

/** LIMPA REGISTROS DAS SAIDAS DOS 74HC595 ********************************************************************/

for(i = 0; i < 32; i++) { LIBERA_DADOS = 1; // INIBE A VISUALIZAO DAS SIDAS DO CI 74HC595 BLOCO 1

21

// Delay10KTCYx(18); SH_CP = 0; //Delay10KTCYx(18); ST_CP = 0; INSERE_DADOS = 0; SH_CP = 1; //Delay10KTCYx(18); //delay de 15ms ST_CP = 1; //Delay10KTCYx(18); //delay de 15ms } // DESLOCA BIT ATE A ULTIMA PORTA DO 74HC595 BLOCO 1 //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1 //ISERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1

7.4 PREPARA PORTA PARA POCICIONAR CABINE DO ELEVADOR 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 (INDEX) 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 REPOSICIONAMENTO DA CABINE **************************************/

ABRE_PORTA = 0; do { FECHA_PORTA = 1; INDEX ++; if(INDEX == 150000) { FECHA_PORTA = 0; //Delay10KTCYx(240); } //delay //EXECUTA TIPO UM DELAY QUE TER "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO DA //CONTAGEM

/** TENTATIVA 2 DE FECHAR A PORTA ********************************************************************************/

if(INDEX == 300000)

// EXECUTA TIPO UM DELAY QUE TER "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO //DA CONTAGEM

22

{ FALHA_FECHAR_PORTA = 2; FECHA_PORTA = 0; //Delay10KTCYx(240); } //delay

/** TENTATIVA 3 DE FECHAR A PORTA ***********************************************************************************/

if(INDEX == 450000) { FALHA_FECHAR_PORTA = 3; FECHA_PORTA = 0; //Delay10KTCYx(240); }

// EXECUTA TIPO UM DELAY QUE TER "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO //DA CONTAGEM

//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(INDEX == 600000) { FALHA_FECHAR_PORTA = 4; FECHA_PORTA = 0; while(1) { FECHA_PORTA = 0; ABRE_PORTA = 0; SINAL_SOBE = 0; SINAL_DESCE = 0; SINAL_ALTA = 0; SINAL_BAIXA = 0; DADOS[31] = 1;

// EXECUTA TIPO UM DELAY QUE TER "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO //DA CONTAGEM

// LAO INFINITO DE FALHA DETECTADA

23

7.6 PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE 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.

/**PROCEDIMENTO PARA ASCENDER LEDS DE FALHA DENTRO DO WHILE ******************************************* */ for(i = 0; i <= 32; i++) { LIBERA_DADOS = 1; // Delay10KTCYx(18); SH_CP = 0; //Delay10KTCYx(18); ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1 // INIBE A VISUALIZAO DAS SIDAS DO CI 74HC595 BLOCO 1

if ( DADOS[i] == 1) INSERE_DADOS = 1; else INSERE_DADOS = 0; SH_CP = 1; //Delay10KTCYx(18); ST_CP = 1; //Delay10KTCYx(18); }

// CONDIO // INSERE VALOR DO BIT QUE IR SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1 // OU // INSERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1

// DESLOCA BIT AT A ULTIMA PORTA DO 74HC595 BLOCO 1

LIBERA_DADOS = 0;

// LIBERA INFORMAO DAS PORTAS DO 74HC595 BLOCO 1

//Delay10KTCYx(18);

} } }while (PORTA_FECHADA == 0);

FECHA_PORTA = 0;

//** ZERA INDEX ***************************************************************************************************************** */

INDEX = 0 ; do { INDEX ++;

// PREPARA VARIAVEL "INDEX" PARA NOVA CONTAGEM.

24

7.7 STOP DA CABINE NA POSIO 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. A tcnica utilizada aqui idntica ao do fechamento de porta a criao da varivel (INDEX) 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 CABINE PARA POSIO INFERIOR ************************************************************************************/ SINAL_DESCE = 1; SINAL_BAIXA = 1;

if( INDEX == 4000000) DA CONTAGEM while(1) { FECHA_PORTA = 0; ABRE_PORTA = 0; SINAL_SOBE = 0; SINAL_DESCE = 0; SINAL_ALTA = 0; SINAL_BAIXA = 0; DADOS[21] = 1;

// EXECUTA TIPO UM DELAY QUE TER "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO

// ESTE TIPO DE DELAY GARANTE A MANUTENO DO COMANDO CONTRA //FALHAS QUE PODEM OCORRER COM TRANSIENTES INDUZIDOS PELA FIAO DE POO

7.8 PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE


/**PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE ************************************************************ */

for(i = 0; i <= 32; i++) { LIBERA_DADOS = 1; //Delay10KTCYx(18); SH_CP = 0; //Delay10KTCYx(18); ST_CP = 0; if(DADOS[i] == 1) INSERE_DADOS = 1; else INSERE_DADOS = 0; //Delay10KTCYx(18); //ISERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1 // OU //ISERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1 //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1 // INIBE A VISUALIZAO DAS SIDAS DO CI 74HC595 BLOCO 1

25

SH_CP = 1; //Delay10KTCYx(18); ST_CP = 1; } // DESLOCA BIT AT A ULTIMA PORTA DO 74HC595 BLOCO 1

LIBERA_DADOS = 0; //Delay10KTCYx(18); } }while (LIMITE_DESCIDA == 1);

// LIBERA INFORMAO DAS PORTAS DO 74HC595 BLOCO 1

7.9 STOP DA CABINE NA POSIO INFERIOR

//** STOP DA CABINE NA POSIO INFERIOR *************************************************************************/

SINAL_DESCE = 0; SINAL_BAIXA = 0;

7.10

NIVELA A CABINE PARA POSIO 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
//** NIVELA A CABINE PARA POSIO DA PRIMEIRA PARADA **************************************************** */ //Delay10KTCYx(180); //delay de 150ms

do { SINAL_SOBE = 1; SINAL_BAIXA = 1; }while(NIVELAMENTO == 0);

SINAL_SOBE = 0; SINAL_BAIXA = 0; //Delay10KTCYx(100); //delay

7.11

PREPARA PARA ABRIR PORTA

26

Nesta parte do programa utilizado novamente a tcnica do contador de ciclos (INDEX) 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 REPOSICIONAMENTO DA CABINE ***************************************************/

FECHA_PORTA = 0;

do { ABRE_PORTA = 1; INDEX++; // CONTA TEMPO ENCREMENTANDO INDEX PARA INDENTIFICAR FALHA DE PORTA FECHANDO

if(INDEX== 150000) { FALHA_ABRIR_PORTA = 1; ABRE_PORTA = 0; Delay10KTCYx(240); //delay } /** TENTATIVA 2 DE FECHAR A PORTA ******************************************************************************/

if(INDEX == 300000) { FALHA_ABRIR_PORTA = 2; ABRE_PORTA = 0; //Delay10KTCYx(240); } //delay

/** TENTATIVA 3 DE FECHAR A PORTA ******************************************************************************/

if(INDEX == 450000) { FALHA_ABRIR_PORTA = 3; ABRE_PORTA = 0; //Delay10KTCYx(240); } //delay

7.12

DETECTA FALHA AO ABRIR A PORTA

/**FALHA DETECTADA AO FECHAR A PORTA ***********************************************************************/

if(INDEX == 600000) {

27

FALHA_ABRIR_PORTA = 4; ABRE_PORTA = 0;

while(1) { FECHA_PORTA = 0; ABRE_PORTA = 0; SINAL_SOBE = 0; SINAL_DESCE = 0; SINAL_ALTA = 0; SINAL_BAIXA = 0; DADOS[32] = 1;

7.13

PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO

WHILE
/**PROCEDIMENTO PARA ASCENDER LED DE FALHA *****************************************************************************/

for(i = 0; i <= 32; i++) { LIBERA_DADOS = 1; // Delay10KTCYx(18); SH_CP = 0; //Delay10KTCYx(18); ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1 // INIBE A VISUALIZAO DAS SAIDAS DO CI 74HC595 BLOCO 1

if( DADOS[i] == 1) INSERE_DADOS = 1; // INSERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1

else INSERE_DADOS = 0;

//OU // INSERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1

SH_CP = 1; //Delay10KTCYx(18); ST_CP = 1; //Delay10KTCYx(18); }

LIBERA_DADOS = 0; } } } while (PORTA_ABERTA == 0);

// MOSTRA COMPOSIO DOS BIT's NAS PORTAS DO 74HC595 BLOCO 1

//Delay10KTCYx(18); //delay de 15ms

ABRE_PORTA = 0;

28

7.14

A EXECUTA LAO DE PROGRAMAO DEFININDO FUNO

PARA IDENTIFICAO 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

/** DEFINE FUNO ANDAR ******************************************************************************/

ANDAR = POSICAOA*1 + POSICAOB*2 + POSICAOC*4 + POSICAOD*8; DA CABINE NOS ANDARES

// DIGITOS PARA INDENTIFICAO DA POCIO

7.15

A FAZ VARREDURA NOS BOTES 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. Isto 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 ****************************************************/

INSERE_DADOS2 = 1;

// INIBE A VISUALIZAO DAS SAIDAS DO CI 74HC595 BLOCO 2

for(i= 0; i < 32; i++) { LIBERA_DADOS2 =1; SH_CP2 = 0; //Delay10KTCYx(18); ST_CP2 = 0; //Delay1KTCYx(18); SH_CP2 = 1; //Delay1KTCYx(18); ST_CP2 = 1; //Delay1KTCYx(18); LIBERA_DADOS2 = 0; //SETA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 DA VARREDURA DE BOTES //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 DA VARREDURA DE BOTES

if(CHAMADAS == 1 && i < 10) chamadas_cab[i] = 1; //ISERE VALOR NA MEMORIA DE CHAMADA DE CABINE

29

if(CHAMADAS == 1 && i >= 10 && i < 20) chamadas_sub[i-10] = 1; if(CHAMADAS == 1 && i >= 20 && i < 30) chamadas_des[i-20] = 1; //ISERE VALOR NA MEMORIA DE CHAMADA DE CABINE //ISERE VALOR NA MEMORIA DE CHAMADA DE SUBIDA

INSERE_DADOS2 = 0; }

//RETORNA ESTADO ZERO PARA DESLOCAR O PRIMEIRO DADO (NIVEL ALTO) AT A ULTIMA PORTA

LIBERA_DADOS2 = 1;

//LIBERA TRANSFERENCIA DE DE DADOS PARA LEITURA DA PORTA "CHAMADA"

7.16

TRANFERE ESPELHO DE CHAMADAS PARA VARIVEL DADOS

/** TRANFERE ESPELHO DE CHAMADAS PARA VARIAVEL DADOS *********************************/

for(i= 0; i < 32; i++) { 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 LEDS correspondentes aos botes pressionados
/** REGISTRA CHAMADAS DE CABINE ****************************************************/

for(i= 0; i < 32; i++) { LIBERA_DADOS = 1; // Delay10KTCYx(18); SH_CP = 0; //Delay10KTCYx(18); ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1 // INIBE A VISUALIZAO DAS SAIDAS DO CI 74HC595 BLOCO 1

if(DADOS[i] == 1) INSERE_DADOS = 1; else INSERE_DADOS = 0; // INSERE VALOR NA VARIAVEL DADOS PARA APAGAR O LED DO BOTO no pressionado SH_CP = 1; //Delay10KTCYx(18); ST_CP = 1; //Delay10KTCYx(18); //SETA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 // INSERE VALOR NA VARIAVEL DADOS PARA ASCENDER O LED DO BOTO RESPECTIVO

30

LIBERA_DADOS = 0; //Delay10KTCYx(18);

//LIBERA ASCENDIMENTO DAS CHAMADAS SOLICITADAS

7.18

IDENTIFICA DIREO DE CHAMADAS SUBIDA OU DESCIDA

Define se as chamadas que esto pressionada se localizam acima ou abaixo da cabine.

/** DIREO DE CHAMADAS SUBIDA ******************************************************************************/

for(i = 0; i < 10; i++) { if((chamadas_sub[i] || chamadas_cab[i] || chamadas_des[i] ) && ANDAR < i) { AUX_CHAM_SUB = 1; break ; } else AUX_CHAM_SUB = 0; }

if(AUX_CHAM_SUB && SINAL_DESCE == 0) SINAL_SOBE = 1; else SINAL_SOBE = 0;

/** DIREO DE CHAMADAS DESCIDA ******************************************************************************/

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 && SINAL_SOBE == 0) SINAL_DESCE = 1; else SINAL_DESCE = 0;

31

7.19

COMANDO DE ALTA VELOCIDADE

/** COMANDO DE ALTA VELOCIDADE **********************************************************************************/

if((SINAL_DESCE || SINAL_SOBE ) && SINAL_BAIXA == 0 && ABRE_PORTA == 0 && PORTA_FECHADA == 1 ) SINAL_ALTA = 1; else SINAL_ALTA = 0;

7.20

PREPARA PARADA COM REVERSO DE DIREO 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
/** PREPARA PARADA COM REVERSO DE DIREO DESCIDA *********************************************************** */

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(SINAL_SOBE && AD) { MAIOR = 0;

for(i = 0; i < 10; i++) if(chamadas_cab[i] || chamadas_des[i] || chamadas_sub[i] && i > MAIOR) MAIOR = i;

if((MAIOR - ANDAR == 1) && PREPARA_PARADA == 1) { SINAL_BAIXA = 1; SINAL_ALTA = 0; } }

/** PREPARA PARADA COM REVERSO DE DIREO SUBIDA ***************************************************************************/

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

32

break; }

if(SINAL_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) { SINAL_BAIXA = 1; SINAL_ALTA = 0; } }

7.21

PREPARACAO_DE_PARADA NA MESMA DIREO

/** PREPARACAO_DE_PARADA ***********************************************************************************************/

for(i = 0; i < 10; i++) { if((chamadas_cab[i] || chamadas_des[i] ) && PREPARA_PARADA && ANDAR - i == 1 && SINAL_DESCE) { SINAL_BAIXA = 1; SINAL_ALTA = 0; break; } if((chamadas_cab[i] || chamadas_sub[i]) && PREPARA_PARADA && i - ANDAR == 1 && SINAL_SOBE) { SINAL_BAIXA = 1; SINAL_ALTA = 0; break; } }

7.22

PARADA

/** PARADA***************************************************************************************************************************/

for(i = 0; i < 10; i++) { if(NIVELAMENTO && ANDAR == i && SINAL_BAIXA) { SINAL_BAIXA = 0;

if(PORTA_ABERTA == 0)

33

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(SINAL_SOBE == 0 && SINAL_DESCE == 0 && i == ANDAR) { chamadas_cab[ANDAR] = 0; chamadas_sub[ANDAR] = 0; chamadas_des[ANDAR] = 0; }

7.24

ABRE PORTA

/** ABRE PORTA ********************************************************************************************************************************/

if(PORTA_ABERTA == 0 && PARADA && NIVELAMENTO) 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

34

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

TRISAbits.TRISA4 = 1; TRISDbits.TRISD0 = 1; TRISDbits.TRISD1 = 1; TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISDbits.TRISD4 = 1; TRISBbits.TRISB0 = 1; TRISBbits.TRISB1 = 1; TRISBbits.TRISB2 = 1; TRISBbits.TRISB3 = 1; TRISBbits.TRISB6 = 1; TRISBbits.TRISB7 = 1; TRISCbits.TRISC6 = 1; TRISEbits.TRISE0 = 1; TRISEbits.TRISE1 = 1;

// CHAMADAS // BIT A DA POSIO // BIT B DA POSIO // BIT C DA POSIO // BIT D DA POSIO // SENSOR DE NIVELAMENTO DE ANDARES // VA // VB // VC // VD // INDICAO DE PORTA ABERTA // INDICAO DE PORTA FECHADA // SENSOR DE PORTA FECHADA // SENSOR LIMITE DE DESCIDA // SENSOR LIMITE DE SUBIDA

/***********************************************************************************************/

//SAIDAS

TRISDbits.TRISD5 = 0; TRISDbits.TRISD6 = 0; TRISDbits.TRISD7 = 0; TRISEbits.TRISE2 = 0; TRISAbits.TRISA0 = 0; TRISAbits.TRISA1 = 0; TRISAbits.TRISA2 = 0; TRISAbits.TRISA3 = 0; TRISAbits.TRISA5 = 0; TRISCbits.TRISC7 = 0; TRISCbits.TRISC0 = 0; TRISCbits.TRISC1 = 0; TRISCbits.TRISC2 = 0; TRISCbits.TRISC6 = 0; TRISBbits.TRISB4 = 0; TRISBbits.TRISB5 = 0;

// SINAL_SOBE // SINAL_ALTA // SINAL_BAIXA // FECHA PORTA // SH_CP2 // INSERE_DADOS2 // ST_CP2 // LIBERA_DADOS2 // PARADA // ABRE PORTA // SH_CP // DATA // ST_CP // LIBERA_DADOS // SINAL DESCE // PREPARAO DE PARADA

35

}//end ConfiguraSistema

/** V E C T O R R E M A P P I 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: COPIAR ESTA SEO DO CODIGO PARA TODO ARQUIVO "main.c" DOS PROJETOS //QUE UTILIZAM O BOOTLOADER PARA GRAVAO IN-CIRCUIT.

extern void _startup (void); void _reset (void) { _asm goto _startup _endasm } #pragma code

// See c018i.c in your C18 compiler dir

#pragma code _RESET_INTERRUPT_VECTOR = 0x000800

/** EOF main.c ***************************************************************/

8 CONSIDERAES FINAIS OU CONCLUSO Diego Corradi O curso de PIC 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 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. Luiz Cludio Ao participar do curso da PICMINAS 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.

36

Meus agradecimentos aos profissionais altamente classificados desta empresa.

REFERNCIAS BIBLIOGRFICAS

OPICMINAS departamento educacional da empresa AXOON Solues Tecnolgicas em Sade.


Curso de linguagem C ANSI para PIC18F4550. CD interativo. Belo Horizonte, 2010, volume 1.

EBAH!, Pedro. MANUAL PROTEUS EM PORTUGUS. Disponvel Em:<http//:www.prdf.mpf.gov.br/~gazoto/monograf/revfranc> Acesso em: 04 Abr. 2010.