No artigo anterior apresentamos as ferramentas da Microchip para o desenvolvimento de projetos com sua linha de microcontroladores de 8 bits, a qual apresentamos no primeiro artigo dessa série.
Neste artigo vamos apresentar como criar um projeto desde o inicio utilizando a IDE MPLAB X juntamente com o compilador MPLAB XC8.
Explicaremos passo a passo como configurar o ambiente e, no final, apresentaremos um exemplo em linguagem C para piscar um LED utilizando o PIC12F675, assim como utilizar o simulador para debug do código desenvolvido.
Iniciando um novo projeto no MPLAB X
Para iniciar um novo projeto deve-se escolher a opção: File->New Project onde será aberta uma janela para escolha do tipo de projeto, conforme exibido na figura 1:
Selecione as opções Microchip Embedded -> Standalone Project e clique no botão Next.
O próximo passo será a escolha do microcontrolador alvo do seu projeto. No nosso caso vamos escolher o PIC12F675 para o nosso primeiro exemplo. Esse é um microcontrolador da família Mid-Range, fácil de achar no mercado, com poucos periféricos e recursos e bem interessante para entender a estrutura dos microcontroladores PIC. A figura 2 abaixo exibe a seleção do mesmo. Após a escolha clique no botão Next novamente.
A próxima janela será a escolha do debug header, como apresentado na figura 3. Em nosso caso não utilizaremos este recurso e deixaremos a opção None selecionada. Pressione o botão Next nessa janela.
Agora vamos escolher a ferramenta de DEBUG. Como este será apenas um exemplo para simulação, escolheremos a opção Simulator, conforme exibido na figura 4 a seguir:
Nesta janela é feita a seleção do compilador que será utilizado no projeto. Escolheremos a opção XC8, conforme figura 5 a seguir:
Por último, vamos dar um nome ao projeto e selecionar a pasta onde o mesmo será salvo. Dê um nome apropriado ao projeto e escolha um diretório para o mesmo, conforme figura 6 abaixo. Para finalizar clique no botão Finish:
Pronto! O nosso projeto foi criado e deverá exibir uma tela inicial conforme a figura 7 a seguir:
Criando o código fonte
Com a estrutura do projeto criada, é necessário criar o código fonte para o mesmo. Existem várias formas para criar o código fonte, porém vamos apresentar a forma mais fácil de fazer isso: utilizando a IDE MPLAB X. Para criar o código fonte em linguagem C, basta clicar com o botão direito do mouse no nome do projeto, e escolher a opção New -> C Source File, conforme exibido na figura 8 a seguir:
Será exibida uma janela para criar o novo código fonte em C, conforme figura 9. Vamos dar o nome de “main” para este arquivo e depois clicar em Finish:
Será aberto um arquivo em branco no editor de código fonte conforme Figura 10. Para iniciar a programação, vamos inserir as seguintes linhas de código:
A estrutura de código apresentada é o mínimo necessário para poder compilar o programa. A diretiva #include<xc.h> é necessária em todos os projetos com o compilador XC independente do microcontrolador utilizado no projeto. Nesse arquivo header, o compilador terá acesso às características do microcontrolador, como nome de registradores e demais estruturas. A função main() é a função principal do nosso código fonte.
Para que o microcontrolador PIC funcione corretamente, além da lógica do programa, é necessário também fazer a correta configuração dos Configurations bits, também conhecidos como Fuse bits. No MPLAB X existe uma interface gráfica que auxilia nessa tarefa. O acesso a esse recurso é feito em: Window -> PIC Memory Views -> Configurations Bits, conforme exibido na figura 11, a seguir:
Será aberta uma janela para a configuração dos bits, conforme exibido na figura 12 seguir:
Selecione as opções de Configurations bits conforme apresentados na figura 12. Este microcontrolador apresenta poucos bits de configuração, porém é necessária a correta seleção para que tudo funcione conforme o esperado. Após a configuração, pressione o botão Generate Source Code to Output, e será gerado o código, conforme figura 13:
O código gerado deverá ser inserido no código fonte do projeto. Para isso selecione e copie todo o código gerado e depois cole no código fonte, que deverá ficar da seguinte forma:
#include <xc.h>
// CONFIG
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscilLator:
//I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
void main(void)
{
}
Para fazer a compilação do projeto existem algumas formas dentro do MPLAB X, porém há também ícones para rápido acesso a essa função. A figura 14 exibe esses ícones. Pressione o ícone Build Project.
Exemplo
Para teste e simulação do nosso projeto, vamos fazer um exemplo para piscar um LED. O esquema elétrico na figura 15 servirá como base para nossa aplicação. Note que temos um LED ligado ao pino GP5, com o devido resistor para limitação de corrente:
O nosso exemplo ligará e desligará o LED em intervalos de 1 segundo. Para isso precisamos digitar a seguinte sequência de código em nosso projeto:
#include <xc.h>
// CONFIG
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin,
// I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#define _XTAL_FREQ 4000000 //define para utilizar funções de tempo
void main(void)
{
GPIO = 0x00; //desliga todos os pinos
TRISIObits.TRISIO5 = 0; //configura GPIO5 como saída
CMCON = 0x07; //desliga o comparador analógico
while(1) //loop principal
{
GPIObits.GP5 = ~GPIObits.GP5; //inverte estado lógico do pino do LED
__delay_ms(1000); //aguarda 1 seg
}
}
Note que o código apresentado acima está dividido em 3 partes. Na primeira parte temos a inclusão dos arquivos externos através da diretiva #include. Temos também as configurações dos bits para o correto funcionamento do microcontrolador através das diretivas #pragma. Temos ainda a definição de uma constante, _XTAL_FREQ, através da diretiva #define. Esta constante é necessária para o uso da macro de temporização __delay_ms(). O valor definido deve ser igual ao valor a frequência, em Hz, do oscilador principal do microcontrolador. A seguir é exibido o código de criação dessa macro, que encontra-se no arquivo pic.h, dentro da pasta include, no diretório de instalação do XC8:
/****************************************************************/ /* Built-in delay routine */ /****************************************************************/ #pragma intrinsic(_delay) extern __nonreentrant void _delay(unsigned long); // NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))) #endif
Outra parte do código encontra-se na função main(), onde estão as configurações do registradores de funções especiais (SFR). Inicialmente foram desligados todos os pinos, através do registrador GPIO. Para que se possa utilizar o pino GP5 como saída, configurou-se o bit TRISIO5 do registrador TRISIO com o nível lógico ‘0’. A última configuração foi desligar o comparador analógico para que não interferisse no funcionamento dos pinos de I/O digitais, já que não foi utilizada a função de comparação.
A última parte é o loop principal do programa dentro do laço while(). Note a presença de um loop infinito, pois a condição sempre será verdadeira, igual a 1. Nesse loop o estado do pino é invertido a cada segundo. Para inversão do estado utilizou-se o operador ~ (not, bit a bit) e para temporização a função __delay_ms(), que aguarda o tempo passado em milissegundos baseada na frequência definida em _XTAL_FREQ, que no caso foi 4MHz.
Após a compilação deverá ser exibida a mensagem da figura 16, a seguir:
Simulação
Para Debugar/Simular nosso projeto, deve-se clicar no ícone Debug main Project, veja o ícone na figura 17:

Após alguns segundos será iniciada a simulação com a parada na primeira linha da função main(), conforme exibido na figura 18:
Para simular passo a passo seu projeto, use os botões de Debug que são exibidos na figura 19 a seguir:

Outro recurso interessante da simulação é a visualização de registradores e variáveis durante cada passo, sendo possível mudar os seus valores durante a simulação. Para acessar esse recurso basta acessar: Window -> Debugging. Confira figura 20, para ver esse caminho:
Conclusão
O MPLAB X, juntamente com o compilador XC, são ótimas ferramentas para o desenvolvimento de projetos com os microcontroladores PIC. Conforme apresentado nesta série de artigos, essas ferramentas vieram para agilizar o processo de desenvolvimento, substituindo a antigo MPLAB IDE e apresentando um ótimo compilador C integrado. O desenvolvedor possui agora ótimos recursos com a possibilidade de trabalhar em diferentes sistemas operacionais e com facilidade de configuração dos projetos.
Aprenda mais
Configuration Bits do Microchip PIC16F877A – Francesco Sacco










Para aqueles pic mais antigos é possível compilar vários .c e .h num projeto?
Olá, boa tarde.
Fiz um programinha no XC8 utilizando o PIC18f27j13. O problema é que ele funciona no debug, mas não funciona quando compilamos normal. Tem alguma instrução que habilite a compilação correta das duas formas?
Olá, bom dia.
Cara como eu vou saber as diretivas certas pra usar? tipo, quando eu quiser usar um bloco em asm, como chama-lo? ou melhor setar um bit de tal variável ?
Laelson, da uma olhada nesse material:
https://www.ohio.edu/people/uijtdeha/ee3954_fall13_12_c.pdf
https://ww1.microchip.com/downloads/en/DeviceDoc/50002053E.pdf
Abraços
Fabio muito obrigado, este material será de grande valia. Ontem já iniciei o projeto com xc8, anteriormente eu utilizava o MikroCforPic e por causa de problemas do compilador tive que mudar para o xc8, e estou começando a me acostumar com essa nova estrutura. Só não consegui um maneira versátil de criar um #define para um bit de uma variável ou algo similar que me ajude a não ter que ficar decorando bit a bit de cada variável já que isso se torna cansativo. Exemplo, no MikroC : unsigned char flag_menu; #define menu_ok flag_menu.f0 // isso define que o bit… Leia mais »
Olá Laelson,
pelo que entendi você quer criar variáveis tipo bit. Você pode criar bit fields para isso: https://www.tutorialspoint.com/cprogramming/c_bit_fields.htm
No manual tem uma seção explicando sobre isso também.
Você também pode fazer operações de bits, para acessar bits específicos em uma variável: https://embarcados.com.br/bits-em-linguagem-c/
veja se consegue usar, e me da um retorno.
Abraços
Parabéns pelo artigo! O que você pode me dizer sobre a Calibração do PI12F675 (OSCCAL), já que está usando o oscilador interno? Tenho a necessidade em um projeto da calibração, pois necessito dos exatos 4 MHz+/- 1%.
Obrigado.
Olá Samuel, eu sinceramente nunca precisei ajustar o oscilador interno. Só em alguns casos onde durante a programação foi sobrescrito o valor de calibração de fabrica. Para calibração você pode gerar um sinal e ir ajustando até chegar no valor desejado.
Porém com a variação pode variar mesmo calibrado.
Abraços
Muito bom mesmo, Fabio.
Muito Obrigado Vagner!
muito bom o artigo.
É o tipo de referência que não se encontra muito na internet. Está de parabéns!
Um aspecto que eu ainda não vi como funciona direito é a operação do MPLABX com o SDCC + gputils.
Obrigado Rafael.
Veja esse artigo do Rodrigo Almeida sobre SDCC:
https://sites.google.com/site/rmaalmeida/mplabx-sdcc-toolchain
Grande abraço
Olá Fábio Souza, você chegou a testar a opção de avaliar os 60 dias de XC8 PRO, porque eu fiz todo o processo e rodei o arquivo que gera a licença, mas continua compilando normal, só aparasse para compara a build com a PRO…