Microcontrolador PIC16F628A DIP-18: Manual Técnico Completo

Microcontrolador PIC16F628A DIP-18 — manual técnico completo

Introdução

Neste manual, será apresentado como instalar, configurar e utilizar o Circuito Integrado Microcontrolador PIC16F628A-I/P (DIP-18). Se desejar adquirir este produto, clique aqui.

O PIC16F628A é um microcontrolador CMOS de 8 bits com memória Flash fabricado pela Microchip Technology, fundamentado na arquitetura RISC (Reduced Instruction Set Computer) de núcleo médio (Mid-Range de 14 bits por palavra de instrução). Projetado como evolução direta do clássico PIC16F84A, este componente integra oscilador interno calibrado de 4 MHz (e modo de baixo consumo de 48 kHz), módulo de comunicação serial assíncrona/síncrona USART (Universal Synchronous Asynchronous Receiver Transmitter), dois comparadores analógicos independentes, módulo CCP (Capture/Compare/PWM) e três temporizadores de hardware em um encapsulamento PDIP de 18 pinos (Plastic Dual In-line Package).

Este guia técnico foi estruturado para estudantes de engenharia, técnicos em eletrônica e desenvolvedores de sistemas embarcados que necessitam integrar o PIC16F628A em circuitos dedicados ou utilizá-lo como coprocessador periférico em conjunto com placas Arduino e ESP32. Ao longo das seções seguintes, são detalhados os limites elétricos absolutos do datasheet oficial (DS40044G), o mapeamento funcional de todos os 18 terminais, o esquema de gravação In-Circuit Serial Programming (ICSP) e rotinas de código em C (compilador XC8 e Arduino IDE).


Especificações técnicas

Principais especificações

A tabela a seguir apresenta os parâmetros arquiteturais e de memória do PIC16F628A-I/P conforme o datasheet oficial da Microchip:

ParâmetroEspecificação
Fabricante / FamíliaMicrochip Technology / PIC16 Mid-Range (8 bits)
Código comercial (SKU Loja)PIC16F628A-I/P (RB1066)
EncapsulamentoPDIP-18 (18 pinos through-hole, passo de 2,54 mm)
Arquitetura de CPUHarvard RISC de 8 bits (35 instruções de palavra única de 14 bits)
Desempenho de execuçãoAté 5 MIPS (ciclo de instrução de 200 ns com clock externo de 20 MHz)
Memória de Programa (Flash)2048 palavras de 14 bits (3,5 KB) — até 100.000 ciclos de escrita/apagamento
Memória de Dados (SRAM)224 Bytes
Memória Não Volátil (EEPROM)128 Bytes — até 1.000.000 de ciclos de escrita/apagamento (retenção > 40 anos)
Oscilador Interno (INTOSC)Calibrado de fábrica em 4 MHz (±1%\pm 1\%) ou 48 kHz (baixo consumo)
Frequência de Clock ExternoDC até 20 MHz (cristal de quartzo, ressonador cerâmico ou clock externo)
Pinos de I/O (GPIO)16 pinos bidirecionais (Portas PORTA de 8 bits e PORTB de 8 bits)
Temporizadores (Timers)3 módulos: Timer0 (8 bits), Timer1 (16 bits) e Timer2 (8 bits com pós-escalador)
Módulo CCP1 canal Capture (16 bits), Compare (16 bits) ou PWM (resolução máxima de 10 bits)
Periféricos Analógicos2 Comparadores Analógicos + Referência de Tensão Programável (VREF)
Comunicação Serial1 módulo USART (RS-485, RS-232 / UART TTL e modo síncrono)
Temperatura de Operação−40 ∘C-40\,^\circ\text{C} a +85 ∘C+85\,^\circ\text{C} (faixa industrial -I/P)

Características elétricas e operacionais

Os limites operacionais e absolutos de tensão e corrente devem ser rigorosamente respeitados durante o projeto da fonte e o dimensionamento de cargas conectadas diretamente às portas PORTA e PORTB:

Parâmetro ElétricoSímboloMínimoTípicoMáximoUnidade
Tensão de alimentação operacional (VDDV_{DD})VDDV_{DD}3,05,05,5V DC
Tensão de retenção de dados RAM em SleepVDRV_{DR}2,0—5,5V DC
Tensão de limiar de Brown-out Reset (BOR)VBORV_{BOR}3,654,04,35V DC
Tensão de programação em MCLR‾/VPP\overline{\text{MCLR}}/V_{PP} (Alta Tensão)VIHHV_{IHH}12,013,013,5V DC
Corrente ativa de operação (4 MHz, VDD=5,0 VV_{DD} = 5,0\,\text{V})IDDI_{DD}—1,22,0mA
Corrente ativa em baixo consumo (48 kHz, VDD=3,0 VV_{DD} = 3,0\,\text{V})IDDI_{DD}—120250μA\mu\text{A}
Corrente em modo Sleep (Watchdog desligado, 3,0 V3,0\,\text{V})IPDI_{PD}—1,015,0μA\mu\text{A}
Corrente máxima por pino de I/O (Source ou Sink)IOH/IOLI_{OH} / I_{OL}——25mA
Corrente máxima combinada nas portas PORTA + PORTBIPORTI_{PORT}——200mA
Corrente máxima total nos terminais VDDV_{DD} ou VSSV_{SS}IMAXI_{MAX}——250mA

⛔ Perigo: A tensão máxima absoluta no pino VDDV_{DD} em relação ao VSSV_{SS} é de +6,5 V+6,5\,\text{V}. Tensões superiores ou inversão de polaridade na linha de alimentação causam ruptura imediata da junção CMOS interna. Somente o pino 4 (MCLR‾/VPP\overline{\text{MCLR}}/V_{PP}) suporta até +13,5 V+13,5\,\text{V} exclusivamente durante o ciclo de gravação em alta tensão.


Descrição do produto

O que é o PIC16F628A?

O PIC16F628A-I/P é um microcontrolador monolítico de 8 bits pertencente à linha nanoWatt Technology da Microchip. Sua arquitetura baseia-se no barramento Harvard, no qual a memória de programa Flash (barramentos de 14 bits) e a memória de dados SRAM (barramentos de 8 bits) possuem vias de acesso fisicamente separadas. Essa separação permite o pipelining de dois estágios: enquanto uma instrução está sendo executada pela Unidade Lógica e Aritmética (ULA), a instrução seguinte já é buscada da memória Flash, garantindo que todas as instruções (exceto desvios condicionais e saltos de programa) sejam processadas em um único ciclo de máquina (equivalente a quatro períodos do clock principal FOSCF_{OSC}).

O sufixo -I/P identifica a versão em encapsulamento PDIP de 18 pinos com qualificação térmica industrial (−40 ∘C-40\,^\circ\text{C} a +85 ∘C+85\,^\circ\text{C}). O espaçamento padrão de 2,54 mm2,54\,\text{mm} (100 mils100\,\text{mils}) entre terminais permite montagem direta em matrizes de contato (protoboards), placas perfuradas universais e soquetes torneados ou estampados de 18 vias em placas de circuito impresso (PCI), facilitando tanto a prototipagem rápida quanto a substituição em campo em equipamentos industriais.

Para que serve?

  • Controle lógico dedicado e automação industrial: implementação de temporizadores programáveis, intertravamentos de segurança, acionamento de relés, leitura de fins de curso e controle de pequenos processos sequenciais em quadros de comando.
  • Geração de sinal PWM e acionamento de potência: controle de velocidade de motores DC via ponte H ou MOSFETs, dimerização de fitas de LED e geração de sinais modulados para transmissores infravermelhos (IR) utilizando o módulo CCP integrado.
  • Interface inteligente e coprocessamento serial: atuação como escravo UART/RS-485 dedicado para leitura de teclados matriciais, varredura de displays de 7 segmentos multiplexados ou monitoramento de comparadores analógicos, reportando estados consolidados para um controlador mestre como Arduino ou ESP32.

Por que devo usar?

  • Oscilador interno duplo de 4 MHz / 48 kHz: dispensa o uso de cristal de quartzo externo e capacitores cerâmicos de carga na maioria das aplicações, liberando os pinos RA6 e RA7 para atuarem como portas digitais de entrada/saída adicionais (totalizando 16 GPIOs úteis em um chip de 18 pinos).
  • Elevada imunidade a ruído elétrico e robustez em 5 V: opera nativamente em lógica TTL/CMOS de 5,0 V5,0\,\text{V} com circuitos internos de Power-on Reset (POR), Power-up Timer (PWRT), Oscillator Start-up Timer (OST), Brown-out Reset (BOR) e Watchdog Timer (WDT) com oscilador RC próprio, prevenindo travamentos em ambientes com interferência eletromagnética (EMI).
  • Capacidade de corrente direta de 25 mA por pino: os estágios de saída CMOS dos registradores PORTA e PORTB conseguem fornecer (source) ou drenar (sink) até 25 mA25\,\text{mA} por terminal, permitindo acionar LEDs indicadores, acopladores ópticos (como PC817 ou MOC3021) e transistores bipolares diretamente sem necessidade de buffers intermediários.

Quando devo usar?

O PIC16F628A é altamente recomendado quando o projeto exige um microcontrolador compacto, de baixo custo unitário, operação nativa em 5 V5\,\text{V}, montagem through-hole (DIP) sem componentes SMD complexos, baixo consumo em repouso e periféricos digitais clássicos (PWM, comparadores analógicos, timers e porta serial UART). É a escolha padrão para substituição direta em manutenção de placas baseadas nos antigos PIC16F84A ou PIC16F628 sem sufixo “A”.

Em contrapartida, não se deve utilizar o PIC16F628A quando a aplicação exigir conversor Analógico-Digital (ADC) multicanal de 10 bits para leitura contínua de tensões variáveis (já que o 16F628A possui apenas comparadores analógicos e referência de tensão em degraus). Para projetos DIP-18 que necessitem de ADC de 10 bits, recomenda-se o PIC16F88 ou PIC16F1827; já para aplicações que demandem conectividade Wi-Fi/Bluetooth, processamento de 32 bits ou grande volume de memória RAM, deve-se optar por módulos ESP32 ou placas da família Arduino.

Pinout e diagrama de entradas/saídas

O circuito integrado possui 18 terminais dispostos em duas fileiras paralelas (pinos 1 a 9 à esquerda do chanfro superior e pinos 10 a 18 à direita, lidos em sentido anti-horário). Quase todos os pinos são multiplexados entre funções de porta digital (RA0–RA7 e RB0–RB7) e periféricos internos.

PinoNome PrincipalFunções MultiplexadasTipo de BufferDescrição Técnica detalhada
1RA2RA2 / AN2 / VREFTTL / AnalógicoPorta A bit 2 (I/O bidirecional), entrada analógica do comparador 2 ou saída da tensão de referência (VREF).
2RA3RA3 / AN3 / CMP1TTL / AnalógicoPorta A bit 3 (I/O bidirecional), entrada analógica do comparador 1 ou saída digital do comparador 1 (CMP1).
3RA4RA4 / T0CKI / CMP2ST / Open-DrainPorta A bit 4 (saída em dreno aberto — requer resistor pull-up externo para nível alto), entrada de clock do Timer0 (T0CKI) ou saída do comparador 2.
4RA5RA5 / MCLR / VPPST (Entrada)Entrada digital somente leitura (RA5), entrada de Reset ativo em nível baixo (MCLR‾\overline{\text{MCLR}}) e entrada de tensão de gravação (VPPV_{PP}). Não possui driver de saída.
5VSSGNDAlimentaçãoReferência de terra (0 V0\,\text{V}) para a lógica interna e portas de I/O.
6RB0RB0 / INTTTL / STPorta B bit 0 (I/O bidirecional com pull-up interno programável) ou entrada de interrupção externa por borda (INT).
7RB1RB1 / RX / DTTTL / STPorta B bit 1 (I/O bidirecional), pino de recepção assíncrona da UART (RX) ou linha de dados síncrona (DT).
8RB2RB2 / TX / CKTTL / STPorta B bit 2 (I/O bidirecional), pino de transmissão assíncrona da UART (TX) ou clock síncrono (CK).
9RB3RB3 / CCP1TTL / STPorta B bit 3 (I/O bidirecional) ou canal de Captura/Comparação/Saída PWM (CCP1).
10RB4RB4 / PGMTTL / STPorta B bit 4 (I/O com interrupção por mudança de estado) ou habilitação de gravação em baixa tensão (PGM).
11RB5RB5TTLPorta B bit 5 (I/O bidirecional com interrupção por mudança de estado e pull-up interno).
12RB6RB6 / T1OSO / T1CKI / PGCTTL / STPorta B bit 6, entrada de clock/oscilador do Timer1 ou entrada de Clock de Programação ICSP (PGC).
13RB7RB7 / T1OSI / PGDTTL / STPorta B bit 7, entrada do oscilador do Timer1 ou linha de Dados de Programação ICSP (PGD).
14VDD+VCCAlimentaçãoAlimentação positiva do circuito integrado (+3,0 V+3,0\,\text{V} a +5,5 V+5,5\,\text{V} DC).
15RA6RA6 / OSC2 / CLKOUTTTL / CristalPorta A bit 6 (quando em oscilador interno), saída do amplificador do cristal (OSC2) ou saída de clock FOSC/4F_{OSC}/4 (CLKOUT).
16RA7RA7 / OSC1 / CLKINST / CristalPorta A bit 7 (quando em oscilador interno), entrada do cristal de quartzo (OSC1) ou entrada de clock externo (CLKIN).
17RA0RA0 / AN0TTL / AnalógicoPorta A bit 0 (I/O bidirecional) ou entrada analógica 0 dos comparadores (AN0).
18RA1RA1 / AN1TTL / AnalógicoPorta A bit 1 (I/O bidirecional) ou entrada analógica 1 dos comparadores (AN1).

💡 Dica: Ao inicializar o PIC16F628A após um Reset, os comparadores analógicos nos pinos RA0 a RA3 vêm ativados por padrão (CMCON=0x00CMCON = 0\text{x}00). Para utilizar o PORTA como entradas e saídas puramente digitais, é obrigatório carregar o valor hexadecimal 0x07 no registrador CMCON (CMCON = 0x07;) logo nas primeiras linhas da função main().


Como fazer a ligação

Requisitos de instalação e alimentação

Para operar o PIC16F628A-I/P com estabilidade em bancada ou em placa definitiva, são necessários os seguintes elementos mínimos de suporte elétrico:

  1. Fonte de alimentação regulada: fonte DC estabilizada de 5,0 V5,0\,\text{V} (por exemplo, baseada em regulador linear 7805, AMS1117-5.0 ou barramento de 5V de uma placa Arduino).
  2. Capacitor de desacoplamento (Bypass): é indispensável instalar um capacitor cerâmico multicamada de 100 nF100\,\text{nF} (0,1 μF0,1\,\mu\text{F}) o mais próximo fisicamente possível entre os pinos 14 (VDD) e 5 (VSS) para filtrar transientes de chaveamento interno da CPU.
  3. Circuito de Reset (MCLR‾\overline{\text{MCLR}}): caso o pino 4 (RA5/MCLR) esteja configurado nos Configuration Bits como Reset externo (MCLRE = ON), deve-se conectá-lo ao barramento de +5 V+5\,\text{V} através de um resistor de pull-up de 10 kΩ10\,\text{k}\Omega. Deixar este pino flutuando com MCLRE = ON fará o microcontrolador reiniciar aleatoriamente ao menor ruído eletrostático.
  4. Interface de gravação ICSP: para transferir o arquivo compilado .hex para a memória Flash interna, utiliza-se um gravador dedicado da Microchip (PICkit 3, PICkit 4 ou MPLAB Snap) conectado às 5 linhas do barramento ICSP (VPP, VDD, VSS, PGD e PGC).

Diagrama de ligação elétrica

O diagrama a seguir ilustra o circuito mínimo de operação e gravação ICSP do PIC16F628A, utilizando o oscilador interno de 4 MHz, desacoplamento de fonte, pull-up no pino de Reset e um LED de teste no pino RB0:

Diagrama de ligação elétrica do PIC16F628A

Na topologia acima, o gravador ICSP de 5 vias compartilha o barramento de alimentação (VDD e GND) e injeta o pulso de programação no pino 4 (MCLR/VPP), enquanto transmite o clock serial pelo pino 12 (RB6/PGC) e os dados binários pelo pino 13 (RB7/PGD). O pino 6 (RB0) aciona um LED indicador através de um resistor limitador de corrente de 330 Ω330\,\Omega.

Tabela de conexões dos terminais

A tabela abaixo apresenta o mapeamento completo De →\to Para compreendendo tanto a gravação ICSP quanto a integração em rede serial UART com um Arduino Uno (ou ESP32 com divisor resistivo):

Pino do PIC16F628ASinal no PICDestino (Gravador ICSP / Fonte / Arduino)Função da Conexão
Pino 14VDD (+5V)Positivo +5 V+5\,\text{V} da Fonte + Pino 2 do PICkit (VDD Target)Alimentação positiva principal do microcontrolador
Pino 5VSS (GND)Negativo GND da Fonte + Pino 3 do PICkit (GND) + GND do ArduinoReferência comum de terra (0 V0\,\text{V})
Pino 4RA5 / MCLR / VPPPino 1 do PICkit (VPP/MCLR) + Resistor de 10 kΩ10\,\text{k}\Omega para +5 V+5\,\text{V}Pulso de gravação ICSP e pull-up de Reset
Pino 13RB7 / PGDPino 4 do PICkit (ICSPDAT / PGD)Linha bidirecional de dados de gravação ICSP
Pino 12RB6 / PGCPino 5 do PICkit (ICSPCLK / PGC)Linha de clock sincronizado de gravação ICSP
Pino 6RB0Resistor de 330 Ω→330\,\Omega \to Ânodo do LED (Cátodo no GND)Saída digital de status / PWM via software
Pino 7RB1 / RXPino TX do Arduino (ou TX do ESP32)Entrada de recepção serial UART do PIC16F628A
Pino 8RB2 / TXPino RX do Arduino (ou divisor 1 kΩ/2 kΩ→1\,\text{k}\Omega / 2\,\text{k}\Omega \to RX do ESP32)Saída de transmissão serial UART do PIC16F628A

Cuidados e observações de segurança

⚠️ Atenção: O pino 3 (RA4/T0CKI) possui estágio de saída em dreno aberto (Open-Drain). Diferentemente dos demais pinos do chip, quando configurado como saída digital e colocado em nível lógico alto (RA4 = 1), ele entra em estado de alta impedância e não fornece tensão positiva. Para obter 5 V5\,\text{V} na saída RA4, conecte um resistor de pull-up externo (entre 4,7 kΩ4,7\,\text{k}\Omega e 10 kΩ10\,\text{k}\Omega) ligado do pino 3 ao +5 V+5\,\text{V}.

⚠️ Atenção: Caso integre a UART do PIC16F628A (alimentado em 5,0 V5,0\,\text{V}) com uma placa ESP32 (cujos GPIOs operam em 3,3 V3,3\,\text{V} e não são tolerantes a 5 V5\,\text{V}), utilize obrigatoriamente um conversor de nível lógico bidirecional ou um divisor de tensão resistivo (1 kΩ1\,\text{k}\Omega em série e 2 kΩ2\,\text{k}\Omega para o GND) na linha que sai do pino 8 (RB2/TX do PIC) antes de entrar no pino RX do ESP32.


Como usar

Guia de operação passo a passo

O fluxo padrão de engenharia para programar e colocar o PIC16F628A em operação compreende cinco etapas sequenciais:

  1. Montagem na matriz de contatos: insira o CI PIC16F628A no sulco central da protoboard, observando a meia-lua de identificação do pino 1. Conecte o capacitor de 100 nF100\,\text{nF} entre os pinos 14 (VDD) e 5 (VSS) e o resistor de 10 kΩ10\,\text{k}\Omega entre o pino 4 (MCLR) e o +5 V+5\,\text{V}.
  2. Configuração dos fusíveis (Configuration Bits): no ambiente MPLAB X IDE com o compilador XC8, defina as diretivas #pragma config: selecione FOSC = INTOSCIO (oscilador interno de 4 MHz com RA6 e RA7 livres como I/O), WDTE = OFF (Watchdog Timer desativado durante testes básicos) e LVP = OFF (desabilita gravação em baixa tensão, liberando o pino 10 RB4 como I/O normal).
  3. Desativação dos comparadores analógicos e definição de direção (TRIS): no início da função main(), execute CMCON = 0x07; para desligar os comparadores do PORTA. Em seguida, configure os registradores de direção TRISA e TRISB, onde o bit em 0 configura o pino como Saída (Output) e o bit em 1 configura o pino como Entrada (Input).
  4. Compilação e gravação ICSP: compile o projeto no MPLAB X IDE para gerar o binário .hex. Conecte o gravador PICkit 3/4 aos pinos 4, 14, 5, 13 e 12 conforme a tabela de conexões e clique em Make and Program Device.
  5. Verificação operacional: após a mensagem Programming/Verify complete, o microcontrolador inicia imediatamente a execução do firmware a partir do vetor de Reset (0x0000).

Modos de operação e ajustes

1. Seleção dos Modos de Oscilador (FOSC)

O PIC16F628A dispõe de oito modos de clock configuráveis via Configuration Word (endereço 0x2007):

  • INTOSCIO (Recomendado para uso geral): utiliza o oscilador RC interno calibrado em 4 MHz4\,\text{MHz} (ou 48 kHz48\,\text{kHz} limpando o bit OSCF no registrador PCON), mantendo os pinos 15 (RA6) e 16 (RA7) disponíveis como portas digitais comuns.
  • HS (High Speed Crystal): destinado a cristais de quartzo externos de 4 MHz4\,\text{MHz} a 20 MHz20\,\text{MHz} conectados entre os pinos 15 e 16 (com dois capacitores cerâmicos de 15 pF15\,\text{pF} a 22 pF22\,\text{pF} aterrados). É obrigatório quando a aplicação exige alta precisão temporal ou comunicação UART em altas taxas de transmissão (baud rates acima de 19200 bps19200\,\text{bps}).
  • XT e LP: voltados para cristais de frequência padrão (até 4 MHz4\,\text{MHz}) e cristais de relógio de baixíssimo consumo (32,768 kHz32,768\,\text{kHz}), respectivamente.

2. Cálculo da Taxa de Transmissão Serial (UART Baud Rate)

Para configurar o módulo USART interno em modo assíncrono de alta velocidade (BRGH = 1), o valor inteiro a ser carregado no registrador gerador de taxa de transmissão (SPBRG, de 8 bits) é determinado pela equação oficial do datasheet:

SPBRG=⌊FOSC16×Baud Rate−1⌋\text{SPBRG} = \left\lfloor \frac{F_{OSC}}{16 \times \text{Baud Rate}} - 1 \right\rfloor

Considerando o oscilador interno padrão de FOSC=4 MHzF_{OSC} = 4\,\text{MHz} (4.000.000 Hz4.000.000\,\text{Hz}) e uma taxa desejada de Baud Rate=9600 bps\text{Baud Rate} = 9600\,\text{bps}, obtém-se:

SPBRG=⌊4.000.00016×9600−1⌋=⌊26,04−1⌋=25\text{SPBRG} = \left\lfloor \frac{4.000.000}{16 \times 9600} - 1 \right\rfloor = \lfloor 26,04 - 1 \rfloor = 25

Com SPBRG=25\text{SPBRG} = 25, a taxa real gerada pelo hardware é de 9615 bps9615\,\text{bps}, resultando em um erro percentual de apenas +0,16%+0,16\%, perfeitamente dentro da tolerância da recepção UART de placas Arduino e ESP32.

3. Cálculo de Frequência e Ciclo Ativo do PWM (Módulo CCP1)

Quando o módulo CCP1 (pino 9, RB3) opera em modo PWM, o período do sinal (TPWMT_{PWM}) é controlado pelo Timer2 através do registrador PR2 segundo a relação matemática:

TPWM=(PR2+1)×4×TOSC×PrescalerTMR2T_{PWM} = \left( \text{PR2} + 1 \right) \times 4 \times T_{OSC} \times \text{Prescaler}_{\text{TMR2}}

Onde TOSC=1/FOSCT_{OSC} = 1 / F_{OSC} e o PrescalerTMR2\text{Prescaler}_{\text{TMR2}} pode assumir os fatores 11, 44 ou 1616. Para FOSC=4 MHzF_{OSC} = 4\,\text{MHz}, PrescalerTMR2=4\text{Prescaler}_{\text{TMR2}} = 4 e PR2=249\text{PR2} = 249, a frequência do PWM resultante é exatamente 1 kHz1\,\text{kHz} (TPWM=1 msT_{PWM} = 1\,\text{ms}).

Exemplos práticos de uso

A seguir, apresentamos uma implementação completa em duas partes:

  1. Firmware nativo do PIC16F628A (em C / MPLAB XC8): configura o oscilador interno de 4 MHz, inicializa o módulo PWM em 1 kHz1\,\text{kHz} no pino RB3, pisca o LED de status em RB0 e estabelece comunicação serial UART a 9600 bps9600\,\text{bps} nos pinos RB1 (RX) e RB2 (TX), respondendo a comandos enviados por um microcontrolador mestre.
  2. Código para Arduino / ESP32 (Arduino IDE): atua como mestre de supervisão, enviando comandos seriais ao PIC16F628A para alternar estados de saída e recebendo telemetria em tempo real.

Parte 1: Firmware para o PIC16F628A (Compilador MPLAB XC8)

/*
 * Arquivo: main.c
 * Dispositivo: PIC16F628A (DIP-18)
 * Compilador: Microchip MPLAB XC8
 * Descrição: Operação com oscilador interno 4 MHz, pisca LED em RB0,
 *            gera PWM de 1 kHz (50% duty cycle) em RB3/CCP1 e comunica
 *            via UART (9600 bps) com Arduino/ESP32 nos pinos RB1(RX) e RB2(TX).
 */

#include <xc.h>
#include <stdint.h>

// 1. Configuração dos Fusíveis (Configuration Bits)
#pragma config FOSC = INTOSCIO  // Oscilador interno 4 MHz, RA6 e RA7 como I/O
#pragma config WDTE = OFF       // Watchdog Timer desativado
#pragma config PWRTE = ON       // Power-up Timer ativado (estabilização de 72 ms)
#pragma config MCLRE = ON       // Pino RA5/MCLR atua como Reset externo
#pragma config BOREN = ON       // Brown-out Reset ativado (proteção contra queda de VDD)
#pragma config LVP = OFF        // Gravação em baixa tensão desativada (RB4 livre como I/O)
#pragma config CPD = OFF        // Proteção de código da EEPROM desativada
#pragma config CP = OFF         // Proteção de código da Flash desativada

#define _XTAL_FREQ 4000000UL    // Define frequência de 4 MHz para rotinas __delay_ms()

// Inicializa o módulo USART interno para 9600 bps @ 4 MHz
void UART_Init(void) {
    TRISBbits.TRISB1 = 1;       // RB1 (RX) configurado como entrada
    TRISBbits.TRISB2 = 1;       // RB2 (TX) configurado conforme recomendação do datasheet
    
    SPBRG = 25;                 // 9600 bps com Fosc = 4 MHz e BRGH = 1 (erro de 0,16%)
    TXSTAbits.BRGH = 1;         // Modo assíncrono de alta velocidade (High Baud Rate)
    TXSTAbits.SYNC = 0;         // Modo Assíncrono
    RCSTAbits.SPEN = 1;         // Habilita a porta serial (configura pinos RX e TX)
    TXSTAbits.TXEN = 1;         // Habilita o transmissor UART
    RCSTAbits.CREN = 1;         // Habilita recepção contínua
}

// Envia um único caractere pela UART
void UART_WriteChar(char data) {
    while (!PIR1bits.TXIF);     // Aguarda o buffer de transmissão (TXREG) esvaziar
    TXREG = data;
}

// Envia uma string terminada em nulo pela UART
void UART_WriteString(const char *text) {
    while (*text != '\0') {
        UART_WriteChar(*text++);
    }
}

// Inicializa o módulo CCP1 para gerar PWM de 1 kHz com 50% de Duty Cycle no pino RB3
void PWM_Init(void) {
    TRISBbits.TRISB3 = 0;       // Pino 9 (RB3/CCP1) configurado como saída
    PR2 = 249;                  // Período de 1 kHz para Fosc = 4 MHz e Prescaler = 4
    CCPR1L = 125;               // Duty Cycle de 50% (125 / 250 = 0,5)
    CCP1CON = 0x0C;             // Modo PWM ativo no módulo CCP1
    T2CON = 0x05;               // Liga Timer2 (TMR2ON = 1) com Prescaler 1:4
}

void main(void) {
    // Desabilita os comparadores analógicos para liberar RA0..RA3 como I/O digital
    CMCON = 0x07;
    
    // Configuração de direção das portas (0 = Saída, 1 = Entrada)
    TRISA = 0x20;               // RA5 (MCLR) é apenas entrada; demais pinos de PORTA como saída
    TRISBbits.TRISB0 = 0;       // Pino 6 (RB0) como saída para o LED de status
    
    PORTA = 0x00;
    PORTBbits.RB0 = 0;
    
    UART_Init();
    PWM_Init();
    
    UART_WriteString("PIC16F628A Inicializado - Pronto\r\n");
    
    while (1) {
        // Verifica se ocorreu erro de Overrun na recepção UART e limpa se necessário
        if (RCSTAbits.OERR) {
            RCSTAbits.CREN = 0;
            RCSTAbits.CREN = 1;
        }
        
        // Verifica se chegou algum comando serial do Arduino/ESP32
        if (PIR1bits.RCIF) {
            char cmd = RCREG;
            if (cmd == '1') {
                PORTBbits.RB0 = 1;
                UART_WriteString("ACK: LED RB0 LIGADO\r\n");
            } else if (cmd == '0') {
                PORTBbits.RB0 = 0;
                UART_WriteString("ACK: LED RB0 DESLIGADO\r\n");
            } else if (cmd == 'S') {
                UART_WriteString("STATUS: PIC16F628A OK | PWM 1kHz ATIVO\r\n");
            }
        }
    }
}

Parte 2: Código de Integração no Arduino Uno / ESP32 (Arduino IDE)

O sketch abaixo utiliza a biblioteca SoftwareSerial (no Arduino Uno) ou HardwareSerial para enviar comandos periódicos ('1', '0' e 'S') ao PIC16F628A e exibir as respostas no Monitor Serial:

/*
 * Integração Mestre-Escravo: Arduino Uno <-> PIC16F628A via UART
 * Conexões:
 * - Pino 10 do Arduino (RX Soft) <--- Pino 8 do PIC16F628A (RB2 / TX)
 * - Pino 11 do Arduino (TX Soft) ---> Pino 7 do PIC16F628A (RB1 / RX)
 * - GND do Arduino               <---> Pino 5 do PIC16F628A (VSS / GND)
 */

#include <Arduino.h>
#include <SoftwareSerial.h>

// Define porta serial emulada nos pinos 10 (RX) e 11 (TX)
SoftwareSerial picSerial(10, 11);

unsigned long ultimoEnvio = 0;
uint8_t etapaComando = 0;

void setup() {
  Serial.begin(115200);      // Serial USB para monitoramento no PC
  picSerial.begin(9600);     // UART a 9600 bps compatível com SPBRG = 25 do PIC16F628A

  Serial.println(F("=== Mestre Arduino iniciado: comunicando com PIC16F628A ==="));
}

void loop() {
  // Encaminha todas as mensagens recebidas do PIC16F628A para o Monitor Serial
  while (picSerial.available() > 0) {
    char c = picSerial.read();
    Serial.write(c);
  }

  // A cada 2000 ms, alterna o comando enviado ao PIC16F628A
  if (millis() - ultimoEnvio >= 2000) {
    ultimoEnvio = millis();

    if (etapaComando == 0) {
      Serial.println(F(">> Enviando comando '1' (Ligar saída RB0 do PIC)"));
      picSerial.write('1');
      etapaComando = 1;
    } else if (etapaComando == 1) {
      Serial.println(F(">> Enviando comando 'S' (Solicitar Status do PIC)"));
      picSerial.write('S');
      etapaComando = 2;
    } else {
      Serial.println(F(">> Enviando comando '0' (Desligar saída RB0 do PIC)"));
      picSerial.write('0');
      etapaComando = 0;
    }
  }
}

Projetos

O PIC16F628A pode atuar como controlador periférico de tempo real ou watchdog externo dedicado em arquiteturas híbridas que utilizam placas ESP32 e módulos de relés industriais. Caso deseje explorar como estruturar sistemas de automação completos com interface web e controle de cargas em bancada, consulte os tutoriais relacionados no blog da RoboBuilders, nos quais é possível integrar a saída serial do PIC16F628A diretamente aos barramentos de supervisão de microcontroladores de 32 bits.


Conclusão

Neste manual técnico, foram abordados os fundamentos de engenharia e operação prática do microcontrolador PIC16F628A-I/P (DIP-18):

  • Especificações técnicas: análise detalhada da arquitetura RISC de 8 bits da Microchip, memória Flash de 2048 palavras, 224 Bytes de SRAM, 128 Bytes de EEPROM e limites elétricos operacionais (3,0 V3,0\,\text{V} a 5,5 V5,5\,\text{V} DC e até 25 mA25\,\text{mA} por pino).
  • Descrição e Pinout: mapeamento completo dos 18 terminais do encapsulamento PDIP, destacando as particularidades do pino RA4 (open-drain), do pino RA5/MCLR (somente entrada/Reset) e da desativação inicial dos comparadores analógicos via CMCON = 0x07.
  • Como fazer a ligação: esquema vetorial de conexões para alimentação estabilizada de 5 V5\,\text{V} com capacitor de desacoplamento de 100 nF100\,\text{nF}, barramento de gravação ICSP de 5 vias (PICkit 3/4) e conexão serial UART.
  • Como usar e programação: equacionamento matemático dos registradores de Baud Rate (SPBRG) e PWM (PR2), acompanhado de firmware completo em C (MPLAB XC8) e código de supervisão serial para Arduino e ESP32.

Com essas referências de hardware e firmware, o PIC16F628A está pronto para ser aplicado em projetos de controle dedicado, automação industrial e sistemas embarcados de alta confiabilidade.

Solução de problemas

Olá! Sou o assistente técnico da RoboBuilders. Descreva seu problema com o Microcontrolador PIC16F628A DIP-18: Manual Técnico Completo e eu ajudarei a encontrar a solução.

O assistente usa IA e pode errar. Confirme informações críticas no datasheet oficial do fabricante.