Você está na página 1de 19

MICROPROCESSADORES E

MICROCONTROLADORES
AULA 5

Prof. Sérgio Luiz Veiga

1
CONVERSA INICIAL

Neste tema iremos abordar o microcontrolador PIC, em que a grande


vantagem, do estudo da família destes dispositivos, é que todos os modelos
possuem um set de instrução bem parecido, assim como mantêm semelhanças
entre suas características básicas. (SOUZA, 2002, p. 5)
Então, ao estudarmos um microcontrolador específico da família PIC,
estaremos familiarizados com os demais, o que torna a migração para outros
modelos muito mais simples. Bons estudos!

TEMA 1: FAMÍLIAS MICROCONTROLADORES PIC

Os microcontroladores da família PIC são constituídos por um grande


repertório de dispositivos com as mais diversas funcionalidades e paras as
mais diversas aplicações.

São divididos em famílias. Cada família, ou linha, tem vários


componentes, com tamanhos e recursos diferentes; no entanto o
código desenvolvido para um componente de uma determinada
família é compatível com os demais componentes da mesma
família, exceto por umas poucas alterações, que ser referem
principalmente aos periféricos. Cada família tem seu próprio set
(conjunto) de instruções. Dessa forma, ao se estudar um
componente específico de uma família, está adquirindo
conhecimento para trabalhar com microcontroladores de toda a
família. Para um mesmo fabricante, as famílias guardam uma
semelhança entre si, apesar de não serem exatamente iguais.
As famílias de microcontroladores PIC são:
 PIC10 
 PIC12 
 PIC14 
 PIC16 
 PIC17 
 PIC18 
 PIC24F/PIC24H 
 dsPIC30/dsPIC33 
 PIC32 

2
Dessas, as mais usadas e com maior número de componentes são
as PIC12, PIC16 e PIC18. As famílias PIC14 e PIC17 foram
famílias intermediárias na evolução da linha. A família
PIC24F/PIC24H é composta por componentes de 16 bits e é a mais
recente. Já a família dsPIC30/dsPIC33 traz os controladores
híbridos de 16 bits. No final de 2007, foi lançada também a família
PIC32, composta por componentes de 32 bits. Quanto ao tipo de
memória, os componentes mais antigos (que ainda continuam
sendo fabricados) têm memória do tipo EPROM. Já os mais novos
utilizam somente flash. A tendência do mercado é trabalhar
somente com flash, principalmente nas etapas de ensino e
desenvolvimento. O tipo de memória flash pode ser identificado por
uma letra “F” no nome do componente (por exemplo, PIC12F679,
PIC16F628, PIC18F4550).
Dentro da família PIC18 há várias subfamílias, cada uma composta
de vários componentes. Os componentes diferem entre si em:
 Quantidade de memória RAM;
 Quantidade de memória EEPROM de dados (alguns não têm nada); 
 Quantidade de memória Flash de programa; 
 Número de pinos (18,28,40, ...); 
 Frequência máxima de clock; 
 Periféricos; 
O quesito “periférico” é uma das principais características dos
PIC. Dentre os disponíveis nas várias famílias, podemos citar:
timers, conversores A/D, comparadores analógicos, módulos
USART (comunicação serial RS232), Módulos MSSP (I2C e SPI
master), módulos CCP (Captura, comparação e PWM), etc.
A linha PIC18 é composta por microcontroladores com core de 8
bits de alto desempenho. Buscou-se manter certa compatibilidade
com a linha PIC16, o que pode ser observado no funcionamento
de diversos periféricos e no conjunto de instruções. Contudo
muitas mudanças se fizeram necessárias, principalmente na
arquitetura e no mapeamento de memória, para superar certas
limitações apresentadas pela família PIC16.
(Disponível em:
<http://www.ebah.com.br/content/ABAAAfSy8AG/xm118-documenta-
integrada-rev-b?part=6>. Acesso em: 01 de dezembro de 2016).

TEMA 2: ORGANIZAÇÃO MEMÓRIA PROGRAMA

Segundo Souza (2002, p. 11):

A memória de programa do PIC pode ser de 12,14 ou 16 bits do tipo


FLASH, uma memória regravável eletronicamente com escrita rápida.

3
O tamanho dessa memória também varia muito de modelo para
modelo. Outra característica muito importante da memória de
programa do PIC é que ela pode ser acessada por software,
possibilitando que o programa seja reescrito dinamicamente, ou ainda,
que ela seja usada como uma expansão da memória E2 PROM de
dados.

Tamanho de memória e páginas


Tomando como exemplo o PIC 16F877A, este possui uma memória de
8kwords, isso é, 8.192 endereços diferentes. Quando falamos da memória de
programa sempre nos referimos ao termo “Word” e nunca a “Byte”, isso porque
esta memória é de 14 bits, enquanto um byte possui somente 8 bits. (SOUZA,
2002, p. 11)

Conforme (SOUZA, 2002, p. 11)

No entanto, o tamanho desta memória gera um grande problema de


gerenciamento. Relembramos o funcionamento do processador. Cada
instrução é carregada através do endereço armazenado no PC
(program counter). Assim sendo, para podemos acessar os 8.192
endereços diferentes necessitaremos de um PC com 13 bits. Isto é
resolvido através do desmembramento do PC em dois registradores
(FSRs): PCL e PCLATH. Até ai tudo bem. Mas vamos checar outros
casos que interferem no gerenciamento da memória de programa,
como quando utilizamos as instruções CALL e GOTO. Estas instruções
vinculam ao seu opcode (código de máquina) de 14 bits ao endereço
para onde o programa deve ser desviado. Vejamos estes opcodes mais
detalhadamente na Tabela 1:

Tabela 1: Opcode instruções no gerenciamento memória-programa.

Instrução Opcode Observações

CALL 100 kkkkkkkkkkk Kkkkkkkkkkk equivale ao

GOTO 101kkkkkkkkkkk endereço de destino

Conhecendo os detalhes destes opcodes, percebemos que só existem 11


bits para o endereço de destino da instrução. Ora, mas com 11 bits conseguimos

4
gerenciar somente 2k de memória. Então como é que podemos usar estas
instruções com toda a memória de programa? Segundo Souza (2002, p. 12):

Para resolver este problema, foi criado o conceito de paginação. A


memória total foi então dividida em várias páginas (no nosso caso 4)
de 2K cada uma. Dentro de cada página, as instruções CALL e GOTO
funcionam perfeitamente, pois possuem capacidade de gerenciamento
para este tamanho. O problema então passa a existir somente quando
quisermos utilizar estas instruções com um endereço de destino
localizado em outra página.
A solução para isso é configurarmos manualmente os 2 bits faltantes
localizados nas posições 3 e 4 do PCLATH.
Estes bits passam então a operar como chaves seletoras da página de
programa ativa no momento. Para podermos então utilizar as
instruções CALL e GOTO entre páginas, devemos primeiro selecionar
a página correta do endereço de destino através dos bits
PCLATH<4:3>.

A figura 01 demonstra esta seleção.

Figura 1: Seleção páginas de memória programa

“Uma característica bastante interessante, quanto à utilização dos


compiladores, é que a sua própria diretriz denominada PAGESEL pode ser
utilizada para selecionar facilmente a página correta, para um destino qualquer”.
(SOUZA, 2002, p. 12)
 Pilha (Stack)
Segundo Souza (2002, p. 12 e 13):

5
A pilha é um local fisicamente separado da memória de programa,
onde serão armazenados os endereços de retorno quando utilizamos
instruções de desvio para rotinas de chamada. Quando o programa é
desviado para o começo de uma rotina através da instrução correta
(CALL ou interrupção), o endereço seguinte ao ponto que estava sendo
executado é armazenado na pilha para que, ao fim da rotina, o
programa passa a retornar novamente ao ponto em que estava.
Tomando como exemplo o PIC 16F877A, este possui uma pilha de 8
níveis, com isto é possível o armazenamento de 8 endereços de
retorno, possibilitando 8 desvios consecutivos. Caso se tente chamar
um número de rotinas maiores que o tamanho da pilha, o endereço de
retorno mais antigo será perdido, pois será reescrito com um novo
endereço.
Outra característica que devemos saber sobre a pilha é o seu tamanho
em bits. Este tamanho representa a quantidade de endereços que o
sistema de retorno automático poderá gerenciar. No nosso caso, a
pilha armazena endereços de 13 bits, o que é suficiente para o
gerenciamento de 8k de memória de programa. Para o PIC tomado
como exemplo, possui exatamente 8k, os retornos através da pilha não
apresentam problemas com a paginação da memória de programa. Na
Figura 2, temos apresentação do mapa de memória de programa,
contendo a região específica de endereço.

Figura 2: Mapa da Memória de Programa

6
TEMA 3: ORGANIZAÇÃO MEMÓRIA DE DADOS

A memória de dados também é conhecida como RAM e serve para


guardar as variáveis e registradores utilizados pelo programa. Essa memória
armazena dados de 8 bits e é volátil, ou seja, quando o PIC é desenergizado,
ela é automaticamente perdida. (SOUZA, 2002, p. 13)

Tamanho da memória e bancos


Conforme Souza (2002, p. 14):

A arquitetura do PIC 16F877A, como exemplo, é preparada para operar


com uma RAM de até 512 bytes. Entretanto verificamos que nem toda
a memória está disponível ao usuário. São 368 bytes para uso geral,
77 bytes para registradores especiais (sendo alguns espelhados) e 19
indisponíveis. Os 48 endereços restantes (não fisicamente
implementados) equivalem a posições espelhadas de 16 endereços
válidos (Banco 0). O termo espelhado é considerado como sendo um
registrador único que pode ser acessado por mais de um endereço.
Isso pode ser facilmente visualizado através do mapa da memória de
dados, onde vemos um mesmo SFR (registradores especiais, assunto
do próximo tema) aparecendo em diversos bancos (os bancos serão
explicados em seguida). Este espelhamento também acontece com a
região inferior da memória de uso geral, para facilitar a vida do
programador em relação às variáveis que são constantemente usadas,
sem a necessidade de troca de banco.
Quanto aos endereços indisponíveis, tratam-se de posições não
implementadas pela fabricante Microchip e que no caso de uma leitura,
retornaram somente zeros (0).
Ao detalharmos o tamanho da memória de dados, encontramos o
mesmo tipo de problema de gerenciamento de endereços, que
enfrentamos ao trabalharmos com a memória de programas. Vejamos
o opcodes de algumas instruções que trabalham com a RAM, conforme
apresentado na tabela

Tabela 2: Opcode instruções no gerenciamento de memória de dados


Instrução Opcode Observações

MOVF 00 1000dfffffff d = destino

MOVWF 000000 1fff ffff fffffff = endereço na RAM

7
Fica fácil percebemos que só existe 7 bits para endereçamento de
todos os registradores. Acontece que, com estes números de bits só
podemos gerenciar 128 endereços diferentes. Por isso, a Microchip
dividiu a memória de dados em grupos de 128 bytes, aos quais deu o
nome de Banco, diferenciando assim da nomenclatura utilizada para
memória de programa (Página).
No caso do nosso exemplo, o PIC 16F877A, sua memória de dados é
composta de 4 bancos. De maneira análoga ao sistema utilizado na
memória de programa, aqui também os demais bits (2) necessários
para o complemento do gerenciamento são utilizados como chaves
seletoras para o banco atual, e encontram-se no registrador STATUS
<RP1:RP0>, como pode ser observado na Figura 3.
Devido a esta estruturação, antes de utilizarmos qualquer comando
que trabalhem com os registradores (RAM) devemos comutar para o
banco onde o mesmo se encontra. Os registradores de uso comum
podem ser armazenados nos endereços de 070h a 07Fh, para que
possam ser acessados diretamente em qualquer um dos 4 quatro
bancos disponíveis. (SOUZA, 2002, p.14 e 15)

Figura 3: Seleção banco de memória dados, por dois bits do registrador de Status

Para a seleção do banco de memória de dados, existe também uma


diretriz do compilador chamado: BANKSEL.
Para os bancos de memórias de dados, existe outro caso em que a
seleção do banco é feita de forma diferente. Trata-se do acesso indireto
através dos registradores SFR e INDF. Acontece que quando
acessamos a memória desta forma, o endereço do registrador
desejado será colocado em SFR, que possui 8 bits. Por isso, só falta 1
bit para complementarmos o gerenciamento. Neste caso então, a

8
chave seletora de banco será o bit STATUS<IRP>. (SOUZA, 2002,
p.15)

Na Figura 4 é apresentada a organização da memória de dados,


selecionada por um modo de endereçamento indireto por meio do
registro INDF.

Figura 4: Seleção banco memória de dados indireto por um bit do registrador de Status

TEMA 4: REGISTRADORES

A funcionalidade e operação de um microcontrolador estão vinculadas


diretamente por meio da manipulação dos registradores. Para os
microcontroladores da família PIC, os registradores são constituídos
basicamente por dois grandes grupos de registros.

Registradores especiais
Os registradores especiais, denominados SFRs (Special Functions
Registers) encontram-se na memória RAM e são utilizados pelo
microcontrolador para a execução do programa e processamento da ULA. Estes
registradores podem ser escritos e lidos tanto pelo usuário quanto pelo hardware,
e servem também para a configuração de muitas funções e para a utilização de
todos os periféricos. O mapa da memória apresentada pela Tabela 2 apresenta

9
a posição de todos os registradores especiais e seus devidos nomes e, na
Tabela 3, temos os bits associados a cada SFRs do
Bank 0. Os registradores podem ser classificados em duas classes, periféricos
e núcleo.

Tabela 2: Mapa memória com alocação dos registros

10
Tabela 3: Bits associados aos SFRs do Bank 0

Registrador de Status
Este registrador contém o Status decorrente das operações na ALU, a
posição de RESET e a seleção de BANK para a memória de dados. O registro
de Status é utilizado como condições de saltos condicionais quando os bits dos
flags são afetados: Z, DC, C. Na Figura 5, temos a apresentação de como é
constituído o registrador de status.

11
Figura 5: Bits do registrador de Status

IRP RP1 RP0 TO PD Z DC C


bit 7 bit 0

O significado dos bits que constitui o registrador de status é:


IRP: Seleção Bank (usado em modo de endereçamento indireto)
0 = Bank 0, 1 1 = Bank 2, 3
RP1:RP0: Seleção Bank (usado em modo de endereçamento direto)
00 = Bank 0, 01 = Bank 1, 10 = Bank 2, 11 = Bank 3
TO: Time-out bit
0 = Ocorrência de um Time-out do WDT
PD: Power-down bit
0 = Instrução SLEEP executada
Z: Zero bit
1 = Resultado de uma operação aritmética é zero
DC: Digit cary / borrow bit
1 = Carry out do 4th bit
C: Carry / borrow bit
1 = Carry out do bit MSb

PCL E PCLATH
O contador do programa especifica o endereço da instrução a ser
executada. Para o PIC 16F877A, o tamanho do PC é de 13 bits, sendo o byte
LSB chamado de registro PCL e o byte MSB chamado de registro PCH, conforme
apresentado na Figura 6. O registro PCH contém a denominação para PC<12;8>
bits, sendo que 13 bits do PC podem acessar 213 = 8192 words.

12
Figura 6: Registrador do Contador de Programa

PCH PCL

2 01 00 0 0 0 0 0 0 0 0 0 0 0

OPTION
Esse registrador serve para configurar uma série de opções para
operação do microcontrolador, tais como: habilitação dos resistores de pull-up
referente ao port de saída B (Port B), configurações do prescaler (divisor de
frequência para base de tempo do timer), configurações do TMR0 (timer 0) e
seleção da borda para reconhecimento de uma interrupção.

INTCON, PIR1, PIE1


Esses registradores servem para realizar as configurações
e identificações de todas as interrupções existentes para o respectivo
microcontrolador.
O registrador INTCON opera com as interrupções principais, tais como:
timer0, interrupção externa e interrupção por mudança de estado. Além disso, é
responsável pela habilitação global das interrupções, representado pelo bit GIE
(Interrupt Global Enable).
Os registradores PIR1 e PIE1 são responsáveis pelo gerenciamento dos
periféricos das interrupções, que são; EEPROM, Comparadores, USART,
Módulo CCP, Timers, e outros.

TIRS
É o registrador responsável por configurar os pinos das portas como
entrada ou saída. Quando é colocado “1” em um bit do TRIS do respectivo port,
o pino é configurado como entrada. Para configurar o pino como saída,

13
atribuímos “0” no bit relacionado. Resumidamente, temos: “1” Input (Entrada) e
“0” Output (Saída).

PORTS
O registrador port representa especificamente as entrada e saídas digitais
para respectivo dispositivo. Para o PIC 16F877A, temos os
seguintes ports:
PORTA com 6 bits, PORTB, com 8 bits, PORTC com 8 bits, PORTD com 8 bits,
PORTE com 3 bits.

Registradores de uso geral - GPR


Os registradores de propósito gerais (General Purpose Registers) são
usados para armazenar temporariamente os dados e resultados, criados durante
a execução do programa, pois se trata de uma área destinada ao
armazenamento de variáveis definidas pelo usuário para serem escritas e lidas
pelo programa. Se o programa está a executar uma contagem, por exemplo, é
necessário que haja um registro para esta operação. Como são realizadas
algumas configurações, quanto ao funcionamento dos microcontroladores PIC,
isso causa também a necessidade de especificar o endereço de alguns GPRs e
atribuir suas funcionalidades. O PIC 16F877A possui 368 bytes disponíveis para
uso geral.

TEMA 5: ESTRUTURA INTERNA PIC 16F877A


1 8
Internamente3o PIC é muito semelhante a um microprocessador simples.
Segundo Souza (2002, p. 9 e 10):

No diagrama de blocos da figura 07, pode ser visualizadas as diversas


partes que compõem, por exemplo, o microcontrolador PIC 16F877A.
No centro encontramos a ULA, que é a unidade de processamento e
está diretamente ligada ao registrador WORK (Wreg), uma espécie de

8
14 8
acumulador. No canto superior esquerdo temos a memória de
programa (FLASH), saindo deste bloco temos um barramento de 14
bits (Program Bus). Mais a direita esta a memória de dados (RAM). Ela
já possui um barramento de 8 bits (Data Bus). Totalmente do lado
direito encontram-se os PORTs, de PORTA a PORTE. Na parte inferior
podem ser encontrados os demais periféricos, tais como: EEPROM
(memória de dados não volátil), os Timers (TMR0, TMR1 e TMR2), os
A/Ds de 10 bits, os modos CCP (Compare, Capture e PWM) e as
comunicações seriais (SPI, I2C e USART). Observe que entre todos os
periféricos a comunicação é feita através de um barramento de 8 vias.
Um pouco mais ao centro, podemos encontrar ainda o registrador de
status (STATUS reg), onde algumas informações importantes sobre as
operações aritméticas da ULA ficam armazenadas, e os programas
(Program Couter) e a pilha de 8 níveis (Stack).
Temos ainda os circuitos internos de reset, POR, BOR, osciladores,
Watchdog Timer (WDT) e sistema de programação.

15
Figura 7: Estrutura interna PIC 16F877A

16
Ciclo de máquina
Conforme Souza (2002, p. 10):
O conceito básico que deve ser conhecido é que neste
microcontrolador (assim como na maioria dos modelos da linha PIC), o
clock interno (Ckint) é equivalente ao clock externo (Ckextou Fosc)
dividido por 4. Com isso teremos:
Ck ext
Ckint 
4
Desta forma, quando trabalhamos, por exemplo, com um cristal de 4
MHz, o PIC estará trabalhando internamente com uma frequência de
1MHz. Para nós, mais importante que o clock interno, é o período desta
frequência (o inverso da mesma), que é equivalente ao tempo de
duração de um ciclo de máquina, popularmente chamado de CM ou
Tcy. Assim sendo teremos:
1
Tcy 
Ck int
Continuando com nosso exemplo de 4MHz externo, nosso ciclo de
máquina (CM) será de 1µs. Mas afinal de contas, qual o motivo da
necessidade da divisão do clock externo por 4? Isto pode ser
visualizado e explicado quando entendermos o funcionamento interno
do processador. Para execução de uma única instrução
pelo processador.
Para execução de uma instrução pelo processador, várias operações
necessitam ser realizadas. Como não existe capacidade de
processamento paralelo, estas operações são executadas em
subciclos do ciclo de máquina pela divisão do clock externo. Estes
subciclos são chamadas de Q1, Q2, Q3 e Q4.
O PC (contador de programa) é incrementado automaticamente no
início de Q1. Durante o decorrer dos 4 tempos (Q1 a Q4) a instrução
previamente carregada para dentro da ULA é executada, sendo
trocadas informações com a memória de dados e o registrador Work
sempre que necessário. Por último, ao final do tempo Q4, a próxima
instrução (lembre-se que o PC já foi incrementado) é buscada da
memória de programa e armazenada na ULA.
Esta característica de buscar a informação num ciclo de máquina e
executá-la no próximo é conhecida como Pipeline. Ela permite que
quase todas as instruções sejam executadas em apenas um ciclo,
gastando assim 1µs (para nosso exemplo de 4Mhz) e tornando o
sistema muito mais rápido. A únicas exceções referem-se as instruções
que geram “saltos” no program counter (PC), como chamadas de
rotinas e retornos. Ao executar estas instruções o Pipeline deve ser
primeiramente limpo para depois poder ser carregado novamente com
o endereço correto, consumindo para isso 2 ciclos de máquina.

17
O diagrama da Figura 8 ilustra os 4 subciclos (Q1 a Q4), relativo ao
conceito de Pipeline.

Figura 8: Ciclo de máquina utilizado pelo PIC

SÍNTESE

Neste tema pudemos aprender a respeito do princípio de funcionamento


dos microcontroladores da família PIC, bem como algumas características mais
especificas do modelo 16F877A. Também pudemos presenciar a aplicação de
alguns conceitos já vistos em aulas anteriores, tais como arquitetura interna, em
que o PIC faz uso de memória de programa e dados separados, caracterizado
por Harvard como set de instrução reduzido decorrente da utilização RISC e
tempo de execução das instruções constantes, pois faz utilização de pipeline.

18
REFERÊNCIAS

PEREIRA, Fábio. Microcontroladores PIC; Técnicas Avançadas – São Paulo:


Érica 2002. ISBN 85-7194-727-9

SOUZA, D. J. de. Desbravando o PIC. 6. ed. São Paulo: Érica 2003. ISBN 85-
7194-867-4

______. Conectando o PIC – Explorando Recursos Avançados: Mosaico


Engenharia Eletrônica. Revisão 3. 2002.

EBAH. XM118 — Microcontroladores PIC18. Disponível em:


<http://www.ebah.com.br/content/ABAAAfSy8AG/xm118-documenta-integrada-
rev-b?part=6>. Acesso em: 01 de dezembro de 2016.

Sites consultados

MICROCHIP. Disponível em: <www.microchip.com>.


MICROCHIP. Disponível em: <www.microchip.com/academic>.

19