Apêndice: Ambiente de Desenvolvimento com MPLAB X IDE e a Placa ACEPIC PRO V8.2

Considerações Introdutórias

Este apêndice desempenha um papel instrumental no curso. Enquanto os módulos teóricos estabelecem os fundamentos arquiteturais da computação e os mecanismos internos do PIC18F4550, é aqui que você encontra a ponte concreta entre o conhecimento teórico e a prática do laboratório. O domínio do ambiente de desenvolvimento é condição necessária para que o Projeto Integrador se desenvolva sem obstáculos operacionais que desviem a atenção do aprendizado conceitual.

O objetivo central deste material é que você compreenda, com profundidade, o caminho percorrido pelo código desde o instante em que os primeiros caracteres são digitados no editor do MPLAB X IDE até o momento em que os LEDs da placa ACEPIC PRO V8.2 respondem à lógica programada. Esse caminho não é apenas uma sequência de cliques e comandos: ele envolve a atuação coordenada de três ferramentas distintas — o compilador XC8, o bootloader gravado permanentemente no microcontrolador e o software AN1310 — e compreender como essas ferramentas se articulam é tão importante quanto saber operá-las.

Ao longo das seções que seguem, cada etapa é apresentada primeiro em seu contexto conceitual e em seguida em sua realização prática. Essa abordagem reflete a convicção pedagógica de que um engenheiro de sistemas embarcados competente não é aquele que memoriza procedimentos, mas aquele que entende as razões por trás de cada escolha de configuração e sabe diagnosticar problemas a partir desse entendimento.

flowchart TD
    A["Código-fonte em C<br/>(.c / .h)"]
    B["Compilador XC8<br/>no MPLAB X IDE"]
    C["Arquivo HEX<br/>(.hex)"]
    D["Software AN1310<br/>Bootloader"]
    E["Conversor USB-Serial<br/>CH340G"]
    F["PIC18F4550<br/>ACEPIC PRO V8.2"]
    G["Programa em execução<br/>(LEDs, serial, etc.)"]
    H["Terminal Serial<br/>Depuração via printf"]

    A --> B
    B --> C
    C --> D
    D --> E
    E --> F
    F --> G
    G --> H

O ponto central do fluxo representado no diagrama é o bootloader, uma peça de software pequena mas de importância conceitual elevada. Trata-se de um programa residente na parte superior da memória Flash do PIC18F4550 da sua placa, gravado uma única vez pelo fabricante do kit. Ao receber um comando específico pela porta serial, o bootloader abandona o programa de aplicação corrente e passa a escutar a chegada de um novo arquivo HEX enviado pelo computador, gravando-o na memória do microcontrolador sem que qualquer gravador externo seja necessário. Perceber a distinção entre o bootloader e o programa de aplicação que você escreve é o primeiro passo para compreender o que torna a placa ACEPIC PRO V8.2 particularmente adequada ao ensino de arquitetura de microcontroladores: a ausência de hardware intermediário entre o seu código e a execução real.

1. Preparação do Hardware

A preparação do hardware antecede qualquer atividade de software e merece atenção porque determina quais periféricos da placa estão efetivamente conectados ao microcontrolador. A ACEPIC PRO V8.2 emprega dois mecanismos de roteamento de sinal que devem ser inspecionados antes da primeira ligação: os DIP switches, que habilitam ou desabilitam conexões elétricas entre o PIC e os periféricos on-board, e os jumpers, que selecionam entre configurações alternativas de um mesmo circuito. A compreensão desses mecanismos não é trivial e será retomada em outros módulos à medida que novos periféricos forem introduzidos.

Configuração obrigatória para uso do bootloader

No DIP switch DP1 — o banco de dez chaves localizado na região central da placa — as chaves 5 e 7 devem permanecer na posição ON. Essas chaves estabelecem a conexão física entre os pinos RC6 (TX) e RC7 (RX) do PIC18F4550 e o conversor USB-Serial CH340G embarcado. Sem essa conexão, a comunicação necessária tanto para a gravação via bootloader quanto para a depuração por mensagens de texto fica fisicamente interrompida.

Os jumpers JP1 e JP2 devem estar na posição 1-2, referindo-se aos dois pinos mais próximos da borda da placa. Essa configuração seleciona a alimentação proveniente do barramento USB, dispensando o uso de fonte externa durante o desenvolvimento.

A ordem em que a placa é conectada ao computador também importa. Conecte o cabo USB antes de energizar qualquer outro subsistema, pois o sistema operacional do computador precisa detectar a porta serial virtual criada pelo conversor CH340G antes que o bootloader inicie sua janela de escuta. Conexões feitas na ordem inversa podem resultar em falhas de enumeração que exigem a desconexão e reconexão do dispositivo.

2. Instalação dos Softwares de Desenvolvimento

O ambiente de desenvolvimento da ACEPIC PRO V8.2 é composto por três softwares distintos, cada um responsável por uma etapa específica da cadeia que vai do código-fonte ao programa em execução. A separação dessas responsabilidades entre ferramentas independentes reflete uma característica comum a ambientes de desenvolvimento para sistemas embarcados: ao contrário de plataformas como navegadores web ou ambientes de desktop, onde uma única ferramenta encapsula múltiplos estágios, o desenvolvimento para microcontroladores tradicionalmente mantém cada fase em um programa dedicado, o que oferece maior controle ao desenvolvedor e maior transparência sobre o que ocorre em cada etapa.

2.1 Driver USB-Serial CH340G

O primeiro software a ser instalado é o driver do conversor USB-Serial embutido na placa. Esse driver é responsável por fazer com que o sistema operacional reconheça o chip CH340G como uma porta COM virtual, permitindo que aplicações no computador enviem e recebam bytes através do barramento USB como se estivessem se comunicando com uma porta serial física tradicional. A ausência desse driver leva o sistema operacional a rotular o dispositivo como desconhecido, impossibilitando qualquer comunicação com a placa.

O arquivo de instalação é o CH341SER_Driver.exe, disponível na pasta Programas/CH340G Driver dos arquivos que acompanham o kit. Execute-o com duplo clique e, ao aparecer a janela de instalação, clique em INSTALL. Com a instalação concluída e a placa conectada ao computador via USB, confirme o sucesso abrindo o Gerenciador de Dispositivos do Windows (combinação Win + X seguida da opção Gerenciador de Dispositivos) e localizando a entrada USB-SERIAL CH340 sob a seção Portas (COM e LPT). Anote o número da porta COM exibida ao lado do dispositivo, pois ele será requerido em etapas posteriores. É comum que o número da porta varie de máquina para máquina e até mesmo entre conexões distintas no mesmo computador, então verifique-o sempre antes de iniciar uma sessão de desenvolvimento.

2.2 MPLAB X IDE 6.20 e Compilador XC8

O MPLAB X IDE é o ambiente de desenvolvimento integrado oficial da Microchip para seus microcontroladores. Ele reúne, em uma única interface, o editor de código, o gerenciador de projetos, a integração com compiladores, as janelas de depuração e a comunicação com gravadores. A versão recomendada para este curso é a 6.20, que pode ser obtida gratuitamente no site da Microchip mediante busca pelo termo “MPLAB X IDE 6.20 Windows”.

Após a instalação do IDE, é necessário instalar também o compilador XC8 na versão 2.x ou superior. O XC8 é uma peça de software conceitualmente distinta do IDE: ele é o programa responsável por traduzir o código em C para o código de máquina do PIC18F4550. O IDE apenas invoca o compilador quando solicitado, passando a ele os arquivos-fonte e recebendo como retorno o arquivo HEX resultante. Ambos os programas possuem versões gratuitas completamente funcionais para todos os recursos utilizados nesta disciplina, e durante a instalação do XC8 recomenda-se aceitar o caminho padrão sugerido pelo instalador, o que evita configurações manuais adicionais.

2.3 Serial Bootloader AN1310

O AN1310 é a terceira peça da tríade: trata-se do aplicativo de computador encarregado de conversar com o bootloader gravado no PIC e transferir o arquivo HEX produzido pelo compilador. Sua execução ocorre através do instalador Serial Bootloader AN1310 v1.05r.exe, localizado na pasta Programas/Serial Bootloader AN1310 v1.05r. O caminho padrão de instalação é C:\Microchip Solutions\Serial Bootloader AN1310 v1.05r, e após a instalação o programa principal é acionado pela execução do arquivo AN1310ui.exe nessa pasta.

Ao abrir o AN1310 pela primeira vez, é necessário configurar alguns parâmetros antes de qualquer tentativa de gravação. Acesse o menu Program → Settings e, na janela que se abre, selecione a porta COM anotada durante a instalação do driver. O campo Bootload Baud Rate deve ser configurado para 38400 bps, que é a velocidade com que o bootloader se comunica com o computador durante a fase de gravação, enquanto o Application Baud Rate deve ser 19200 bps, correspondente à velocidade utilizada pelo programa de aplicação para enviar mensagens de depuração após entrar em execução. Na seção Write Options, apenas a opção FLASH Program Memory deve permanecer marcada. A opção Config Bits precisa estar desmarcada, e essa exigência não é arbitrária: marcá-la instrui o AN1310 a sobrescrever a região de bits de configuração do microcontrolador, o que pode alterar a fonte de clock gravada originalmente e tornar o bootloader incapaz de entrar em funcionamento até que um gravador externo seja empregado para restaurar o firmware. Clique em OK para concluir a configuração.

3. Criação do Projeto no MPLAB X IDE

Com as ferramentas instaladas, o próximo passo é criar um projeto que contenha o código-fonte de aplicação. Projetos no MPLAB X são contêineres que agrupam arquivos-fonte, configurações do compilador, opções de linker e metadados do dispositivo-alvo. Essa organização evita que você precise informar manualmente ao compilador, a cada compilação, detalhes como o modelo do microcontrolador ou as opções de otimização.

Inicie o MPLAB X IDE e, no menu superior, acesse File → New Project. A janela do assistente solicitará a categoria do projeto: selecione Microchip Embedded e o tipo Standalone Project, clicando em Next para avançar. Na tela seguinte, dedicada à seleção do dispositivo, digite PIC18F4550 no campo de busca e escolha-o na lista exibida. O campo Tool deve permanecer com o valor No Tool, pois a gravação será realizada através do bootloader, e não por meio de um gravador físico acoplado ao IDE. Clique em Next.

A tela subsequente solicita a seleção do compilador. Escolha XC8 na lista — se a instalação do compilador ocorreu sem incidentes, ele aparecerá acompanhado da versão instalada. Clique em Next. Por fim, forneça um nome e um local para o projeto. Um diretório organizado como C:\Projetos\PIC\pisca_led é uma sugestão que preserva legibilidade ao longo do curso, à medida que novos projetos forem surgindo. Mantenha a opção Set as Main Project marcada e conclua com Finish.

A criação do projeto faz surgir, na janela à esquerda do IDE, a árvore de pastas que organiza logicamente os arquivos do código. Para adicionar um arquivo de código-fonte, clique com o botão direito sobre a pasta Source Files, selecione New → C Source File, nomeie o arquivo como main.c e clique em Finish. O arquivo recém-criado se abre automaticamente no editor, pronto para receber código.

4. O Primeiro Programa: Pisca-LED no PORTD

O programa que você implementará a seguir é o equivalente microeletrônico do “Hello, World!” da programação convencional. Trata-se de fazer com que os LEDs conectados ao PORTD da placa pisquem em intervalos de 500 milissegundos. A simplicidade do resultado esconde uma riqueza de elementos que precisam ser corretamente configurados: a fonte de clock, os pinos de saída, a calibração dos atrasos temporais e a estrutura do laço infinito. Cada um desses elementos corresponde a uma decisão de projeto do microcontrolador sobre a qual você tomará conhecimento ao longo dos módulos.

Na placa ACEPIC PRO V8.2, os pinos RD0 a RD7 do PIC18F4550 estão conectados diretamente a LEDs através de resistores limitadores de corrente. Configurar o PORTD como saída digital e alternar seu valor entre 0xFF (todos os bits em nível alto) e 0x00 (todos os bits em nível baixo) é suficiente para produzir o efeito visual desejado.

Antes do código propriamente dito, uma palavra sobre os bits de configuração, também conhecidos como configuration words. Esses bits definem parâmetros de hardware do microcontrolador que não podem ser alterados em tempo de execução, entre os quais a fonte de clock, a habilitação do watchdog timer e o nível de proteção de código. Para que o programa funcione corretamente em conjunto com o bootloader pré-instalado, a configuração de clock declarada no código deve corresponder à configuração com que o bootloader foi originalmente gravado, a saber, 48 MHz via PLL a partir de um cristal externo. Embora o compilador XC8 inclua as configuration words no arquivo HEX gerado, elas não serão gravadas no chip porque, como discutido anteriormente, a opção Config Bits permanecerá desmarcada no AN1310. Ainda assim, declará-las corretamente no código é necessário para que a macro __delay_ms() calcule os atrasos com precisão, pois ela consulta diretamente a definição _XTAL_FREQ que você fornece.

#include <xc.h>

/* Configuração do oscilador para 48 MHz via PLL
 * Cristal externo de 20 MHz: 20 MHz / 5 = 4 MHz (entrada do PLL)
 * PLL x 12 = 48 MHz (frequência do sistema)
 */

// CONFIG1L
#pragma config PLLDIV  = 5          // Divisor do PLL: 20 MHz / 5 = 4 MHz
#pragma config CPUDIV  = OSC1_PLL2  // Clock da CPU: 96 MHz PLL / 2 = 48 MHz
#pragma config USBDIV  = 2          // Clock USB: 96 MHz PLL / 2 = 48 MHz

// CONFIG1H
#pragma config FOSC    = HSPLL_HS   // Oscilador HS com PLL habilitado
#pragma config FCMEN   = OFF
#pragma config IESO    = OFF

// CONFIG2L
#pragma config PWRT    = ON         // Power-up Timer ligado
#pragma config BOR     = OFF        // Brown-out Reset desligado
#pragma config VREGEN  = ON         // Regulador de tensão USB ligado

// CONFIG2H
#pragma config WDT     = OFF        // Watchdog Timer desligado
#pragma config WDTPS   = 32768

// CONFIG3H
#pragma config CCP2MX  = ON
#pragma config PBADEN  = OFF        // Pinos do PORTB como digital
#pragma config LPT1OSC = OFF
#pragma config MCLRE   = ON         // MCLR habilitado como reset

// CONFIG4L
#pragma config STVREN  = ON
#pragma config LVP     = OFF        // Programação de baixa tensão desligada
#pragma config XINST   = OFF
#pragma config DEBUG   = OFF

/* Informa ao compilador a frequência do clock para cálculos de delay */
#define _XTAL_FREQ 48000000UL

void main(void) {
    /* Configura todos os pinos do PORTD como saída digital */
    TRISD = 0x00;

    /* Garante que todos os LEDs começam apagados */
    PORTD = 0x00;

    while (1) {
        PORTD = 0xFF;       /* Liga todos os 8 LEDs */
        __delay_ms(500);    /* Aguarda 500 ms */

        PORTD = 0x00;       /* Apaga todos os 8 LEDs */
        __delay_ms(500);    /* Aguarda 500 ms */
    }
}
#include <xc.h>

#pragma config PLLDIV=5, CPUDIV=OSC1_PLL2, USBDIV=2
#pragma config FOSC=HSPLL_HS, FCMEN=OFF, IESO=OFF
#pragma config PWRT=ON, BOR=OFF, VREGEN=ON
#pragma config WDT=OFF, WDTPS=32768
#pragma config CCP2MX=ON, PBADEN=OFF, LPT1OSC=OFF, MCLRE=ON
#pragma config STVREN=ON, LVP=OFF, XINST=OFF, DEBUG=OFF

#define _XTAL_FREQ 48000000UL

void main(void) {
    TRISD = 0;
    while (1) {
        PORTD ^= 0xFF;      /* Inverte todos os bits do PORTD */
        __delay_ms(500);
    }
}

Observe que a versão otimizada emprega o operador XOR bit a bit (^=) aplicado ao registrador PORTD, o que inverte simultaneamente todos os oito bits em uma única instrução, dispensando as duas atribuições explícitas presentes na versão didática. Essa substituição não altera o comportamento observável do programa, mas produz um código mais compacto e ilustra um padrão recorrente na programação de microcontroladores: substituir operações sequenciais sobre campos de bits por operações lógicas aplicadas a registradores inteiros.

5. Configuração do Linker XC8 para Compatibilidade com o Bootloader

Esta é, provavelmente, a etapa mais sutil de todo o processo e também a mais frequentemente esquecida por iniciantes. A razão da sua importância reside na organização da memória Flash do PIC18F4550 quando o bootloader está presente. O bootloader ocupa as últimas posições da memória, especificamente o intervalo de endereços que vai de 0x7CFC a 0x7FFF, totalizando pouco mais de três quilobytes. Caso o compilador XC8 decida alocar qualquer byte de código ou dado do seu programa nessa região, ele sobrescreverá o bootloader, e a placa deixará de aceitar novas gravações via porta serial — a partir desse ponto, a única maneira de restaurar o funcionamento é empregar um gravador externo, como o PICkit 3 ou o PICkit 4, para reescrever o bootloader.

Para proteger essa região, você precisa informar explicitamente ao linker que ela está proibida. Clique com o botão direito sobre o nome do seu projeto na janela Projects e selecione Properties. Na janela que se abre, clique em XC8 linker na árvore à esquerda. Na caixa Option categories, selecione Memory model. Localize o campo ROM ranges e substitua seu conteúdo pelo valor a seguir:

default,-7CFC-7FFF

A vírgula separa intervalos independentes, e o prefixo hífen antes de 7CFC-7FFF instrui o linker a excluir esse trecho do espaço disponível para alocação. Clique em Apply e em OK para confirmar.

Nunca pule esta etapa. Se o campo ROM ranges permanecer com o valor padrão default, o linker poderá alocar código no espaço do bootloader. O programa aparentemente compilará sem erros, mas após a gravação o microcontrolador ficará inoperante e você precisará de um gravador externo (como o PICkit 3 ou PICkit 4) para restaurar o bootloader.

6. Compilação do Projeto

Com o código escrito e o linker configurado, passa-se à compilação. Pressione F11 ou clique no ícone Clean and Build na barra de ferramentas — representado por um martelo com o símbolo de vassoura. O MPLAB X invocará o compilador XC8, que processará o código-fonte, resolverá referências simbólicas através do linker e gerará o arquivo HEX em formato Intel, pronto para ser transferido ao microcontrolador.

Acompanhe a janela Output na parte inferior do IDE durante o processo. Uma compilação bem-sucedida encerra-se com uma linha semelhante a BUILD SUCCESSFUL (total time: Xs), indicando que todas as etapas foram concluídas sem erros. O arquivo HEX resultante fica na pasta dist/default/production/ dentro do diretório do projeto, com extensão .hex. Esse é o arquivo que será transferido ao microcontrolador na etapa seguinte.

Se, em vez da mensagem de sucesso, aparecerem linhas vermelhas indicando erros, leia as mensagens com atenção. O compilador informa, para cada erro, o arquivo, a linha e o motivo do problema. Os erros mais frequentes nesta fase do aprendizado são parênteses não fechados, ponto e vírgula esquecido ao final de uma instrução e nomes de registradores digitados de maneira ligeiramente incorreta — lembre-se de que o PIC18F4550 distingue maiúsculas de minúsculas nos nomes de registradores e bits.

7. Gravação do Programa via Bootloader

Com o arquivo HEX compilado, você está a poucos passos de observar o programa em execução. O processo de gravação via bootloader envolve uma coreografia precisa entre três agentes: o software AN1310, o computador e a placa. O objetivo da coreografia é colocar o microcontrolador em modo bootloader durante a janela de tempo em que ele aceita comandos de gravação, que é extremamente curta após o reset.

A sequência começa abrindo o AN1310 e clicando no botão Break/Reset Application Firmware, também acessível pelo atalho F3. Em seguida, pressione o botão RST físico na placa ACEPIC PRO — esse reset faz o microcontrolador reinicializar, e o bootloader passa a aguardar por uma fração de segundo a confirmação de entrada em modo de gravação. Imediatamente após o reset físico, clique em Bootloader Mode no AN1310 ou pressione F4. Se a comunicação for estabelecida dentro da janela temporal, a janela central do AN1310 exibirá a memória Flash do microcontrolador preenchida com a sequência FFFF, confirmação visual de que o modo bootloader está ativo e aguardando o conteúdo do novo arquivo.

Carregue então o arquivo HEX no AN1310: acesse File → Open, navegue até a pasta dist/default/production/ do seu projeto e abra o arquivo com extensão .hex. O conteúdo do programa será exibido na janela central, em formato hexadecimal, substituindo os preenchimentos de FFFF. Para efetivar a gravação, clique em Write Device ou pressione F6. Ao término do processo, o rodapé do AN1310 exibirá o tempo total gasto, em uma mensagem semelhante a Write complete (FLASH 2.642s).

Para executar o programa recém-gravado, clique em Run Application Firmware (ou pressione F2) ou simplesmente acione o botão RST da placa. Os LEDs do PORTD devem começar a piscar em intervalos de meio segundo, confirmando que todo o ciclo de desenvolvimento — edição, compilação, gravação e execução — foi concluído com sucesso.

8. Depuração por Comunicação Serial

Observar LEDs piscarem produz uma sensação imediata de sucesso, mas essa forma de visualização tem limitações severas como ferramenta de depuração. Assim que os programas passem a envolver cálculos intermediários, leituras de sensores, decisões condicionais ou máquinas de estado, acompanhar o comportamento interno apenas por LEDs torna-se impraticável. A técnica mais acessível e informativa para investigar o que acontece dentro do microcontrolador durante a execução é utilizar a USART — o módulo de comunicação serial assíncrona do PIC18F4550 — para enviar mensagens de texto ao computador, de modo análogo ao que se faz com printf em programas destinados ao próprio computador.

A placa ACEPIC PRO V8.2 já integra o conversor USB-Serial CH340G conectado aos pinos RC6 (TX) e RC7 (RX) do PIC, de modo que nenhum hardware adicional é necessário para habilitar esse canal de comunicação. Basta que as chaves 5 e 7 do DP1 estejam ligadas, configuração que foi estabelecida no início deste apêndice. O programa apresentado a seguir estende o exemplo do pisca-LED: além de alternar os LEDs do PORTD, ele envia pelo terminal serial uma contagem do número de ciclos e o estado atual do registrador, o que permite acompanhar a execução em tempo real a partir do computador.

#include <xc.h>
#include <stdio.h>

#pragma config PLLDIV=5, CPUDIV=OSC1_PLL2, USBDIV=2
#pragma config FOSC=HSPLL_HS, FCMEN=OFF, IESO=OFF
#pragma config PWRT=ON, BOR=OFF, VREGEN=ON
#pragma config WDT=OFF, WDTPS=32768
#pragma config CCP2MX=ON, PBADEN=OFF, LPT1OSC=OFF, MCLRE=ON
#pragma config STVREN=ON, LVP=OFF, XINST=OFF, DEBUG=OFF

#define _XTAL_FREQ 48000000UL

/* Inicializa a USART para 19200 baud a 48 MHz
 * BRGH=1 (alta velocidade): SPBRG = (Fosc / (16 * baud)) - 1
 * SPBRG = (48000000 / (16 * 19200)) - 1 = 155
 */
void uart_init(void) {
    TRISCbits.TRISC6 = 0;   /* RC6 (TX) como saída */
    TRISCbits.TRISC7 = 1;   /* RC7 (RX) como entrada */

    SPBRG  = 155;            /* Divisor de baud rate */
    SPBRGH = 0;

    TXSTAbits.BRGH  = 1;    /* Alta velocidade */
    TXSTAbits.SYNC  = 0;    /* Modo assíncrono */
    TXSTAbits.TXEN  = 1;    /* Habilita transmissão */
    RCSTAbits.SPEN  = 1;    /* Habilita porta serial */
}

/* Envia um único caractere pela USART */
void uart_putchar(char c) {
    while (!TXSTAbits.TRMT); /* Aguarda o registrador de deslocamento esvaziar */
    TXREG = c;
}

/* Redireciona putch() do printf para a USART (requisito do XC8) */
void putch(char c) {
    uart_putchar(c);
}

void main(void) {
    unsigned int ciclo = 0;

    uart_init();
    TRISD = 0x00;
    PORTD = 0x00;

    printf("Sistema iniciado. Iniciando pisca-LED...\r\n");

    while (1) {
        ciclo++;

        PORTD = 0xFF;
        printf("Ciclo %u: LEDs LIGADOS  (PORTD = 0xFF)\r\n", ciclo);
        __delay_ms(500);

        PORTD = 0x00;
        printf("Ciclo %u: LEDs APAGADOS (PORTD = 0x00)\r\n", ciclo);
        __delay_ms(500);
    }
}
#include <xc.h>
#include <stdio.h>

#pragma config PLLDIV=5, CPUDIV=OSC1_PLL2, USBDIV=2
#pragma config FOSC=HSPLL_HS, FCMEN=OFF, IESO=OFF
#pragma config PWRT=ON, BOR=OFF, VREGEN=ON
#pragma config WDT=OFF, WDTPS=32768
#pragma config CCP2MX=ON, PBADEN=OFF, LPT1OSC=OFF, MCLRE=ON
#pragma config STVREN=ON, LVP=OFF, XINST=OFF, DEBUG=OFF

#define _XTAL_FREQ 48000000UL

void putch(char c) {
    while (!TXSTAbits.TRMT);
    TXREG = c;
}

void main(void) {
    unsigned int n = 0;

    /* USART: 19200 baud, BRGH=1, assíncrono */
    TRISCbits.TRISC6 = 0; TRISCbits.TRISC7 = 1;
    SPBRG = 155; SPBRGH = 0;
    TXSTA = 0x26;   /* BRGH=1, SYNC=0, TXEN=1 */
    RCSTA = 0x80;   /* SPEN=1 */

    TRISD = 0;

    while (1) {
        PORTD ^= 0xFF;
        printf("Ciclo %u: PORTD=%02X\r\n", ++n, PORTD);
        __delay_ms(500);
    }
}

Para visualizar as mensagens, abra um terminal serial qualquer configurado para a mesma porta COM da placa. O próprio AN1310 integra um monitor serial que se abre automaticamente quando você clica em Run Application Firmware, mas alternativas convencionais como PuTTY e Realterm cumprem a mesma função com igual eficácia. A configuração do terminal deve corresponder exatamente à do programa: 19200 bits por segundo, 8 bits de dados, sem paridade e 1 bit de parada, comumente abreviada como 8N1. Quando bem configurado, o terminal exibirá uma nova linha a cada meio segundo, confirmando que o programa está em execução e permitindo acompanhar a evolução das variáveis internas em tempo real.

9. Diagnóstico de Erros Frequentes

A prática docente mostra que alguns problemas se repetem com frequência surpreendente entre estudantes que estão dando seus primeiros passos com a ACEPIC PRO V8.2. O objetivo desta seção é antecipar esses problemas e oferecer, para cada um, não apenas a solução imediata mas também uma compreensão de suas causas, de modo que você consiga diagnosticar situações análogas sem a necessidade de consultar esta referência a cada novo incidente.

O AN1310 não consegue conectar à placa (tempo esgotado). Essa falha ocorre quase sempre por uma de três razões. A primeira é o descompasso temporal no acionamento do botão RST da placa — o bootloader escuta a porta serial apenas por uma fração de segundo após o reset, de modo que o clique em Bootloader Mode no AN1310 precisa ocorrer imediatamente após a liberação do botão físico. A segunda razão é a seleção de uma porta COM incorreta no AN1310, situação que se resolve consultando o Gerenciador de Dispositivos para identificar exatamente qual porta o CH340G ocupa no momento. A terceira razão é a presença das chaves 5 e 7 do DP1 em posição OFF, o que interrompe fisicamente a ligação entre o conversor CH340G e os pinos de comunicação do PIC.

O programa compila, mas os atrasos mostram-se incorretos, muito rápidos ou muito lentos. A origem desse sintoma é a ausência ou a incorreção da definição #define _XTAL_FREQ 48000000UL no código. Sem essa definição explícita, o compilador XC8 utiliza um valor padrão para calcular os parâmetros internos das macros __delay_ms() e __delay_us(), e esse valor padrão não corresponde à frequência real de operação do microcontrolador. O resultado é um atraso proporcional, porém com escala incorreta.

Os LEDs permanecem apagados após uma gravação aparentemente bem-sucedida. Duas causas respondem pela maior parte dos casos. A primeira é simplesmente esquecer de clicar em Run Application Firmware ou pressionar o botão RST após a gravação: o bootloader permanece em modo de gravação aguardando novos comandos até ser explicitamente instruído a passar o controle ao programa de aplicação. A segunda causa, mais severa, é não ter configurado o campo ROM ranges para excluir o intervalo 7CFC-7FFF, o que pode ter levado o compilador a alocar parte do código do programa dentro da região do bootloader; nessa situação, a placa entra em estado indefinido e precisa ser reprogramada com gravador externo.

Mensagem BUILD FAILED com erro sobre _XTAL_FREQ ou __delay_ms. Esse erro surge quando o código não inclui #include <xc.h> no topo do arquivo ou quando a macro _XTAL_FREQ não é definida antes da primeira chamada a __delay_ms(). O XC8 exige essa declaração explícita porque não deduz a frequência de clock a partir das configuration words para fins de cálculo de delay — essa é uma decisão arquitetural do compilador que não admite exceções.

O terminal serial exibe símbolos ilegíveis em vez de texto compreensível. O sintoma indica que o baud rate configurado no terminal não corresponde ao baud rate gerado pelo programa no microcontrolador. A correspondência exata é obrigatória: ambos os lados devem operar a 19200 bits por segundo, com 8 bits de dados, sem paridade e 1 bit de parada. Vale também conferir se o valor atribuído a SPBRG no código é efetivamente 155, que é o divisor correto para baud rate de 19200 com clock de 48 MHz e BRGH em 1.

Considerações Finais

O domínio do fluxo de trabalho apresentado neste apêndice constitui a fundação operacional sobre a qual todo o restante da disciplina se apoia. A partir do momento em que você consegue escrever um programa simples, compilá-lo, gravá-lo e observar sua execução com depuração serial, os demais periféricos do PIC18F4550 presentes na placa — conversor analógico-digital, display LCD, PWM, barramento I²C, sistema de interrupções — podem ser abordados como extensões deste mesmo fluxo. O que varia de um periférico para outro é apenas a configuração dos registradores que os controlam, tema que você estudará em detalhe nos módulos correspondentes. O ciclo de desenvolvimento, esse sim, permanece invariante ao longo do curso e das suas futuras incursões em sistemas embarcados profissionais.