1.
Introduçao
Num sistema digital, especialmente em microprocessadores e microcontroladores, a
capacidade de interagir com dispositivos externos (periféricos) é essencial. Essa interação é
mediada por interfaces que controlam o fluxo de dados entre o processador e os dispositivos.
O Peripheral Interface Adapter (PIA), ou Adaptador de Ligação com Periféricos, é um dos
dispositivos mais comuns nessa função. Ele permite uma comunicação paralela e
programável entre o microprocessador e dispositivos como teclados, impressoras, displays de
7 segmentos, entre outros.
O presente trabalho tem como objetivo descrever a estrutura e o funcionamento do PIA,
explicando os seus componentes internos, a função dos registos de controlo e o mecanismo
de sincronização conhecido como handshaking, que garante a comunicação correta entre os
componentes do sistema digital.
2. Estrutura Interna do PIA e Inicialização
Um PIA típico como o MC6821 é mais complexo do que apenas duas portas. Internamente,
ele possui:
Duas Portas Paralelas Independentes (Porta A e Porta B):
Cada porta geralmente tem 8 linhas de dados (PA0-PA7, PB0-PB7).
Registador de Dados (Data Register - DR): Um registo de 8 bits para cada porta
(DRA, DRB). Usado para ler o estado das linhas configuradas como entrada ou
para escrever (latched) o valor a ser colocado nas linhas configuradas como saída.
Registador de Direção de Dados (Data Direction Register - DDR): Um registo
de 8 bits para cada porta (DDRA, DDRB). Cada bit neste registo controla a
direção da linha correspondente na porta de dados. Tipicamente, 0 = Entrada, 1 =
Saída. Este registo só pode ser escrito pelo CPU.
Linhas de Controlo (Control Lines): Além das 8 linhas de dados por porta, existem
linhas de controlo associadas:
Porta A: CA1 (entrada de controlo), CA2 (entrada/saída de controlo).
Porta B: CB1 (entrada de controlo), CB2 (entrada/saída de controlo).
Estas linhas são usadas para handshaking (sincronização da comunicação) e para
gerar interrupções.
Registadores de Controlo: Um para cada porta (CRA, CRB). Estes são os registos mais
complexos e poderosos:
Seleção DDR/DR (Bit 2): Um bit crucial (tipicamente o bit 2) em cada CR determina se um
acesso ao endereço da porta (ex: endereço base + 0 para Porta A) vai ler/escrever no
Registador de Dados (DR) ou no Registador de Direção de Dados (DDR). Para configurar a
direção, o CPU primeiro escreve no CR para selecionar o DDR, depois escreve no endereço
da porta para definir as direções, e finalmente escreve no CR novamente para selecionar o
DR para operações normais de I/O.
Configuração das Linhas de Controlo (CA1, CA2, CB1, CB2): Vários bits no CR (bits 0,
1, 3, 4, 5) definem o comportamento destas linhas:
Sensibilidade à Transição: Podem ser configuradas para detetar uma transição de nível
baixo para alto (borda de subida) ou de alto para baixo (borda de descida) nas linhas de
entrada (CA1, CB1).
Geração de Interrupção: Podem ser configuradas para gerar um pedido de interrupção
(IRQ) para o CPU quando a transição ativa configurada ocorre em CA1/CB1.
Máscara de Interrupção: Bits separados permitem habilitar ou desabilitar a geração de
IRQs por CA1 e CA2 (em CRA) e CB1 e CB2 (em CRB).
Modo de Operação de CA2/CB2: Estas linhas são mais versáteis. Podem ser configuradas
como:
1. Entradas de controlo (semelhantes a CA1/CB1).
2. Saídas de nível fixo (controladas por um bit no CR).
3. Saídas de handshake automático (ex: mudam de estado automaticamente após uma
leitura/escrita da porta correspondente, para sinalizar ao periférico).
4. Saídas pulsadas (geram um pulso curto após uma leitura/escrita).
Flags de Interrupção (Bits 6 e 7): Bits de status (apenas leitura) em cada CR indicam se
ocorreu um evento de interrupção nas linhas de controlo associadas (IRQ A1/A2 em CRA,
IRQ B1/B2 em CRB). Ler o Registador de Dados ou escrever no mesmo muitas vezes limpa
estes flags.
Lógica de Interface com o Barramento:
Barramento de Dados (D0-D7): Conecta ao barramento de dados do CPU para transferência
de dados e comandos. É bidirecional.
Entradas de Seleção de Chip (CS0, CS1, /CS2): Usadas pelo sistema de descodificação de
endereços para selecionar este PIA específico no barramento. Geralmente precisam de uma
combinação específica (ex: CS0=1, CS1=1, /CS2=0) para ativar o chip.
Entradas de Seleção de Registo (RS0, RS1): Selecionam qual dos registos internos do PIA
está a ser acedido através do barramento de dados. Tipicamente:
RS1=0, RS0=0: Acesso a DRA ou DDRA (depende do bit 2 de CRA).
RS1=0, RS0=1: Acesso a CRA.
RS1=1, RS0=0: Acesso a DRB ou DDRB (depende do bit 2 de CRB).
RS1=1, RS0=1: Acesso a CRB.
Sinal Read/Write (R/W): Indica ao PIA se a operação atual é de leitura (R/W=1) ou escrita
(R/W=0) pelo CP
Sinal de Habilitação (Enable - E ou Clock - φ2): Sincroniza a transferência de dados entre
o CPU e o PIA. Muitas vezes ligado ao clock de fase 2 do CPU (em sistemas 6800/6502).
Reset (/RESET): Uma linha de entrada que, quando ativa (nível baixo), inicializa o PIA para
um estado conhecido (geralmente todas as linhas como entrada, interrupções desabilitadas).
Saídas de Pedido de Interrupção (/IRQA, /IRQB): Saídas de coletor aberto (open-drain)
ativas a nível baixo. Sinalizam ao CPU que o PIA tem um pedido de interrupção pendente
(devido a CA1, CA2, CB1 ou CB2, se habilitado). Podem ser ligadas juntas externamente
(wired-OR) com outras fontes de IRQ.
1. Processo de Handshaking Parcial e Completo
O handshaking é uma técnica de sincronização entre dois dispositivos digitais. Ele serve para
garantir que o envio e a receção de dados aconteçam no momento correto, evitando conflitos
ou perda de informação.
Handshaking Parcial
É uma forma simplificada de controle de fluxo. Apenas uma das partes (normalmente o
microprocessador) verifica se a outra está pronta para comunicar. Exemplo:
O processador escreve dados no porto.
Avisa com um sinal (por exemplo, CA2).
O periférico lê os dados, mas não envia confirmação de leitura.
Esse método economiza recursos, mas não garante que os dados foram realmente lidos
corretamente.
Handshaking Completo
Envolve troca de sinais de controlo entre os dois dispositivos. Exemplo típico:
1. O processador escreve dados no PORTA.
2. Ativa a linha CA2 para indicar “dados prontos”.
3. O periférico deteta o sinal, lê os dados.
4. O periférico responde ativando CA1 para confirmar que os dados foram recebidos.
5. O processador deteta a confirmação e continua.
Este método oferece sincronização total, sendo mais seguro e confiável, especialmente em
sistemas com dados críticos ou com velocidade variável.
Sequência de Programação Típica
Para usar um PIA, o software (geralmente em assembly ou C de baixo nível) precisa de
seguir passos como:
Reset (Opcional): Garantir que o PIA está num estado inicial conhecido (pode ser
feito por hardware ou escrevendo valores padrão nos CRs).
Configurar Direção:
Escrever no CR apropriado (CRA/CRB) para selecionar o DDR (ex: limpar o
bit 2).
Escrever o padrão de bits desejado no endereço da Porta (DDRA/DDRB) para
definir quais pinos são entrada (0) e quais são saída (1).
Operação de I/O:
Para ler de uma porta, o CPU executa uma instrução de leitura do endereço do DR
correspondente.
Para escrever para uma porta, o CPU executa uma instrução de escrita para o
endereço do DR correspondente.
Gestão de Interrupções (se usadas):
A Rotina de Serviço de Interrupção (ISR) do CPU deve primeiro determinar a fonte
da interrupção.
Lê o CR do PIA para verificar os flags de interrupção (bits 7 e 6).
Realiza a ação necessária (ex: ler dados da porta se foi um IRQ de "dados prontos").
Limpa o flag de interrupção (muitas vezes feito automaticamente ao ler/escrever o
DR, mas pode exigir uma leitura explícita do DR ou escrita no CR em alguns casos).
Retorna da interrupção.
Aplicações do handshaking:
Interface Centronics (Impressora): Clássico uso de PIA. A Porta A ou B envia os 8
bits de dados, e as linhas de controlo (CA1, CA2, CB1, CB2) implementam os sinais
Strobe, Acknowledge (ACK), Busy, Paper End (PE), Select.
Scanners de Teclado: Uma porta configurada como saída para selecionar linhas da
matriz do teclado, outra porta como entrada para ler colunas.
Controlar Displays: Acionar segmentos de displays LED de 7 segmentos
(diretamente ou via drivers), ou enviar dados para controladores de LCD simples.
Interface com Conversores A/D e D/A: Usar portas paralelas para enviar dados a
um Conversor Digital-Analógico (DAC) ou receber dados de um Conversor
Analógico-Digital (ADC), usando as linhas de controlo para iniciar a conversão e
sinalizar fim de conversão.
Comunicação entre Sistemas: Ligar dois microprocessadores diretamente usando
dois PIAs "costas-com-costas" para transferência de dados paralela.
Controlo Industrial Simples: Ler estado de sensores digitais (fim de curso,
presença), acionar relés, LEDs indicadores, pequenos motores (através de etapas de
potência).
5. PIA vs. Outros CIs de Interface
PIA (Parallel I/O): Foco em múltiplas linhas de I/O paralelas, programáveis bit a bit,
com handshake. Ideal para interfaces paralelas de 8 bits.
ACIA/UART/USART (Serial I/O): Foco em comunicação serial (um bit de cada
vez) assíncrona ou síncrona. Converte dados paralelos do CPU em série para
transmissão (e vice-versa para recepção). Usado para RS-232, modems, ligação a
outros microcontroladores via poucos fios.
Temporizadores Programáveis (PTM - Programmable Timer Module, ex: 6840):
Geram atrasos precisos, medem frequências, contam eventos, geram formas de onda
(PWM). Não fazem I/O paralelo direto.
Controladores de Interrupção (PIC - Programmable Interrupt Controller, ex:
Intel 8259): Gerem múltiplas fontes de interrupção, priorizam-nas e interfaceiam com
a entrada de interrupção única (ou poucas) do CPU. O PIA tem gestão limitada de
interrupções (apenas as suas próprias fontes).
GPIO em MCUs Modernos: Integra a funcionalidade de PIAs (portas I/O
configuráveis), temporizadores, UARTs, SPI, I2C, ADC, DAC, e mais, tudo num
único chip, com muito maior flexibilidade e capacidade.
5. Exemplo Prático de Utilização
O exemplo mais conhecido é o Motorola MC6820 ou MC6821 PIA, que foi amplamente
utilizado com as famílias de microprocessadores Motorola 6800 e MOS Technology 6502
(usado em computadores como o Apple II, Commodore PET/VIC-20/64). Outros fabricantes
tinham CIs semelhantes, como o Intel 8255 (Programmable Peripheral Interface - PPI).
6. Interface do PIA com o Microprocessador
O Peripheral Interface Adapter (PIA) funciona como uma ponte entre um microcontrolador
(ou microprocessador) e os dispositivos periféricos. Essa comunicação é feita por meio de
linhas de dados, controlo e sinais de sincronização, todas conectadas aos pinos do
microcontrolador.
a) Comunicação com o Microcontrolador
A ligação entre o PIA e o microcontrolador é feita por três conjuntos principais de sinais:
Barramento de Dados: Linha de 8 bits usada para trocar dados entre o
microcontrolador e o PIA.
Barramento de Endereços: Permite ao microcontrolador selecionar qual registo do
PIA (PORTA, PORTB, CRA, CRB, etc.) ele deseja ler ou escrever.
Linhas de Controlo:
RS (Register Select): Seleciona o registo interno a ser acessado (dados ou
controlo).
R/W (Read/Write): Indica se a operação é de leitura ou escrita.
E (Enable) ou CS (Chip Select): Ativa o PIA para uma operação.
b) Mecanismo de Comunicação
1. O microcontrolador coloca o endereço do registo do PIA no Address Bus.
2. Define o sinal R/W:
1 para leitura de dados do PIA,
0 para escrita.
3. Usa o sinal RS para indicar se vai acessar dados ou controlo.
4. Ativa o PIA com o sinal CS.
5. A troca de dados ocorre pelo Data Bus.
6. Em caso de interrupções ou handshaking, os sinais de controlo (CA1, CA2, etc.) são
ativados conforme a configuração.
c) Vantagens dessa Interface
Comunicação paralela rápida (8 bits de cada vez).
Suporte a interrupções (para resposta imediata a eventos).
Configuração flexível dos pinos (entrada, saída ou ambos).
Possibilidade de operar com handshaking para periféricos sensíveis ao tempo.