You are on page 1of 23

MICROCONTROLADORES - BÁSICO

PIC – Microchip

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


1/23
1. Introdução

As circunstâncias que se apresentam hoje no campo dos microcontroladores têm os seus primórdios no
desenvolvimento da tecnologia dos circuitos integrados. Este desenvolvimento tornou possível colocar
centenas de milhares de transistores num único chip. Isso constituiu um pré-requisito para a produção de
microprocessadores, e os primeiros computadores foram construídos adicionando periféricos externos tais
como memória, linhas de entrada e saída, temporizadores e outros. Um crescente aumento do nível de
integração permitiu o aparecimento de circuitos integrados contendo simultaneamente processador e
periféricos. Foi assim que apareceu o primeiro chip contendo um microcomputador e que mais tarde
haveria de ser designado por microcontrolador.

2. História

O primeiro microprocessador foi desenvolvido por uma então pequena empresa chamada Intel (acrônimo
de Integrated Electronics) nos primórdios dos anos 1970. O cliente era uma companhia japonesa de nome
Busicon, que não comprou a idéia. Como a Intel teve que arcar com os custos do desenvolvimento e não
tinha um cliente que comprasse o produto, resolveu colocá-lo no mercado como um sistema
microprocessador de “uso geral” (ou, como chamam em ingles, “general purpose”) para aplicações onde
componentes discretos de lógica digital eram empregados. O componente foi um sucesso e logo a Intel
desenvolveu um novo microprocessador de 4 bits chamado 4004.

Em 1974, um microprocessador mais poderoso de segunda geração (denominado 8008) foi anunciado e
fornecido como um componente simples, que foi rapidamente seguido pelo Intel 8080. Ambos, o 8008 e o
8080 eram alimentados a partir de uma fonte de 5 VCC, usando tecnologia N-MOS.

No mesmo período, a Motorola lançou o seu primeiro microprocessador, denominado 6800, que possuia
um processador de 8 bits com a mesma capacidade de processamento do Intel 8080. Nesta ocasião, a
arquitetura interna usada no Intel 8080 e no Motorola 6800 eram muito diferentes.

O Intel 8080 utilizava uma arquitetura de registros AX, BX, CX, DX e HL, todos de 16 bits porém,
capazes de serem utilizados como pares de registros de 8 bits, isto é, o registro AX poderia ser usado
como dois registros separados – AH e AL – onde AH era a parte alta (H = high) do byte do registro AX, e
AL era a parte baixa (L = low) do byte do registroAX. Desta forma, os registros de 16 bits AX, BX, CX,
DX e HL poderiam ser utilizados como AH, AL, BH, BL, CH, CL, DH, DL, H e L, todos de 8 bits.

O Intel 8080 possuia o mapa de I/O (Input/Output – Entrada/Saída) separado da memória de dados. Isto
significa que, para comandar entrada/saída do dispositivo, instruções especiais deveriam ser
implementadas tais como IN para instrução de entrada e OUT para instrução de saída. O acesso à
memória de dados (que possuia um mapa diferente), utilizava a instrução MOV.

O Motorola 6800 utilizava o que se chamava de “Memory Mapped I/O” (memória mapeada como I/O), o
que significa que tanto a memória de dados quanto de Entrada/Saída dividiam o mesmo mapa. O conjunto
de registros era muito menor, consistindo em dois acumuladores de 8 bits (A e B) e um registro indexador
de 16 bits chamado X. Estes registros podem suportar uma gama de modos de enderaçamento totalmente
voltados para um número pequeno de registros (o que torna a programação também mais simples).

Para se ter acesso a dados da memória ou das Entradas/Saídas é necessário utilizar uma instrução do tipo
LDAA; para escrever dados na memória ou nas Entradas/Saídas é necessário utilizar uma instrução do
tipo STAA. O acesso ao registro X deverá ser via suas próprias instruções, isto é, LDX e STX.

Intel e Motorola mantiveram as diferenças fundamentais na arquitetura de seus processadores mesmo nos
modelos mais modernos.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


2/23
No caso dos processadores desenvolvidos pela Intel, o modelo 8080 evoluiu no modelo 8085 (também
com registros de 8 bits como no modelo 8080) até o processador de terceira geração (com registro de 16
bits), o modelo 8086 que, na sua forma de pseudo-16 bits 8088, foi empregado na construção dos
primeiros IBM PC (IBM Personal Computer). O modelo 8088 era o modelo 8086 com um barramento de
dados de 8 bits, o que tornava fácil a interligação com os dispositivos de 8 bits existentes naquela ocasião.
Na sequencia, foram seguidos pelos modelos 80286, 80386 (com processador de 32 bits), e o 80486,
chegando aos modelos Pentium (com processadores de 64 bits) exitentes atualmente. A família 80x86 e
Pentium foram desenvolvidos para aplicações em computadores pessoais e possuem um vasto mapa de
memória.

Os processadores da Motorola seguiram caminho semelhante com o modelo 6800 que foi substituído pelo
6809 (8 bits), o 68000 (16 bits), os 68010,68020 e 68030, utilizados em muitas estações de trabalho e
principalmente no modelos Apple MAC.

O núcleo do processador Intel 8080 foi utilizado na linha de microcontroladores 8048 e 8051, que
sobrevive até os dias atuais. A Intel, hoje, desenvolve uma gama de microcontroladores muito mais
complexa que os modelos básicos originais.

Motorola seguiu pelo mesmo caminho com os microcontroladores baseados no modelo 6800 (6805,6808
e 6811, utilizado atualmente).

Logo, muitos dos atuais microcontroladores são originários nas famílias 8080 e 6800. Outros fabricantes,
como a Rockwell que produziu microprocessadores com arquitetura 6800 (6502), enquanto que a Zilog
desenvolveu o famoso Z80 (com arquitetura 8080).

O desenvolvimento dos modelos mais recentes de microcontroladores utilizando a arquitetura Harvard e o


uso de Instruções Reduzidas (RISC – Reduced Instruction Set Computers) levou aos componentes
comercializados pela Microchip (PIC), Motorola (MSP), STMicroelectronics (ST7) e outros.

Este texto foi escrito em JUL/2005. O futuro vai, com certeza, aumentar esta história.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


3/23
3. Microprocessador versus Microcontrolador

Um microcontrolador difere de um microprocessador em vários aspectos e o mais importante, é a sua


funcionalidade.

Para que um microprocessador possa ser usado, outros componentes devem ser adicionados, tais como
memória e componentes para receber e enviar dados (Entradas/Saídas). Em resumo, isso significa que o
microprocessador é o verdadeiro coração do computador.

Fig. 3.1 - Estrutura básica do microprocessador


A fig.3.1 mostra a interconexão entre o microprocessador e a unidade externa de memória. Se houver a
inclusão de unidades de Entrada/Saída (I/O), novos componentes e interconexões deverão ser
acrescentadas.

Por outro lado, o microcontrolador foi projectado para ter tudo num só. Nenhum outro componente
externo é necessário nas aplicações, uma vez que todos os periféricos necessários já estão contidos nele.

Fig.3 2 - Estrutura básica do microcontrolador

A fig.3 2 mostra a estrutura interna de um microcontrolador (não expandido) contendo todas as interfaces
e memórias necessárias dentro de um único encapsulamento, reduzindo drásticamente o número de
componentes externos na aplicação.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


4/23
4. O que é um Microcontrolador

Um microcontrolador é um computador em um único chip otimizado para controlar dispositivos externos


enfatizando a auto-suficiencia e baixo custo.

Inclui um núcleo contendo a Unidade Central de Proceessamento (CPU – Central Processing Unit),
memória de programa normalmente do tipo Flash, memória para dados dos tipos RAM e EEPROM, um
ou mais temporizadores, entrada/saídas para ligação com elementos periféricos externos, tudo isto dentro
de um único circuito integrado.

A fig. 4.1 mostra esquematicamente os dispositivos normais no interior de um microntrolador comercial:

Fig. 4.1 – Microcontrolador – Arquitetura Interna

Na sequencia, vamos descrever os diversos elementos do microcontrolador:

4.1. Memória

Memória é a parte do microcontrolador que tem a função de guardar dados. Pode-se imaginar que uma
memória é como um armário com diversas gavetas onde, em cada gaveta sãoguardadas diversas
informações. Se identificarmos cada gaveta do armário com um nome específico e único para cada uma,
então o conteúdo de cada gaveta será conhecido através do nome daquela gaveta.

As memórias são componentes semelhantes ao armário - para um determinado endereço, é possível obter
o conteúdo deste endereço portanto, uma memória nada mais é do que o conjunto de todos os locais de
memória (gavetas) e endereçamento nada mais é que seleccionar um deles.

Isto significa que precisamos seleccionar o endereço desejado (gaveta) e esperar que o conteúdo desse
endereço seja apresentado (abrir a gaveta). Além de ler um local de memória (ler o conteúdo da gaveta),
também é possível escrever num endereço de memória (introduzir um conteúdo na gaveta). Isto é feito
utilizando uma linha adicional chamada linha de controle.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


5/23
A fig. 4.2 mostra um diagrama simplificado de memória. Para uma entrada específica, obtem-se uma
saída correspondente. A linha R/W (read/write - ler/escrever) é utilizada do seguinte modo:

R/W = 1 - operação de leitura – lê o conteúdo da localização da memória


R/W = 0 - operação de escrita – escreve um conteúdo na localização da memória

Fig. 4.2 – Exemplo de Memória

A memória de um controlador utiliza 3 tipos básicos:

Memória de Programa: armazena o programa que o controlador utiliza quando em operação.


Esta memória é do tipo FLASH, isto é, mesmo quando o dispositivo for desligado da
fonte de alimentação, os dados armazenados nesta memória não são perdidos
(apagados). Permite ser apagada e gravada inúmeras vezes (cerca de 10.000 ciclos de
gravação) o que torna seu uso de extrema importancia em microcontroladores.

RAM (Randomic Access Memory): armazena os registros especiais bem como os resultados
das operações realizadas pelo programa. Uma vez desligada a fonte de alimentação, os
valores contidos nesta memória são perdidos (apagados).

EEPROM (Electrally Erasable Programable Read Only Memory): os registros que não
devem ou não podem ser perdidos quando a fonte é desligada são armazenados neste
tipo de memória, que só pode ser gravada/apagada mediante comandos específicos.

4.2. Unidade Central de Processamento (CPU)

Admitindo que existam 3 localizações de memória em um bloco específico para que se possa ter a
capacidade de realizar operações de somar, multiplicar, dividir, subtrair e mover os seus conteúdos de um
local de memória para outro, este bloco recebe o nome de "Central Processing Unit" (CPU) ou Unidade
Central de Processamento, e os locais de memória nela contidos chamam-se registros, conforme se pode
ver na fig. 4.3.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


6/23
Fig. 4.3 – Exemplo de CPU

Os registros são locais de memória cujo papel é ajudar a executar as várias operações matemáticas ou
quaisquer outras operações com dados, quaisquer que sejam os locais em que estes se encontrem.

4.3. Barramento de Comunicação (Bus)

Com dois blocos independentes (Memória e CPU), existe a necessidade de interligação entre eles para
que, por exemplo, uma operação que some os conteúdos de dois locais da memória e guarde o resultado
em outro local da memória seja realizada, isto é, precisa de um caminho através do qual os dados possam
passar de um bloco para outro.

Esta interligação é designada Barramento (Bus) que corresponde a um grupo de 8, 16 ou mais condutores
que interliga elétricamente um bloco a outro.

Existem dois tipos de barramento:

Barramento de dados: interliga todos os blocos dentro do microcontrolador, o número de


linhas depende do comprimento da palavra de dados (.

Barramento de endereços: interliga a CPU com a Memória, o número de linhas depende da


quantidade de memórias que devem ser endereçadas.

A fig.4.4 mostra a conexão entre a Memória e a CPU utilizando barramentos para ganhar funcionalidade.

Fig.4.4 – Barramento interligando CPU com Memória

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


7/23
4.4. Entrada/Saída (I/O – Input/Output)

A Entrada/Saída (I/O) é a porta de comunicação do microcontrolador com o mundo exterior. São


designadas como PORT e podem reunir, de acordo com o modelo do controlador, diversas funções:

- Entrada Digital
- Saída Digital
- Entrada e Saída Digital
- Entrada Analógica
- Entrada/Saída de Comunicação Serial
- Outras de diversas aplicações e complexidades

Física e elétricamente, o PORT está conectado com os pinos de conexão do circuito integrado logo, os
circuitos externos podem enviar sinais e informações ao microcontrolador bem como receber sinais e
informações do microcontrolador.

Um PORT funciona como uma posição de memória, isto é, é possível realizar uma operação de escrita
bem como realizar uma operação de leitura desta posição de memória. Como está interligado ao exterior
pelos pinos do circuito integrado, o resultado das operações permitem controlar dispositivos externos e ler
o estado dos dispositivos externos.

A fig.4.5 mostra o diagrama simplificado de uma unidade de I/O para comunicação com o mundo externo
ao microcontrolador.

Fig.4.5 – Diagrama Simplificado da Unidade I/O

I/O digitais são comumente agrupadas no comprimento equivalente de um registro de 8 bits, que
corresponde a um PORT, que pode ser configurado tanto como entrada como saída. Existem exceções,
que dependem do tamanho e da capacidade do microcontrolador onde um PORT pode conter apenas 1 bit,
4 bits ou 6 bits, considerando os modelos de média capacidade.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


8/23
A fig.4.6 mostra um diagrama lógico simplificado do circuito de entrada, enquanto a fig.4.7 mostra um
diagrama lógico simplificado do circuito de saída de um microcontrolador típico.

Fig.4.6 – Diagrama Simplificado de Entrada Fig.4.7 – Diagrama Simplificado de Saída

4.5. Comunicação Serial

Os microcontroladores mais modernos costumam incluir dentro do circuito integrado um sistema de


comunicação serial completo. Este sistema permite que haja um caminho simples para que o equipamento
possa conversar tanto com outros controladores quanto com computadores.

Os fabricantes já incluem, dentro do maquinário de comunicação, o protocolo de transmissão e recepção


de tal forma que o usuário não necessita de estudos mais profundos da forma como os dados (ou
registros) são transmitidos/recebidos, apenas entender como colocar/retirar de um local apropriado
(definido pelo fabricante) o dado e colocá-lo na memória para utilização.

Normalmente são previstas duas linhas independentes de comunicação a partir de dois pinos específicos:

Tx – para transmissão de dados


Rx – para recepção de dados

A linha de transmissão é elétrica e físicamente independente da linha de recepção, o que permite


transmitir um dado e receber outro simultaneamente. Este tipo de comunicação chama-se “full-duplex”, e
os dados são transmitidos/recebidos na forma serial (os bits trafegam pela linha um após o outro).

Eventualmente pode existir uma terceira linha para sincronizar a comunicação entre os divesos
dispositivos existentes na rede. Nesta opção, um dispositivo opera como “Master” (Mestre) enquanto os
demais como “Slave” (Escravo).

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


9/23
Fig.4.8 – Diagrama Simplificado do Módulo de Comunicação Serial

4.6. Temporizador ou Contador Livre

Os microcontroladores possuem um registro cujo valor numérico incrementa automáticamente uma


unidade em intervalos de tempo definidos.

Portanto, este registro pode ser utilizado como uma base de tempo precisa e independente de um
programa específico para que seja realizado, podendo ser considerada a mais poderosa ferramenta
existente em um controlador.

O entendimento do correto funcionamento deste temporizador ou contador livre permite controle sobre
variáveis cíclicas tais como sinais de tensão senoidal da rede de energia que devem ser sincronizados com
elementos de controle (Triac) para acionmentos externos.

A fig.4.9 mostra o diagrama simplificado do temporizador onde se pode visualizar um sinal de saída de
controle.

Fig.4.9 – Diagrama Simplificado do Temporizador ou Contador Livre

4.7. Conversor Analógico-Digital (ADC)

Nem sempre os sinais que o microcontrolador deve ler são sinais simples do tipo liga/desliga (um/zero),
que são os únicos sinais que são processados na CPU. Sinais continuamente variáveis (analógicos) devem
ser convertidos em um padrão (digital) que a CPU pode compreender e processar.

Esta conversão é realizada por um ADC (Analogo to Digital Converter – Conversor Analógico – Digital)
e a maioria dos microcontroladores possuem ao menos 4 canais de utilização em um ADC interno.

A fig.4.10 mostra o diagrama simplificado do ADC de um controlador:

Fig.4.10 – Diagrama Simplificado do Conversor Analógico – Digital (ADC)

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


10/23
5. Arquitetura

5.1. Máquina von Neumann

No começo dos anos 1950, John von Neumann propos o conceito de computador com programa
armazenado, que veio a ser o fundamento dos processadores mais modernos atualmente. Na Máquina von
Neumann o programa e os dados ocupam a mesma memória e utilizam o mesmo barramento de
comunicação. O tamanho da palavra utiliada para a instrução é o mesmo tamanho do dado, isto é, 8 bits.

Para a realização de uma operação, o processador lê uma instrução para, na sequencia, movimentar o
dado na memória até a posição solicitada pela instrução. Enquanto o dado não ocupar a posição da
memória, o processador não pode ler a instrução seguinte, uma vez que a atualização dos endereços
ocorre passo a passo.

Consequentemente, a sequencia lógica de processamento consiste em:

- ler instrução
- movimentar dado
- ler instrução
- movimentar dado

e assim sucessivamente. Logo, pelo barramento de comunicação circulam dados e instruções


alternadamente.

5.2. Máquina Harvard

O conceito Harvard é mais recente que o von Neumann e surgiu da necessidade de aumentar a velocidade
dos processadores sem aumentar significativamente seu tamanho ou oscilador. Para tanto, foram alocadas
duas áreas de memória – uma para armazenar o programa e outra para armazenar os dados. Ao mesmo
tempo, dividiu-se os barramento de comunicação de tal forma que em um barramento circula somente
dados enquanto no outro circula somente endereços.

Esta separação permitiu que o tamanho da palavra não ficasse limitado a apenas 8 bits, aumentando para
14 bits dividido em OPCODE (código operacional), que especifica o tipo de instrução e um ou mais
operadores (colocado nos 6 bits mais signficativos), enquanto os demais 8 bits armzenam o dado.

Como o número de bits reservados para a instrução é pequeno, o número de instruções para operar um
microcontrolador também é pequeno.

A fig.5.1 mostra um diagrama comparativo entre as duas máquinas:

Fig.5.1 – Comparação entre Arquiteturas

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


11/23
5.3. RISC/CISC

RISC (Reduced Instruction Set Computer) – Computador com Conjunto Reduzido de Instruções:
este tipo de processador é construído em arquitetura
Harvard onde uma palavra de 14 bits reúne tanto a
instrução quanto o dado a ser operado.
A grande característica desta arquitetura está no reduzido
número de instruções empregado na programação, o que
torna o conjunto extremamente rápido.
Os microcontroladores existentes no mercado atualmente
são construídos dentro desta arquitetura.

CISC (Complex Instruction Set Computer) – Computador com Conjunto Complexo de Instruções:
este tipo de processador é construído em arquitetura von
Neumann onde uma palavra de 8 bits é utilizada para a
instrução e outra palavra de 8 bits é utilizada para conter
dado.
O conjunto de instruções é bastante grande, podendo
atingir 250 tipos diferentes. Se por um lado a
programação fica mais difícil, por outro a capacidade de
resolução gráfica e matemática é mais poderosa.
Os processadores existentes nos modernos computadores
de mercado atualmente são construídos dentro desta
arquitetura.

5.4. Clock - Ciclo de Instrução (Ciclo Q – Q Cycle Activity)

Para que um microcontrolador possa operar, é necessário que haja uma base de tempo constante e
independente de forma que os sinais digitais no interior da memória e da CPU sejam enviados e recebidos
corretamente. Esta base de tempo é fornecida por um oscilador onde, a cada ciclo, um evento é realizado.
A velocidade de realização destes eventos depende da velocidade do oscilador, isto é, da sua frequencia.
Como este oscilador fornece a base de tempo de funcionamento dos dispositivos eletronicos, recebe o
nome técnico de CLOCK (relógio).

Portanto, como em cada ciclo de clock uma instrução é realizada, surge o termo Ciclo de Instrução (Tcy)
ou Ciclo de Máquina (CM).

Nos microcontroladores com arquitetura RISC, cada Ciclo de Instrução (Tcy) compreende 4 ciclos Q (Q1
a Q4) onde cada ciclo Q corresponde ao mesmo tempo de um período do clock (Tosc) que equivale ao
tempo/designação para Decodificação, Leitura, Processamento do Dado, Escrita etc., de acordo com a
fig.5.2:

Fig.5.2 – Ciclo Q

Os quatro ciclos Q que formam um ciclo de instrução (Tcy) podem ser generalizados como segue:

Q1: Decodificação da Instrução


Q2: Ciclo de Leitura de Instrução
Q3: Processamento do Dado
Q4: Ciclo de Escrita da Instrução
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07
12/23
Internamente na CPU existe um registro cuja função é contar as linhas de programa. Este registro é
chamado de PC (Program Counter) e é incrementado de uma unidade sempre em Q1.

Uma instrução é chamada da memória sempre no ciclo Q1 e escrita em um registro no ciclo Q4. A
decodificação (ou interpretação) e execução desta instrução serão feitas entre os próximos ciclos Q1 e Q4.

A fig.5.3 mostra a relação entre o Ciclo de Instrução e o clock (OSC1) bem como os ciclos internos de Q1
a Q4. O Contador de Programa (PC) guarda o endereço da próxima instrução:

Fig.5.3 – Clock – Ciclo de Instrução

5.5. Fluxo de Instruções/Pipelining

Como foi visto anteriormente, um Ciclo de Instrução consiste de 4 ciclos Q (Q1, Q2, Q3 e Q4). A busca
de uma instrução ocupa um ciclo enquanto decodificar e executar a instrução ocupa outro ciclo.
Entretanto, devido ao “pipelining”, cada instrução é efetivamente executada em um ciclo. Se uma
instrução provoca um desvio (por exemplo, GOTO), um ciclo extra é necessário para completar a
instrução (devido a alteração no PC - Program Counter).

A instrução busca (fetch) começa quando o PC é incrementado em Q1. No ciclo de execução (execute), a
instrução buscada é colocada dentro do Registro de Instrução (Instruction Register - IR) no ciclo Q1. Esta
instrução é decodificada e executada durante os ciclos Q2, Q3, e Q4. A memória de dado é lida durante
Q2 (ler operando) e escrito durante Q4 (escreve destino)

A fig.5.4 mostra a operação do pipeline de dois estágios para a sequencia de instruções indicada:

Fig.5.4 – Fluxo de Instrução - Pipelinig

Tcy0: a primeira instrução (MOVLW 55h) é buscada na memória de programa (Fetch 1).
Tcy1: a primeira instrução é executada (Execute 1) enquanto a segunda instrução (MOVWF PORTB) é
buscada (Fetch 2).
Tcy2: a segunda instrução é executada (Execute 2) enquanto a terceira instrução (CALL SUB_1) é
buscada (Fetch 3).
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07
13/23
Tcy3: a terceira instrução (CALL SUB_1) é executada (Execute 3) enquanto a quarta instrução (BSF
PORTA, BIT3) é buscada (Fetch 4). Quando a terceira instrução é completada, a CPU força o
endereço da quarta instrução a ser colocado no Stack (registros que armazenam os endereços de
retorno dos desvios) e modifica o valor do PC para o endereço SUB_1. Isto significa que a
instrução que foi buscada na memória durante o Tcy3 (no caso Fetch 4) teve que ser
“descarregada” do pipeline.
Tcy4: a quarta instrução é “descarregada” (uma NOP – No Operation – é realizada) e a instrução existente
no endereço SUB_1 (Instruction @ address SUB_1) é buscada (Fetch SUB_1).
Tcy5: a quinta instrução é executada (Execute SUB_1) e a instrução do endereço SUB_1 + 1 (Fetch
SUB_1 + 1) é buscada

Um método útil de demonstração é a analogia com uma lavanderia. Vamos considerar que existem quatro
cargas de roupa suja que precisamos lavar, secar, passar e dobrar. Nós podemos colocar a primeira carga
na lavadora por 30 minutos, secar por 40 minutos e levar 20 minutos para passar e dobrar as roupas.
Então colocamos a segunda carga para lavar, secar, passar e dobrar, e assim sucessivamente para a
terceira e quarta carga de roupa. Considerando que iniciamos o trabalho de lavanderia às 18:00 h (na fig.
5.5, equivalente a 6 PM), e procuramos realizar o serviço da maneira mais eficiente possível, só
conseguiremos terminar o serviço à meia-noite.

Fig.5.5 – Fluxo de Serviços no formato Sequencial

Entretanto, uma forma mais eficiente de resolver o problema seria colocando a segunda carga de roupa
suja na lavadora quando a primeira carga estiver limpa e rodando alegremente na secadora. Então, quando
a primeira carga estiver sendo passada e dobrada, a segunda carga estará secando e a terceira poderá ser
incluída no “pipeline” da lavanderia. Usando este método, o nosso serviço termina por volta das 21:30 h.,
como pode ser observado na fig. 5.6.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


14/23
Fig.5.6 – Fluxo de Serviço no formato Pipelinig

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


15/23
6. Estrutura

6.1. Diagrama de Blocos de um Microcontrolador

A fig.6.1 mostra o Diagrama de Blocos de um microcontrolador completo com todas as possibilidades de


acessórios e dispositivos periféricos que podem ser estruturados no interior do dispositivo.

Fig.6.1 – Diagrama de Blocos

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


16/23
6.2. Unidade Central de Processamento (CPU)/Unidade Lógica-Aritmética (ALU)

A Unidade Central de Processamento (CPU – Central Processing Unit) pode ser considerada como o
“cérebro” do controlador e é responsável por buscar a instrução correta para execução, decodificar esta
instrução e executá-la.

A CPU interliga todas as partes do microcontrolador como se fosse uma única peça. A função mais
importante realizada pela CPU é decodificar as instruções do programa.

Quando um programador escreve um programa, as instruções escritas têm o formato semelhante a:

MOVLW 0x20

O formato literal é bastante claro e simples para a compreensão humana, mas é completamente
imcompreensível para o microcontrolador. Para que o microcontrolador entenda a instrução neste
formato, é necessário que um “tradutor” reescreva a instrução no formato literal para o formato de uma
sequencia de “zeros” e “uns” (código binário – único formato que o microcontrolador consegue ler)
chamado de “opcode”.

A tradução do formato literal para o formato binário é feita por um programa residente normalmente
chamado de “compilador”, que contém as correlações de código (ou dicionário) para reescrever no
formato binário todas as instruções, variáveis, constantes etc..

Portanto, a instrução buscada na memória de programa é decodificada pela CPU em um conjunto de


ações que executam a tarefa designada pela instrução.

Como as instruções podem conter outros comandos que podem requerer diferentes transferencias de
dados de uma memória para outra, da memória para os PORTs de I/O ou ainda executar alguns cálculos, é
necessário que a CPU esteja conectada com todas as partes do microcontrolador a partir de barramentos
de dados e de endereços.

Algumas vezes a CPU trabalha em conjunto com a Unidade Lógica e Aritmética (ALU) para completar a
execução de instruções que envolvem operações aritméticas e lógicas.

6.3. Unidade Lógica-Aritmética (ALU)

Muitas das instruções da memória de programa operam na memória de dados. Para operar a memória de
dados existe a Unidade Lógica-Aritmética (ALU – Arithmetic-Logic Unit), que realiza as operações de
lógica e aritmética e controla os bits de status da memória. A execução de algumas instruções força tais
bits a assumir um estado dependendo do valor do resultado (por exemplo, um determinado bit de um
registro de controle assume valor 1 quando a execução de uma instrução apresentar resultado nulo).

Nos microcontroladores, a ALU emprega registros de 8 bits e é capaz de realizar operações de soma,
subtração, deslocamento e operações lógicas (booleanas) utilizando um registro de trabalho (registro W) e
qualquer outro registro (arquivo ou constante numérica).

A fig.6.2 mostra o diagrama simplificado do fluxo de informações da ALU e do registro W:

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


17/23
Fig.6.2 – Fluxo de Informações na ALU

6.4. Memória - Organização

Existem dois blocos de memória nos microcontroladores :

- Memória de programa
- Memória de dados

A estrutura Harvard permite que o acesso à memória de programa seja independente do acesso da
memória de dados logo, cada bloco tem seu próprio barramento e o acesso a cada bloco pode ocorrer
simultaneamente durante o mesmo ciclo do oscilador (clock).

6.4.1. Memória de programa

Nos microcontroladores mais modernos, a memória de programa é construída no formato FLASH, que
permite um número bastante elevado de ciclos de gravação utilizando-se apenas de sinais elétricos.

Este tipo de memória facilita tanto o trabalho de desenvolvimento (onde as diversas versões de um
programa podem ser gravadas até atingir o funcionamento ótimo), quanto à evolução natural da aplicação
em um dispositivo (possibilita a gravação de uma versão mais avançada em um equipamento já em
operação).

Os microcontroladores usualmente possuem um contador de programa PC com capacidade para endereçar


até 8k (8.000) posições de memória. Como todas as instruções utilizam uma única palavra (ou uma única
posição de memória), um dispositivo com esta capacidade pode conter até 8k instruções, o que torna bem
simples determinar qual o modelo mais adequado para a utilização.

A memória de programa é dividida em 4 páginas, cada uma com capacidade de 2k posições de memória.
Dependendo do modelo de microcontrolador utilizado, apenas parte desta memória pode ser
implementada. Logo, o usuário deve ler o manual técnico do modelo pretendido para saber o tamanho e
distribuição da memória de programa.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


18/23
A fig.6.4 mostra o mapa da memória de programa genérica. Observar que os endereços da memória são
mostrados em numeração hexadecimal. Mesmo durante um programa, os endereços que são informados
ao programador serão sempre neste formato, uma vez que ocupam comprimento menor que nos formatos
binário ou decimal.

Fig.6.4 – Mapa Memória de Programa Genérico

Como mostra a fig.6.4, algumas informações e referencias devem ser detalhadas, como segue:

6.4.1.1. Vetor de Reset (Reset Vector)

O Vetor de Reset identifica a primeira posição, ou o endereço inicial, da memória de programa (0h)
portanto, o local onde se inicia o programa inserido pelo usuário.

Quando o microcontrolador é energizado e após a estabilização do seu oscilador (clock), o programa


começa por esta posição de memória.

Se o microcontrolador já estiver operacional e ocorrer um reset (forçado por ação externa ou pelo
programa), o contador de programa PC é forçado a zero, a execução do programa é redirecionada para
este endereço de memória e o microcontrolador reinicia novamente, inclusive com paginação de
memória, dados e constantes iniciais. Todas as informações existentes até o instante do reset são perdidas.

6.4.1.2. Vetor de Interrupção (Interrupt Vector)

Uma das mais poderosas ferramentas existentes dentro de um microcontrolador é a Interrupção, isto é, um
desvio forçado por alteração de estado de algum bit preparado para ocorrer em situações especiais pelo
programador.

Quando uma interrupção ocorre, o contador de programa PC é forçado a assumir o valor 04h. A partir
deste endereço, o programa inicia o Tratamento de Interrupção (ISR – Interrupt Service Routine) de
acordo com as necessidades da aplicação do controlador.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


19/23
6.4.1.3. Contador de Programa (Program Counter – PC)

O Contador de Programa (PC) especifica o endereço de busca na memória da instrução para execução. O
incremento ou modificação dos valores do PC é feito automáticamente pela CPU (hardware) em função
das necessidades impostas pelo programa. Se não houver nenhuma instrução de desvio, o incremento é
automático no ciclo Q1. Se houver uma instrução de desvio (GOTO), então o novo valor será colocado no
PC de acordo com as premissas de endereçamento vindas da CPU.

O comprimento do registrodo PC é normalmente de 13 bits. Os primeiros 8 bits (de 0 a 7) compreendem


o registro PCL (low byte – byte baixo) e são acessíveis diretamente, isto é, podem ser lidos e/ou escritos
pelo programa. Os últimos bits (de 8 a 12) compreendem o registro PCH (high byte – byte alto) e não são
diretamente acessíveis, isto é, sómente podem ser lidos e/ou escritos através de outro registro, o registro
PCLATH (Program Counter Latch High).

6.4.1.4. Stack

O Stack contém os endereços de retorno dos desvios (sub-rotinas) ou interrupções requisitadas. Permite
uma combinação de até 8 desvios, isto é, permite até o máximo de 8 desvios de sub-rotina e interrupção.

O registro de Stack não faz parte da memória de programa ou da memória de dados, e também não é
possível ler ou escrever nestes registros.

O valor do registro PC é colocado no Stack quando uma instrução CALL é executada ou quando uma
interrupção provoca um desvio (sempre que uma interrupção é chamada, a Rotina Principal é
interrompida no ponto em que se encontra e força um desvio para o Vetor de Interrupção). O valor do
registro PC retorna do Stack quando uma das instruções de retorno (RETURN, RETLW ou RETFIE) é
executada.

Observar que os valores do registro PC são colocados seqüencialmente dentro do Stack à medida que os
desvios ocorrem. Após oito valores do registro PC serem colocados dentro do Stack, o nono valor sobre-
escreve o primeiro armazenado, o décimo sobre-escreve o segundo armazenado e assim sucessivamente.
Os demais registros existentes não são modificados.A fig.6.5 mostra o procedimento de escrita dos
endereços dentro do Stack:

Fig.6.5 – Sequencia de Entrada de Registros no Stack

Observações:

1. Não existe bit indicando a situação do Stack (overflow ou underflow).


2. Não existem instruções ou mnemonicos para acionar os valores no Stack – somente a CPU pode
fazer estas ações.
3. A perda de valores do Stack por overflow (excesso) implica em erro durante a execução do
programa, uma vez que foi perdido um endereço de retorno.
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07
20/23
6.4.2. Memória de Dados

A memória de dados é formada por Registros de Função Especial (SFR – Special Function Register) e por
Registros de Uso Geral (GPR – General Purpose Register). A memória de dados é formada por bancos
cujo acesso é feito a partir de bits de controle existentes em um registro especial (SFR) chamado Status.

Como os valores são gravados em memória RAM, ao iniciar a operação do microcontrolador todas as
posições estarão no nível “0” (zero) logo, é necessário que o programa do usuário coloque os valores
adequados em cada registro (na forma de constantes) para o correto funcionamento do dispositivo. Se
ocorrer o desligamento da fonte do controlador, os valores armazenados serão perdidos.

No caso de um comando de Reset (interno ou externo) os valores existentes na memória de dados não
sofrem alteração. No entanto, como esta ação depende do modelo do dispositivo, é necessário que o
usuário leia o manual do modelo específico para a correta programação.

A fig.6.6 mostra o mapa genérico da memória de dados. Observar que este mapa varia conforme o
modelo do microcontrolador (ver Notas).

Fig.6.6 – Mapa da Memória de Dados


Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07
21/23
Notas:
1. Os Registros em negrito estão presentes em todos os modelos de microcontroladores.
2. Nem todas as posições de memória são implementadas portanto, são lidas pelo programa como
“0” (zero).
3. Estas posições podem não ser implementadas. Dependendo do modelo do controlador, o acesso às
posições não implementadas pode operar de forma diferente. Para maiores detalhes, é importante
que o usuário consulte o manual do modelo específico.
4. Alguns modelos não incluem estes registros dentro do Bank0. Os modelos que incluem estes
registros dentro do Bank0, são referidos como memória RAM comum.
5. Alguns modelos não possuem estes bancos implementados portanto, as posições relativas são lidas
como “0” (zero).
6. Registros de Uso Geral (GPR) podem ser alocados na área de Registros de Função Especial
(SFR).

Para movimentar valores de um registro para outro, os valores precisam passar pelo registro W (ver ítem
6.4 e fig.6.3), o que significa que movimentar dados entre registros requer dois ciclos de máquina (2Tcy).

A memória de dados é organizada em duas áreas:

6.4.2.1. Registros de Uso Geral (GPR – General Purpose Register)

Esta área de registros é utilizada pelo usuário para armazenar dados ou como base de cálculos
intermediários não suportados pela CPU. Na fig.6.6 corresponde à área abaixo dos Registros Especiais.

6.4.2.2. Registros de Função Especial (SFR – Special Function Register)

São utilizados pela CPU e Módulos Periféricos para controlar a operação desejada do microcontrolador.
Estes registros são implementados em memórias do tipo RAM estática (static RAM). Estes registros são
implementados pelo fabricante de acordo com o modelo e utilidade. Em todos os casos, é possível ler e/ou
escrever nestes registros tanto na forma direta quanto na forma indireta.

Os Registros Especiais - SFR - podem ser divididos em dois conjuntos distintos:

a) Núcleo (Core): controlam e são controlados por funções específicas do núcleo da CPU. Através
dos bits destes registros é possível controlar funções dentro da CPU e, ao mesmo tempo, receber
informações da CPU dos resultados obtidos.
b) Periféricos: controlam e são controlados por funções externas ao núcleo, normalmente estão
ligados a conexões externas ao microcontrolador. Os bits destes registros permitem receber
informações das ocorrencias externas bem como tomar decisões sobre estas ocorrencias.

Na fig.6.6, os Registros Especiais estão identificados pelo acrônimo que corresponde à descrição da sua
função.

6.6. Conversando com o Mundo Exterior - Entrada/Saída (I/O) Digital

A Entrada/Saída (I/O) de uso geral pode ser considerada como o mais simples periférico de um
microcontrolador, permitindo monitorar e controlar outros dispositivos conectados a ela.

Para aumentar a funcionalidade e flexibilidade do dispositivo, as Entradas/Saídas podem ser


multiplexadas com outras funções alternativas, que dependem do modelo do dispositivo. Geralmente,
estas funções multiplexadas não podem ser utilizadas simultaneamente com Entrada/Saída digital.

Cada grupo de Entrada/Saída é controlado por um PORT que está, por sua vez, relacionado a um byte
(palavra) com no máximo 8 bits. O tamanho do PORT é função do modelo do dispositivo podendo se
apresentar como vários PORTs de 8 bits ou menos em um mesmo dispositivo.
Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07
22/23
Cada bit do PORT está relacionado a uma I/O que, por sua vez, corresponde a um pino externo do
controlador. Logo, a direção de utilização do pino de I/O, isto é, sua utilização como Entrada (Input) ou
Saída (Output) é determinada por um registro especial chamado TRIS.

Consequentemente, cada bit de um PORT está relacionado a um bit de seu TRIS de controle. A seleção da
direção de um pino será feita no registro TRIS da seguinte forma:

- Entrada (Input) – bit igual a `1´ (um) (lembrar que o número 1 é semelhante à letra I de Input)
- Saída (Output) – bit igual a `0´ (zero) (lembrar que o número 0 é semelhante à letra O de Output)

A fig.6.7 mostra um PORT I/O digital típico, não considerando a enventualidade de existir outras funções
multiplexadas no pino.

Fig.6.7 – Diagrama Típico de uma I/O Digital

Ler o registro PORT significa ler o estado do pino de I/O (alto -1 ou baixo -0) – observar na fig. 21 que a
leitura do estado do pino é feita através de um “Schmitt trigger” ligado a um flip-flop tipo D e
diretamente conectado ao barramento de dados (Data Bus). O comando (ou instrução) de leitura é feito
através do RD PORT que habilita o flip-flop e a chave do buffer de conexão com o barramento de dados.

Escrever no registro PORT significa ler o valor do pino, modificar o seu valor e escrever em um flip-flop
do tipo D (caracterizado como Data Latch – trava de dado), o que faz com que todas as operações de
escrita sejam do tipo read-modify-write (ler-modificar-escrever).

Colocando um bit do registro TRIS no nível `1´ significa que a saída correspondente assume o valor de
alta impedancia.

Colocando um bit do registro TRIS no nível `0´ significa que o conteúdo do latch de saída será colocado
no pino correspondente.

O controle da função de cada pino deve estar de acordo com o modelo escolhido para a aplicação – é
importante a leitura completa do manual de cada modelo em uso para a correta especificação dos pinos
multiplexados.

Bento Alves Cerqueira Cesar Filho - R 1.0 - NOV/07


23/23

You might also like