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âmetro | Especificação |
|---|---|
| Fabricante / Família | Microchip Technology / PIC16 Mid-Range (8 bits) |
| Código comercial (SKU Loja) | PIC16F628A-I/P (RB1066) |
| Encapsulamento | PDIP-18 (18 pinos through-hole, passo de 2,54 mm) |
| Arquitetura de CPU | Harvard RISC de 8 bits (35 instruções de palavra única de 14 bits) |
| Desempenho de execução | Até 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 () ou 48 kHz (baixo consumo) |
| Frequência de Clock Externo | DC 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 CCP | 1 canal Capture (16 bits), Compare (16 bits) ou PWM (resolução máxima de 10 bits) |
| Periféricos Analógicos | 2 Comparadores Analógicos + Referência de Tensão Programável (VREF) |
| Comunicação Serial | 1 módulo USART (RS-485, RS-232 / UART TTL e modo síncrono) |
| Temperatura de Operação | a (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étrico | Símbolo | Mínimo | Típico | Máximo | Unidade |
|---|---|---|---|---|---|
| Tensão de alimentação operacional () | 3,0 | 5,0 | 5,5 | V DC | |
| Tensão de retenção de dados RAM em Sleep | 2,0 | — | 5,5 | V DC | |
| Tensão de limiar de Brown-out Reset (BOR) | 3,65 | 4,0 | 4,35 | V DC | |
| Tensão de programação em (Alta Tensão) | 12,0 | 13,0 | 13,5 | V DC | |
| Corrente ativa de operação (4 MHz, ) | — | 1,2 | 2,0 | mA | |
| Corrente ativa em baixo consumo (48 kHz, ) | — | 120 | 250 | ||
| Corrente em modo Sleep (Watchdog desligado, ) | — | 1,0 | 15,0 | ||
| Corrente máxima por pino de I/O (Source ou Sink) | — | — | 25 | mA | |
Corrente máxima combinada nas portas PORTA + PORTB | — | — | 200 | mA | |
| Corrente máxima total nos terminais ou | — | — | 250 | mA |
⛔ Perigo: A tensão máxima absoluta no pino em relação ao é de . 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 () suporta até 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 ).
O sufixo -I/P identifica a versão em encapsulamento PDIP de 18 pinos com qualificação térmica industrial ( a ). O espaçamento padrão de () 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
RA6eRA7para 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 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
PORTAePORTBconseguem fornecer (source) ou drenar (sink) até 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 , 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.
| Pino | Nome Principal | Funções Multiplexadas | Tipo de Buffer | Descrição Técnica detalhada |
|---|---|---|---|---|
| 1 | RA2 | RA2 / AN2 / VREF | TTL / Analógico | Porta A bit 2 (I/O bidirecional), entrada analógica do comparador 2 ou saída da tensão de referência (VREF). |
| 2 | RA3 | RA3 / AN3 / CMP1 | TTL / Analógico | Porta A bit 3 (I/O bidirecional), entrada analógica do comparador 1 ou saída digital do comparador 1 (CMP1). |
| 3 | RA4 | RA4 / T0CKI / CMP2 | ST / Open-Drain | Porta 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. |
| 4 | RA5 | RA5 / MCLR / VPP | ST (Entrada) | Entrada digital somente leitura (RA5), entrada de Reset ativo em nível baixo () e entrada de tensão de gravação (). Não possui driver de saída. |
| 5 | VSS | GND | Alimentação | Referência de terra () para a lógica interna e portas de I/O. |
| 6 | RB0 | RB0 / INT | TTL / ST | Porta B bit 0 (I/O bidirecional com pull-up interno programável) ou entrada de interrupção externa por borda (INT). |
| 7 | RB1 | RB1 / RX / DT | TTL / ST | Porta B bit 1 (I/O bidirecional), pino de recepção assíncrona da UART (RX) ou linha de dados síncrona (DT). |
| 8 | RB2 | RB2 / TX / CK | TTL / ST | Porta B bit 2 (I/O bidirecional), pino de transmissão assíncrona da UART (TX) ou clock síncrono (CK). |
| 9 | RB3 | RB3 / CCP1 | TTL / ST | Porta B bit 3 (I/O bidirecional) ou canal de Captura/Comparação/Saída PWM (CCP1). |
| 10 | RB4 | RB4 / PGM | TTL / ST | Porta B bit 4 (I/O com interrupção por mudança de estado) ou habilitação de gravação em baixa tensão (PGM). |
| 11 | RB5 | RB5 | TTL | Porta B bit 5 (I/O bidirecional com interrupção por mudança de estado e pull-up interno). |
| 12 | RB6 | RB6 / T1OSO / T1CKI / PGC | TTL / ST | Porta B bit 6, entrada de clock/oscilador do Timer1 ou entrada de Clock de Programação ICSP (PGC). |
| 13 | RB7 | RB7 / T1OSI / PGD | TTL / ST | Porta B bit 7, entrada do oscilador do Timer1 ou linha de Dados de Programação ICSP (PGD). |
| 14 | VDD | +VCC | Alimentação | Alimentação positiva do circuito integrado ( a DC). |
| 15 | RA6 | RA6 / OSC2 / CLKOUT | TTL / Cristal | Porta A bit 6 (quando em oscilador interno), saída do amplificador do cristal (OSC2) ou saída de clock (CLKOUT). |
| 16 | RA7 | RA7 / OSC1 / CLKIN | ST / Cristal | Porta A bit 7 (quando em oscilador interno), entrada do cristal de quartzo (OSC1) ou entrada de clock externo (CLKIN). |
| 17 | RA0 | RA0 / AN0 | TTL / Analógico | Porta A bit 0 (I/O bidirecional) ou entrada analógica 0 dos comparadores (AN0). |
| 18 | RA1 | RA1 / AN1 | TTL / Analógico | Porta 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
RA0aRA3vêm ativados por padrão (). Para utilizar oPORTAcomo entradas e saídas puramente digitais, é obrigatório carregar o valor hexadecimal0x07no registradorCMCON(CMCON = 0x07;) logo nas primeiras linhas da funçãomain().
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:
- Fonte de alimentação regulada: fonte DC estabilizada de (por exemplo, baseada em regulador linear 7805, AMS1117-5.0 ou barramento de 5V de uma placa Arduino).
- Capacitor de desacoplamento (Bypass): é indispensável instalar um capacitor cerâmico multicamada de () o mais próximo fisicamente possível entre os pinos 14 (
VDD) e 5 (VSS) para filtrar transientes de chaveamento interno da CPU. - Circuito de Reset (): caso o pino 4 (
RA5/MCLR) esteja configurado nos Configuration Bits como Reset externo (MCLRE = ON), deve-se conectá-lo ao barramento de através de um resistor de pull-up de . Deixar este pino flutuando comMCLRE = ONfará o microcontrolador reiniciar aleatoriamente ao menor ruído eletrostático. - Interface de gravação ICSP: para transferir o arquivo compilado
.hexpara 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,PGDePGC).
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:

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 .
Tabela de conexões dos terminais
A tabela abaixo apresenta o mapeamento completo De 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 PIC16F628A | Sinal no PIC | Destino (Gravador ICSP / Fonte / Arduino) | Função da Conexão |
|---|---|---|---|
| Pino 14 | VDD (+5V) | Positivo da Fonte + Pino 2 do PICkit (VDD Target) | Alimentação positiva principal do microcontrolador |
| Pino 5 | VSS (GND) | Negativo GND da Fonte + Pino 3 do PICkit (GND) + GND do Arduino | Referência comum de terra () |
| Pino 4 | RA5 / MCLR / VPP | Pino 1 do PICkit (VPP/MCLR) + Resistor de para | Pulso de gravação ICSP e pull-up de Reset |
| Pino 13 | RB7 / PGD | Pino 4 do PICkit (ICSPDAT / PGD) | Linha bidirecional de dados de gravação ICSP |
| Pino 12 | RB6 / PGC | Pino 5 do PICkit (ICSPCLK / PGC) | Linha de clock sincronizado de gravação ICSP |
| Pino 6 | RB0 | Resistor de Ânodo do LED (Cátodo no GND) | Saída digital de status / PWM via software |
| Pino 7 | RB1 / RX | Pino TX do Arduino (ou TX do ESP32) | Entrada de recepção serial UART do PIC16F628A |
| Pino 8 | RB2 / TX | Pino RX do Arduino (ou divisor 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 na saídaRA4, conecte um resistor de pull-up externo (entre e ) ligado do pino 3 ao .
⚠️ Atenção: Caso integre a UART do PIC16F628A (alimentado em ) com uma placa ESP32 (cujos GPIOs operam em e não são tolerantes a ), utilize obrigatoriamente um conversor de nível lógico bidirecional ou um divisor de tensão resistivo ( em série e para o
GND) na linha que sai do pino 8 (RB2/TXdo PIC) antes de entrar no pinoRXdo 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:
- 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 entre os pinos 14 (
VDD) e 5 (VSS) e o resistor de entre o pino 4 (MCLR) e o . - Configuração dos fusíveis (Configuration Bits): no ambiente MPLAB X IDE com o compilador XC8, defina as diretivas
#pragma config: selecioneFOSC = INTOSCIO(oscilador interno de 4 MHz comRA6eRA7livres como I/O),WDTE = OFF(Watchdog Timer desativado durante testes básicos) eLVP = OFF(desabilita gravação em baixa tensão, liberando o pino 10RB4como I/O normal). - Desativação dos comparadores analógicos e definição de direção (
TRIS): no início da funçãomain(), executeCMCON = 0x07;para desligar os comparadores doPORTA. Em seguida, configure os registradores de direçãoTRISAeTRISB, onde o bit em0configura o pino como Saída (Output) e o bit em1configura o pino como Entrada (Input). - 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. - 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 (ou limpando o bitOSCFno registradorPCON), 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 a conectados entre os pinos 15 e 16 (com dois capacitores cerâmicos de a 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 ).XTeLP: voltados para cristais de frequência padrão (até ) e cristais de relógio de baixíssimo consumo (), 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:
Considerando o oscilador interno padrão de () e uma taxa desejada de , obtém-se:
Com , a taxa real gerada pelo hardware é de , resultando em um erro percentual de apenas , 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 () é controlado pelo Timer2 através do registrador PR2 segundo a relação matemática:
Onde e o pode assumir os fatores , ou . Para , e , a frequência do PWM resultante é exatamente ().
Exemplos práticos de uso
A seguir, apresentamos uma implementação completa em duas partes:
- Firmware nativo do PIC16F628A (em C / MPLAB XC8): configura o oscilador interno de 4 MHz, inicializa o módulo PWM em no pino
RB3, pisca o LED de status emRB0e estabelece comunicação serial UART a nos pinosRB1(RX) eRB2(TX), respondendo a comandos enviados por um microcontrolador mestre. - 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 ( a DC e até por pino).
- Descrição e Pinout: mapeamento completo dos 18 terminais do encapsulamento PDIP, destacando as particularidades do pino
RA4(open-drain), do pinoRA5/MCLR(somente entrada/Reset) e da desativação inicial dos comparadores analógicos viaCMCON = 0x07. - Como fazer a ligação: esquema vetorial de conexões para alimentação estabilizada de com capacitor de desacoplamento de , 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.