Académique Documents
Professionnel 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.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.22 PARADA 31
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
Passo 13- Depois de escrito o programava em “Project” depois em Build All. Se o programa estiver sem erro o arquivo .H
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;
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;
// Delay10KTCYx(18);
SH_CP = 0;
//Delay10KTCYx(18);
ST_CP = 0; //ZERA OS CLOCK'S DE DESLOCAMENTO DO 74HC595 BLOCO 1
INSERE_DADOS = 0; //ISERE VALOR DO BIT QUE IRA SE DESLOCAR NAS PORTA DO 74HC595 BLOCO 1
SH_CP = 1;
//Delay10KTCYx(18); //delay de 15ms
ST_CP = 1; // DESLOCA BIT ATE A ULTIMA PORTA DO 74HC595 BLOCO 1
//Delay10KTCYx(18); //delay de 15ms
}
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
22
{
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
}
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;
23
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
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;
SINAL_BAIXA = 0;
DADOS[21] = 1;
SH_CP = 1;
//Delay10KTCYx(18);
ST_CP = 1; // DESLOCA BIT ATÉ A ULTIMA PORTA DO 74HC595 BLOCO 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)
{
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;
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);
ST_CP = 1;
//Delay10KTCYx(18);
}
ABRE_PORTA = 0;
28
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
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);
30
break;
}
7.22 PARADA
/** PARADA***************************************************************************************************************************/
if(PORTA_ABERTA == 0)
33
PARADA = 1;
}
FECHA_PORTA = 0;
}
}//end while
}//end main
//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
35
}//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 ***************************************************************/
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