Professional Documents
Culture Documents
PIC18F4550
Belo Horizonte
Março de 2010
LINGUAGEM C ANSI PARA MICROCONTROLADOR
PIC18F4550
Diego Carradi
Luiz Cláudio do Nascimento
Belo Horizonte
Março de 2010
RESUMO
1
USB - Universal Serial Bus
2
PC – Computadores Compactos
SUMÁRIO
1. INTRODUÇÃO 03
2 CONSIDERAÇÕES 03
3 PLATAFORMAS DE SIMULAÇÃO 03
3.1 PROTEUS® 7.2 SP6 03
3.1.1 AMBIENTE DE TRABALHO PROTEUS® 7.2 SP6. 04
3.1.2 ARQUIVO DE COMANDO DE IMPRESSÃO 04
3.1.3 COMANDOS DE EXPOSIÇÃO 04
3.1.4 PRINCIPAIS COMANDOS 04
3.1.5 ICONES DO DISPOSITIVO 05
3.1.6 GRÁFICOS 2D 05
3.1.7 FERRAMENTAS DO PROJETO 05
3.1.8 EDIÇÃO DE COMANDOS 06
3.1.9 ESPELHO E GIRAR ICONES 06
3.2 INTRODUÇÃO DE OPERAÇÃO DO PROTEUS NO MODO ISIS COM
MICROCONTROLADORES 06
3.2.3 CARREGAR O PROGRAMA COM OS DADOS “. HEX”
GERADOS NO MPLAB® 11
4 PLATAFORMAS DE PROGRAMAÇÃO C ANSI. 12
4.1 MPLAB® 12
4.1.1 CARREGANDO PROJETOS NO MPLAB ® 13
4.2 MCC18® 17
5 APRESENTAÇÃO DO 74HS594 17
5.1. ESQUEMA ELETRÔNICO 17
5.2. FUNCIONAMENTO. 18
6 APRESENTAÇÃO DO PROJETO 18
7 APRESENTAÇÃO DO PROGRAMA ESCRITO EM LINGUAGEM C ANSI. 18
7.1 DEFINES 18
7.2 VARIÁVEIS 19
7.3 ZERANDO VARIAVEIS, PORTAS E REGISTRADORES PARA INICIALIZAR COMANDOS.
19
7.4 PREPARA PORTA PARA POCICIONAR CABINE DO ELEVADOR NA PRIMEIRA PARADA
21
7.5 DETECTA FALHA AO FECHAR A PORTA 22
7.6 PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE 22
7.7 STOP DA CABINE NA POSIÇÃO INFERIOR 23
7.8 PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE 24
7.9 STOP DA CABINE NA POSIÇÃO INFERIOR 25
7.10 NIVELA A CABINE PARA POSIÇÃO DA PRIMEIRA PARADA 25
7.11 PREPARA PARA ABRIR PORTA 25
7.12 DETECTA FALHA AO ABRIR A PORTA 26
7.13 PROCEDIMENTO PARA ASCENDER LED DE FALHA DENTRO DO WHILE 26
7.14 A EXECUTA LAÇO DE PROGRAMAÇÃO DEFININDO FUNÇÃO PARA IDENTIFICAÇÃO DE
ANDAR 27
7.15 A FAZ VARREDURA NOS BOTÕES DE CHAMADA 27
7.16 TRANFERE ESPELHO DE CHAMADAS PARA VARIÀVEL DADOS 28
7.17 REGISTRA CHAMADAS DE CABINE 28
7.18 IDENTIFICA DIREÇÃO DE CHAMADAS SUBIDA OU DESCIDA 29
7.19 COMANDO DE ALTA VELOCIDADE 29
7.20 PREPARA PARADA COM REVERSÃO DE DIREÇÃO DESCIDA OU SUBIDA 30
7.21 PREPARACAO_DE_PARADA NA MESMA DIREÇÃO 31
7.22 PARADA 31
7.23 CANCELANDO CHAMADA 31
7.24 ABRE PORTA 32
7.25 FECHA PORTA 32
7.26 CONFIGURA SISTEMA 32
8 CONSIDERAÇÕES FINAIS OU CONCLUSÃO 33
9 REFERÊNCIAS BIBLIOGRÁFICAS 34
1. INTRODUÇÃO
2 CONSIDERAÇÕES
3 PLATAFORMAS DE SIMULAÇÃO
Esta plataforma permite a simulação de uma gama de circuitos eletrônicos com uma
precisão de até 98% de confiabilidade depois de calculado as faixas de tolerância
dos componentes empregados.
Em anexo 1 encontra-se passo a passo a utilização do Proteus® neste projeto.
3
Plataforma de simulação eletrônica ISIS
4
3.1.6 GRÁFICOS 2D
Cópia Bloco Movimenta Deletar Bloco Girar o Bloco Seleção Dispositivo Fazer o Dispositivo Decompor
Bloco Símbolo
Girar no Sentido Horário Girar Anti-Horário Linha central de X linha central da aleta Y
Com o programa instalado vá até o menu iniciar e clique sobre o ícone ISIS
7
Nesta tela selecione o formato da pagina ideal ao seu projeto e clique em OK.
8
1 2 3 4
4
2
5 3
3.3 MPLAB®
7
4.1 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 6
1- Clique em browse
2- Escolha a pasta
onde foi criado main.c 3- Digite um nome
para o projeto
4- Clique em salvar
Passo 12- Dê dois clique sobre o ícone main e digite o programa a ser rodado
16
Mensagem de
compilação com sucesso
NOTA:
Existe a possibilidade de simular o programa no ambiente MPLAB® mas não
abordaremos este tópico pois nossa simulação acontecerá no PROTEUS ®
17
4.2 MCC18®
Também conhecido como MPLAB® C18 é uma compilador C ANSI compatível para
a família PIC18 na plataforma Windows e um componente totalmente integrado a
Microchip, permitindo a depuração da linguagem de nível com MPLAB®.
Os Projetos, opções do compilador e vinculador personalizações podem ser
controladas completamente dentro do MPLAB IDE.
5 Apresentação do 74HS594
5.2. funcionamento.
6 Apresentação do projeto
Anexo três (3)
7.1 DEFINES
/** I N C L U D E S ************************************************************************************/
#include <p18cxxx.h> // Necessário para que o compilador adicione a biblioteca
// com as definições do PIC selecionado no projeto, neste
//caso, o modelo 18F4550.
#include <delays.h> // Biblioteca padrão de rotinas de atraso do C18 Microchip
/** D E F I N E S **************************************************************************************/
7.2 VARIÁVEIS
/** P R O T O T I P O S P R I V A D O S **************************************************************************************/
void main(void)
{
SH_CP2 = 0;
INSERE_DADOS2 = 0;
ST_CP2 = 0;
LIBERA_DADOS2 = 0;
PARADA = 0;
SINAL_DESCE = 0;
20
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;
FALHA_FECHAR_PORTA = 0;
ANDAR = 0;
INDEX = 0;
FALHA = 0;
ABRE_PORTA = 0;
do
{
FECHA_PORTA = 1;
INDEX ++; //EXECUTA TIPO UM DELAY QUE TERÁ "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO DA
//CONTAGEM
if(INDEX == 150000)
{
FECHA_PORTA = 0;
//Delay10KTCYx(240); //delay
}
if(INDEX == 300000) // EXECUTA TIPO UM DELAY QUE TERÁ "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO
//DA CONTAGEM
{
FALHA_FECHAR_PORTA = 2;
FECHA_PORTA = 0;
//Delay10KTCYx(240); //delay
}
if(INDEX == 450000) // EXECUTA TIPO UM DELAY QUE TERÁ "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO
//DA CONTAGEM
{
FALHA_FECHAR_PORTA = 3;
FECHA_PORTA = 0;
//Delay10KTCYx(240); //delay
}
22
if(INDEX == 600000) // EXECUTA TIPO UM DELAY QUE TERÁ "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO
//DA CONTAGEM
{
FALHA_FECHAR_PORTA = 4;
FECHA_PORTA = 0;
while(1) // LAÇO INFINITO DE FALHA DETECTADA
{
FECHA_PORTA = 0;
ABRE_PORTA = 0;
SINAL_SOBE = 0;
SINAL_DESCE = 0;
SINAL_ALTA = 0;
SINAL_BAIXA = 0;
DADOS[31] = 1;
A tentativa para fechar a porta se repetira por três vezes ao final de todas as
tentativas o elevador ira para um loop infinito que mantêm um LED de falha acesso
até a intervenção técnica no equipamento.
if ( DADOS[i] == 1) // CONDIÇÃO
INSERE_DADOS = 1; // INSERE VALOR DO BIT QUE IRÁ SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
23
else // OU
INSERE_DADOS = 0; // INSERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
SH_CP = 1;
//Delay10KTCYx(18);
ST_CP = 1;
//Delay10KTCYx(18); // DESLOCA BIT ATÉ A ULTIMA PORTA DO 74HC595 BLOCO 1
}
//Delay10KTCYx(18);
}
}
}while (PORTA_FECHADA == 0);
FECHA_PORTA = 0;
Depois que as portas são fechadas o elevador deve se dirigir para o curso inferior do
poço, no intuito de se posicionar para inicio de atendimento das chamadas.
A técnica utilizada aqui é idêntica ao do fechamento de porta a criação da variável
(INDEX) Conta o número de ciclos dentro do “do” para o estouro ou a satisfação da
função, visando proteger o motor de tração na ordem do que acontecer primeiro e
terá que ser regulado de acordo com o tamanho do percurso maximo do poço do
elevador.
if( INDEX == 4000000) // EXECUTA TIPO UM DELAY QUE TERÁ "off" QUANDO "do" FOR SATISFEITO OU FALHA NO ESTOURO
DA CONTAGEM
while(1)
{ // ESTE TIPO DE DELAY GARANTE A MANUTENÇÃO DO COMANDO CONTRA
FECHA_PORTA = 0; //FALHAS QUE PODEM OCORRER COM TRANSIENTES INDUZIDOS PELA FIAÇÃO DE POÇO
ABRE_PORTA = 0;
SINAL_SOBE = 0;
SINAL_DESCE = 0;
SINAL_ALTA = 0;
24
SINAL_BAIXA = 0;
DADOS[21] = 1;
SINAL_DESCE = 0;
SINAL_BAIXA = 0;
do
{
SINAL_SOBE = 1;
SINAL_BAIXA = 1;
}while(NIVELAMENTO == 0);
SINAL_SOBE = 0;
SINAL_BAIXA = 0;
//Delay10KTCYx(100); //delay
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
}
if(INDEX == 450000)
{
FALHA_ABRIR_PORTA = 3;
ABRE_PORTA = 0;
//Delay10KTCYx(240); //delay
}
if(INDEX == 600000)
{
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;
if( DADOS[i] == 1)
INSERE_DADOS = 1; // INSERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
else //OU
INSERE_DADOS = 0; // INSERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
SH_CP = 1;
//Delay10KTCYx(18);
27
ST_CP = 1;
//Delay10KTCYx(18);
}
ABRE_PORTA = 0;
INSERE_DADOS2 = 0; //RETORNA ESTADO ZERO PARA DESLOCAR O PRIMEIRO DADO (NIVEL ALTO) ATÉ A ULTIMA PORTA
}
if(DADOS[i] == 1)
INSERE_DADOS = 1; // INSERE VALOR NA VARIAVEL DADOS PARA ASCENDER O LED DO BOTÃO RESPECTIVO
29
else
INSERE_DADOS = 0;
// INSERE VALOR NA VARIAVEL DADOS PARA APAGAR O LED DO BOTÃO não pressionado
SH_CP = 1;
//Delay10KTCYx(18);
ST_CP = 1; //SETA OS CLOCK'S DE DESLOCAMENTO DO 74HC595
//Delay10KTCYx(18);
}
{
MENOR = 10;
7.22 PARADA
/** PARADA***************************************************************************************************************************/
if(PORTA_ABERTA == 0)
PARADA = 1;
}
//ENTRADA
TRISAbits.TRISA4 = 1; // CHAMADAS
TRISDbits.TRISD0 = 1; // BIT A DA POSIÇÃO
TRISDbits.TRISD1 = 1; // BIT B DA POSIÇÃO
TRISDbits.TRISD2 = 1; // BIT C DA POSIÇÃO
TRISDbits.TRISD3 = 1; // BIT D DA POSIÇÃO
TRISDbits.TRISD4 = 1; // SENSOR DE NIVELAMENTO DE ANDARES
TRISBbits.TRISB0 = 1; // VA
TRISBbits.TRISB1 = 1; // VB
TRISBbits.TRISB2 = 1; // VC
TRISBbits.TRISB3 = 1; // VD
TRISBbits.TRISB6 = 1; // INDICAÇÃO DE PORTA ABERTA
TRISBbits.TRISB7 = 1; // INDICAÇÃO DE PORTA FECHADA
TRISCbits.TRISC6 = 1; // SENSOR DE PORTA FECHADA
TRISEbits.TRISE0 = 1; // SENSOR LIMITE DE DESCIDA
TRISEbits.TRISE1 = 1; // SENSOR LIMITE DE SUBIDA
/***********************************************************************************************/
//SAIDAS
TRISDbits.TRISD5 = 0; // SINAL_SOBE
TRISDbits.TRISD6 = 0; // SINAL_ALTA
TRISDbits.TRISD7 = 0; // SINAL_BAIXA
TRISEbits.TRISE2 = 0; // FECHA PORTA
TRISAbits.TRISA0 = 0; // SH_CP2
TRISAbits.TRISA1 = 0; // INSERE_DADOS2
TRISAbits.TRISA2 = 0; // ST_CP2
TRISAbits.TRISA3 = 0; // LIBERA_DADOS2
TRISAbits.TRISA5 = 0; // PARADA
TRISCbits.TRISC7 = 0; // ABRE PORTA
TRISCbits.TRISC0 = 0; // SH_CP
TRISCbits.TRISC1 = 0; // DATA
TRISCbits.TRISC2 = 0; // ST_CP
TRISCbits.TRISC6 = 0; // LIBERA_DADOS
TRISBbits.TRISB4 = 0; // SINAL DESCE
TRISBbits.TRISB5 = 0; // PREPARAÇÃO DE PARADA
}//end ConfiguraSistema
/** V E C T O R R E M A P P I N G ***********************************************************/
// Seção necessária para informar ao compilador C18 onde são os novos endereços
//da memória de programa que ele deve alocar as rotinas de tratamento do evento
//de "reset" do microcontrolador.
//
//ATENÇÃO: COPIAR ESTA SEÇÃO DO CODIGO PARA TODO ARQUIVO "main.c" DOS PROJETOS
//QUE UTILIZAM O BOOTLOADER PARA GRAVAÇÃO IN-CIRCUIT.
extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x000800
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code
/** EOF main.c ***************************************************************/
34
Diego Corradi
O curso de PIC foi de grande importância, a partir dele adquiri uma visão melhor
sobre microcontroladores e melhorei meu raciocínio com lógica digital. E ainda tive a
oportunidade de conhecer o Luiz que me ensinou muitas coisas na área de elétrica e
eletrônica, ampliando minha visão na área. Com o projeto de conclusão de curso
obtive conhecimentos do funcionamento do elevador, parte de sensoriamento,
prioridades, além de conhecer novos dispositivos eletrônicos e otimizar um projeto a
partir de portas lógicas, flip flop's, e melhorar meu raciocínio com programação de
computadores, linguagem C.
Luiz Cláudio
9 REFERÊNCIAS BIBLIOGRÁFICAS