SlideShare uma empresa Scribd logo
1 de 123
Baixar para ler offline
Exsto
Tecnologia
Kit de Microcontroladores PIC

Apostila de microcontroladores PIC16

Exsto Tecnologia Ltda.
R. Vereador José Eduardo da Costa, 169
Santa Rita do Sapucaí – MG
CEP: 37540-000
+55 35 3471 6898
www.exsto.com.br
Microcontroladores PIC16F877A

Revisão

Principais Autores

Descrição da Versão

1

José Domingos Adriano

Data de Término

Revisão inicial para a nova versão
do kit

© Copyright 2008 por Exsto Tecnologia Ltda.
Todos os direitos reservados

“Desenvolvido e produzido com orgulho no Brasil”

Exsto Tecnologia Ltda
R. Vereador José Eduardo da Costa, 169
Santa Rita do Sapucaí – MG
CEP: 37540-000
+55 35 3471 6898
www.exsto.com.br

Exsto Tecnologia

2
Microcontroladores PIC16F877A

ÍNDICE

PÁGINA

Introdução .............................................................................................................................................. 6
1

CONCEITOS BÁSICOS ................................................................................................................ 7
1.1
Sistema Computacional .......................................................................................................... 7
1.1.1 Memórias........................................................................................................................... 8
1.1.2

Memória de programa ...................................................................................................... 8

1.1.3

Memória de Dados ............................................................................................................ 9

1.1.4

Barramentos ...................................................................................................................... 9

1.1.5

Dispositivos de entrada e saída ....................................................................................... 10

1.1.6

Periféricos ........................................................................................................................ 13

1.1.7

CPU .................................................................................................................................. 14

1.2
Arquitetura Computacional................................................................................................... 17
1.2.1 Arquitetura von-Neumann .............................................................................................. 17
1.2.2
2

Arquitetura Harvard ........................................................................................................ 18

O MICROCONTROLADOR PIC16F877A ................................................................................. 20
2.1

A Microchip .......................................................................................................................... 20

2.2

Microcontroladores PIC ........................................................................................................ 20

2.3

A Arquitetura do PIC16F877A ............................................................................................. 21

2.4
Geração de clock................................................................................................................... 22
2.4.1 Modos LP,XT e HS ............................................................................................................ 23
2.4.2

Modos RC......................................................................................................................... 25

2.4.3

Modo INTOSC .................................................................................................................. 26

2.4.4

Comparação entre os modos de oscilador ...................................................................... 26

2.4.5

Clock e execução das instruções ..................................................................................... 26

2.5
Memórias .............................................................................................................................. 27
2.5.1 Memória de programa .................................................................................................... 27
2.5.2

Memória de dados .......................................................................................................... 28

2.6
RESET .................................................................................................................................. 31
2.6.1 POR – Power-On Reset .................................................................................................... 31
2.6.2

PWRT – Power-up Timer ................................................................................................. 31

2.6.3

OST – Oscillator Start-up Timer ....................................................................................... 31

2.6.4

BOR – Brown-out Reset ................................................................................................... 31

2.6.5

Seqüência de inicialização ............................................................................................... 32

2.6.6

Identificação de Reset pelo Software .............................................................................. 32

2.7

Watch-Dog Timer ................................................................................................................. 33

2.8

Modo de baixo consumo – Modo SLEEP............................................................................. 33
Exsto Tecnologia

3
Microcontroladores PIC16F877A

2.9
Características especiais ....................................................................................................... 34
2.9.1 Proteção de Código (Code Protect) ................................................................................. 34
2.9.2

Locais de Identificação (ID Locations) ............................................................................. 34

2.9.3

Pinagem e Hardware Básico ............................................................................................ 34

2.10

Gravação ............................................................................................................................... 36

2.11
O conjunto de instruções do PIC16F877A ........................................................................... 37
2.11.1
Manipulação de Byte .................................................................................................. 39
2.11.2

Manipulação de bit ..................................................................................................... 40

2.11.3

Matemáticas ............................................................................................................... 41

2.11.4

Lógicas ......................................................................................................................... 44

2.11.5

Testes .......................................................................................................................... 48

2.11.6

Chamadas e desvio...................................................................................................... 49

2.11.7

Controle....................................................................................................................... 51

2.12
2.13

Estrutura do Programa .......................................................................................................... 53

2.14
3

Programando em assembly ................................................................................................... 52
Programação estruturada....................................................................................................... 56

PROGRAMANDO O PIC16F877A ............................................................................................. 58
3.1

Diretivas ................................................................................................................................ 58

3.2

Variáveis ............................................................................................................................... 61

3.3
Sub-rotinas ............................................................................................................................ 62
3.3.1 Passagem de Parâmetros ................................................................................................ 63
3.3.2

Chamada X Desvio (CALL X GOTO) .................................................................................. 64

3.4

Atribuição ............................................................................................................................. 66

3.5

Entrada e Saída ..................................................................................................................... 67

3.6

Estruturas de Decisão............................................................................................................ 68

3.7

Condições ............................................................................................................................. 69

3.8

Se .......................................................................................................................................... 71

3.9

Se senão ................................................................................................................................ 72

3.10

Se senão se ............................................................................................................................ 73

3.11

Caso ...................................................................................................................................... 75

3.12
Estruturas de repetição .......................................................................................................... 77
3.12.1
Faça-Enquanto ............................................................................................................ 78
3.12.2

Enquanto ..................................................................................................................... 78

3.12.3

Para ............................................................................................................................. 79

3.13
4

Temporização por software – Rotinas de atraso ................................................................... 80

RECURSOS AVANÇADOS ......................................................................................................... 84
4.1

Display de cristal Líquido ..................................................................................................... 84

4.2

Teclado ................................................................................................................................. 87
Exsto Tecnologia

4
Microcontroladores PIC16F877A

4.3
Interrupções .......................................................................................................................... 89
4.3.1 Utilização das Interrupções ............................................................................................. 92
4.3.2
4.3.3
5

Interrupção externa em RB0 ........................................................................................... 96
Interrupção por mudança no portal B ............................................................................. 96

PERIFÉRICOS DO PIC16F877A .............................................................................................. 98
5.1
Timers ................................................................................................................................... 98
5.1.1 Timer 1............................................................................................................................. 98
5.1.2

Oscilador do timer 1 ...................................................................................................... 101

5.1.3

Interrupção .................................................................................................................... 101

5.2
Módulo CCP ....................................................................................................................... 101
5.2.1 Modo captura ................................................................................................................ 102
5.2.2

Modo comparação ........................................................................................................ 103

5.2.3

Modo PWM ................................................................................................................... 103

5.2.4

Interrupção .................................................................................................................... 106

5.3
Comunicação Serial ............................................................................................................ 106
5.3.1 Comunicação Paralela ................................................................................................... 106
5.3.2

Comunicação serial........................................................................................................ 107

5.3.3

EIA-232C ........................................................................................................................ 109

5.3.4

A USART do PIC16F877A................................................................................................ 110

5.3.5

Transmissão ................................................................................................................... 112

5.3.6

Recepção ....................................................................................................................... 113

5.4
Conversor Analógico para digital – ADC........................................................................... 114
5.4.1 Configuração e uso ........................................................................................................ 116
5.5
Memórias EEPROM e Flash............................................................................................... 118
5.5.1 Memória EEPROM ......................................................................................................... 118
5.5.2

Rotinas de acesso a EEPROM ........................................................................................ 119

5.5.3

Memória FLASH de programa ....................................................................................... 120

5.5.4

Rotinas de acesso a FLASH. ........................................................................................... 120

Apêndices ............................................................................................................................................ 122
Apêndice A – Conjunto de Instruções do PIC16 ............................................................................. 122
Apêndice B – Mapeamento de memória de dados........................................................................... 123

Exsto Tecnologia

5
Microcontroladores PIC16F877A

Introdução
Está apostila tem o objetivo de servir como livro texto para um curso de microcontroladores PIC16.
Esse conteúdo foi preparado para ser usado em disciplinas de microcontrolador/microprocessadores
em cursos técnicos ou superiores na área de tecnologia.
Os pré-requisitos para o bom aproveitamento do curso são conhecimentos básicos de informática,
eletrônica básica, eletrônica digital básica (principalmente memórias, contadores, portas lógicas e
flip-flops ). Também é recomendável para o bom andamento do curso que os alunos já tenham
freqüentada alguma matéria de programação (seja qual for a linguagem estudada).
O curso é estruturado em 5 capítulos que abordam o funcionamento do PIC16F877A, partindo de
conceitos mais gerais e especializando a cada passo, até tratar vários dos periféricos.
O capítulo inicial com os conceitos básicos sobre microcontroladores e sistemas computacionais, e
tem o objetivo de equalizar os pré-requisitos sobre o assunto. Este capítulo pode ser omitido, sem
qualquer prejuízo no andamento do curso, caso esses conceitos já tenham sido estudados em outras
disciplinas.
O capítulo 2 apresenta os microcontroladores PIC16 , tratando tanto de hardware como de
software, além de trazer os fundamentos de programação em linguagem assembly. São discutidos
organização de memória e funcionamento da CPU, além das principais características destes
microcontroladores.
De posse dos conhecimentos do Capítulo 2 é feito um estudo mais aprofundado de técnicas de
programação segundo os preceitos da programação estruturada e engenharia de software. Vale
ressaltar a importância dessa unidade, visto que ela visa formar as bases da lógica de programação e
que o desenvolvimento com microcontroladores é basicamente um desenvolvimento de software.
O capítulo 4 apresenta algumas aplicações avançadas de programação, com displays LCD, teclados
matriciais e, principalmente, interrupções.
No último capítulo são apresentados alguns dos principais periféricos do PIC16F877A, também
encontrados em outros microcontroladores da família PIC16. Destes, são fundamentais os timers e
comunicação serial. Os demais poderão ser sacrificadas ou resumidas, caso a carga horária não
suporte a totalidade do conteúdo, apesar de ser recomendado dar uma maior atenção ao conversor
analógico para digital.

Exsto Tecnologia

6
Microcontroladores PIC16F877A

1 CONCEITOS BÁSICOS
Inicialmente será apresentado o conceito de microcontroladores de forma genérica, que
posteriormente será estendido ao PIC16F877A e pode ser aplicado a qualquer outro
microcontrolador.
É importante este embasamento teórico não somente para garantir um melhor aproveitamento no
estudo do PIC 16F877A como também para tornar o leitor apto a entender o funcionamento de
outros microcontroladores, tanto da linha PIC como de outros fabricantes. Esses conhecimentos
também são importantes na escolha do microcontrolador a ser utilizado em um projeto, pois permite
estabelecer as bases conceituais para a comparação de suas características.

1.1 Sistema Computacional
Inicialmente devemos conceituar o que vem a ser um sistema computacional. Os sistemas
computacionais são compostos por sistemas combinacionais e seqüenciais. O que caracteriza um
sistema computacional é a possibilidade de ser programado.
Um sistema computacional é composto por hardware (parte física) e software (programa). O
hardware dos sistemas computacionais, ao contrário do que ocorre com sistema combinacionais e
seqüenciais, não possui uma aplicação específica. É necessário que exista um software para ser
executado. Em contrapartida, um mesmo hardware pode executar uma infinidade de funções
diferentes, simplesmente alterando o seu software.
Uma boa analogia é imaginar o hardware como um instrumento musical e o software como uma
partitura. Um piano por si só não faz nada, é necessária uma música que possa ser executada a fim
de se obter algum resultado. Da mesma forma que a música contida na partitura, um programa será
composto por um conjunto limitado de símbolos (no caso da partitura são as notas musicais e no
caso do programa são as instruções) que podem ser organizados de diversas formas diferentes,
obtendo-se diferentes resultados.
Como exemplo de sistema computacional, o primeiro que nos vem em mente é o computador
pessoal (PC), hoje tão difundido. Contudo, existem vários equipamentos, tão ou mais comuns que os
PC´s, que são sistemas computacionais. Por exemplo, os vídeo-games, os mini-games, as
calculadoras, palm-top´s, etc. Além disso, temos os microcontroladores, que são o objetivo desse
nosso estudo, que estão presentes nas mais diversas aplicações.
A estrutura de um sistema computacional é como a apresentada no diagrama em blocos abaixo
(Figura 1.1).
Exsto Tecnologia

7
Microcontroladores PIC16F877A

Memória
Dados
Controle
(CPU)

Programa

Barramento de
Dados

Dispositivos de
Entrada e saída e
periféricos

“Mundo
Externo”

Figura 1.1 – Diagrama em blocos genérico de um sistema computacional

1.1.1 Memórias
Memórias são dispositivos que armazenam informações. No caso de um sistema computacional, essa
informação, assim como a memória, pode ser dividida em dois tipos: de programa e de dados.
Existem também Registros (bytes de memória) com funções especiais que trabalham junto ao
processador (CPU).

1.1.2 Memória de programa
Sua função é armazenar o software (programa) a ser executado no sistema. Também é utilizada para
guardar tabelas de constantes
Existem endereços de memória de programa existem alguns com finalidade específica, chamados
vetores, que são endereços para onde o programa desvia quando ocorrem determinados eventos.
Temos o vetor de reset, que é o endereço pelo qual o programa começa a ser executado e o vetor de
interrupções, que é para onde o programa desvia quando ocorreu um pedido de interrupção
(trataremos desse conceito mais adiante).
De uma forma geral, a memória de programa é uma memória não volátil. O tipo dessa memória pode
ser:
•

•
•

ROM (Read Only Memory): somente de leitura. Geralmente chamada de masked-ROM
(masked = mascarado), é gravada pelo fabricante do componente, o que em quantidades
muito grandes reduz custos.
OTP (Only Time programming): programável somente uma vez, utilizada em produção.
EPROM (Erasable Progrmable Read Only Memory) : apagável através de luz ultravioleta. Utilizada no processo de desenvolvimento e algumas vezes no produto acabado,
quando há a necessidade de se poder alterar o software.

Exsto Tecnologia

8
Microcontroladores PIC16F877A

•

Flash: é uma memória eletricamente apagável (EEPROM – Electricaly Eresable Read Only
Memory) com tempos de acesso para leitura rápido. Oferece uma grande flexibilidade,
pois geralmente é possível reprogramar um equipamento sem troca de componentes.

Praticamente todos os microcontroladores já possuem internamente algum desses tipos de memória
de programa. Atualmente quase todos os microcontroladores possuem versões em memória Flash,
pois a mesma apresenta muitas vantagens a um custo dos mais baixos.

1.1.3 Memória de Dados
É a memória onde são armazenados os dados a serem processados pelo computador (as variáveis
dos programas e outras informações.). Como esses dados são constantemente alterados, a memória
utilizada para armazena-los é do tipo RAM. Como se trata de uma memória volátil, quando a
alimentação é cortada esses dados são perdidos.
Alguns microcontroladores disponibilizam também memórias EEPROM para armazenar dados que
não devem ser perdidos com a falta de energia.

1.1.4 Barramentos
As várias partes de um sistema computacional (CPU, memórias, dispositivos de entrada e saída) são
ligadas entre si através de barramentos, ou vias, que são ligações físicas de comunicação paralela
entre os componentes. São eles:
•
•
•
•

Barramento de dados: pelo qual os dispositivos de I/O e memórias trocam dados com o
processador
Barramento de endereços: permite ao processador “endereçar” qual dispositivo será
acessado
Barramento de controle: indica se o acesso é de leitura ou escrita, se é feito a posição de
memória ou a I/O.
Barramento de programa: por onde o processador recebe as instruções que compõe o
programa.

O tamanho do barramento de dados limita o tamanho de dados que trafegam pelo sistema. Por isso
é comum classificar os sistemas computacionais pelo tamanho de seu barramento; temos então
sistemas de 8 bits, 16 bits, 32bits, etc. Os microcontroladores são em sua maioria de 8 bits, apesar de
existirem alguns modelos de 16 bits.
Já o tamanho do barramento de endereços nos informa qual a quantidade máxima de endereços de
memória ou dispositivos de I/O e periféricos podem ser acessados. Por exemplo, um barramento de
endereços de 10 bits permite acessar 210 = 1024 endereços.
Todos os dispositivos de um sistema computacional fazem uso do barramento de dados para trafegar
informações. Para que o sistema funcione corretamente podemos apresentar o processo de forma
simplificada assim: o processador (que coordena o processo) escreve no barramento de endereços o
endereço do dispositivo a ser acessado. Através do barramento de controle ele informa ao
dispositivo se o acesso é de leitura ou escrita (a definição de leitura ou escrita de dispositivos sempre
é feita pelo ponto de vista do processador). No caso de um aceso de leitura o dispositivo escreve no

Exsto Tecnologia

9
Microcontroladores PIC16F877A

barramento de dados e a informação é lida pelo processador. No caso de um acesso de escrita, o
processador envia dados para o barramento de dados que são lidos pelo dispositivo acessado.
Como dispositivos de um sistema computacional usam o mesmo barramento de dados para trafegar
informações é preciso que, quando um dispositivo estiver escrevendo no barramento (portanto
aplicando níveis de tensão ao barramento) os demais dispositivos não causem conflito de dados. De
fato, todos os dispositivos presentes em um sistema computacional são capazes de ficar em estado
de “alta impedância” enquanto não forem acessados para leitura.

1.1.5 Dispositivos de entrada e saída
São responsáveis por realizar a interface do processador com o “mundo externo”. É através deles
que um sistema computacional adquire dados externos e aciona processos. São comumente
chamados de dispositivos de I/O (Input/Output – Entrada/Saída), portais de I/O (no inglês, ports) ou
simplesmente portais.
A função dos portais de saída é transferir ao “mundo externo” um dado que esteja presente no
barramento de dados. Para isso são utilizados latches, pois permitem o “carregar” dados somente
quando são acionados, retendo esses dados independente de haverem alterações em suas entradas.
Os portais de entrada devem permitir a transferência de dados do “mundo externo” para o
barramento de dados quando acionados e em alta impedância no restante do tempo. Para tanto, são
tradicionalmente utilizados buffers com saída tri-state para essa função.
A seleção dos dispositivos de I/O a partir do barramento de endereços é feita por decodificadores
ligados ao barramento de endereços e seu acionamento é feita através do barramento de controle.
Exemplo 1.1
A figura 1.2, abaixo, mostra um exemplo de utilização de buffers e latches como portais de entrada e
saída, respectivamente.
Ambos os portais estão ligados ao barramento de dados. Cada portal possui um decodificador (DEC),
que apresenta nível alto na saída quando o valor do barramento de endereços é o endereço do portal.
Os sinais RD (read – ler), WR (write – escrever) e IORQ (I/O request – requisição de I/O) constituem o
barramento de controle.
Para a operação de leitura, o endereço do portal é colocado no barramento de dados.O decodificador
decodifica o endereço do portal de leitura e coloca em sua saída nível lógico 0. Em seguida, os sinais
IORQ e RD são acionados. Assim temos ‘1’ no terminal de habilitação de saída do buffer e o valor em
sua entrada é transferido para o barramento de dados, podendo ser armazenado pela CPU.

Exsto Tecnologia

10
Microcontroladores PIC16F877A

Figura 1.2 – Portais de entrada e saída
Para realizar uma operação de escrita do portal , o processador inicialmente coloca os dados a serem
escritos no barramento de dados e o endereço do portal no barramento de endereço.O decodificador
decodifica o endereço do portal de escrita e coloca em sua saída nível lógico 0. Então são acionados
os sinais WR e IORQ. Nesse instante temos ‘1’ nas três entradas da porta AND que aciona o terminal E
do latch, que faz com ele carregue os dados presentes no barramento na saída.

Figura 1.2 – Portais de entrada e saída
A função do microcontrolador, como o próprio nome diz, é controlar processos e circuitos. Para
otimizar essa função, seus portais de entrada e saída são tratados como registros de funções
especiais, ou seja, são lidos e escritos como se fossem simples bytes de memória. Em sistemas como
microprocessadores geralmente o tratamento é diferente, havendo instruções específicas para
acesso aos portais e outras implicações, que diminuem a eficiência do código gerado quando se
trabalha intensamente com entrada e saída.

Exsto Tecnologia

11
Microcontroladores PIC16F877A

Para maior flexibilidade do sistema, geralmente os microcontroladores utilizam um sistema de
portais mais complexo que o apresentado acima, que permite que um mesmo terminal do
microcontrolador seja configurado como entrada ou saída. Para que isso seja possível é utilizado um
registro de portal (PORT) e um registro de direção de dados (DDR – Data Direction Register). Esse
último permite selecionar a direção de cada bit de um portal de saída, individualmente. A figura 1.3a
e 1.3b abaixo mostram o esquema genérico de um bit de portal do PIC16F877A. Outros
microcontroladores utilizam configurações semelhantes.

Figura 1.3a – Esquema típico de um pino de I/O
OPERAÇÃO DE ESCRITA OU SAÍDA DE DADOS: ao acionar o controle WR PORT, o latch de saída (Data
Latch) armazena a informação complementar do barramento de dados em sua saída complementar
Q “barra”. Vamos admitir que o registro de direção de dados (TRIS Latch) foi carregado inicialmente
com o valor ‘0’. O registro de direção de dados é habilitado através do controle WR TRIS e a
informação de direção fica armazenada em sua saída. Para Q=0 e Q ”barra”=1 na saída do registro de
direção, o pino I/O estará configurado como saída e tem-se a transferência da informação Q ”barra”
do latch de saída para o driver do pino I/O conforme o arranjo das portas lógicas. Se este último Q
”barra” =0 o transistor “N” será cortado e “P” será ativado permitindo que a tensão Vdd apareça no
pino I/O como nível lógico 1 que era a informação original do barramento de dados. Se Q “barra” =1
o transistor “P” será cortado e “N” estará ativo. A tensão no pino I/O cai para o nível Vss indicando
nível lógico 0.

Exsto Tecnologia

12
Microcontroladores PIC16F877A

Figura 1.3b – Esquema típico de um pino de I/O
OPERAÇÃO DE LEITURA OU ENTRADA DE DADOS: novamente admitamos que o registro de direção
foi carregado inicialmente com o valor ‘1’ em sua saída. Agora, o arranjo das portas lógicas permite
o corte simultâneo dos dois transistores do driver configurando o pino I/O como entrada de dados.
Assim, o controle RD PORT habilita o latch de entrada e o buffer tri-state, o que possibilita que a
informação do pino de I/O trafegue pelo barramento de dados. No restante do tempo o buffer fica
em alta impedância.
Caso seja feita uma operação de escrita em um terminal configurado como entrada, o dado escrito
será armazenado no latch de dados, mas não será transferido para o terminal, pois o driver está
desativado. Por outro lado, se for realizada uma operação de leitura em um terminal configurado
como saída, o valor lido será o dado presente no terminal, que é o mesmo escrito no latch de dados
anteriormente.

1.1.6 Periféricos
Além dos portais de I/O e as memórias, podemos ter muitos outros tipos de dispositivos ligados ao
barramento de dados. Esses dispositivos nada mais são do que circuitos destinados a realizar funções
especiais. Esses dispositivos periféricos são particularmente importantes nos microcontroladores.
Como periféricos mais comuns podemos citar os temporizadores e contadores (Timers), os módulos
de comunicação serial, conversores AD e DA, módulos de CCP (Captura, comparação e PWM), drivers
de LCD, comparadores analógicos, etc.

Exsto Tecnologia

13
Microcontroladores PIC16F877A

O modo de acesso aos periféricos é semelhante ao de acesso aos portais de I/O. Eles muitas vezes
possuem vários registros de parâmetros que podem ser configurados, e um ou mais registros de
entrada e saída de dados.
Quando estivermos tratando dos periféricos do PIC16F877A mostraremos como trabalhar com eles
e, apesar de cada microcontrolador apresentar um conjunto de periféricos diferentes, seu
funcionamento é muito semelhante.

1.1.7 CPU
A CPU (Central Processing Unit – Unidade Central de Processamento) ou processador é parte
principal de um sistema computacional. É comum se referir à CPU dos microcontroladores como core
(núcleo). Sua função é executar as instruções do programa e processar dados. Para tanto ela controla
todas as demais partes do sistema e envia ou recebe dados dessas partes. Ela também é capaz de
interpretar e colocar em execução as instruções que compõe o programa e realizar operações lógicas
e aritméticas.
Genericamente um processador é organizado conforme o diagrama em blocos da figura 1.4.

Figura 1.4 – Diagrama em blocos de uma CPU
Os nomes de cada bloco estão em inglês no diagrama para facilitar a identificação desses blocos nos
manuais de microcontroladores e microprocessadores, que comumente são escritos nessa língua. Os
blocos pontilhados podem ou não estar presentes. As vias em amarelo representam o barramento de
dados interno do processador, que é ligado ao barramento de dados do sistema. As vias em verde
são outras vias de dados e sinais de controle.
Exsto Tecnologia

14
Microcontroladores PIC16F877A

O principal bloco de um processador é o decodificador de instruções (Instructiuon Decoder).
Voltando a analogia entre um sistema computacional e um instrumento musical, o decodificador de
instruções pode ser comparado ao músico, que age sobre o instrumento (hardware) executando a
música (software).
Esse bloco é composto por um decodificador e um contador. Tal decodificador pode ser visto como
um livro de receitas culinárias. No livro, cada página contém uma receita e dentro de cada receita há
os passos para sua execução. De modo análogo, cada instrução do processador é como o endereço
de uma “página” onde está a seqüências de acionamento dos sinais de controles (internos e externos
ao processador) que permitem a execução da instrução. O contador existente é responsável por
fazer com que os passos para a execução de uma instrução sejam executados em seqüência. Cada
modelo de processador possui um conjunto, ou set, de instruções que pode executar.
O barramento de controle interno (Internal Control) permite ao decodificador de instruções
controlar os blocos internos do processador, enquanto o barramento de controle externo (External
Control) já foi discutido e tem a função de indicar se o acesso é de leitura ou escrita, se é em
memória ou dispositivos de I/O.
O programa armazenado na memória é uma seqüência de instruções. Podemos então supor que
para endereçar corretamente essas instruções deveria haver um contador. Ele existe e é chamado
Contador de Programa ou PC (Program Counter). A cada instrução iniciada o PC é incrementado.
Portanto ele aponta a próxima instrução, isto é, contém o endereço da próxima instrução a ser
executada. A saída desse contador é ligada a um registro (Program Addressing) que é carregado ao
final de cada instrução com o endereço da próxima instrução. A saída do registro Program Addressing
está ligada ao barramento de endereços da memória de programa.
Quando a CPU é resetada, o PC é automaticamente carregado com o valor do vetor de reset. Durante
a execução do programa, um valor pode ser carregado no PC. Isso ocorre para desviar o fluxo do
programa. Existem instruções que realizam essa alteração de fluxo, que pode ser de dois tipos:
desvio ou chamada.
Quando ocorre um desvio o conteúdo do PC é alterado para que ele passe a executar o programa a
partir de outro ponto.
Na execução de uma chamada o fluxo do programa também é desviado para um determinado ponto
para executar um trecho do programa, mas nesse caso ele deve retornar ao ponto do programa onde
ocorreu o desvio (mais precisamente à primeira instrução após a instrução de chamada). Isso
permite executar uma sub-rotina, conceito que será discutido quando tratarmos do software.
Em uma chamada o endereço de retorno deve ser armazenado em algum lugar, caso contrário não
seria possível retornar ao ponto onde a chamada ocorreu. Esse lugar é chamado de pilha (stack). O
nome pilha se deve a seu funcionamento, que é semelhante a uma pilha de pratos: como pode haver
várias chamadas consecutivas sem que haja retorno, os endereços de retorno são armazenados “uns
sobre os outros”. Quando ocorre uma instrução de retorno (que é o que faz o programa retornar da
chamada), o programa volta para o último endereço guardado, e assim sucessivamente até que a
pilha esteja vazia. A pilha é então uma porção de memória onde podem ser armazenados os
endereços de retorno.

Exsto Tecnologia

15
Microcontroladores PIC16F877A

Para indicar a próxima posição livre na pilha existe um registro (na verdade um contador) chamado
ponteiro da pilha (Stack Pointer) que aponta o topo. Esse registro é incrementado cada vez que um
novo endereço de retorno é armazenado na pilha e decrementado quando ocorre um retorno.
Uma vez determinado o endereço, seu conteúdo é lido e armazenado em um registro chamado
registro de instrução (Instruction Register). Desse registro, parte da instrução vai para o
decodificador de instruções e parte pode ir para a ALU e/ou parte para o registro de endereçamento
de dados (Data Addressing). Para entender o porque disso, devemos ter em mente que uma
instrução nada mais é que uma palavra binária. Parte dela, que é efetivamente a instrução, indica ao
decodificador de instruções qual a seqüência de ações deve ser executada (qual a “página” do
decodificador de instruções). O restante constitui os operandos da instrução, ou seja, os dados a
serem processados. Esses dados podem ser constantes ou endereços de dados variáveis na memória
RAM. Conforme sua natureza e a instrução a ser executada eles tem um destino ou outro.
A unidade lógico-aritmética ou ALU (Aritmetic and Lógic Unit) é o circuito responsável pelos cálculos
em um processador. Como próprio nome diz, ela é responsável pela realização de operações lógicas,
(E, OU, OU-exclusivo, deslocamentos, rotações, complemento), e aritméticas (incremento,
decremento, adição, subtração, multiplicação, e divisão). Os processos de divisão e multiplicação são
feitos com a ALU utilizando seqüências somas e subtrações, o que efetivamente o que a ALU é capaz
de fazer.
A ALU trabalha juntamente com dois registros especiais: o Acumulador (Accumulator) e o registro de
estado de operações aritméticas (Status). É comum se referir ao acumulador simplesmente como
Acc ou, no caso dos PICs, como W (Worker – Trabalhador ). O acumulador quase sempre está
envolvido nas operações realizadas pela ALU. Ele pode ser um dos operandos, pode ser onde se
armazena o resultado ou pode ser as duas coisas. Há também microcontroladores onde qualquer
transferência de dados entre dois endereços da RAM passa pelo acumulador.
Quanto ao registro de status, sua função é indicar resultados notáveis das operações matemáticas.
Esses resultados são indicados por flags, que são bits desse registro. Através da análise dos flags é
possível saber, dentre outras coisas, se uma operação resultou em zero; se houve estouro da
capacidade de armazenamento (overflow), que acontece quando um resultado é maior que o
máximo valor possível de ser representado pelo sistema; se o resultado de uma operação aritimética
é negativo ou positivo. Existe uma interação do registro status com o decodificador de instruções,
pois através da análise de seus flags é possível realizar instruções de testes.
Para acessar a memória de dados e os periféricos existe um registro, que em nosso sistema é
chamado de endereçamento de dados (Data Addressing) que pode receber valores de duas formas.
A primeira é diretamente de parte da instrução. Nesse caso se está fazendo referência a endereços
da RAM conhecidos e fixos, pois são carregados valores constantes existentes no programa. Esse
modo é chamado endereçamento direto.
Em muitos casos é necessário fazer referências a endereços variáveis. Isso é feito carregando o
registro de endereçamento com dados provenientes de um outro registro, o registro de
endereçamento indireto (Indirect Addressig). Como qualquer outro registro, ele pode ser carregado
com um valor, constante ou proveniente de uma variável, pode ser incrementado, decrementado ou
participar que qualquer operação lógico-aritmética. Sua função é semelhante a dos ponteiros em
linguagens de alto nível.
Exsto Tecnologia

16
Microcontroladores PIC16F877A

Todo o sistema computacional trabalha sincronizado com um mesmo sinal de clock. Devemos
lembrar que esse clock é o que faz o decodificador de instruções passar de uma instrução para a
outra, e tudo o mais deve estar sincronizado com ele, senão haveria o caos. Para gerar esse sinal de
clock é necessário um oscilador. Nos microcontroladores esse oscilador já faz parte do componente
Independente da forma como o clock é gerado, esse sinal é aplicado a CPU e aos periféricos. É
comum que a freqüência do clock dos periféricos seja menor que a da CPU. Para tanto são utilizados
divisores de freqüência
Outro ponto importante é o reset. Além do reset que ocorre quando o sistema é ligado, chamado de
Power-on reset, os microcontroladores apresentam várias outras fontes de reset. Esses resets são
proteções do sistema.
Síntese genérica de operação de uma CPU:
1) O iniciar um programa, o contador de programa aponta para o primeiro endereço na
memória de programa.
2) Neste endereço começa o programa.
3) O registrador de instrução armazena o dado guardado neste endereço. Este dado é
composto da instrução e do operando. O operando pode ser proveniente da memória de
programa ou da memória RAM ( memória de dados ).
4) O decodificador de instrução recebe a instrução do registrador de instrução.
5) A instrução corresponde a uma seqüência de passos programados em uma ROM, o chamado
microcódigo.
6) Um contador dentro do decodificador de instrução varre essa seqüência de passos.
7) O decodificador de instrução começa então a acionar os dispositivos dentro ou fora da CPU
através dos barramentos de dados, controle e endereço.
8) A partir desse ponto os dispositivos podem ser acionados nas mais diversas seqüências de
operação dependendo da necesidade de processamento imposta pelo código, por exemplo:
• O contador de programa aponta para o próximo endereço de memória de programa
onde pode estar o valor de uma instrução com operando. A memória de programa é
habilitada e esse valor é passado do para a ALU através do registro de instrução.
• O contador de programa aponta para o próximo endereço na memória de dados. A
memória de dados é habilitada e o valor armazenado nesse endereço passa para o
acumulador.
• A ALU opera aritmeticamente esses dois dados, sinaliza para o registrador de estados
qual foi e estado da operação e disponibiza o resultado em sua saída.
• Uma memória ou um dispositivo de saída pode ser habilitado e o resultado será
armazenado em um desses dispositivos.
Em resumo sempre ocorre um processo de BUSCA e EXECUÇÃO da instrução. A busca se
refere a localização das instruções e dos operandos na memória e a execução se refere ao
acionamento de dispositivos em seqüência para conseguir o resultado desejado.

1.2 Arquitetura Computacional
1.2.1 Arquitetura von-Neumann
Na arquitetura von-Neumann, as memórias tanto de dados quanto de programa, são acessadas
usando-se o mesmo barramento de dados; os portais de I/O também fazem uso do barramento de
dados. Ou seja, a memória e os dispositivos de I/O compartilham o mesmo barramento em
momentos distintos.
Exsto Tecnologia

17
Microcontroladores PIC16F877A

Vale lembrar aqui que uma instrução é como uma operação matemática, isto é, composta de
operadores, que indicam o que será feito, e operandos, que são os parâmetros envolvidos na
operação.Desta forma, o processo de execução de cada instrução é dividido em dois momentos: a
leitura da instrução e a leitura dos operandos (fetch) e a execução da instrução propriamente dita.
Nota-se que dessa forma o processador está parte do tempo ocupado com a leitura da memória de
programa e, conseqüentemente não fica executando o firmware o tempo todo. Outra característica
da arquitetura von-Neumann é que, visto que os operandos das instruções são geralmente do
mesmo tamanho do barramento de dados, quanto mais complexa a instrução maior será a
quantidade de endereços ocupados por ela na memória. Isto quer dizer que por exemplo, para um
barramento de 8 vias, uma instrução de 16 bits é buscada e executada em duas partes de 8 bits. Por
outro lado, como a complexidade da instrução não tem limite a não ser o espaço ocupado, podemos
ter um set de instruções tão complexo quanto se queira.
Podemos concluir que arquitetura von-Neumann consome muito tempo de processamento com a
leitura da instrução e dos operandos. Conclui-se também que instruções diferentes ocupam
quantidades diferentes de memória e são executadas em tempos diferentes.
Memória

Dados

Programa
CPU

Barramento de
Dados

I/O

Figura 1.5 – Arquitetura von-Neumann
Os sistemas de arquitetura von-Neumann geralmente têm conjuntos de instruções complexos, o que
equivale a dizer que possuem um grande número de instruções e cada instrução realiza uma grande
seqüência de ações. Processadores desse tipo são chamados CISC (Complex Instruction Set CPU –
CPU com Set de Instruções Complexo).

1.2.2 Arquitetura Harvard
Já a arquitetura chamada de arquitetura Harvard, que é utilizada nos microcontroladores PIC, tem
como principal característica acessar a memória de dados separadamente da memória de programa.
A principal vantagem dessa arquitetura é que a leitura de instruções e de alguns tipos de operandos
pode ser feita ao mesmo tempo em que a execução das instruções (tempo Tcy). Isso significa que o
sistema fica todo o tempo executando instruções, o que acarreta um significativo ganho de
velocidade. Enquanto uma instrução está sendo executada, a seguinte está sendo lida. Esse processo
é conhecido como pipelining (canalização) e é ilustrado pela figura 1.6 abaixo.

Exsto Tecnologia

18
Microcontroladores PIC16F877A

Figura 1.6 – Pipeline
O barramento de programa não necessariamente tem o mesmo tamanho do barramento de dados.
Dessa forma, em uma única palavra da memória de programa pode conter operando e operadores, o
que nos permite carregar toda a instrução em um único ciclo de leitura da memória.

Memória de

CPU

Programa

Barramento de
Programa

Memória de
Dados

I/O

Barramento de
Dados
Figura 1.7 – Arquitetura Harvard

Pode-se notar então que os tempos de execução e de leitura estão atrelados e são os menores
possíveis. Isso acarreta em as instruções não poderem executar uma grande seqüência de ações, ou
seja, não existem instruções complexas. Por isso, os PIC´s são considerados processadores RISC
(Reduced Instruction Set CPU – CPU com Set de Instruções Reduzido). O número de instruções é
reduzido, o que não significa que não se possa executar programas complexos, mas sim que
seqüências complexas de ações devem ser construídas por seqüências de instruções básicas.

Exsto Tecnologia

19
Microcontroladores PIC16F877A

2 O MICROCONTROLADOR PIC16F877A
2.1 A Microchip
O fabricante dos microcontroladores PIC é a empresa americana Microchip. Atualmente ela é um dos
maiores fabricante mundiais de microcontroladores de 8, 16 e 32 bits, além de possuir uma ampla
linha de memórias e componentes analógicos.
A Microchip trabalha com uma política de suporte ao cliente muito eficiente, que provavelmente é
uma das causas de seu sucesso. Em seu site (www.microchip.com) existe uma grande quantidade de
informação disponível. Além dos manuais dos componentes, existem muitas notas de aplicação
(Application Notes) e projetos de referência, que são de grande ajuda para a formação da base de
conhecimentos do estudante de microcontroladores PIC.

2.2 Microcontroladores PIC
Os PICs são divididos em famílias. Cada família, ou plaforma, 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. Essas instruções são comandos em linguagem de programação assembly
que compõe os softwares gravados nos microcontroladores, com as quais o aluno entrará em
contato mais adiante. Dessa forma, ao se estudar um componente específico de uma família, se está
adquirindo conhecimento para trabalhar com microcontroladores de toda a família.
As famílias são se dividem ainda conforme o tamanho do barramento de bits, havendo
microcontroladores de 8, 16 e 32 bits.
As famílias de microcontroladores PIC são:
•

•
•

8 bits
o Família PIC10
o Família PIC12
o Família PIC14 e PIC17
o Família PIC16
o Família PIC18
16 bits:
o Famílias PIC24F e PIC24H
o Familias dsPIC30F e dsPIC33F
32 bits
Exsto Tecnologia

20
Microcontroladores PIC16F877A

o PIC32
o
Os componentes diferem entre si basicamente 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 (8,14,18,28,40, ...)
• Freqüência máxima de clock
• Periféricos
Nesse curso abordaremos o PIC16F877A, que é um dos componentes mais completos da família
PIC16. Conforme foi dito anteriormente, ao se estudar um membro de uma família o estudante
torna-se apto a trabalhar com toda a família.

2.3 A Arquitetura do PIC16F877A
A figura 1.1 apresenta o diagrama em blocos do PIC16F877A.
Trata-se de um microcontrolador de 8 bits de arquitetura Harvard. Seu barramento de programa é de
14 bits. A estrutura do PIC16F877A é semelhante ao sistema genérico estudado na aula 1. Seu
funcionamento e análise também são semelhantes à aquele sistema genérico consistindo nas etapas
de busca de instrução com habilitação e leitura de memória de programa e, execução da instrução
com decodificação da instrução e acionamento de dispositivos em seqüência para o processamento
da atividade programada. Podem ser observados os barramentos de dados e de programa. Além
disso, nota-se como operandos da ALU e de endereçamento da memória de dados vem diretamente
da memória de programa.
Também são dignos de nota os periféricos, localizados na parte inferior do diagrama, que estão
ligados ao barramento de dados.

Exsto Tecnologia

21
Microcontroladores PIC16F877A

Figura 2.1 – Diagrama em blocos do PIC16F877A

2.4 Geração de clock
Os microcontroladores PIC possuem um circuito de oscilação interna, isto é, são capazes de gerar seu
próprio clock (ou sinal de relógio) com acréscimo de poucos (ou nenhum) componentes externos.
Existem sete modos diferentes de clock, e cada componente da família utiliza alguns deles. O modo
de clock para cada aplicação é selecionado no momento da gravação do microcontrolador e não
pode ser alterado pelo programa. São eles:
•
•
•
•

•

LP: Cristal/Ressonador de baixa freqüência e baixo consumo (Low Frequency (Power)
Crystal)
XT: Cristal/Ressonador (Crystal/Resonator);
HS: Cristal/Ressonador de Alta Freqüência (High Speed Crystal/Resonator);
RC: Oscilador RC Externo (External Resistor/Capacitor);
o Com saída de clock
o Sem saída de clock
INTOSC (INTRC): Oscilador RC Interno de 4MHz (Internal Resistor/Capacitor) Esse modo
não está presente no PIC16F877A, mas existe em outros componentes da família PIC16;
Exsto Tecnologia

22
Microcontroladores PIC16F877A

o Com saída de clock
o Sem saída de clock

Obs.: resistores, indutores, capacitores e cristais podem ser combinados formando circuitos
osciladores em freqüências determinadas. Mais detalhes sobre os conceitos, funcionamento e
projeto desse tipo de circuito podem ser encontrados em livros de eletrônica com capítulos sobre
osciladores.

2.4.1 Modos LP,XT e HS
Os modos LP, XT e HS utilizam um cristal ou ressonador cerâmico para estabilizar o clock. A diferença
está na faixa de freqüência de cada modo e no consumo de energia associado a cada freqüência.
O consumo de energia em sistemas computacionais está diretamente relacionado com o a
freqüência de operação do sistema porque a dissipação de potência (transformação de energia
elétrica em energia térmica) nos transistores que compõem os circuitos integrador digitais se dá nos
momentos de transição de baixo para auto e de auto para baixo. Assim, quanto mais transições por
unidade de tempo (ou seja, quanto maior a freqüência) maior a dissipação de energia e, portanto,
maior o consumo.
O modo LP refere-se a cristal/ressonador cerâmico de baixa freqüência. Esse modo trabalha com
freqüências de oscilação de até 200 kHz e nele conseguimos o menor consumo dos três modos em
questão.
O modo XT abrange as freqüências de 200 kHz até 4 MHz e apresenta um consumo médio.
O modo HS é para freqüências de 4 a 20 MHz e tem o mais alto consumo.
Cada faixa de freqüência possui um ganho do circuito oscilador, que é ajustado de forma diferente
para cada modo. É recomendado que se use o modo adequado para cada freqüência, caso contrário
pode ocorrer mau funcionamento do oscilador.
Além do cristal ou do ressonador, nos modos LP, XT e HS, devem existir capacitores ligados dos
terminais do cristal terra, conforme mostra a figura 2.2.
Os valores desses capacitores C1 e C2 são os indicados nas tabelas Capacitor Selection for Crystal
Oscillator que se encontra nos manuais de cada PIC na seção que trata de configurações do oscilador.
Para o PIC16F877A os valores são os apresentados na tabela 2.2. O valor de RF representa o ajuste
interno do oscilador para cada modo (XT, LP e HS). O resistor RS pode ser necessário para alguns
tipos de corte de cristal, mas geralmente não é usado. O Comando SLEEP desativa o oscilador no
modo de baixo consumo, do qual trataremos mais adiante.

Exsto Tecnologia

23
Microcontroladores PIC16F877A

Figura 2.2 – Circuito do Oscilador a Cristal/Ressonador
Modo de Oscilador

Freqüência do Cristal

Capacitores C1 e C2

32 kHz
33 pF
200 kHz
15 pF
100 kHz
47 a 68 pF
XT
1 MHz
15 pF
4 MHz
15 pF
4 MHz
15 pF
HS
8 MHz
15 a 33 pF
20 MHz
15 a 33 pF
Tabela 2.1 – Seleção de capacitores para oscilador a cristal
LP

Capacitores maiores aumentam a estabilidade do oscilador, mas também aumenta o tempo de
partida.O tempo de partida do oscilador é o tempo necessário para que o oscilador se estabilize,
pois a oscilação não ocorre de forma imediata assim que o circuito é alimentado,conforme mostra a
figura2.3. Esse tempo depende de uma série de fatores, além dos capacitores, com temperatura,
tensão de alimentação e até capacitâncias parasitas do lay-out da placa. Esse tempo deve ser
considerado pois o programa só será iniciado (ou reiniciado, no caso do modo de baixo consumo)
quando o oscilador se estabilizar.

Exsto Tecnologia

24
Microcontroladores PIC16F877A

Figura 2.3 – Partida do oscilador
Também é possível aplicar sinais de clock gerados externamente, bastando para isso selecionar o
modo relativo a faixa de sinal utilizado. Nesse caso o sinal deve ser aplicado ao pino OSC1/CLKIN e o
pino OSC2/CLKOUT deve permanecer em aberto.

2.4.2 Modos RC
Também é possível trabalhar com osciladores RC (Resistor/Capacitor). Para isso é utilizada a
montagem da figura 2.4 e selecionado o modo de oscilador como RC.

Figura 2.4 – Circuito do oscilador no modo RC.
O modo RC apresenta algumas limitações: a freqüência de trabalho é dependente de vários fatores
(valores de resistor e de capacitor, tensão de alimentação, temperatura) e apresenta pouca
estabilidade (tolerância dos resistores e capacitores, variação na tensão de alimentação, variações de
temperatura). Por exemplo, em uma produção em quantidade de produtos utilizando PIC´s no modo
RC, a freqüência de cada produto pode variar em função da tolerância dos resistores utilizados. Não
é possível garantir precisão em nada que se baseie em tempo no programa. Assim esse modo só é
recomendado para aplicações nas quais a freqüência não é um fator crítico. Essa situação é que
justifica a utilização do modo, pois um oscilador RC tem custo menor que um a cristal.
O resistor REXT deve estar entre 3kΩ e 100kΩ e o capacitor CEXT deve ser superior a 20pF. O circuito
pode funcionar sem capacitor CEXT, mas nessa situação ele se torna muito suscetível a variações
drásticas de freqüência devido a capacitâncias externas (do próprio lay-out, por exemplo). Além
disso, a variação da freqüência é maior para resistores maiores e capacitores menores.

Exsto Tecnologia

25
Microcontroladores PIC16F877A

No modo RC com saída de clock o terminal OSC2/CLKOUT apresenta a freqüência do oscilador divida
por quatro, que pode ser utilizado como fonte de clock para outros pontos do circuito. Já no modo
sem saída de clock, esse terminal pode ser utilizado como I/O.

2.4.3 Modo INTOSC
Esse modo de oscilador não está disponível no PIC16F877A, mas pode ser encontrado em outros
modelos de microcontroladores. No modo INTOSC (ou INTRC) não se necessita de nenhum outro
componente externo. Portanto, além da redução de custos, ele libera terminais do microcontrolador
para serem utilizados como I/O.
Nesse modo, o sinal de clock é obtido de forma semelhante ao funcionamento do modo RC, porém o
“resistor” e “capacitor” são implementados na própria pastilha do componente. Devido a isso temos
geralmente uma ou duas freqüências de clock fixas.
Tipicamente o oscilador interno é menos preciso que o oscilador a cristal é mais preciso que o
oscilador RC, com tolerâncias entre +/- 1 e 10 %.

2.4.4 Comparação entre os modos de oscilador
Na tabela 2.2 é feita uma comparação entre os diferentes modos de oscilador.
Quesito

Tipo de Oscilador
Cristal (HS, XT e HS) RC Externo
Precisão
Preciso
Impreciso
Estabilidade
Estável
Instável
Variedade de freqüências
Pequena
Grande
Custo
Alto
Baixo
Tabela 2.2 – Seleção de capacitores para oscilador a cristal

RC Interno
Pouco preciso
Pouco Estável
Nenhuma
Nenhum

2.4.5 Clock e execução das instruções
Cada instrução executado pelos microcontroladores PIC16 gasta 4 ciclos de clock, chamados “ciclos
Q”. Esses 4 ciclos compõem um ciclo de instrução (TCY) que dura 4 vezes mais que um ciclo Q ,
portanto um ciclo de instrução tem ¼ da freqüência do oscilador e o sinal desse ciclo maior é
chamado de clock de instrução ou clock de periféricos. Ou seja, o tempo de execução de cada
instrução e de 4 períodos de clock.
Em cada um dos ciclos Q é realizada uma etapa da instrução, conforme mostrado na tabela 2.2.
Graficamente esse processo é apresentado na figura 2.5.
Ciclo
Ação
Q1
Ciclo de decodificação da instrução
Q2
Ciclo de leitura de dados
Q3
Ciclo de processamento
Q4
Ciclo de escrita de dados
Tabela 1.2 – Ciclos de execução das instruções

Exsto Tecnologia

26
Microcontroladores PIC16F877A

Figura 2.5 – Ciclos de instrução
Alguns periféricos e algumas funções do PIC não são sincronizados nem com o clock do oscilador
nem com o clock de periféricos, mas com os ciclos Q.

2.5 Memórias
2.5.1 Memória de programa
O PIC16F877A possui 8K-palavras de memória de programa. Já que se trata de um processador RISC,
o tamanho das palavras da memória de programa é maior que o barramento de dados. Assim, apesar
de ser um microcontrolador de 8 bits, a memória de programa é composta por palavras de 14 bits.
Cada palavra, isto é, cada endereço de memória de programa guarda uma instrução. Dessa forma,
um programa de 500 instruções ocupará 500 bytes.
O vetor de reset é o endereço 0000h. Como vimos, isso significa que o programa deve ser escrito a
partir desse endereço. O vetor de interrupção, para todas as interrupções é o 0004h.
A memória é do tipo FLASH, suportando um grande número de reescritas. É possível, através de
rotinas que trataremos em outro ponto do curso, realizar escrita na memória e programa.
Na estrutura das instruções de chamada e desvio da família 16F o espaço reservado para endereço é
de 11 bits. Portanto é possível endereçar diretamente 2048 endereços de memória. Sendo que o
PIC16F877A tem 8k endereços de memória de programa, essa memória é dividida em unidades que
chamaremos de páginas. Dentro de uma mesma página é possível realizar saltos e desvios para
qualquer ponto. Mas se um salto ou desvio vai de uma página para outra é necessário fazer um
ajuste prévio dos dois bits mais significativos do SFR PCLATH, conforme mostrado na tabela abaixo.
PCLATH
Bit 4
Bit 3
0
0
0
1
0
1
2
1
0
3
1
1
Tabela 2.3 – Páginas de memória de programa
Página

A figura 2.6 apresenta o mapemamento de memória de programa.

Exsto Tecnologia

27
Microcontroladores PIC16F877A

0000h
Vetor de reset
0001h
0002h
Uso geral
0003h
0004h
Vetor de interrupção
0005h
Página 0
.
.
Uso geral
.
07FFh
0800h
.
.
Uso geral
Página 1
.
0FFFh
1000h
.
.
Uso geral
Página 2
.
17FFh
1800h
.
.
Uso geral
Página 3
.
1FFFh
Figura 1.6 – Mapeamento de memória do PIC16F877A
Os demais microcontroladores da família PIC16F seguem esse mesmo mapeamento de memória,
contudo nem todos os modelos têm 8k-words, isto é, alguns não tem todas as páginas
implementadas. Por exemplo, o PIC16F874A tem as páginas 0 e 1 mas não as 2 e 3, portanto tem 4kwords; já o 16F628A tem 2k-words, ou seja, somente a página 0.

2.5.2 Memória de dados
O core (núcleo ou processador do microcontrolador) da família PIC16 existem 9 vias de
endereçamento o que permite um acesso a 512 endereços diferentes (29 = 512). Contudo, nem
sempre temos memória RAM implementada para todos os endereços. A quantidade e a disposição
da RAM de dados varia de microcontrolador para microcontrolador.
No PIC16F877A existem 368 bytes de memória RAM de dados. Ela é composta por registros de
funções especiais (SFR – Special Function Registers) e a RAM de uso geral (GPR – General Purpose
RAM). Os SFR são responsáveis pelo controle da CPU e dos periféricos, além de conterem os registros
dos portais. Na RAM de uso geral é onde o programa armazenará suas variáveis.
A memória RAM pode ser acessada de duas formas: por acesso direto e por acesso indireto. Acesso
direto ocorre quando o endereço acessado faz parte da própria instrução (é um dos operandos). Já o
acesso indireto é feito através de duas variáveis, uma contendo o endereço a ser acessado e a outra

Exsto Tecnologia

28
Microcontroladores PIC16F877A

se comportando como o byte acessado. Este último modo de endereçamento pode ser muito útil em
algumas situações e será estudado mais adiante.

Para acesso direto, a RAM é dividida em 4 bancos. Isso ocorre porque a capacidade de máxima de
acesso de memória dos microcontroladores PIC é de 512 bytes. Portanto, são necessários 9 bits para
compor os endereços. Como cada instrução tem apenas 14 bits, e esses bits devem ser divididos
entre operadores e operandos, não há espaço para um endereço de 9 bits. Na verdade, as instruções
armazenam apenas 7 bits do endereço a ser acessado. Os dois bits restantes fazem parte do registro
de função especial STATUS e são chamados RP1 e RP0. Já que dois bits podem gerar 4 combinações,
existe essa divisão em 4 bancos. Para acessar um registro em um banco diferente do banco atual, é
necessário ajustar previamente RP1 e RP0. Na prática utilizamos o máximo possível endereços do
banco 0, e mudamos para os demais bancos quando necessário, retornando novamente ao banco 0.
A divisão de bancos é feita conforme a tabela 1.3.
Banco
0
1
2

RP1
0
0
1

RP0
0
1
0

Endereços
00h ~ 7Fh
80h ~ FFh
100h ~ 17Fh

3

1

1

180h ~ 1FFh

Tabela 1.4 - Seleção de bancos de RAM
No caso do endereçamento indireto, o endereço é armazenado em um registro de função especial
chamado FSR. Como trata-se de um registro de 8 bits, falta 1 bit, que se chama IRP e faz parte do
STATUS. Quando IRP é ‘0’ são acessados os bancos 0 e 1, quando é ‘1’, são acessados os bancos 2 e 3.
Os registros de funções especiais têm seus nomes e os nomes de seus bits já definidos em um
arquivo. Existe um arquivo desses para cada PIC e a forma de incluí-lo no programa será mostrado
mais adiante. Podemos então tratar os SFR pelo seus nomes, não havendo a preocupação com o
endereço que eles ocupam. Também não é necessário saber qual bit de um registro tem
determinada função, apenas o nome do mesmo. Na apresentação desses registros será seguida a
convenção abaixo, que a mesma utilizada no manual dos componentes.

R/W – 0
IRP
Bit 7

R/W – 0
RP1

R/W – 0
RP0

R–1

R– 1

R/W – x

R/W – x

NOT_TO

NOT_PD

Z

DC

R/W – x
C
Bit 0

STATUS
Os bits são numerados de 0 a 7, da direita para a esquerda. O nome do registro aparece em baixo.
Sobre cada bit temos algumas informações: se ele pode ser lido (R) escrito (W), se não é
implementado. Também contém sua situação após o reset, podendo ser ‘0’, ‘1’ ou desconhecida (x).
Por exemplo, sobre o bit RP0 está escrito R/W-0, que significa que pode ser lido ou escrito e seu valor
no reset é 0.
No anexo B encontra-se o mapa de memória do PIC16F628A. Pode-se observar os nomes dos SFR e
as regiões de uso geral. Note que apesar de ser possível acessar 512 bytes, foram implementados
apenas 224 bytes. As posições não implementadas estão em cinza na figura. Note ainda que os
últimos 16 endereços de todos os bancos acessam os mesmos bytes no banco 0.

Exsto Tecnologia

29
Microcontroladores PIC16F877A

A figura 1.7 trás o mapeamento de memória RAM do PIC16F877A com os nomes dos registros de
função especial e as áreas de uso geral (GPR). As regiões em cinza correspondem a endereços para os
quais não há memória implementada. No manual do PIC16F877A existe um detalhamento maior dos
bits que compõe os SPR´s. A função de vários desses registros será explicada no decorrer do curso.

Tabela 1.7 - Mapeamento de memória RAM de dados

Exsto Tecnologia

30
Microcontroladores PIC16F877A

2.6 RESET
O PIC possui várias fontes de reset (reinicialização), que são:
•
•
•
•
•
•

Reset ao ligar (POR – Power-on Reset);
Reset por MCLR durante operação normal;
Reset por MCLR no modo SLEEP (que será tratado adiante);
Reset por Watch-Dog durante operação normal;
Reset por Watch-Dog no modo SLEEP;
Reset por queda de alimentação (BOR – Brown-Out Reset).

O reset por MCLR é acionado quando ao terminal MCLR (pino 4) é aplicado nível lógico baixo. MCLR é
o terminal de Reset do componente, sendo um terminal baixo ativo, isto é, o reset ocorre em ‘0’.
Além disso, o terminal de MCLR possui internamente um filtro para evitar que ruídos possam causar
reset acidental.
O modo como os registros se comportam em cada reset é variado. Para saber quais são os “valores
iniciais” de cada registro, deve ser consultada a tabela de situações iniciais dos registros, presente no
manual de cada PIC.
A seguir são detalhadas algumas fontes e funcionalidades associadas ao reset.

2.6.1 POR – Power-On Reset
Essa funcionalidade detecta quando o circuito é ligado, percebendo a subida da tensão de
alimentação, e realiza o reset do microcontrolador. Dessa forma podemos dispensar o resistor e
capacitor tradicionalmente ligados ao terminal de reset para gerar um nível lógico baixo quando o
sistema é ligado, garantido assim o reset inicial. O terminal MCLR pode ser ligado diretamente ao
nível lógico alto sendo recomendado utilizar um resistor de 10 kΩ ligando-o à VDD.

2.6.2 PWRT – Power-up Timer
Trata-se de um timer de aproximadamente 72ms que mantém o microcontrolador em condição de
reset durante esse tempo. É útil, pois permite ao sistema ter tempo de se estabilizar (tensão, reset
dos demais componentes, etc.) antes do programa começar a ser executado.

2.6.3 OST – Oscillator Start-up Timer
Este timer “conta” 1024 ciclos válidos de clock antes de sair da condição de reset, permitindo assim
que o oscilador se estabilize, conforme trato no tópico “Modos LP, XT e HS”. Essa funcionalidade é
habilitada somente nos modos LP, XT e HS.

2.6.4 BOR – Brown-out Reset
Essa funcionalidade visa reiniciar o sistema se houver uma queda na tensão de alimentação.
O BOR ocorre quando a alimentação atinge aproximadamente 4V por mais de 100µs (quedas por
tempo intervalos menores que esse são ignorados pois podem se tratar de ruídos na alimentação),
em situações como as mostradas na figura2.8.

Exsto Tecnologia

31
Microcontroladores PIC16F877A

Figura 2.7 – Situações de Brown-out

2.6.5 Seqüência de inicialização
1.
2.
3.
4.
5.

O circuito é ligado: a tensão de alimentação começa a subir;
É detectada a subida da tensão: ocorre POR;
O sistema aguarda o tempo de PWRT (aprox. 72 ms);
O oscilador começa a funcionar: 1024 ciclos são contados (OST);
O programa começa a ser efetivamente executado.

2.6.6 Identificação de Reset pelo Software
Apesar de existirem várias fontes de Reset, é possível determinar qual reset ocorreu. Para isso
existem 4 bits: NOT_TD e NOT_PD do registro STATUS e NOT_BOR e NOT_POR do registro PCON
(Banco 1). As condições desses bits para cada reset podem ser vistas na tabela 2.4.
Condição
NOT_POR
NOT_BOR
Reset por Power-on
0
X
Impossível
0
X
Impossível
0
X
Reset por Brown-out
1
0
Reset pelo Watchdog
1
1
Dispertar pelo Watchdog
1
1
Reset pelo MCLR em operação normal 1
1
Reset pelo MCLR no modo SLEEP
1
1
Tabela 2.4 – Bits de status e seus significados

NOT_TO
1
0
x
1
0
0
U
1

NOT_PD
1
X
0
1
1
0
U
0

Essa informação pode ser útil, permitindo que providências sejam tomadas em situações específicas
de problema.
O esquema da figura 1.8 mostra como é a lógica de reset.

Exsto Tecnologia

32
Microcontroladores PIC16F877A

Figura 2.8 – Lógica de reset

2.7 Watch-Dog Timer
Esse timer de 8 bits, que é baseado em um oscilador RC interno próprio, independente de qualquer
outra coisa, gera um reset quando “estoura”. Ele é importante em situações em que, por qualquer
motivo, o microcontrolador “trava”. Quando habilitado ele deve ser zerado a intervalos regulares
menores que seu tempo máximo pela instrução CLRWDT. Se o programa “para” e o Watch-Dog não é
zerado, tendo sido habilitada essa função na gravação, ocorre o reset. Ao timer de 8 bits pode ser
atribuído um pré-escala, como será visto mais adiante.
Essa funcionalidade é muito útil, pois, na grande maioria das situações práticas, é melhor que o
sistema reinicie do que fique inoperante. Desenvolvendo o código adequadamente é possível fazer
com que o reset sequer tenha efeitos perceptíveis para o sistema.
O período do watchdog é de 18 ms (típico). Com pré-escala máxima pode chegar a 2,3s.

2.8 Modo de baixo consumo – Modo SLEEP
O modo de baixo consumo (Power-dowm Mode), também chamado de modo SLEEP (sono, em
inglês), é a situação de menor consumo do microcontrolador. Ele é ativado pela execução da
instrução SLEEP. Nesse modo o oscilador é desligado, fazendo com que o microcontrolador pare
completamente a execução do programa. Dessa forma conseguimos reduzir drasticamente o
consumo do sistema, o que é importante sobretudo em sistemas alimentados por bateria.
O microcontrolador pode ser “acordado” por qualquer um dos eventos abaixo:
•
•
•

Qualquer reset;
Estouro do Watch-Dog (se este estiver habilitado);
Qualquer periférico que estiver com sua respectiva interrupção habilitada (incluso INT e
interrupção por mudança no Portal B).
Exsto Tecnologia

33
Microcontroladores PIC16F877A

Quando da ocorrência de algum reset, o programa recomeça sua execução no vetor de reset
(0000h). Se, porém, ocorrer um estouro do Watch-Dog ou a chamada de alguma interrupção o
programa continua sua execução a partir do endereço imediatamente posterior a instrução SLEEP
que ativou o modo de baixo consumo. E ainda, se o controle geral de interrupções estiver habilitado,
o programa recomeça pelo vetor de interrupções (0004h) se desperto por interrupção. Assim, se
desejamos que uma interrupção simplesmente “acorde” o microcontrolador, devemos desabilitar
globalmente as interrupções.
Deve-se ter atenção ao fato de que no modo SLEEP o oscilador está desligado. Dessa forma não
podem ser utilizadas interrupções dos timer’s para a saída do modo, se estes timer’s utilizarem como
fonte de clock o oscilador interno, nem demais periféricos cujo funcionamento se baseie no oscilador
principal do sistema.

2.9 Características especiais
2.9.1 Proteção de Código (Code Protect)
O programa gravado em um PIC pode ser protegido, isto é, pode ser impedida a sua leitura. Essa
funcionalidade é muito importante, sobretudo quando se trata de produção industrial, visto que
assim se podem preservar os direitos autorais do autor do firmware e dificultar a cópia de produtos.

2.9.2 Locais de Identificação (ID Locations)
Existem 4 endereços não acessáveis pelo microcontrolador que podem ser utilizados para
identificação do componente (por exemplo, o número de série do produto ou a versão do firmware).

2.9.3 Pinagem e Hardware Básico
Como já foi comentado anteriormente, o PIC16F877A é um componente de 40 pinos, em seu
encapsulamento PDIP (Plastic Dual In-line Package – Encapsulamento plástico em linha dupla). Esses
pinos podem ser divididos em terminais de alimentação, de reset, de conexão com o oscilador e os
terminais de portais e periféricos. Como se trata de um componente com diversas características e
um pequeno número de terminais, muitos terminais possuem mais de uma função. Dessa forma,
temos terminais de entrada e saída dos portais multiplexados com terminais dos periféricos, com
terminais do oscilador e terminais de reset. De uma forma geral, quando usamos um determinado
periférico, o terminal é associado a ele serve ao periférico e sua função de entrada e saída fica
desativada. Quando o periférico não é utilizado, o terminal trabalha como I/O.
A figura abaixo apresenta a pinagem do PIC 16F877A. Para facilitar a escrita, toda documentação da
Microchip quando se refere a um terminal não utiliza a notação bit N do portal X, e sim RX N. Por
exemplo, o bit 2 do portal A é representado por RA2, o bit 7 do portal C por RC7, e assim por diante.

Exsto Tecnologia

34
Microcontroladores PIC16F877A

Figura 2.1 – Pinagem do PIC 16F877A
As principais características do PIC são apresentadas na tabela abaixo.
Característica
Valor
Unidade
Frequência de Operação
0 ~ 20 MHz
MHz
Resets
POR, BOR
Memória de Programa (FLASH)
8k
palavras de 14 bits
Memória de Dados (RAM)
368
bytes
Memória de Dados Não Volátil (EEPROM)
256
bytes
Interrupções
15
Timers
3
Módulo CCP
2
Módulo SSP (SPI e I2C)
1
Comparador analógico
2
Comunicação Paralela
PSP
Módulo ADC de 10-bits
8
canais
Set de Instruções
35
instruções

A tabela seguinte contém as características elétricas do PIC 16F877A.
Característica
Temperatura de Trabalho
Vdd ( em relação à Vss)
Máxima Corrente de saída em Vss
Máxima Corrente de entrada em Vdd
Máxima Corrente drenada por I/O
Máxima Corrente de saída po I/O
Máxima Corrente drenada por PORTA + PORTB + PORTE
Máxima Corrente fornecida por PORTA + PORTB + PORTE
Máxima Corrente drenada por PORTC + PORTD
Máxima Corrente fornecida por PORTC + PORTD

Min
-55
4
-

Max Unidade
125
ºC
5,5
V
300
mA
250
mA
25
mA
25
mA
200
mA
200
mA
200
mA
200
mA

Exsto Tecnologia

35
Microcontroladores PIC16F877A

Os níveis de tensão de entrada e saída para o PIC são apresentados na tabela abaixo. Os valores são
considerndo que a alimentação é de 5,0 V. O buffer de entrada de cada pino pode ser do tipo TTL
simples ou Schmitt Trigger. Para saber qual o tipo de buffer deve-se consultar a parte do manual de
cada componente relativo aos portais de I/O.
Parâmetro
VIH
VIH
VOL
VOH

Tipo de buffer
TTL
Schmitt Trigger
TTL
Schmitt Trigger

Min
Vss
Vss
2,0
4,0
4,3

Max
0,8
1,0
VDD
VDD
0,6
-

Unid
V
V
V
V
V
V

Como já foi discutido, um microcontrolador possui todos os componentes básicos de um sistema
computacional em um único chip. Assim o circuito básico necessário para um PIC funcionar é
bastante reduzido. É necessário somente :
• A alimentação de +5V, bem regulada;
• Como em todo circuito digital, um capacitor de desacoplamento de 100nF bem próximo aos
terminais de Vdd e Vss;
• O terminal /MCLR é o terminal de reset do PIC e é baixo ativo. Por isso ele deve ser mantido em
nível lógico alto. Recomenda-se a liga-lo a Vdd por um resistor (10kΩ). Não é necessário o
circuito RC de reset.
• Definir-se um esquema de clock conforme já tratado.
Um cuidado que deve ser tomado, independente do tipo de oscilador escolhido, é fazer com que os
componentes externos do circuito oscilador fiquem bem próximo uns dos outros e todos bem
próximos ao microcontrolador. Além disso, quando for confeccionada uma placa de circuito impresso
deve-se minimizar as indutâncias e capacitâncias parasitas. Isso é feito aumentando a espessura das
trilhas, diminuindo seu comprimento e posicionando trilhas excessivamente próximas umas das
outras. Esses cuidados são fundamentais quando se trabalha com freqüências altas.

2.10 Gravação
A gravação do microcontrolador PIC pode ser realizada sem que o componente seja retirado da placa
(gravação in-circuit). Essa gravação é feita de forma serial utilizando somente dois pinos: PB7/PGD
para envio de dados e RB6/PGC para clock.
Além dos pinos RB7 e RB6 é necessário que o pino MCLR/VPP receba uma tensão de 13VDC +/- 0,5V
durante o processo de gravação. Também é necessário que o microcontrolador esteja devidamente
alimentado, portanto VDD e VSS devem estar devidamente conectados.

Exsto Tecnologia

36
Microcontroladores PIC16F877A

2.11 O conjunto de instruções do PIC16F877A
O set de instruções de um microcontrolador é o conjunto de todas as instruções que o processador
pode interpretar e executar. Voltando a analogia com um instrumento musical, são como as notas
musicais que o compositor usa para escrever uma partitura. Cada processador (ou core) possui seu
próprio conjunto de instruções (ou set de instruções). Isso significa que todos os microcontroladores
da linha PIC16 são capazes de executar o mesmo código, ou seja, falam a mesma língua. Significa
também que microcontroladores de outras famílias ou fabricantes não são compatíveis com o código
gerado para PIC16 ou para outro conjunto de instruções (não falam a mesma lingua).
Cada instrução na verdade é um código numérico (chamado Opcode) que o decodificador de
instruções é capaz de interpretar e disparar uma seqüência de ações pré-definida. Por exemplo, uma
instrução de soma inicia um processo interno do microcontrolador que realiza movimento de bytes,
ajusta e realiza operações na unidade lógico-aritmética, carrega resultados em endereços de
memória. Fazendo uma analogia com um livro de culinária, o opcode indica a página onde estão os
passos para a realização de uma receita.
Como criar uma lógica complexa de programação usando apenas códigos numéricos seria um
trabalho muito desgastante e o resultado muito confuso foi criada uma linguagem simbólica
que associa nomes, denominados mnemônicos, aos opcodes; por conveniência esses nomes
fazem referência a ação realiza, como poderá ser observado brevemente.
Para assembler é o programa responsável por “traduzir” o código mnemônico (entendido pelo ser
humano) para um código numérico composto de opcodes (entendido pelo core do
microcontrolador).
Antes de estudar as instruções deve-se definir alguns termos que serão utilizados na descrição das
instruções e na apresentação de sua sintaxe:
f
W
b
k
x
d
PC
NOT_TO
NOT_PD

Registro da RAM (0x00~0x7F)
Acumulador (Working register)
Bit em um byte
Constante de 8 bits
Irrelevante
destino: 0 => Acumulador (W)
1=> registro
Program Counter
Bit de time-out
Bit de Power Down

TOS

Topo da pilha (Top Of Stack)

O acumulador, chamado no PIC de Working Register ou simplesmente W, é um registro interno do
microcontrolador, não mapeado em RAM, que está envolvido na maioria das instruções. Como será
visto, ele participa das instruções de movimentação e é um dos operandos ou o destino do resultado
nas operações lógico e matemáticas.

Para maior compreensão do funcionamento das instruções se faz necessário comentar o
funcionamento do registro de STATUS. Os bits desse registro nos apresentam a situação do
Exsto Tecnologia

37
Microcontroladores PIC16F877A

microcontrolador a cada instrução. Esses bits são tipicamente chamados de flags (Bandeiras).
Através deles podemos saber de resultados de operações da ALU (se uma subtração resultou em
zero, se uma soma causou “overflow”, etc), a situação do RESET, além do controle bancos de
memória.
R/W – 0

R/W – 0

IRP

RP1

R/W – 0
RP0

R–1

R/– 1

R/W – x

R/W – x

R/W – x

NOT_TO

NOT_PD

Z

DC

C

Bit 7

Bit 0

STATUS
•
•

•
•
•
•
•

IRP :bit de seleção de banco, usado para endereçamento indireto.
o 1 = Bancos 2 e 3 (100h - 1FFh)
o 0 = Bancos 0 e 1 (00h - FFh)
RP1~RP0 : bit de seleção de banco, usado para endereçamento direto.
o 11 = Banco 3 (180h - 1FFh )
o 10 = Banco 2 (100h - 17Fh )
o 01 = Banco 1 (80h - FFh )
o 00 = Banco 0 (00h - 7Fh )
NOT_TO: Bit indicador de Time-out
o 1 = após todos os Resets, exceto time-out do WDT
o 0 = ocorreu um time-out do WDT
NOT_PD: Bit indicador de Power-down
o 1 = quando é ligado ou após a instrução CLRWDT
o 0 = pela execução de uma instrução SLEEP
Z: Bit indicador de zero
o 1 = se o resultado de uma operação da ALU é zero
o 0 = se o resultado de uma operação da ALU é diferente de zero
DC: Carry/Borrow de dígito. Para borrow o sinal é inverso
o 1 = houve transporte do 4o. para o 5o. bit
o 0 = não houve transporte do 4o. para o 5o. bit
C: Carry/Borrow . Para borrow o sinal é inverso
o 1 = houve transporte do 8o. bit
o 0 = não houve transporte do 8o. bit

O conjunto de instruções do core PIC16 é composto de 35 instruções, apresentadas a seguir. O
campo “Sintaxe” mostra a forma de se escrever a instrução. O campo “Operadores” indica quais os
operadores envolvidos e quais seus domínios. “Operação” apresenta a operação realizada pela
instrução. O campo “Flags Afetados” mostra quais flags de STATUS são afetados pela execução da
operação; essas alterações são comentadas abaixo dos quadros. No campo “Ciclos” está o número
de ciclos de máquina gastos para a execução da instrução. Finalmente, o campo “Exemplo”
apresenta um exemplo simples de utilização da instrução.
As instruções são divididas, conforme sua função, nos seguintes tipos:
•
•
•
•

Manipulação de byte
Manipulação e bit
Matemáticas
Lógicas
Exsto Tecnologia

38
Microcontroladores PIC16F877A

•
•
•

Testes e desvios condicionais
Chamadas e desvio (controle de fluxo)
Controle (da CPU)

No anexo A existe uma tabela resumo de todas as instruções. Recomenda-se tirar uma cópia desta
pagina e tela sempre à mão para consulta rápida.

2.11.1

Manipulação de Byte

As instruções de manipulação de byte permitem atribuir valores a endereços da RAM e ao registro
W. É importante ressaltar que apesar de normalmente o mnemônico dessas instruções trazer a
palavra move (mover) o valor do registro é na verdade copiado, isto é, o registro de destino recebe o
valor do registro de origem, mas o valor da origem não é alterado.
CLRW
"Zera" o registro W. O bit Z do registro STATUS é setado.
Sintaxe
CLRW
Operadores
Nenhum
Operação
(W) 00h
Flags Afetados
Z
Ciclos
1
Exemplo
CLRW
Alterações nas Flags: Como a instrução resultou em um registro se tornar 0, o bit Z é setado
indicando esse evento.
CLRF
"Zera" o registro indicado por f. O bit Z do registro STATUS é setado.
Sintaxe
CLRF
f
Operadores
0 ≤ f ≤ 127
Operação
(f) 00h
Flags Afetados
Z
Ciclos
1
Exemplo
CLRF
TEST
Alterações nas Flags: Como a instrução resultou em um registro se tornar 0, o bit Z é setado
indicando esse evento.
MOVLW
Move a constante k para W.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

MOVLW
k
0 ≤ k ≤ 255
(W) k
Nenhum
1
MOVLW
35h

Exsto Tecnologia

39
Microcontroladores PIC16F877A

MOVF
Move o valor do registro (f) para o destino. Se d é 0 destino é W; se d é 1 o destino é o próprio
registro (f). Mover o valor do registro para ele mesmo é útil para testarmos se o valor é 0, uma vez
que essa instrução afeta o bit Z do registro STATUS.
Sintaxe
Operadores

MOVF
f, d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
(d) (f)
Z
1
MOVF
TEST,0

Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:
Z = 0: o valor movido, é diferente de zero.
Z = 1: o valor movido, é 0.
MOVWF
Move o conteúdo de W para o registro f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

2.11.2

MOVWF
f
0 ≤ f ≤ 127
(f) W
Nenhum
1
MOVWF
TEST

Manipulação de bit

As operações de manipulação de bit são uma particularidade dos microcontroladores e dificilmente
são encontradas em outros sistema computacionais. Sua função é permitir alterar o valor de um
único bit de um determinado registro, sem qualquer influência nos demais bits.
BCF
"Zera" o bit b do registro f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

BCF
f, b
0 ≤ f ≤ 127
0≤b≤7
f[b] 0
Nenhum
1
BCF
CONTROLE,5

Exsto Tecnologia

40
Microcontroladores PIC16F877A

BSF
"Seta" o bit b do registro f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

2.11.3

BSF
f, b
0 ≤ f ≤ 127
0≤b≤7
f[b] 1
Nenhum
1
BSF
CONTROLE,7

Matemáticas

As instruções matemáticas são capazes de realizar operações matemáticas básicas através da
operação da ALU do microcontrolador. Como trata-se de um microcontrolador de 8 bits essas
operações tem operadores e resultados de 8 bits. Para cálculos com valores maiores de 8 bits devese desenvolver rotinas fazendo uso das instruções básicas. Da mesma forma, operações mais
complexas podem ser construídas a partir das rotinas básicas. Essa raciocínio se aplica para
operações de multiplicação e divisão, que não suportadas pela ALU do PIC16.

ADDLW
Realiza a adição do valor contido em W com a constante k. O resultado é armazenado em W.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

ADDLW
k
0 ≤ k ≤ 255
(W) (W) + k
C, DC, Z
1
ADDLW
35h

C = 1: o resultado da adição é maior que 255.
C = 0: o resultado da adição é menor ou igual a que 255.
DC = 1: o resultado da adição causou o transporte de 4o para o 5o bit
DC = 0: o resultado da adição não causou o transporte de 4o para o 5o bit
Z = 0: o resultado da adição é diferente de zero.
Z = 1: o resultado da adição é 0. Pode ocorrer com 128 + 128 = 256: C=1 e o resultado da adição é
igual a 0.

ADDWF
Realiza a adição do valor contido em W com o valor do registro f. O resultado é armazenado no
destino: d=0 para W ou d=1 para o registro f.
Exsto Tecnologia

41
Microcontroladores PIC16F877A

Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

ADDWF
f, d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
(d) (W) + (f)
C, DC,Z
1
ADDWF
TEST,0

C = 1: o resultado da adição é maior que 255.
C = 0: o resultado da adição é menor ou igual a que 255.
DC = 1: o resultado da adição causou o transporte de 4o para o 5o bit
DC = 0: o resultado da adição não causou o transporte de 4o para o 5o bit
Z = 0: o resultado da adição é diferente de 0.
Z = 1: o resultado da adição é 0. Pode ocorre com 128 + 128 = 256: C=1 e o resultado da adição é
igual a 0.
DECF
Decrementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1
para o registro designado por f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

DECF
f,d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
(d) (f) – 1
Z
1
DECF
COUNT,0

Z = 0: o resultado do decremento é diferente de zero.
Z = 1: o resultado do decremento é 0 (quando o valor original for igual a 1).
INCF
Incrementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1
para o registro designado por f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

INCF
f,d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
(d) (f) + 1
Z
1
INCF
COUNT,0

Exsto Tecnologia

42
Microcontroladores PIC16F877A

Alterações nos Flags:
Z = 0: o resultado do incremento é diferente de zero.
Z = 1: o resultado do incremento é igual a 0 (quando o valor original for igual a 255).
SUBLW
O valor contido em W é subtraído, pelo método do complemento 2, da constante de oito bits k. O
Resultado é armazenado em W.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

SUBLW k
0 ≤ k ≤ 255
(W) k - (W)
C, DC, Z
1
SUBLW
23h

ATENÇÃO: nessa operação os bits C e DC tem significado inverso ao que seria esperado, isto é,
quando ocorre um borrow ("estouro para menos"), os bits C e DC ficam em zero, ao contrário que
quando ocorre um Carry ("estouro para mais"), quando C e DC ficam em 1.
C = 1: o resultado da subtração é maior ou igual a 0.
C = 0: o resultado da subtração é menor a 0.
DC = 1: o resultado da subtração não causou o transporte de 5o para o 4o bit
DC = 0: o resultado da subtração causou o transporte de 4o para o 5o bit
Z = 0: o resultado da subtração é diferente de zero.
Z = 1: o resultado da subtração é igual a 0.
SUBWF
O valor contido em W é subtraído, pelo método do complemento 2, do valor contido no registro f. O
resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

SUBWF f,d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
(W) (f) - (W)
C, DC, Z
1
SUBWF
TEST,0

ATENÇÃO: nessa operação os bits C e DC têm significado inverso ao que seria esperado, isto é,
quando ocorre um borrow ("estouro para menos"), os bits C e DC ficam em zero, ao contrário que
quando ocorre um Carry ("estouro para mais"), quando C e DC ficam em 1.
Exsto Tecnologia

43
Microcontroladores PIC16F877A

C = 1: o resultado da subtração é maior ou igual a 0.
C = 0: o resultado da subtração é menor a 0.
DC = 1: o resultado da subtração não causou o transporte de 5o para o 4o bit.
DC = 0: o resultado da subtração causou o transporte de 4o para o 5o bit.
Z = 0: o resultado da subtração é diferente de zero.
Z = 1: o resultado da subtração é igual a 0.

2.11.4

Lógicas

Assim como as instruções matemáticas, as instruções lógicas realizam operações lógicas básicas
fazendo uso da ALU.

ANDLW
Realiza uma operação lógica "E" entre o valor contido em W e a constante k. O resultado é
armazenado em W.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:
Z = 0:
Z = 1:

ANDLW
k
0 ≤ k ≤ 255
(W) (W) E k
Z
1
ANDLW
0Fh

o resultado da operação "E" é diferente de zero.
o resultado da operação "E" é igual a 0.

ANDWF
Realiza a operação "E" entre o valor contido em W o valor contido no registro f. O resultado é
armazenado no destino: 0 para W ou 1 para o registro designado por f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

ANDWF
f, d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
(d) (W) E (f)
Z
1
ANDWF
TEST,1

Z = 0: o resultado da operação "E" é diferente de zero.
Z = 1: o resultado da operação "E" é igual a 0.

Exsto Tecnologia

44
Microcontroladores PIC16F877A

COMF
Complementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou
d=1 para o registro designado por f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

COMF
f,d
0 ≤ f ≤ 127
d=0:W
d = 1 :registro f
(d) complemento de (f)
Z
1
COMF
TESTE,1

Z = 0: o resultado do complemento é diferente de zero.
Z = 1: o resultado do complemento é 0. O complemento de 255 (11111111b) é 0 (00000000b).
IORLW
Realiza uma operação "OU" bit a bit entre o valor contido em W e a constante k. O resultado é
armazenado em W.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

IORLW k
0 ≤ k ≤ 255
(W) (W) OU (f)
Z
1
IORLW
TEST

Z = 0 o resultado da operação "OU" é diferente de zero.
Z = 1 o resultado da operação "OU" é igual a 0 (0 OU 0 é igual a zero)
IORWF
Realiza a operação "OU" bit a bit entre o valor contido em W com o valor do registro indicado por f.
O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

[label] IORWF
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
(d) (W) OU (f)
Z
1
IORWF
TEST,1

f, d

Z = 0 o resultado da operação "OU" é diferente de zero.
Z = 1 o resultado da operação "OU" é igual a 0 (0 OU 0 é igual a zero).
Exsto Tecnologia

45
Microcontroladores PIC16F877A

RLF
O valor contido em f é rotacionado para a esquerda através do bit de Carry (bit C do registro
STATUS). O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. A
operação de rotação a esquerda consiste no deslocamento sucessivo de bits de sua posição inicial
para a posição consecutiva de modo que o último bit do registro f vá para C e o bit que estava em C
vá para o primeiro bit do registro f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

RLF
f,d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
veja a figura abaixo
C
1
RLF
TEST,1

C

Registro f

Alterações nas Flags:
C passa conter o valor (0 ou 1) do 8 bit do registro f.

RRF
O valor contido em f é rotacionado para a direita através do bit de Carry (bit C do registro STATUS). O
resultado é armazenado no destino: 0 para W ou 1 para o registro designado por f. A operação de
rotação a direita consiste no deslocamento sucessivo de bits de sua posição inicial para a posição
consecutiva de modo que o primeiro bit do registro f vá para C e o bit que estava em C vá para o
último bit do registro f.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

RRF
f,d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
veja a figura abaixo
C
1
RRF
TEST,1

C

Registro f

Alterações nas Flags:
C passa a conter o valor (0 ou 1) do registro f.
Exsto Tecnologia

46
Microcontroladores PIC16F877A

SWAPF
O nibble (conjuntos de 4 bits) mais significativo e o menos significativo do registro f são trocados. Ou
seja, os bits de 7 a 4 vão para as posições de 3 a 0 e os bits de 3 a 0 vão para as posições de 7 a 4. A
figura abaixo ilustra esse processo. O resultado é armazenado no destino: d=0 para W ou d=1 para o
registro designado por f.

Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

SWAPF f,d
0 ≤ f ≤ 127
d=0:W
d = 1 : registro f
Destino [7:4] f [3:0]
Destino [3:0] f [7:4]
Nenhum
1
SWAPF TEST,1

XORLW
Realiza uma operação "OU exclusivo" entre o valor contido em W e a constante de oito bits k. O
resultado é armazenado em W.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

XORLW
k
0 ≤ k ≤ 255
(W) (W) XOU (f)
Z
1
XORLW
OFh

Z = 0: o resultado da operação "OU exclusivo" é diferente de zero.
Z = 1: o resultado da operação "OU exclusivo" é 0 (um valor "OU-exclusivo" consigo mesmo é igual a
zero).
XORWF
Realiza a operação "OU exclusivo" entre o valor contido em W com o valor do registro indicado por f.
O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f.
Sintaxe
Operadores

XORWF
0 ≤ f ≤ 127
d= 0 → W

f, d

Exsto Tecnologia

47
Microcontroladores PIC16F877A

Operação
Flags Afetados
Ciclos
Exemplo
Alterações nas Flags:

d=1 → registro f
(d) ← (W) XOU (f)
Z
1
XORWF
TEST,0

Z = 0: o resultado da operação "OU exclusivo" é diferente de zero.
Z = 1: o resultado da operação "OU exclusivo" é 0 (um valor "OU-exclusivo" consigo mesmo é igual a
zero).

2.11.5

Testes

BTFSC
Testa o bit b do registro f : se o bit for '1' a próxima instrução é executada; se o bit for '0' a próxima
instrução não é executada, em seu lugar é executada uma instrução NOP, seguindo o programa na
segunda instrução após a BTFSC.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

BTFSC f, b
0 ≤ f ≤ 127
0≤ b≤7
se f[b]=0 salta a próxima instrução
nenhum
se o bit não estiver em 1;
se o bit estiver em 1.
BTFSC
STATUS,Z
GOTO
ZERO

BTFSS
Testa o bit b do registro f : se o bit for '0' a próxima instrução é executada; se o bit for '1' a próxima
instrução não é executada, em seu lugar é executada uma instrução NOP, seguindo o programa na
segunda instrução após a BTFSS.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

BTFSS f, b
0 ≤ f ≤ 127
0≤ b≤7
se f[b]=1 salta a próxima instrução
Nenhum
se o bit não estiver em 1;
se o bit estiver em 1.
BTFSS
STATUS,Z
GOTO
NO_ZERO

DECFSZ
Decrementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1
para o registro designado por f. Se o resultado for diferente de 0 a próxima instrução é executada; se
o resultado for 0 a próxima instrução não é executada, em seu lugar é executada uma instrução NOP,
seguindo o programa na segunda instrução após a DECFSZ.

Exsto Tecnologia

48
Microcontroladores PIC16F877A

Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

DECFSZ
f,d
0 ≤ f ≤ 127
d=0→W
d = 1 → registro f
(d) (f) - 1
se f[b] = 1 salta a próxima instrução
Nenhum
1
DECFSZ
COUNT,1

INCFSZ
Incrementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1
para o registro designado por f. Se o resultado for diferente de 0 a próxima instrução é executada; se
o resultado for 0 a próxima não é executada, em seu lugar é executada uma instrução NOP e o
seguindo o programa na segunda instrução após a INCFSZ.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

2.11.6

INCFSZ
f,d
0 ≤ f ≤ 127
d= 0 → W
d=1 → registro f
(d) ← (f)+1
se f[b]=1 salta a próxima instrução
Nenhum
1
INCFSZ
COUNT,1

Chamadas e desvio

CALL
Chamada de sub-rotina. O endereço de retorno (próxima instrução) é guardado no topo da pilha
(TOS) e um valor de 11 bits é carregado nos bits menos significativos do PC (PC[10:0]), fazendo a
seqüência do programa ser transferida para o endereço indicado por k. Os bits superiores do PC
(PC[12:11]) são carregados a partir de PCLATH. Ver tópico "Desvio X Chamada" para maiores
informações.
Sintaxe
Operadores
Operação
Flags Afetados
Ciclos
Exemplo

CALL k
0 ≤ k ≤ 2047
TOS PC+1
PC[10:0] k
PC[12:11] (PCLATCH[4:3])
Nenhum
2
CALL
TX_SERIAL

Exsto Tecnologia

49
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877
Apostila pic 16f877

Mais conteúdo relacionado

Mais procurados

Microcontroladores PIC - Introdução
Microcontroladores PIC - IntroduçãoMicrocontroladores PIC - Introdução
Microcontroladores PIC - IntroduçãoFabio Souza
 
9 correcao-do-fator-de-potencia-e-instalacoes-de-capacitores
9 correcao-do-fator-de-potencia-e-instalacoes-de-capacitores9 correcao-do-fator-de-potencia-e-instalacoes-de-capacitores
9 correcao-do-fator-de-potencia-e-instalacoes-de-capacitoresJosé Rodrigues
 
Arquitetura e Montagem de Computadores.pdf
Arquitetura e Montagem de Computadores.pdfArquitetura e Montagem de Computadores.pdf
Arquitetura e Montagem de Computadores.pdfOs Fantasmas !
 
Microcontroladores PIC - Interface com displays de 7 segmentos
Microcontroladores PIC - Interface com displays de 7 segmentosMicrocontroladores PIC - Interface com displays de 7 segmentos
Microcontroladores PIC - Interface com displays de 7 segmentosFabio Souza
 
Comandos do linux
Comandos do linuxComandos do linux
Comandos do linuxPeslPinguim
 
Aula 2 eletrônica industrial
Aula 2 eletrônica industrialAula 2 eletrônica industrial
Aula 2 eletrônica industrialBruno Nora
 
Arquitetura interna do computador
Arquitetura interna do computadorArquitetura interna do computador
Arquitetura interna do computadorAndleloli
 
Serviços de Redes.pdf
Serviços de Redes.pdfServiços de Redes.pdf
Serviços de Redes.pdfOs Fantasmas !
 
Apostila de infraestrutura de redes
Apostila de infraestrutura de redesApostila de infraestrutura de redes
Apostila de infraestrutura de redesJosefran Ranniery
 
Comandos ms-dos - Atualizado 29/10/2014
Comandos ms-dos - Atualizado 29/10/2014Comandos ms-dos - Atualizado 29/10/2014
Comandos ms-dos - Atualizado 29/10/2014Evandro Júnior
 
Cabeamento Estruturado - Rede Lógica x Rede Elétrica
Cabeamento Estruturado - Rede Lógica x Rede ElétricaCabeamento Estruturado - Rede Lógica x Rede Elétrica
Cabeamento Estruturado - Rede Lógica x Rede ElétricaEduardo D'Avila
 
Redes 6 equipamentos ativos da rede
Redes 6 equipamentos ativos da redeRedes 6 equipamentos ativos da rede
Redes 6 equipamentos ativos da redeMauro Pereira
 
Exercicios diodo-e-retificadores-v (1)
Exercicios diodo-e-retificadores-v (1)Exercicios diodo-e-retificadores-v (1)
Exercicios diodo-e-retificadores-v (1)Ivanir Silva
 

Mais procurados (20)

Microcontroladores PIC - Introdução
Microcontroladores PIC - IntroduçãoMicrocontroladores PIC - Introdução
Microcontroladores PIC - Introdução
 
9 correcao-do-fator-de-potencia-e-instalacoes-de-capacitores
9 correcao-do-fator-de-potencia-e-instalacoes-de-capacitores9 correcao-do-fator-de-potencia-e-instalacoes-de-capacitores
9 correcao-do-fator-de-potencia-e-instalacoes-de-capacitores
 
Flip Flops Parte 1
Flip Flops Parte 1Flip Flops Parte 1
Flip Flops Parte 1
 
Amplificadores operacionais
Amplificadores operacionaisAmplificadores operacionais
Amplificadores operacionais
 
Arquitetura e Montagem de Computadores.pdf
Arquitetura e Montagem de Computadores.pdfArquitetura e Montagem de Computadores.pdf
Arquitetura e Montagem de Computadores.pdf
 
Microcontroladores PIC - Interface com displays de 7 segmentos
Microcontroladores PIC - Interface com displays de 7 segmentosMicrocontroladores PIC - Interface com displays de 7 segmentos
Microcontroladores PIC - Interface com displays de 7 segmentos
 
Comandos do linux
Comandos do linuxComandos do linux
Comandos do linux
 
Aula 2 eletrônica industrial
Aula 2 eletrônica industrialAula 2 eletrônica industrial
Aula 2 eletrônica industrial
 
Arquitetura interna do computador
Arquitetura interna do computadorArquitetura interna do computador
Arquitetura interna do computador
 
Sistemas digitais arquitectura computadores
Sistemas digitais arquitectura computadoresSistemas digitais arquitectura computadores
Sistemas digitais arquitectura computadores
 
Serviços de Redes.pdf
Serviços de Redes.pdfServiços de Redes.pdf
Serviços de Redes.pdf
 
Apostila de infraestrutura de redes
Apostila de infraestrutura de redesApostila de infraestrutura de redes
Apostila de infraestrutura de redes
 
Informática aplicada
Informática aplicadaInformática aplicada
Informática aplicada
 
Comandos ms-dos - Atualizado 29/10/2014
Comandos ms-dos - Atualizado 29/10/2014Comandos ms-dos - Atualizado 29/10/2014
Comandos ms-dos - Atualizado 29/10/2014
 
Cabeamento Estruturado - Rede Lógica x Rede Elétrica
Cabeamento Estruturado - Rede Lógica x Rede ElétricaCabeamento Estruturado - Rede Lógica x Rede Elétrica
Cabeamento Estruturado - Rede Lógica x Rede Elétrica
 
Instalação de Servidor de Arquivo
Instalação de Servidor de ArquivoInstalação de Servidor de Arquivo
Instalação de Servidor de Arquivo
 
Redes 6 equipamentos ativos da rede
Redes 6 equipamentos ativos da redeRedes 6 equipamentos ativos da rede
Redes 6 equipamentos ativos da rede
 
Sdac
SdacSdac
Sdac
 
Exercicios diodo-e-retificadores-v (1)
Exercicios diodo-e-retificadores-v (1)Exercicios diodo-e-retificadores-v (1)
Exercicios diodo-e-retificadores-v (1)
 
Manual em português da pc analyzer
Manual em português da pc analyzerManual em português da pc analyzer
Manual em português da pc analyzer
 

Destaque

Microcontroladores PIC - Manipulação de pinos de I/O com a Linguagem C
Microcontroladores PIC - Manipulação de pinos de I/O com a Linguagem CMicrocontroladores PIC - Manipulação de pinos de I/O com a Linguagem C
Microcontroladores PIC - Manipulação de pinos de I/O com a Linguagem CFabio Souza
 
Microcontroladores PIC - Exercícios para estudos de I/O digitais
Microcontroladores PIC - Exercícios para estudos de I/O digitaisMicrocontroladores PIC - Exercícios para estudos de I/O digitais
Microcontroladores PIC - Exercícios para estudos de I/O digitaisFabio Souza
 
Microcontroladores PIC - Entradas e saídas Digitais
Microcontroladores PIC - Entradas e saídas DigitaisMicrocontroladores PIC - Entradas e saídas Digitais
Microcontroladores PIC - Entradas e saídas DigitaisFabio Souza
 
Display de 7 segmentos multiplexados
Display de 7 segmentos multiplexadosDisplay de 7 segmentos multiplexados
Display de 7 segmentos multiplexadosRodrigo Almeida
 
Apresentação curso pic básico fbs eletrônica
Apresentação   curso pic básico fbs eletrônicaApresentação   curso pic básico fbs eletrônica
Apresentação curso pic básico fbs eletrônicaFabio Souza
 
Apostila pic-c
Apostila pic-cApostila pic-c
Apostila pic-cjlconrado
 
Apostila de PIC
Apostila de PICApostila de PIC
Apostila de PICluizgraf
 
Apostila Arduino - FBS Eletrônica
Apostila Arduino - FBS EletrônicaApostila Arduino - FBS Eletrônica
Apostila Arduino - FBS EletrônicaFabio Souza
 
1 história e características dos microcontroladores pic
1 história e características dos microcontroladores pic1 história e características dos microcontroladores pic
1 história e características dos microcontroladores picAnderson Inácio Morais
 
Registradores contadores memórias_r2
Registradores contadores memórias_r2Registradores contadores memórias_r2
Registradores contadores memórias_r2Eduardo_borges
 
Arduino introdução - 10 projectos
Arduino   introdução - 10 projectosArduino   introdução - 10 projectos
Arduino introdução - 10 projectosDaniel Chavier
 
Apostila para Programar Arduino
Apostila para Programar ArduinoApostila para Programar Arduino
Apostila para Programar ArduinoIsvaldo Souza
 
Microcontrolador pic16 f887
Microcontrolador pic16 f887Microcontrolador pic16 f887
Microcontrolador pic16 f887\Renato costa
 
Introdução a Microcontroladores PIC
Introdução a Microcontroladores PICIntrodução a Microcontroladores PIC
Introdução a Microcontroladores PICChellton Almeida
 
Comandos de Controle de Programa em C - Resumo
Comandos de Controle de Programa em C - ResumoComandos de Controle de Programa em C - Resumo
Comandos de Controle de Programa em C - ResumoElaine Cecília Gatto
 
Linguagem C - Resumo dos comandos de controle de programa
Linguagem C - Resumo dos comandos de controle de programaLinguagem C - Resumo dos comandos de controle de programa
Linguagem C - Resumo dos comandos de controle de programaElaine Cecília Gatto
 
Barramento
BarramentoBarramento
Barramentowendhel
 
Barramentos clock interno
Barramentos clock internoBarramentos clock interno
Barramentos clock internocabaldreams
 

Destaque (20)

Microcontroladores PIC - Manipulação de pinos de I/O com a Linguagem C
Microcontroladores PIC - Manipulação de pinos de I/O com a Linguagem CMicrocontroladores PIC - Manipulação de pinos de I/O com a Linguagem C
Microcontroladores PIC - Manipulação de pinos de I/O com a Linguagem C
 
Microcontroladores PIC - Exercícios para estudos de I/O digitais
Microcontroladores PIC - Exercícios para estudos de I/O digitaisMicrocontroladores PIC - Exercícios para estudos de I/O digitais
Microcontroladores PIC - Exercícios para estudos de I/O digitais
 
Microcontroladores PIC - Entradas e saídas Digitais
Microcontroladores PIC - Entradas e saídas DigitaisMicrocontroladores PIC - Entradas e saídas Digitais
Microcontroladores PIC - Entradas e saídas Digitais
 
Display de 7 segmentos multiplexados
Display de 7 segmentos multiplexadosDisplay de 7 segmentos multiplexados
Display de 7 segmentos multiplexados
 
Apresentação curso pic básico fbs eletrônica
Apresentação   curso pic básico fbs eletrônicaApresentação   curso pic básico fbs eletrônica
Apresentação curso pic básico fbs eletrônica
 
Apostila pic-c
Apostila pic-cApostila pic-c
Apostila pic-c
 
Apostila de PIC
Apostila de PICApostila de PIC
Apostila de PIC
 
Contadores
ContadoresContadores
Contadores
 
Apostila Arduino - FBS Eletrônica
Apostila Arduino - FBS EletrônicaApostila Arduino - FBS Eletrônica
Apostila Arduino - FBS Eletrônica
 
1 história e características dos microcontroladores pic
1 história e características dos microcontroladores pic1 história e características dos microcontroladores pic
1 história e características dos microcontroladores pic
 
Registradores contadores memórias_r2
Registradores contadores memórias_r2Registradores contadores memórias_r2
Registradores contadores memórias_r2
 
Arduino introdução - 10 projectos
Arduino   introdução - 10 projectosArduino   introdução - 10 projectos
Arduino introdução - 10 projectos
 
Apostila para Programar Arduino
Apostila para Programar ArduinoApostila para Programar Arduino
Apostila para Programar Arduino
 
Microcontrolador pic16 f887
Microcontrolador pic16 f887Microcontrolador pic16 f887
Microcontrolador pic16 f887
 
Introdução a Microcontroladores PIC
Introdução a Microcontroladores PICIntrodução a Microcontroladores PIC
Introdução a Microcontroladores PIC
 
Seminario pic
Seminario picSeminario pic
Seminario pic
 
Comandos de Controle de Programa em C - Resumo
Comandos de Controle de Programa em C - ResumoComandos de Controle de Programa em C - Resumo
Comandos de Controle de Programa em C - Resumo
 
Linguagem C - Resumo dos comandos de controle de programa
Linguagem C - Resumo dos comandos de controle de programaLinguagem C - Resumo dos comandos de controle de programa
Linguagem C - Resumo dos comandos de controle de programa
 
Barramento
BarramentoBarramento
Barramento
 
Barramentos clock interno
Barramentos clock internoBarramentos clock interno
Barramentos clock interno
 

Semelhante a Apostila pic 16f877

Crioscópio PZLl – 7000 v.3.00 manual de operação pzl-7000 ip - rev. 2.0
Crioscópio   PZLl – 7000 v.3.00 manual de operação pzl-7000 ip - rev. 2.0Crioscópio   PZLl – 7000 v.3.00 manual de operação pzl-7000 ip - rev. 2.0
Crioscópio PZLl – 7000 v.3.00 manual de operação pzl-7000 ip - rev. 2.0PZL Tecnologia
 
245521697 123529254-curso-microcontrolador-pic18f
245521697 123529254-curso-microcontrolador-pic18f245521697 123529254-curso-microcontrolador-pic18f
245521697 123529254-curso-microcontrolador-pic18fDaniel Henrique
 
SPED Contábil - ECD - Manual de Orientação - ADE COFIS 103/13
SPED Contábil - ECD - Manual de Orientação - ADE COFIS 103/13SPED Contábil - ECD - Manual de Orientação - ADE COFIS 103/13
SPED Contábil - ECD - Manual de Orientação - ADE COFIS 103/13Jose Adriano Pinto
 
Manual da interface de Áudio FOCUSRITE FORTE
Manual da interface de Áudio FOCUSRITE FORTEManual da interface de Áudio FOCUSRITE FORTE
Manual da interface de Áudio FOCUSRITE FORTEHabro Group
 
Curso completo de simocode 3 uf70 revisao 2
Curso completo de simocode 3 uf70 revisao 2Curso completo de simocode 3 uf70 revisao 2
Curso completo de simocode 3 uf70 revisao 2confidencial
 
Manual da Interface de Áudio FOCUSRITE Scarlett 18i8
Manual da Interface de Áudio FOCUSRITE Scarlett 18i8Manual da Interface de Áudio FOCUSRITE Scarlett 18i8
Manual da Interface de Áudio FOCUSRITE Scarlett 18i8Habro Group
 
Crioscópio PZL – 7000 v.4.00 manual de operação pzl-7000 bl rev. 1.0
Crioscópio PZL – 7000 v.4.00 manual de operação pzl-7000 bl rev. 1.0Crioscópio PZL – 7000 v.4.00 manual de operação pzl-7000 bl rev. 1.0
Crioscópio PZL – 7000 v.4.00 manual de operação pzl-7000 bl rev. 1.0PZL Tecnologia
 
Manual caged 2010_versao_aci10-1
Manual caged 2010_versao_aci10-1Manual caged 2010_versao_aci10-1
Manual caged 2010_versao_aci10-1Moisesaw07
 
Emissão e Escrituração de Documentos Fiscais - 5ª ed. | IOB e-Store
Emissão e Escrituração de Documentos Fiscais - 5ª ed. | IOB e-StoreEmissão e Escrituração de Documentos Fiscais - 5ª ed. | IOB e-Store
Emissão e Escrituração de Documentos Fiscais - 5ª ed. | IOB e-StoreIOB News
 
Manual Crioscópio Eletrônico pzl 7000 rev. 1.0
Manual Crioscópio Eletrônico pzl 7000 rev. 1.0Manual Crioscópio Eletrônico pzl 7000 rev. 1.0
Manual Crioscópio Eletrônico pzl 7000 rev. 1.0PZL Tecnologia
 
Guia Fiscal para o Profissional Contábil - IOB e-Store
Guia Fiscal para o Profissional Contábil - IOB e-StoreGuia Fiscal para o Profissional Contábil - IOB e-Store
Guia Fiscal para o Profissional Contábil - IOB e-StoreIOB News
 
E social manual_de_orientacao_v.2.4.02
E social manual_de_orientacao_v.2.4.02E social manual_de_orientacao_v.2.4.02
E social manual_de_orientacao_v.2.4.02Ilânio Luis Luis
 

Semelhante a Apostila pic 16f877 (20)

Apostila redes
Apostila redesApostila redes
Apostila redes
 
Crioscópio PZLl – 7000 v.3.00 manual de operação pzl-7000 ip - rev. 2.0
Crioscópio   PZLl – 7000 v.3.00 manual de operação pzl-7000 ip - rev. 2.0Crioscópio   PZLl – 7000 v.3.00 manual de operação pzl-7000 ip - rev. 2.0
Crioscópio PZLl – 7000 v.3.00 manual de operação pzl-7000 ip - rev. 2.0
 
Game Bible - TCP III 2017.1
Game Bible - TCP III 2017.1Game Bible - TCP III 2017.1
Game Bible - TCP III 2017.1
 
Pilar 02-edição dados
Pilar 02-edição dadosPilar 02-edição dados
Pilar 02-edição dados
 
245521697 123529254-curso-microcontrolador-pic18f
245521697 123529254-curso-microcontrolador-pic18f245521697 123529254-curso-microcontrolador-pic18f
245521697 123529254-curso-microcontrolador-pic18f
 
SPED Contábil - ECD - Manual de Orientação - ADE COFIS 103/13
SPED Contábil - ECD - Manual de Orientação - ADE COFIS 103/13SPED Contábil - ECD - Manual de Orientação - ADE COFIS 103/13
SPED Contábil - ECD - Manual de Orientação - ADE COFIS 103/13
 
Manual da interface de Áudio FOCUSRITE FORTE
Manual da interface de Áudio FOCUSRITE FORTEManual da interface de Áudio FOCUSRITE FORTE
Manual da interface de Áudio FOCUSRITE FORTE
 
Curso completo de simocode 3 uf70 revisao 2
Curso completo de simocode 3 uf70 revisao 2Curso completo de simocode 3 uf70 revisao 2
Curso completo de simocode 3 uf70 revisao 2
 
Manual da Interface de Áudio FOCUSRITE Scarlett 18i8
Manual da Interface de Áudio FOCUSRITE Scarlett 18i8Manual da Interface de Áudio FOCUSRITE Scarlett 18i8
Manual da Interface de Áudio FOCUSRITE Scarlett 18i8
 
Crioscópio PZL – 7000 v.4.00 manual de operação pzl-7000 bl rev. 1.0
Crioscópio PZL – 7000 v.4.00 manual de operação pzl-7000 bl rev. 1.0Crioscópio PZL – 7000 v.4.00 manual de operação pzl-7000 bl rev. 1.0
Crioscópio PZL – 7000 v.4.00 manual de operação pzl-7000 bl rev. 1.0
 
Manual caged 2010_versao_aci10-1
Manual caged 2010_versao_aci10-1Manual caged 2010_versao_aci10-1
Manual caged 2010_versao_aci10-1
 
Emissão e Escrituração de Documentos Fiscais - 5ª ed. | IOB e-Store
Emissão e Escrituração de Documentos Fiscais - 5ª ed. | IOB e-StoreEmissão e Escrituração de Documentos Fiscais - 5ª ed. | IOB e-Store
Emissão e Escrituração de Documentos Fiscais - 5ª ed. | IOB e-Store
 
TG KickGames
TG KickGamesTG KickGames
TG KickGames
 
Manual Crioscópio Eletrônico pzl 7000 rev. 1.0
Manual Crioscópio Eletrônico pzl 7000 rev. 1.0Manual Crioscópio Eletrônico pzl 7000 rev. 1.0
Manual Crioscópio Eletrônico pzl 7000 rev. 1.0
 
Monografia Arduino
Monografia ArduinoMonografia Arduino
Monografia Arduino
 
Guia Fiscal para o Profissional Contábil - IOB e-Store
Guia Fiscal para o Profissional Contábil - IOB e-StoreGuia Fiscal para o Profissional Contábil - IOB e-Store
Guia Fiscal para o Profissional Contábil - IOB e-Store
 
V16x manual field_logger_portuguese_a4
V16x manual field_logger_portuguese_a4V16x manual field_logger_portuguese_a4
V16x manual field_logger_portuguese_a4
 
Livro
LivroLivro
Livro
 
Pca
PcaPca
Pca
 
E social manual_de_orientacao_v.2.4.02
E social manual_de_orientacao_v.2.4.02E social manual_de_orientacao_v.2.4.02
E social manual_de_orientacao_v.2.4.02
 

Apostila pic 16f877

  • 1. Exsto Tecnologia Kit de Microcontroladores PIC Apostila de microcontroladores PIC16 Exsto Tecnologia Ltda. R. Vereador José Eduardo da Costa, 169 Santa Rita do Sapucaí – MG CEP: 37540-000 +55 35 3471 6898 www.exsto.com.br
  • 2. Microcontroladores PIC16F877A Revisão Principais Autores Descrição da Versão 1 José Domingos Adriano Data de Término Revisão inicial para a nova versão do kit © Copyright 2008 por Exsto Tecnologia Ltda. Todos os direitos reservados “Desenvolvido e produzido com orgulho no Brasil” Exsto Tecnologia Ltda R. Vereador José Eduardo da Costa, 169 Santa Rita do Sapucaí – MG CEP: 37540-000 +55 35 3471 6898 www.exsto.com.br Exsto Tecnologia 2
  • 3. Microcontroladores PIC16F877A ÍNDICE PÁGINA Introdução .............................................................................................................................................. 6 1 CONCEITOS BÁSICOS ................................................................................................................ 7 1.1 Sistema Computacional .......................................................................................................... 7 1.1.1 Memórias........................................................................................................................... 8 1.1.2 Memória de programa ...................................................................................................... 8 1.1.3 Memória de Dados ............................................................................................................ 9 1.1.4 Barramentos ...................................................................................................................... 9 1.1.5 Dispositivos de entrada e saída ....................................................................................... 10 1.1.6 Periféricos ........................................................................................................................ 13 1.1.7 CPU .................................................................................................................................. 14 1.2 Arquitetura Computacional................................................................................................... 17 1.2.1 Arquitetura von-Neumann .............................................................................................. 17 1.2.2 2 Arquitetura Harvard ........................................................................................................ 18 O MICROCONTROLADOR PIC16F877A ................................................................................. 20 2.1 A Microchip .......................................................................................................................... 20 2.2 Microcontroladores PIC ........................................................................................................ 20 2.3 A Arquitetura do PIC16F877A ............................................................................................. 21 2.4 Geração de clock................................................................................................................... 22 2.4.1 Modos LP,XT e HS ............................................................................................................ 23 2.4.2 Modos RC......................................................................................................................... 25 2.4.3 Modo INTOSC .................................................................................................................. 26 2.4.4 Comparação entre os modos de oscilador ...................................................................... 26 2.4.5 Clock e execução das instruções ..................................................................................... 26 2.5 Memórias .............................................................................................................................. 27 2.5.1 Memória de programa .................................................................................................... 27 2.5.2 Memória de dados .......................................................................................................... 28 2.6 RESET .................................................................................................................................. 31 2.6.1 POR – Power-On Reset .................................................................................................... 31 2.6.2 PWRT – Power-up Timer ................................................................................................. 31 2.6.3 OST – Oscillator Start-up Timer ....................................................................................... 31 2.6.4 BOR – Brown-out Reset ................................................................................................... 31 2.6.5 Seqüência de inicialização ............................................................................................... 32 2.6.6 Identificação de Reset pelo Software .............................................................................. 32 2.7 Watch-Dog Timer ................................................................................................................. 33 2.8 Modo de baixo consumo – Modo SLEEP............................................................................. 33 Exsto Tecnologia 3
  • 4. Microcontroladores PIC16F877A 2.9 Características especiais ....................................................................................................... 34 2.9.1 Proteção de Código (Code Protect) ................................................................................. 34 2.9.2 Locais de Identificação (ID Locations) ............................................................................. 34 2.9.3 Pinagem e Hardware Básico ............................................................................................ 34 2.10 Gravação ............................................................................................................................... 36 2.11 O conjunto de instruções do PIC16F877A ........................................................................... 37 2.11.1 Manipulação de Byte .................................................................................................. 39 2.11.2 Manipulação de bit ..................................................................................................... 40 2.11.3 Matemáticas ............................................................................................................... 41 2.11.4 Lógicas ......................................................................................................................... 44 2.11.5 Testes .......................................................................................................................... 48 2.11.6 Chamadas e desvio...................................................................................................... 49 2.11.7 Controle....................................................................................................................... 51 2.12 2.13 Estrutura do Programa .......................................................................................................... 53 2.14 3 Programando em assembly ................................................................................................... 52 Programação estruturada....................................................................................................... 56 PROGRAMANDO O PIC16F877A ............................................................................................. 58 3.1 Diretivas ................................................................................................................................ 58 3.2 Variáveis ............................................................................................................................... 61 3.3 Sub-rotinas ............................................................................................................................ 62 3.3.1 Passagem de Parâmetros ................................................................................................ 63 3.3.2 Chamada X Desvio (CALL X GOTO) .................................................................................. 64 3.4 Atribuição ............................................................................................................................. 66 3.5 Entrada e Saída ..................................................................................................................... 67 3.6 Estruturas de Decisão............................................................................................................ 68 3.7 Condições ............................................................................................................................. 69 3.8 Se .......................................................................................................................................... 71 3.9 Se senão ................................................................................................................................ 72 3.10 Se senão se ............................................................................................................................ 73 3.11 Caso ...................................................................................................................................... 75 3.12 Estruturas de repetição .......................................................................................................... 77 3.12.1 Faça-Enquanto ............................................................................................................ 78 3.12.2 Enquanto ..................................................................................................................... 78 3.12.3 Para ............................................................................................................................. 79 3.13 4 Temporização por software – Rotinas de atraso ................................................................... 80 RECURSOS AVANÇADOS ......................................................................................................... 84 4.1 Display de cristal Líquido ..................................................................................................... 84 4.2 Teclado ................................................................................................................................. 87 Exsto Tecnologia 4
  • 5. Microcontroladores PIC16F877A 4.3 Interrupções .......................................................................................................................... 89 4.3.1 Utilização das Interrupções ............................................................................................. 92 4.3.2 4.3.3 5 Interrupção externa em RB0 ........................................................................................... 96 Interrupção por mudança no portal B ............................................................................. 96 PERIFÉRICOS DO PIC16F877A .............................................................................................. 98 5.1 Timers ................................................................................................................................... 98 5.1.1 Timer 1............................................................................................................................. 98 5.1.2 Oscilador do timer 1 ...................................................................................................... 101 5.1.3 Interrupção .................................................................................................................... 101 5.2 Módulo CCP ....................................................................................................................... 101 5.2.1 Modo captura ................................................................................................................ 102 5.2.2 Modo comparação ........................................................................................................ 103 5.2.3 Modo PWM ................................................................................................................... 103 5.2.4 Interrupção .................................................................................................................... 106 5.3 Comunicação Serial ............................................................................................................ 106 5.3.1 Comunicação Paralela ................................................................................................... 106 5.3.2 Comunicação serial........................................................................................................ 107 5.3.3 EIA-232C ........................................................................................................................ 109 5.3.4 A USART do PIC16F877A................................................................................................ 110 5.3.5 Transmissão ................................................................................................................... 112 5.3.6 Recepção ....................................................................................................................... 113 5.4 Conversor Analógico para digital – ADC........................................................................... 114 5.4.1 Configuração e uso ........................................................................................................ 116 5.5 Memórias EEPROM e Flash............................................................................................... 118 5.5.1 Memória EEPROM ......................................................................................................... 118 5.5.2 Rotinas de acesso a EEPROM ........................................................................................ 119 5.5.3 Memória FLASH de programa ....................................................................................... 120 5.5.4 Rotinas de acesso a FLASH. ........................................................................................... 120 Apêndices ............................................................................................................................................ 122 Apêndice A – Conjunto de Instruções do PIC16 ............................................................................. 122 Apêndice B – Mapeamento de memória de dados........................................................................... 123 Exsto Tecnologia 5
  • 6. Microcontroladores PIC16F877A Introdução Está apostila tem o objetivo de servir como livro texto para um curso de microcontroladores PIC16. Esse conteúdo foi preparado para ser usado em disciplinas de microcontrolador/microprocessadores em cursos técnicos ou superiores na área de tecnologia. Os pré-requisitos para o bom aproveitamento do curso são conhecimentos básicos de informática, eletrônica básica, eletrônica digital básica (principalmente memórias, contadores, portas lógicas e flip-flops ). Também é recomendável para o bom andamento do curso que os alunos já tenham freqüentada alguma matéria de programação (seja qual for a linguagem estudada). O curso é estruturado em 5 capítulos que abordam o funcionamento do PIC16F877A, partindo de conceitos mais gerais e especializando a cada passo, até tratar vários dos periféricos. O capítulo inicial com os conceitos básicos sobre microcontroladores e sistemas computacionais, e tem o objetivo de equalizar os pré-requisitos sobre o assunto. Este capítulo pode ser omitido, sem qualquer prejuízo no andamento do curso, caso esses conceitos já tenham sido estudados em outras disciplinas. O capítulo 2 apresenta os microcontroladores PIC16 , tratando tanto de hardware como de software, além de trazer os fundamentos de programação em linguagem assembly. São discutidos organização de memória e funcionamento da CPU, além das principais características destes microcontroladores. De posse dos conhecimentos do Capítulo 2 é feito um estudo mais aprofundado de técnicas de programação segundo os preceitos da programação estruturada e engenharia de software. Vale ressaltar a importância dessa unidade, visto que ela visa formar as bases da lógica de programação e que o desenvolvimento com microcontroladores é basicamente um desenvolvimento de software. O capítulo 4 apresenta algumas aplicações avançadas de programação, com displays LCD, teclados matriciais e, principalmente, interrupções. No último capítulo são apresentados alguns dos principais periféricos do PIC16F877A, também encontrados em outros microcontroladores da família PIC16. Destes, são fundamentais os timers e comunicação serial. Os demais poderão ser sacrificadas ou resumidas, caso a carga horária não suporte a totalidade do conteúdo, apesar de ser recomendado dar uma maior atenção ao conversor analógico para digital. Exsto Tecnologia 6
  • 7. Microcontroladores PIC16F877A 1 CONCEITOS BÁSICOS Inicialmente será apresentado o conceito de microcontroladores de forma genérica, que posteriormente será estendido ao PIC16F877A e pode ser aplicado a qualquer outro microcontrolador. É importante este embasamento teórico não somente para garantir um melhor aproveitamento no estudo do PIC 16F877A como também para tornar o leitor apto a entender o funcionamento de outros microcontroladores, tanto da linha PIC como de outros fabricantes. Esses conhecimentos também são importantes na escolha do microcontrolador a ser utilizado em um projeto, pois permite estabelecer as bases conceituais para a comparação de suas características. 1.1 Sistema Computacional Inicialmente devemos conceituar o que vem a ser um sistema computacional. Os sistemas computacionais são compostos por sistemas combinacionais e seqüenciais. O que caracteriza um sistema computacional é a possibilidade de ser programado. Um sistema computacional é composto por hardware (parte física) e software (programa). O hardware dos sistemas computacionais, ao contrário do que ocorre com sistema combinacionais e seqüenciais, não possui uma aplicação específica. É necessário que exista um software para ser executado. Em contrapartida, um mesmo hardware pode executar uma infinidade de funções diferentes, simplesmente alterando o seu software. Uma boa analogia é imaginar o hardware como um instrumento musical e o software como uma partitura. Um piano por si só não faz nada, é necessária uma música que possa ser executada a fim de se obter algum resultado. Da mesma forma que a música contida na partitura, um programa será composto por um conjunto limitado de símbolos (no caso da partitura são as notas musicais e no caso do programa são as instruções) que podem ser organizados de diversas formas diferentes, obtendo-se diferentes resultados. Como exemplo de sistema computacional, o primeiro que nos vem em mente é o computador pessoal (PC), hoje tão difundido. Contudo, existem vários equipamentos, tão ou mais comuns que os PC´s, que são sistemas computacionais. Por exemplo, os vídeo-games, os mini-games, as calculadoras, palm-top´s, etc. Além disso, temos os microcontroladores, que são o objetivo desse nosso estudo, que estão presentes nas mais diversas aplicações. A estrutura de um sistema computacional é como a apresentada no diagrama em blocos abaixo (Figura 1.1). Exsto Tecnologia 7
  • 8. Microcontroladores PIC16F877A Memória Dados Controle (CPU) Programa Barramento de Dados Dispositivos de Entrada e saída e periféricos “Mundo Externo” Figura 1.1 – Diagrama em blocos genérico de um sistema computacional 1.1.1 Memórias Memórias são dispositivos que armazenam informações. No caso de um sistema computacional, essa informação, assim como a memória, pode ser dividida em dois tipos: de programa e de dados. Existem também Registros (bytes de memória) com funções especiais que trabalham junto ao processador (CPU). 1.1.2 Memória de programa Sua função é armazenar o software (programa) a ser executado no sistema. Também é utilizada para guardar tabelas de constantes Existem endereços de memória de programa existem alguns com finalidade específica, chamados vetores, que são endereços para onde o programa desvia quando ocorrem determinados eventos. Temos o vetor de reset, que é o endereço pelo qual o programa começa a ser executado e o vetor de interrupções, que é para onde o programa desvia quando ocorreu um pedido de interrupção (trataremos desse conceito mais adiante). De uma forma geral, a memória de programa é uma memória não volátil. O tipo dessa memória pode ser: • • • ROM (Read Only Memory): somente de leitura. Geralmente chamada de masked-ROM (masked = mascarado), é gravada pelo fabricante do componente, o que em quantidades muito grandes reduz custos. OTP (Only Time programming): programável somente uma vez, utilizada em produção. EPROM (Erasable Progrmable Read Only Memory) : apagável através de luz ultravioleta. Utilizada no processo de desenvolvimento e algumas vezes no produto acabado, quando há a necessidade de se poder alterar o software. Exsto Tecnologia 8
  • 9. Microcontroladores PIC16F877A • Flash: é uma memória eletricamente apagável (EEPROM – Electricaly Eresable Read Only Memory) com tempos de acesso para leitura rápido. Oferece uma grande flexibilidade, pois geralmente é possível reprogramar um equipamento sem troca de componentes. Praticamente todos os microcontroladores já possuem internamente algum desses tipos de memória de programa. Atualmente quase todos os microcontroladores possuem versões em memória Flash, pois a mesma apresenta muitas vantagens a um custo dos mais baixos. 1.1.3 Memória de Dados É a memória onde são armazenados os dados a serem processados pelo computador (as variáveis dos programas e outras informações.). Como esses dados são constantemente alterados, a memória utilizada para armazena-los é do tipo RAM. Como se trata de uma memória volátil, quando a alimentação é cortada esses dados são perdidos. Alguns microcontroladores disponibilizam também memórias EEPROM para armazenar dados que não devem ser perdidos com a falta de energia. 1.1.4 Barramentos As várias partes de um sistema computacional (CPU, memórias, dispositivos de entrada e saída) são ligadas entre si através de barramentos, ou vias, que são ligações físicas de comunicação paralela entre os componentes. São eles: • • • • Barramento de dados: pelo qual os dispositivos de I/O e memórias trocam dados com o processador Barramento de endereços: permite ao processador “endereçar” qual dispositivo será acessado Barramento de controle: indica se o acesso é de leitura ou escrita, se é feito a posição de memória ou a I/O. Barramento de programa: por onde o processador recebe as instruções que compõe o programa. O tamanho do barramento de dados limita o tamanho de dados que trafegam pelo sistema. Por isso é comum classificar os sistemas computacionais pelo tamanho de seu barramento; temos então sistemas de 8 bits, 16 bits, 32bits, etc. Os microcontroladores são em sua maioria de 8 bits, apesar de existirem alguns modelos de 16 bits. Já o tamanho do barramento de endereços nos informa qual a quantidade máxima de endereços de memória ou dispositivos de I/O e periféricos podem ser acessados. Por exemplo, um barramento de endereços de 10 bits permite acessar 210 = 1024 endereços. Todos os dispositivos de um sistema computacional fazem uso do barramento de dados para trafegar informações. Para que o sistema funcione corretamente podemos apresentar o processo de forma simplificada assim: o processador (que coordena o processo) escreve no barramento de endereços o endereço do dispositivo a ser acessado. Através do barramento de controle ele informa ao dispositivo se o acesso é de leitura ou escrita (a definição de leitura ou escrita de dispositivos sempre é feita pelo ponto de vista do processador). No caso de um aceso de leitura o dispositivo escreve no Exsto Tecnologia 9
  • 10. Microcontroladores PIC16F877A barramento de dados e a informação é lida pelo processador. No caso de um acesso de escrita, o processador envia dados para o barramento de dados que são lidos pelo dispositivo acessado. Como dispositivos de um sistema computacional usam o mesmo barramento de dados para trafegar informações é preciso que, quando um dispositivo estiver escrevendo no barramento (portanto aplicando níveis de tensão ao barramento) os demais dispositivos não causem conflito de dados. De fato, todos os dispositivos presentes em um sistema computacional são capazes de ficar em estado de “alta impedância” enquanto não forem acessados para leitura. 1.1.5 Dispositivos de entrada e saída São responsáveis por realizar a interface do processador com o “mundo externo”. É através deles que um sistema computacional adquire dados externos e aciona processos. São comumente chamados de dispositivos de I/O (Input/Output – Entrada/Saída), portais de I/O (no inglês, ports) ou simplesmente portais. A função dos portais de saída é transferir ao “mundo externo” um dado que esteja presente no barramento de dados. Para isso são utilizados latches, pois permitem o “carregar” dados somente quando são acionados, retendo esses dados independente de haverem alterações em suas entradas. Os portais de entrada devem permitir a transferência de dados do “mundo externo” para o barramento de dados quando acionados e em alta impedância no restante do tempo. Para tanto, são tradicionalmente utilizados buffers com saída tri-state para essa função. A seleção dos dispositivos de I/O a partir do barramento de endereços é feita por decodificadores ligados ao barramento de endereços e seu acionamento é feita através do barramento de controle. Exemplo 1.1 A figura 1.2, abaixo, mostra um exemplo de utilização de buffers e latches como portais de entrada e saída, respectivamente. Ambos os portais estão ligados ao barramento de dados. Cada portal possui um decodificador (DEC), que apresenta nível alto na saída quando o valor do barramento de endereços é o endereço do portal. Os sinais RD (read – ler), WR (write – escrever) e IORQ (I/O request – requisição de I/O) constituem o barramento de controle. Para a operação de leitura, o endereço do portal é colocado no barramento de dados.O decodificador decodifica o endereço do portal de leitura e coloca em sua saída nível lógico 0. Em seguida, os sinais IORQ e RD são acionados. Assim temos ‘1’ no terminal de habilitação de saída do buffer e o valor em sua entrada é transferido para o barramento de dados, podendo ser armazenado pela CPU. Exsto Tecnologia 10
  • 11. Microcontroladores PIC16F877A Figura 1.2 – Portais de entrada e saída Para realizar uma operação de escrita do portal , o processador inicialmente coloca os dados a serem escritos no barramento de dados e o endereço do portal no barramento de endereço.O decodificador decodifica o endereço do portal de escrita e coloca em sua saída nível lógico 0. Então são acionados os sinais WR e IORQ. Nesse instante temos ‘1’ nas três entradas da porta AND que aciona o terminal E do latch, que faz com ele carregue os dados presentes no barramento na saída. Figura 1.2 – Portais de entrada e saída A função do microcontrolador, como o próprio nome diz, é controlar processos e circuitos. Para otimizar essa função, seus portais de entrada e saída são tratados como registros de funções especiais, ou seja, são lidos e escritos como se fossem simples bytes de memória. Em sistemas como microprocessadores geralmente o tratamento é diferente, havendo instruções específicas para acesso aos portais e outras implicações, que diminuem a eficiência do código gerado quando se trabalha intensamente com entrada e saída. Exsto Tecnologia 11
  • 12. Microcontroladores PIC16F877A Para maior flexibilidade do sistema, geralmente os microcontroladores utilizam um sistema de portais mais complexo que o apresentado acima, que permite que um mesmo terminal do microcontrolador seja configurado como entrada ou saída. Para que isso seja possível é utilizado um registro de portal (PORT) e um registro de direção de dados (DDR – Data Direction Register). Esse último permite selecionar a direção de cada bit de um portal de saída, individualmente. A figura 1.3a e 1.3b abaixo mostram o esquema genérico de um bit de portal do PIC16F877A. Outros microcontroladores utilizam configurações semelhantes. Figura 1.3a – Esquema típico de um pino de I/O OPERAÇÃO DE ESCRITA OU SAÍDA DE DADOS: ao acionar o controle WR PORT, o latch de saída (Data Latch) armazena a informação complementar do barramento de dados em sua saída complementar Q “barra”. Vamos admitir que o registro de direção de dados (TRIS Latch) foi carregado inicialmente com o valor ‘0’. O registro de direção de dados é habilitado através do controle WR TRIS e a informação de direção fica armazenada em sua saída. Para Q=0 e Q ”barra”=1 na saída do registro de direção, o pino I/O estará configurado como saída e tem-se a transferência da informação Q ”barra” do latch de saída para o driver do pino I/O conforme o arranjo das portas lógicas. Se este último Q ”barra” =0 o transistor “N” será cortado e “P” será ativado permitindo que a tensão Vdd apareça no pino I/O como nível lógico 1 que era a informação original do barramento de dados. Se Q “barra” =1 o transistor “P” será cortado e “N” estará ativo. A tensão no pino I/O cai para o nível Vss indicando nível lógico 0. Exsto Tecnologia 12
  • 13. Microcontroladores PIC16F877A Figura 1.3b – Esquema típico de um pino de I/O OPERAÇÃO DE LEITURA OU ENTRADA DE DADOS: novamente admitamos que o registro de direção foi carregado inicialmente com o valor ‘1’ em sua saída. Agora, o arranjo das portas lógicas permite o corte simultâneo dos dois transistores do driver configurando o pino I/O como entrada de dados. Assim, o controle RD PORT habilita o latch de entrada e o buffer tri-state, o que possibilita que a informação do pino de I/O trafegue pelo barramento de dados. No restante do tempo o buffer fica em alta impedância. Caso seja feita uma operação de escrita em um terminal configurado como entrada, o dado escrito será armazenado no latch de dados, mas não será transferido para o terminal, pois o driver está desativado. Por outro lado, se for realizada uma operação de leitura em um terminal configurado como saída, o valor lido será o dado presente no terminal, que é o mesmo escrito no latch de dados anteriormente. 1.1.6 Periféricos Além dos portais de I/O e as memórias, podemos ter muitos outros tipos de dispositivos ligados ao barramento de dados. Esses dispositivos nada mais são do que circuitos destinados a realizar funções especiais. Esses dispositivos periféricos são particularmente importantes nos microcontroladores. Como periféricos mais comuns podemos citar os temporizadores e contadores (Timers), os módulos de comunicação serial, conversores AD e DA, módulos de CCP (Captura, comparação e PWM), drivers de LCD, comparadores analógicos, etc. Exsto Tecnologia 13
  • 14. Microcontroladores PIC16F877A O modo de acesso aos periféricos é semelhante ao de acesso aos portais de I/O. Eles muitas vezes possuem vários registros de parâmetros que podem ser configurados, e um ou mais registros de entrada e saída de dados. Quando estivermos tratando dos periféricos do PIC16F877A mostraremos como trabalhar com eles e, apesar de cada microcontrolador apresentar um conjunto de periféricos diferentes, seu funcionamento é muito semelhante. 1.1.7 CPU A CPU (Central Processing Unit – Unidade Central de Processamento) ou processador é parte principal de um sistema computacional. É comum se referir à CPU dos microcontroladores como core (núcleo). Sua função é executar as instruções do programa e processar dados. Para tanto ela controla todas as demais partes do sistema e envia ou recebe dados dessas partes. Ela também é capaz de interpretar e colocar em execução as instruções que compõe o programa e realizar operações lógicas e aritméticas. Genericamente um processador é organizado conforme o diagrama em blocos da figura 1.4. Figura 1.4 – Diagrama em blocos de uma CPU Os nomes de cada bloco estão em inglês no diagrama para facilitar a identificação desses blocos nos manuais de microcontroladores e microprocessadores, que comumente são escritos nessa língua. Os blocos pontilhados podem ou não estar presentes. As vias em amarelo representam o barramento de dados interno do processador, que é ligado ao barramento de dados do sistema. As vias em verde são outras vias de dados e sinais de controle. Exsto Tecnologia 14
  • 15. Microcontroladores PIC16F877A O principal bloco de um processador é o decodificador de instruções (Instructiuon Decoder). Voltando a analogia entre um sistema computacional e um instrumento musical, o decodificador de instruções pode ser comparado ao músico, que age sobre o instrumento (hardware) executando a música (software). Esse bloco é composto por um decodificador e um contador. Tal decodificador pode ser visto como um livro de receitas culinárias. No livro, cada página contém uma receita e dentro de cada receita há os passos para sua execução. De modo análogo, cada instrução do processador é como o endereço de uma “página” onde está a seqüências de acionamento dos sinais de controles (internos e externos ao processador) que permitem a execução da instrução. O contador existente é responsável por fazer com que os passos para a execução de uma instrução sejam executados em seqüência. Cada modelo de processador possui um conjunto, ou set, de instruções que pode executar. O barramento de controle interno (Internal Control) permite ao decodificador de instruções controlar os blocos internos do processador, enquanto o barramento de controle externo (External Control) já foi discutido e tem a função de indicar se o acesso é de leitura ou escrita, se é em memória ou dispositivos de I/O. O programa armazenado na memória é uma seqüência de instruções. Podemos então supor que para endereçar corretamente essas instruções deveria haver um contador. Ele existe e é chamado Contador de Programa ou PC (Program Counter). A cada instrução iniciada o PC é incrementado. Portanto ele aponta a próxima instrução, isto é, contém o endereço da próxima instrução a ser executada. A saída desse contador é ligada a um registro (Program Addressing) que é carregado ao final de cada instrução com o endereço da próxima instrução. A saída do registro Program Addressing está ligada ao barramento de endereços da memória de programa. Quando a CPU é resetada, o PC é automaticamente carregado com o valor do vetor de reset. Durante a execução do programa, um valor pode ser carregado no PC. Isso ocorre para desviar o fluxo do programa. Existem instruções que realizam essa alteração de fluxo, que pode ser de dois tipos: desvio ou chamada. Quando ocorre um desvio o conteúdo do PC é alterado para que ele passe a executar o programa a partir de outro ponto. Na execução de uma chamada o fluxo do programa também é desviado para um determinado ponto para executar um trecho do programa, mas nesse caso ele deve retornar ao ponto do programa onde ocorreu o desvio (mais precisamente à primeira instrução após a instrução de chamada). Isso permite executar uma sub-rotina, conceito que será discutido quando tratarmos do software. Em uma chamada o endereço de retorno deve ser armazenado em algum lugar, caso contrário não seria possível retornar ao ponto onde a chamada ocorreu. Esse lugar é chamado de pilha (stack). O nome pilha se deve a seu funcionamento, que é semelhante a uma pilha de pratos: como pode haver várias chamadas consecutivas sem que haja retorno, os endereços de retorno são armazenados “uns sobre os outros”. Quando ocorre uma instrução de retorno (que é o que faz o programa retornar da chamada), o programa volta para o último endereço guardado, e assim sucessivamente até que a pilha esteja vazia. A pilha é então uma porção de memória onde podem ser armazenados os endereços de retorno. Exsto Tecnologia 15
  • 16. Microcontroladores PIC16F877A Para indicar a próxima posição livre na pilha existe um registro (na verdade um contador) chamado ponteiro da pilha (Stack Pointer) que aponta o topo. Esse registro é incrementado cada vez que um novo endereço de retorno é armazenado na pilha e decrementado quando ocorre um retorno. Uma vez determinado o endereço, seu conteúdo é lido e armazenado em um registro chamado registro de instrução (Instruction Register). Desse registro, parte da instrução vai para o decodificador de instruções e parte pode ir para a ALU e/ou parte para o registro de endereçamento de dados (Data Addressing). Para entender o porque disso, devemos ter em mente que uma instrução nada mais é que uma palavra binária. Parte dela, que é efetivamente a instrução, indica ao decodificador de instruções qual a seqüência de ações deve ser executada (qual a “página” do decodificador de instruções). O restante constitui os operandos da instrução, ou seja, os dados a serem processados. Esses dados podem ser constantes ou endereços de dados variáveis na memória RAM. Conforme sua natureza e a instrução a ser executada eles tem um destino ou outro. A unidade lógico-aritmética ou ALU (Aritmetic and Lógic Unit) é o circuito responsável pelos cálculos em um processador. Como próprio nome diz, ela é responsável pela realização de operações lógicas, (E, OU, OU-exclusivo, deslocamentos, rotações, complemento), e aritméticas (incremento, decremento, adição, subtração, multiplicação, e divisão). Os processos de divisão e multiplicação são feitos com a ALU utilizando seqüências somas e subtrações, o que efetivamente o que a ALU é capaz de fazer. A ALU trabalha juntamente com dois registros especiais: o Acumulador (Accumulator) e o registro de estado de operações aritméticas (Status). É comum se referir ao acumulador simplesmente como Acc ou, no caso dos PICs, como W (Worker – Trabalhador ). O acumulador quase sempre está envolvido nas operações realizadas pela ALU. Ele pode ser um dos operandos, pode ser onde se armazena o resultado ou pode ser as duas coisas. Há também microcontroladores onde qualquer transferência de dados entre dois endereços da RAM passa pelo acumulador. Quanto ao registro de status, sua função é indicar resultados notáveis das operações matemáticas. Esses resultados são indicados por flags, que são bits desse registro. Através da análise dos flags é possível saber, dentre outras coisas, se uma operação resultou em zero; se houve estouro da capacidade de armazenamento (overflow), que acontece quando um resultado é maior que o máximo valor possível de ser representado pelo sistema; se o resultado de uma operação aritimética é negativo ou positivo. Existe uma interação do registro status com o decodificador de instruções, pois através da análise de seus flags é possível realizar instruções de testes. Para acessar a memória de dados e os periféricos existe um registro, que em nosso sistema é chamado de endereçamento de dados (Data Addressing) que pode receber valores de duas formas. A primeira é diretamente de parte da instrução. Nesse caso se está fazendo referência a endereços da RAM conhecidos e fixos, pois são carregados valores constantes existentes no programa. Esse modo é chamado endereçamento direto. Em muitos casos é necessário fazer referências a endereços variáveis. Isso é feito carregando o registro de endereçamento com dados provenientes de um outro registro, o registro de endereçamento indireto (Indirect Addressig). Como qualquer outro registro, ele pode ser carregado com um valor, constante ou proveniente de uma variável, pode ser incrementado, decrementado ou participar que qualquer operação lógico-aritmética. Sua função é semelhante a dos ponteiros em linguagens de alto nível. Exsto Tecnologia 16
  • 17. Microcontroladores PIC16F877A Todo o sistema computacional trabalha sincronizado com um mesmo sinal de clock. Devemos lembrar que esse clock é o que faz o decodificador de instruções passar de uma instrução para a outra, e tudo o mais deve estar sincronizado com ele, senão haveria o caos. Para gerar esse sinal de clock é necessário um oscilador. Nos microcontroladores esse oscilador já faz parte do componente Independente da forma como o clock é gerado, esse sinal é aplicado a CPU e aos periféricos. É comum que a freqüência do clock dos periféricos seja menor que a da CPU. Para tanto são utilizados divisores de freqüência Outro ponto importante é o reset. Além do reset que ocorre quando o sistema é ligado, chamado de Power-on reset, os microcontroladores apresentam várias outras fontes de reset. Esses resets são proteções do sistema. Síntese genérica de operação de uma CPU: 1) O iniciar um programa, o contador de programa aponta para o primeiro endereço na memória de programa. 2) Neste endereço começa o programa. 3) O registrador de instrução armazena o dado guardado neste endereço. Este dado é composto da instrução e do operando. O operando pode ser proveniente da memória de programa ou da memória RAM ( memória de dados ). 4) O decodificador de instrução recebe a instrução do registrador de instrução. 5) A instrução corresponde a uma seqüência de passos programados em uma ROM, o chamado microcódigo. 6) Um contador dentro do decodificador de instrução varre essa seqüência de passos. 7) O decodificador de instrução começa então a acionar os dispositivos dentro ou fora da CPU através dos barramentos de dados, controle e endereço. 8) A partir desse ponto os dispositivos podem ser acionados nas mais diversas seqüências de operação dependendo da necesidade de processamento imposta pelo código, por exemplo: • O contador de programa aponta para o próximo endereço de memória de programa onde pode estar o valor de uma instrução com operando. A memória de programa é habilitada e esse valor é passado do para a ALU através do registro de instrução. • O contador de programa aponta para o próximo endereço na memória de dados. A memória de dados é habilitada e o valor armazenado nesse endereço passa para o acumulador. • A ALU opera aritmeticamente esses dois dados, sinaliza para o registrador de estados qual foi e estado da operação e disponibiza o resultado em sua saída. • Uma memória ou um dispositivo de saída pode ser habilitado e o resultado será armazenado em um desses dispositivos. Em resumo sempre ocorre um processo de BUSCA e EXECUÇÃO da instrução. A busca se refere a localização das instruções e dos operandos na memória e a execução se refere ao acionamento de dispositivos em seqüência para conseguir o resultado desejado. 1.2 Arquitetura Computacional 1.2.1 Arquitetura von-Neumann Na arquitetura von-Neumann, as memórias tanto de dados quanto de programa, são acessadas usando-se o mesmo barramento de dados; os portais de I/O também fazem uso do barramento de dados. Ou seja, a memória e os dispositivos de I/O compartilham o mesmo barramento em momentos distintos. Exsto Tecnologia 17
  • 18. Microcontroladores PIC16F877A Vale lembrar aqui que uma instrução é como uma operação matemática, isto é, composta de operadores, que indicam o que será feito, e operandos, que são os parâmetros envolvidos na operação.Desta forma, o processo de execução de cada instrução é dividido em dois momentos: a leitura da instrução e a leitura dos operandos (fetch) e a execução da instrução propriamente dita. Nota-se que dessa forma o processador está parte do tempo ocupado com a leitura da memória de programa e, conseqüentemente não fica executando o firmware o tempo todo. Outra característica da arquitetura von-Neumann é que, visto que os operandos das instruções são geralmente do mesmo tamanho do barramento de dados, quanto mais complexa a instrução maior será a quantidade de endereços ocupados por ela na memória. Isto quer dizer que por exemplo, para um barramento de 8 vias, uma instrução de 16 bits é buscada e executada em duas partes de 8 bits. Por outro lado, como a complexidade da instrução não tem limite a não ser o espaço ocupado, podemos ter um set de instruções tão complexo quanto se queira. Podemos concluir que arquitetura von-Neumann consome muito tempo de processamento com a leitura da instrução e dos operandos. Conclui-se também que instruções diferentes ocupam quantidades diferentes de memória e são executadas em tempos diferentes. Memória Dados Programa CPU Barramento de Dados I/O Figura 1.5 – Arquitetura von-Neumann Os sistemas de arquitetura von-Neumann geralmente têm conjuntos de instruções complexos, o que equivale a dizer que possuem um grande número de instruções e cada instrução realiza uma grande seqüência de ações. Processadores desse tipo são chamados CISC (Complex Instruction Set CPU – CPU com Set de Instruções Complexo). 1.2.2 Arquitetura Harvard Já a arquitetura chamada de arquitetura Harvard, que é utilizada nos microcontroladores PIC, tem como principal característica acessar a memória de dados separadamente da memória de programa. A principal vantagem dessa arquitetura é que a leitura de instruções e de alguns tipos de operandos pode ser feita ao mesmo tempo em que a execução das instruções (tempo Tcy). Isso significa que o sistema fica todo o tempo executando instruções, o que acarreta um significativo ganho de velocidade. Enquanto uma instrução está sendo executada, a seguinte está sendo lida. Esse processo é conhecido como pipelining (canalização) e é ilustrado pela figura 1.6 abaixo. Exsto Tecnologia 18
  • 19. Microcontroladores PIC16F877A Figura 1.6 – Pipeline O barramento de programa não necessariamente tem o mesmo tamanho do barramento de dados. Dessa forma, em uma única palavra da memória de programa pode conter operando e operadores, o que nos permite carregar toda a instrução em um único ciclo de leitura da memória. Memória de CPU Programa Barramento de Programa Memória de Dados I/O Barramento de Dados Figura 1.7 – Arquitetura Harvard Pode-se notar então que os tempos de execução e de leitura estão atrelados e são os menores possíveis. Isso acarreta em as instruções não poderem executar uma grande seqüência de ações, ou seja, não existem instruções complexas. Por isso, os PIC´s são considerados processadores RISC (Reduced Instruction Set CPU – CPU com Set de Instruções Reduzido). O número de instruções é reduzido, o que não significa que não se possa executar programas complexos, mas sim que seqüências complexas de ações devem ser construídas por seqüências de instruções básicas. Exsto Tecnologia 19
  • 20. Microcontroladores PIC16F877A 2 O MICROCONTROLADOR PIC16F877A 2.1 A Microchip O fabricante dos microcontroladores PIC é a empresa americana Microchip. Atualmente ela é um dos maiores fabricante mundiais de microcontroladores de 8, 16 e 32 bits, além de possuir uma ampla linha de memórias e componentes analógicos. A Microchip trabalha com uma política de suporte ao cliente muito eficiente, que provavelmente é uma das causas de seu sucesso. Em seu site (www.microchip.com) existe uma grande quantidade de informação disponível. Além dos manuais dos componentes, existem muitas notas de aplicação (Application Notes) e projetos de referência, que são de grande ajuda para a formação da base de conhecimentos do estudante de microcontroladores PIC. 2.2 Microcontroladores PIC Os PICs são divididos em famílias. Cada família, ou plaforma, 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. Essas instruções são comandos em linguagem de programação assembly que compõe os softwares gravados nos microcontroladores, com as quais o aluno entrará em contato mais adiante. Dessa forma, ao se estudar um componente específico de uma família, se está adquirindo conhecimento para trabalhar com microcontroladores de toda a família. As famílias são se dividem ainda conforme o tamanho do barramento de bits, havendo microcontroladores de 8, 16 e 32 bits. As famílias de microcontroladores PIC são: • • • 8 bits o Família PIC10 o Família PIC12 o Família PIC14 e PIC17 o Família PIC16 o Família PIC18 16 bits: o Famílias PIC24F e PIC24H o Familias dsPIC30F e dsPIC33F 32 bits Exsto Tecnologia 20
  • 21. Microcontroladores PIC16F877A o PIC32 o Os componentes diferem entre si basicamente 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 (8,14,18,28,40, ...) • Freqüência máxima de clock • Periféricos Nesse curso abordaremos o PIC16F877A, que é um dos componentes mais completos da família PIC16. Conforme foi dito anteriormente, ao se estudar um membro de uma família o estudante torna-se apto a trabalhar com toda a família. 2.3 A Arquitetura do PIC16F877A A figura 1.1 apresenta o diagrama em blocos do PIC16F877A. Trata-se de um microcontrolador de 8 bits de arquitetura Harvard. Seu barramento de programa é de 14 bits. A estrutura do PIC16F877A é semelhante ao sistema genérico estudado na aula 1. Seu funcionamento e análise também são semelhantes à aquele sistema genérico consistindo nas etapas de busca de instrução com habilitação e leitura de memória de programa e, execução da instrução com decodificação da instrução e acionamento de dispositivos em seqüência para o processamento da atividade programada. Podem ser observados os barramentos de dados e de programa. Além disso, nota-se como operandos da ALU e de endereçamento da memória de dados vem diretamente da memória de programa. Também são dignos de nota os periféricos, localizados na parte inferior do diagrama, que estão ligados ao barramento de dados. Exsto Tecnologia 21
  • 22. Microcontroladores PIC16F877A Figura 2.1 – Diagrama em blocos do PIC16F877A 2.4 Geração de clock Os microcontroladores PIC possuem um circuito de oscilação interna, isto é, são capazes de gerar seu próprio clock (ou sinal de relógio) com acréscimo de poucos (ou nenhum) componentes externos. Existem sete modos diferentes de clock, e cada componente da família utiliza alguns deles. O modo de clock para cada aplicação é selecionado no momento da gravação do microcontrolador e não pode ser alterado pelo programa. São eles: • • • • • LP: Cristal/Ressonador de baixa freqüência e baixo consumo (Low Frequency (Power) Crystal) XT: Cristal/Ressonador (Crystal/Resonator); HS: Cristal/Ressonador de Alta Freqüência (High Speed Crystal/Resonator); RC: Oscilador RC Externo (External Resistor/Capacitor); o Com saída de clock o Sem saída de clock INTOSC (INTRC): Oscilador RC Interno de 4MHz (Internal Resistor/Capacitor) Esse modo não está presente no PIC16F877A, mas existe em outros componentes da família PIC16; Exsto Tecnologia 22
  • 23. Microcontroladores PIC16F877A o Com saída de clock o Sem saída de clock Obs.: resistores, indutores, capacitores e cristais podem ser combinados formando circuitos osciladores em freqüências determinadas. Mais detalhes sobre os conceitos, funcionamento e projeto desse tipo de circuito podem ser encontrados em livros de eletrônica com capítulos sobre osciladores. 2.4.1 Modos LP,XT e HS Os modos LP, XT e HS utilizam um cristal ou ressonador cerâmico para estabilizar o clock. A diferença está na faixa de freqüência de cada modo e no consumo de energia associado a cada freqüência. O consumo de energia em sistemas computacionais está diretamente relacionado com o a freqüência de operação do sistema porque a dissipação de potência (transformação de energia elétrica em energia térmica) nos transistores que compõem os circuitos integrador digitais se dá nos momentos de transição de baixo para auto e de auto para baixo. Assim, quanto mais transições por unidade de tempo (ou seja, quanto maior a freqüência) maior a dissipação de energia e, portanto, maior o consumo. O modo LP refere-se a cristal/ressonador cerâmico de baixa freqüência. Esse modo trabalha com freqüências de oscilação de até 200 kHz e nele conseguimos o menor consumo dos três modos em questão. O modo XT abrange as freqüências de 200 kHz até 4 MHz e apresenta um consumo médio. O modo HS é para freqüências de 4 a 20 MHz e tem o mais alto consumo. Cada faixa de freqüência possui um ganho do circuito oscilador, que é ajustado de forma diferente para cada modo. É recomendado que se use o modo adequado para cada freqüência, caso contrário pode ocorrer mau funcionamento do oscilador. Além do cristal ou do ressonador, nos modos LP, XT e HS, devem existir capacitores ligados dos terminais do cristal terra, conforme mostra a figura 2.2. Os valores desses capacitores C1 e C2 são os indicados nas tabelas Capacitor Selection for Crystal Oscillator que se encontra nos manuais de cada PIC na seção que trata de configurações do oscilador. Para o PIC16F877A os valores são os apresentados na tabela 2.2. O valor de RF representa o ajuste interno do oscilador para cada modo (XT, LP e HS). O resistor RS pode ser necessário para alguns tipos de corte de cristal, mas geralmente não é usado. O Comando SLEEP desativa o oscilador no modo de baixo consumo, do qual trataremos mais adiante. Exsto Tecnologia 23
  • 24. Microcontroladores PIC16F877A Figura 2.2 – Circuito do Oscilador a Cristal/Ressonador Modo de Oscilador Freqüência do Cristal Capacitores C1 e C2 32 kHz 33 pF 200 kHz 15 pF 100 kHz 47 a 68 pF XT 1 MHz 15 pF 4 MHz 15 pF 4 MHz 15 pF HS 8 MHz 15 a 33 pF 20 MHz 15 a 33 pF Tabela 2.1 – Seleção de capacitores para oscilador a cristal LP Capacitores maiores aumentam a estabilidade do oscilador, mas também aumenta o tempo de partida.O tempo de partida do oscilador é o tempo necessário para que o oscilador se estabilize, pois a oscilação não ocorre de forma imediata assim que o circuito é alimentado,conforme mostra a figura2.3. Esse tempo depende de uma série de fatores, além dos capacitores, com temperatura, tensão de alimentação e até capacitâncias parasitas do lay-out da placa. Esse tempo deve ser considerado pois o programa só será iniciado (ou reiniciado, no caso do modo de baixo consumo) quando o oscilador se estabilizar. Exsto Tecnologia 24
  • 25. Microcontroladores PIC16F877A Figura 2.3 – Partida do oscilador Também é possível aplicar sinais de clock gerados externamente, bastando para isso selecionar o modo relativo a faixa de sinal utilizado. Nesse caso o sinal deve ser aplicado ao pino OSC1/CLKIN e o pino OSC2/CLKOUT deve permanecer em aberto. 2.4.2 Modos RC Também é possível trabalhar com osciladores RC (Resistor/Capacitor). Para isso é utilizada a montagem da figura 2.4 e selecionado o modo de oscilador como RC. Figura 2.4 – Circuito do oscilador no modo RC. O modo RC apresenta algumas limitações: a freqüência de trabalho é dependente de vários fatores (valores de resistor e de capacitor, tensão de alimentação, temperatura) e apresenta pouca estabilidade (tolerância dos resistores e capacitores, variação na tensão de alimentação, variações de temperatura). Por exemplo, em uma produção em quantidade de produtos utilizando PIC´s no modo RC, a freqüência de cada produto pode variar em função da tolerância dos resistores utilizados. Não é possível garantir precisão em nada que se baseie em tempo no programa. Assim esse modo só é recomendado para aplicações nas quais a freqüência não é um fator crítico. Essa situação é que justifica a utilização do modo, pois um oscilador RC tem custo menor que um a cristal. O resistor REXT deve estar entre 3kΩ e 100kΩ e o capacitor CEXT deve ser superior a 20pF. O circuito pode funcionar sem capacitor CEXT, mas nessa situação ele se torna muito suscetível a variações drásticas de freqüência devido a capacitâncias externas (do próprio lay-out, por exemplo). Além disso, a variação da freqüência é maior para resistores maiores e capacitores menores. Exsto Tecnologia 25
  • 26. Microcontroladores PIC16F877A No modo RC com saída de clock o terminal OSC2/CLKOUT apresenta a freqüência do oscilador divida por quatro, que pode ser utilizado como fonte de clock para outros pontos do circuito. Já no modo sem saída de clock, esse terminal pode ser utilizado como I/O. 2.4.3 Modo INTOSC Esse modo de oscilador não está disponível no PIC16F877A, mas pode ser encontrado em outros modelos de microcontroladores. No modo INTOSC (ou INTRC) não se necessita de nenhum outro componente externo. Portanto, além da redução de custos, ele libera terminais do microcontrolador para serem utilizados como I/O. Nesse modo, o sinal de clock é obtido de forma semelhante ao funcionamento do modo RC, porém o “resistor” e “capacitor” são implementados na própria pastilha do componente. Devido a isso temos geralmente uma ou duas freqüências de clock fixas. Tipicamente o oscilador interno é menos preciso que o oscilador a cristal é mais preciso que o oscilador RC, com tolerâncias entre +/- 1 e 10 %. 2.4.4 Comparação entre os modos de oscilador Na tabela 2.2 é feita uma comparação entre os diferentes modos de oscilador. Quesito Tipo de Oscilador Cristal (HS, XT e HS) RC Externo Precisão Preciso Impreciso Estabilidade Estável Instável Variedade de freqüências Pequena Grande Custo Alto Baixo Tabela 2.2 – Seleção de capacitores para oscilador a cristal RC Interno Pouco preciso Pouco Estável Nenhuma Nenhum 2.4.5 Clock e execução das instruções Cada instrução executado pelos microcontroladores PIC16 gasta 4 ciclos de clock, chamados “ciclos Q”. Esses 4 ciclos compõem um ciclo de instrução (TCY) que dura 4 vezes mais que um ciclo Q , portanto um ciclo de instrução tem ¼ da freqüência do oscilador e o sinal desse ciclo maior é chamado de clock de instrução ou clock de periféricos. Ou seja, o tempo de execução de cada instrução e de 4 períodos de clock. Em cada um dos ciclos Q é realizada uma etapa da instrução, conforme mostrado na tabela 2.2. Graficamente esse processo é apresentado na figura 2.5. Ciclo Ação Q1 Ciclo de decodificação da instrução Q2 Ciclo de leitura de dados Q3 Ciclo de processamento Q4 Ciclo de escrita de dados Tabela 1.2 – Ciclos de execução das instruções Exsto Tecnologia 26
  • 27. Microcontroladores PIC16F877A Figura 2.5 – Ciclos de instrução Alguns periféricos e algumas funções do PIC não são sincronizados nem com o clock do oscilador nem com o clock de periféricos, mas com os ciclos Q. 2.5 Memórias 2.5.1 Memória de programa O PIC16F877A possui 8K-palavras de memória de programa. Já que se trata de um processador RISC, o tamanho das palavras da memória de programa é maior que o barramento de dados. Assim, apesar de ser um microcontrolador de 8 bits, a memória de programa é composta por palavras de 14 bits. Cada palavra, isto é, cada endereço de memória de programa guarda uma instrução. Dessa forma, um programa de 500 instruções ocupará 500 bytes. O vetor de reset é o endereço 0000h. Como vimos, isso significa que o programa deve ser escrito a partir desse endereço. O vetor de interrupção, para todas as interrupções é o 0004h. A memória é do tipo FLASH, suportando um grande número de reescritas. É possível, através de rotinas que trataremos em outro ponto do curso, realizar escrita na memória e programa. Na estrutura das instruções de chamada e desvio da família 16F o espaço reservado para endereço é de 11 bits. Portanto é possível endereçar diretamente 2048 endereços de memória. Sendo que o PIC16F877A tem 8k endereços de memória de programa, essa memória é dividida em unidades que chamaremos de páginas. Dentro de uma mesma página é possível realizar saltos e desvios para qualquer ponto. Mas se um salto ou desvio vai de uma página para outra é necessário fazer um ajuste prévio dos dois bits mais significativos do SFR PCLATH, conforme mostrado na tabela abaixo. PCLATH Bit 4 Bit 3 0 0 0 1 0 1 2 1 0 3 1 1 Tabela 2.3 – Páginas de memória de programa Página A figura 2.6 apresenta o mapemamento de memória de programa. Exsto Tecnologia 27
  • 28. Microcontroladores PIC16F877A 0000h Vetor de reset 0001h 0002h Uso geral 0003h 0004h Vetor de interrupção 0005h Página 0 . . Uso geral . 07FFh 0800h . . Uso geral Página 1 . 0FFFh 1000h . . Uso geral Página 2 . 17FFh 1800h . . Uso geral Página 3 . 1FFFh Figura 1.6 – Mapeamento de memória do PIC16F877A Os demais microcontroladores da família PIC16F seguem esse mesmo mapeamento de memória, contudo nem todos os modelos têm 8k-words, isto é, alguns não tem todas as páginas implementadas. Por exemplo, o PIC16F874A tem as páginas 0 e 1 mas não as 2 e 3, portanto tem 4kwords; já o 16F628A tem 2k-words, ou seja, somente a página 0. 2.5.2 Memória de dados O core (núcleo ou processador do microcontrolador) da família PIC16 existem 9 vias de endereçamento o que permite um acesso a 512 endereços diferentes (29 = 512). Contudo, nem sempre temos memória RAM implementada para todos os endereços. A quantidade e a disposição da RAM de dados varia de microcontrolador para microcontrolador. No PIC16F877A existem 368 bytes de memória RAM de dados. Ela é composta por registros de funções especiais (SFR – Special Function Registers) e a RAM de uso geral (GPR – General Purpose RAM). Os SFR são responsáveis pelo controle da CPU e dos periféricos, além de conterem os registros dos portais. Na RAM de uso geral é onde o programa armazenará suas variáveis. A memória RAM pode ser acessada de duas formas: por acesso direto e por acesso indireto. Acesso direto ocorre quando o endereço acessado faz parte da própria instrução (é um dos operandos). Já o acesso indireto é feito através de duas variáveis, uma contendo o endereço a ser acessado e a outra Exsto Tecnologia 28
  • 29. Microcontroladores PIC16F877A se comportando como o byte acessado. Este último modo de endereçamento pode ser muito útil em algumas situações e será estudado mais adiante. Para acesso direto, a RAM é dividida em 4 bancos. Isso ocorre porque a capacidade de máxima de acesso de memória dos microcontroladores PIC é de 512 bytes. Portanto, são necessários 9 bits para compor os endereços. Como cada instrução tem apenas 14 bits, e esses bits devem ser divididos entre operadores e operandos, não há espaço para um endereço de 9 bits. Na verdade, as instruções armazenam apenas 7 bits do endereço a ser acessado. Os dois bits restantes fazem parte do registro de função especial STATUS e são chamados RP1 e RP0. Já que dois bits podem gerar 4 combinações, existe essa divisão em 4 bancos. Para acessar um registro em um banco diferente do banco atual, é necessário ajustar previamente RP1 e RP0. Na prática utilizamos o máximo possível endereços do banco 0, e mudamos para os demais bancos quando necessário, retornando novamente ao banco 0. A divisão de bancos é feita conforme a tabela 1.3. Banco 0 1 2 RP1 0 0 1 RP0 0 1 0 Endereços 00h ~ 7Fh 80h ~ FFh 100h ~ 17Fh 3 1 1 180h ~ 1FFh Tabela 1.4 - Seleção de bancos de RAM No caso do endereçamento indireto, o endereço é armazenado em um registro de função especial chamado FSR. Como trata-se de um registro de 8 bits, falta 1 bit, que se chama IRP e faz parte do STATUS. Quando IRP é ‘0’ são acessados os bancos 0 e 1, quando é ‘1’, são acessados os bancos 2 e 3. Os registros de funções especiais têm seus nomes e os nomes de seus bits já definidos em um arquivo. Existe um arquivo desses para cada PIC e a forma de incluí-lo no programa será mostrado mais adiante. Podemos então tratar os SFR pelo seus nomes, não havendo a preocupação com o endereço que eles ocupam. Também não é necessário saber qual bit de um registro tem determinada função, apenas o nome do mesmo. Na apresentação desses registros será seguida a convenção abaixo, que a mesma utilizada no manual dos componentes. R/W – 0 IRP Bit 7 R/W – 0 RP1 R/W – 0 RP0 R–1 R– 1 R/W – x R/W – x NOT_TO NOT_PD Z DC R/W – x C Bit 0 STATUS Os bits são numerados de 0 a 7, da direita para a esquerda. O nome do registro aparece em baixo. Sobre cada bit temos algumas informações: se ele pode ser lido (R) escrito (W), se não é implementado. Também contém sua situação após o reset, podendo ser ‘0’, ‘1’ ou desconhecida (x). Por exemplo, sobre o bit RP0 está escrito R/W-0, que significa que pode ser lido ou escrito e seu valor no reset é 0. No anexo B encontra-se o mapa de memória do PIC16F628A. Pode-se observar os nomes dos SFR e as regiões de uso geral. Note que apesar de ser possível acessar 512 bytes, foram implementados apenas 224 bytes. As posições não implementadas estão em cinza na figura. Note ainda que os últimos 16 endereços de todos os bancos acessam os mesmos bytes no banco 0. Exsto Tecnologia 29
  • 30. Microcontroladores PIC16F877A A figura 1.7 trás o mapeamento de memória RAM do PIC16F877A com os nomes dos registros de função especial e as áreas de uso geral (GPR). As regiões em cinza correspondem a endereços para os quais não há memória implementada. No manual do PIC16F877A existe um detalhamento maior dos bits que compõe os SPR´s. A função de vários desses registros será explicada no decorrer do curso. Tabela 1.7 - Mapeamento de memória RAM de dados Exsto Tecnologia 30
  • 31. Microcontroladores PIC16F877A 2.6 RESET O PIC possui várias fontes de reset (reinicialização), que são: • • • • • • Reset ao ligar (POR – Power-on Reset); Reset por MCLR durante operação normal; Reset por MCLR no modo SLEEP (que será tratado adiante); Reset por Watch-Dog durante operação normal; Reset por Watch-Dog no modo SLEEP; Reset por queda de alimentação (BOR – Brown-Out Reset). O reset por MCLR é acionado quando ao terminal MCLR (pino 4) é aplicado nível lógico baixo. MCLR é o terminal de Reset do componente, sendo um terminal baixo ativo, isto é, o reset ocorre em ‘0’. Além disso, o terminal de MCLR possui internamente um filtro para evitar que ruídos possam causar reset acidental. O modo como os registros se comportam em cada reset é variado. Para saber quais são os “valores iniciais” de cada registro, deve ser consultada a tabela de situações iniciais dos registros, presente no manual de cada PIC. A seguir são detalhadas algumas fontes e funcionalidades associadas ao reset. 2.6.1 POR – Power-On Reset Essa funcionalidade detecta quando o circuito é ligado, percebendo a subida da tensão de alimentação, e realiza o reset do microcontrolador. Dessa forma podemos dispensar o resistor e capacitor tradicionalmente ligados ao terminal de reset para gerar um nível lógico baixo quando o sistema é ligado, garantido assim o reset inicial. O terminal MCLR pode ser ligado diretamente ao nível lógico alto sendo recomendado utilizar um resistor de 10 kΩ ligando-o à VDD. 2.6.2 PWRT – Power-up Timer Trata-se de um timer de aproximadamente 72ms que mantém o microcontrolador em condição de reset durante esse tempo. É útil, pois permite ao sistema ter tempo de se estabilizar (tensão, reset dos demais componentes, etc.) antes do programa começar a ser executado. 2.6.3 OST – Oscillator Start-up Timer Este timer “conta” 1024 ciclos válidos de clock antes de sair da condição de reset, permitindo assim que o oscilador se estabilize, conforme trato no tópico “Modos LP, XT e HS”. Essa funcionalidade é habilitada somente nos modos LP, XT e HS. 2.6.4 BOR – Brown-out Reset Essa funcionalidade visa reiniciar o sistema se houver uma queda na tensão de alimentação. O BOR ocorre quando a alimentação atinge aproximadamente 4V por mais de 100µs (quedas por tempo intervalos menores que esse são ignorados pois podem se tratar de ruídos na alimentação), em situações como as mostradas na figura2.8. Exsto Tecnologia 31
  • 32. Microcontroladores PIC16F877A Figura 2.7 – Situações de Brown-out 2.6.5 Seqüência de inicialização 1. 2. 3. 4. 5. O circuito é ligado: a tensão de alimentação começa a subir; É detectada a subida da tensão: ocorre POR; O sistema aguarda o tempo de PWRT (aprox. 72 ms); O oscilador começa a funcionar: 1024 ciclos são contados (OST); O programa começa a ser efetivamente executado. 2.6.6 Identificação de Reset pelo Software Apesar de existirem várias fontes de Reset, é possível determinar qual reset ocorreu. Para isso existem 4 bits: NOT_TD e NOT_PD do registro STATUS e NOT_BOR e NOT_POR do registro PCON (Banco 1). As condições desses bits para cada reset podem ser vistas na tabela 2.4. Condição NOT_POR NOT_BOR Reset por Power-on 0 X Impossível 0 X Impossível 0 X Reset por Brown-out 1 0 Reset pelo Watchdog 1 1 Dispertar pelo Watchdog 1 1 Reset pelo MCLR em operação normal 1 1 Reset pelo MCLR no modo SLEEP 1 1 Tabela 2.4 – Bits de status e seus significados NOT_TO 1 0 x 1 0 0 U 1 NOT_PD 1 X 0 1 1 0 U 0 Essa informação pode ser útil, permitindo que providências sejam tomadas em situações específicas de problema. O esquema da figura 1.8 mostra como é a lógica de reset. Exsto Tecnologia 32
  • 33. Microcontroladores PIC16F877A Figura 2.8 – Lógica de reset 2.7 Watch-Dog Timer Esse timer de 8 bits, que é baseado em um oscilador RC interno próprio, independente de qualquer outra coisa, gera um reset quando “estoura”. Ele é importante em situações em que, por qualquer motivo, o microcontrolador “trava”. Quando habilitado ele deve ser zerado a intervalos regulares menores que seu tempo máximo pela instrução CLRWDT. Se o programa “para” e o Watch-Dog não é zerado, tendo sido habilitada essa função na gravação, ocorre o reset. Ao timer de 8 bits pode ser atribuído um pré-escala, como será visto mais adiante. Essa funcionalidade é muito útil, pois, na grande maioria das situações práticas, é melhor que o sistema reinicie do que fique inoperante. Desenvolvendo o código adequadamente é possível fazer com que o reset sequer tenha efeitos perceptíveis para o sistema. O período do watchdog é de 18 ms (típico). Com pré-escala máxima pode chegar a 2,3s. 2.8 Modo de baixo consumo – Modo SLEEP O modo de baixo consumo (Power-dowm Mode), também chamado de modo SLEEP (sono, em inglês), é a situação de menor consumo do microcontrolador. Ele é ativado pela execução da instrução SLEEP. Nesse modo o oscilador é desligado, fazendo com que o microcontrolador pare completamente a execução do programa. Dessa forma conseguimos reduzir drasticamente o consumo do sistema, o que é importante sobretudo em sistemas alimentados por bateria. O microcontrolador pode ser “acordado” por qualquer um dos eventos abaixo: • • • Qualquer reset; Estouro do Watch-Dog (se este estiver habilitado); Qualquer periférico que estiver com sua respectiva interrupção habilitada (incluso INT e interrupção por mudança no Portal B). Exsto Tecnologia 33
  • 34. Microcontroladores PIC16F877A Quando da ocorrência de algum reset, o programa recomeça sua execução no vetor de reset (0000h). Se, porém, ocorrer um estouro do Watch-Dog ou a chamada de alguma interrupção o programa continua sua execução a partir do endereço imediatamente posterior a instrução SLEEP que ativou o modo de baixo consumo. E ainda, se o controle geral de interrupções estiver habilitado, o programa recomeça pelo vetor de interrupções (0004h) se desperto por interrupção. Assim, se desejamos que uma interrupção simplesmente “acorde” o microcontrolador, devemos desabilitar globalmente as interrupções. Deve-se ter atenção ao fato de que no modo SLEEP o oscilador está desligado. Dessa forma não podem ser utilizadas interrupções dos timer’s para a saída do modo, se estes timer’s utilizarem como fonte de clock o oscilador interno, nem demais periféricos cujo funcionamento se baseie no oscilador principal do sistema. 2.9 Características especiais 2.9.1 Proteção de Código (Code Protect) O programa gravado em um PIC pode ser protegido, isto é, pode ser impedida a sua leitura. Essa funcionalidade é muito importante, sobretudo quando se trata de produção industrial, visto que assim se podem preservar os direitos autorais do autor do firmware e dificultar a cópia de produtos. 2.9.2 Locais de Identificação (ID Locations) Existem 4 endereços não acessáveis pelo microcontrolador que podem ser utilizados para identificação do componente (por exemplo, o número de série do produto ou a versão do firmware). 2.9.3 Pinagem e Hardware Básico Como já foi comentado anteriormente, o PIC16F877A é um componente de 40 pinos, em seu encapsulamento PDIP (Plastic Dual In-line Package – Encapsulamento plástico em linha dupla). Esses pinos podem ser divididos em terminais de alimentação, de reset, de conexão com o oscilador e os terminais de portais e periféricos. Como se trata de um componente com diversas características e um pequeno número de terminais, muitos terminais possuem mais de uma função. Dessa forma, temos terminais de entrada e saída dos portais multiplexados com terminais dos periféricos, com terminais do oscilador e terminais de reset. De uma forma geral, quando usamos um determinado periférico, o terminal é associado a ele serve ao periférico e sua função de entrada e saída fica desativada. Quando o periférico não é utilizado, o terminal trabalha como I/O. A figura abaixo apresenta a pinagem do PIC 16F877A. Para facilitar a escrita, toda documentação da Microchip quando se refere a um terminal não utiliza a notação bit N do portal X, e sim RX N. Por exemplo, o bit 2 do portal A é representado por RA2, o bit 7 do portal C por RC7, e assim por diante. Exsto Tecnologia 34
  • 35. Microcontroladores PIC16F877A Figura 2.1 – Pinagem do PIC 16F877A As principais características do PIC são apresentadas na tabela abaixo. Característica Valor Unidade Frequência de Operação 0 ~ 20 MHz MHz Resets POR, BOR Memória de Programa (FLASH) 8k palavras de 14 bits Memória de Dados (RAM) 368 bytes Memória de Dados Não Volátil (EEPROM) 256 bytes Interrupções 15 Timers 3 Módulo CCP 2 Módulo SSP (SPI e I2C) 1 Comparador analógico 2 Comunicação Paralela PSP Módulo ADC de 10-bits 8 canais Set de Instruções 35 instruções A tabela seguinte contém as características elétricas do PIC 16F877A. Característica Temperatura de Trabalho Vdd ( em relação à Vss) Máxima Corrente de saída em Vss Máxima Corrente de entrada em Vdd Máxima Corrente drenada por I/O Máxima Corrente de saída po I/O Máxima Corrente drenada por PORTA + PORTB + PORTE Máxima Corrente fornecida por PORTA + PORTB + PORTE Máxima Corrente drenada por PORTC + PORTD Máxima Corrente fornecida por PORTC + PORTD Min -55 4 - Max Unidade 125 ºC 5,5 V 300 mA 250 mA 25 mA 25 mA 200 mA 200 mA 200 mA 200 mA Exsto Tecnologia 35
  • 36. Microcontroladores PIC16F877A Os níveis de tensão de entrada e saída para o PIC são apresentados na tabela abaixo. Os valores são considerndo que a alimentação é de 5,0 V. O buffer de entrada de cada pino pode ser do tipo TTL simples ou Schmitt Trigger. Para saber qual o tipo de buffer deve-se consultar a parte do manual de cada componente relativo aos portais de I/O. Parâmetro VIH VIH VOL VOH Tipo de buffer TTL Schmitt Trigger TTL Schmitt Trigger Min Vss Vss 2,0 4,0 4,3 Max 0,8 1,0 VDD VDD 0,6 - Unid V V V V V V Como já foi discutido, um microcontrolador possui todos os componentes básicos de um sistema computacional em um único chip. Assim o circuito básico necessário para um PIC funcionar é bastante reduzido. É necessário somente : • A alimentação de +5V, bem regulada; • Como em todo circuito digital, um capacitor de desacoplamento de 100nF bem próximo aos terminais de Vdd e Vss; • O terminal /MCLR é o terminal de reset do PIC e é baixo ativo. Por isso ele deve ser mantido em nível lógico alto. Recomenda-se a liga-lo a Vdd por um resistor (10kΩ). Não é necessário o circuito RC de reset. • Definir-se um esquema de clock conforme já tratado. Um cuidado que deve ser tomado, independente do tipo de oscilador escolhido, é fazer com que os componentes externos do circuito oscilador fiquem bem próximo uns dos outros e todos bem próximos ao microcontrolador. Além disso, quando for confeccionada uma placa de circuito impresso deve-se minimizar as indutâncias e capacitâncias parasitas. Isso é feito aumentando a espessura das trilhas, diminuindo seu comprimento e posicionando trilhas excessivamente próximas umas das outras. Esses cuidados são fundamentais quando se trabalha com freqüências altas. 2.10 Gravação A gravação do microcontrolador PIC pode ser realizada sem que o componente seja retirado da placa (gravação in-circuit). Essa gravação é feita de forma serial utilizando somente dois pinos: PB7/PGD para envio de dados e RB6/PGC para clock. Além dos pinos RB7 e RB6 é necessário que o pino MCLR/VPP receba uma tensão de 13VDC +/- 0,5V durante o processo de gravação. Também é necessário que o microcontrolador esteja devidamente alimentado, portanto VDD e VSS devem estar devidamente conectados. Exsto Tecnologia 36
  • 37. Microcontroladores PIC16F877A 2.11 O conjunto de instruções do PIC16F877A O set de instruções de um microcontrolador é o conjunto de todas as instruções que o processador pode interpretar e executar. Voltando a analogia com um instrumento musical, são como as notas musicais que o compositor usa para escrever uma partitura. Cada processador (ou core) possui seu próprio conjunto de instruções (ou set de instruções). Isso significa que todos os microcontroladores da linha PIC16 são capazes de executar o mesmo código, ou seja, falam a mesma língua. Significa também que microcontroladores de outras famílias ou fabricantes não são compatíveis com o código gerado para PIC16 ou para outro conjunto de instruções (não falam a mesma lingua). Cada instrução na verdade é um código numérico (chamado Opcode) que o decodificador de instruções é capaz de interpretar e disparar uma seqüência de ações pré-definida. Por exemplo, uma instrução de soma inicia um processo interno do microcontrolador que realiza movimento de bytes, ajusta e realiza operações na unidade lógico-aritmética, carrega resultados em endereços de memória. Fazendo uma analogia com um livro de culinária, o opcode indica a página onde estão os passos para a realização de uma receita. Como criar uma lógica complexa de programação usando apenas códigos numéricos seria um trabalho muito desgastante e o resultado muito confuso foi criada uma linguagem simbólica que associa nomes, denominados mnemônicos, aos opcodes; por conveniência esses nomes fazem referência a ação realiza, como poderá ser observado brevemente. Para assembler é o programa responsável por “traduzir” o código mnemônico (entendido pelo ser humano) para um código numérico composto de opcodes (entendido pelo core do microcontrolador). Antes de estudar as instruções deve-se definir alguns termos que serão utilizados na descrição das instruções e na apresentação de sua sintaxe: f W b k x d PC NOT_TO NOT_PD Registro da RAM (0x00~0x7F) Acumulador (Working register) Bit em um byte Constante de 8 bits Irrelevante destino: 0 => Acumulador (W) 1=> registro Program Counter Bit de time-out Bit de Power Down TOS Topo da pilha (Top Of Stack) O acumulador, chamado no PIC de Working Register ou simplesmente W, é um registro interno do microcontrolador, não mapeado em RAM, que está envolvido na maioria das instruções. Como será visto, ele participa das instruções de movimentação e é um dos operandos ou o destino do resultado nas operações lógico e matemáticas. Para maior compreensão do funcionamento das instruções se faz necessário comentar o funcionamento do registro de STATUS. Os bits desse registro nos apresentam a situação do Exsto Tecnologia 37
  • 38. Microcontroladores PIC16F877A microcontrolador a cada instrução. Esses bits são tipicamente chamados de flags (Bandeiras). Através deles podemos saber de resultados de operações da ALU (se uma subtração resultou em zero, se uma soma causou “overflow”, etc), a situação do RESET, além do controle bancos de memória. R/W – 0 R/W – 0 IRP RP1 R/W – 0 RP0 R–1 R/– 1 R/W – x R/W – x R/W – x NOT_TO NOT_PD Z DC C Bit 7 Bit 0 STATUS • • • • • • • IRP :bit de seleção de banco, usado para endereçamento indireto. o 1 = Bancos 2 e 3 (100h - 1FFh) o 0 = Bancos 0 e 1 (00h - FFh) RP1~RP0 : bit de seleção de banco, usado para endereçamento direto. o 11 = Banco 3 (180h - 1FFh ) o 10 = Banco 2 (100h - 17Fh ) o 01 = Banco 1 (80h - FFh ) o 00 = Banco 0 (00h - 7Fh ) NOT_TO: Bit indicador de Time-out o 1 = após todos os Resets, exceto time-out do WDT o 0 = ocorreu um time-out do WDT NOT_PD: Bit indicador de Power-down o 1 = quando é ligado ou após a instrução CLRWDT o 0 = pela execução de uma instrução SLEEP Z: Bit indicador de zero o 1 = se o resultado de uma operação da ALU é zero o 0 = se o resultado de uma operação da ALU é diferente de zero DC: Carry/Borrow de dígito. Para borrow o sinal é inverso o 1 = houve transporte do 4o. para o 5o. bit o 0 = não houve transporte do 4o. para o 5o. bit C: Carry/Borrow . Para borrow o sinal é inverso o 1 = houve transporte do 8o. bit o 0 = não houve transporte do 8o. bit O conjunto de instruções do core PIC16 é composto de 35 instruções, apresentadas a seguir. O campo “Sintaxe” mostra a forma de se escrever a instrução. O campo “Operadores” indica quais os operadores envolvidos e quais seus domínios. “Operação” apresenta a operação realizada pela instrução. O campo “Flags Afetados” mostra quais flags de STATUS são afetados pela execução da operação; essas alterações são comentadas abaixo dos quadros. No campo “Ciclos” está o número de ciclos de máquina gastos para a execução da instrução. Finalmente, o campo “Exemplo” apresenta um exemplo simples de utilização da instrução. As instruções são divididas, conforme sua função, nos seguintes tipos: • • • • Manipulação de byte Manipulação e bit Matemáticas Lógicas Exsto Tecnologia 38
  • 39. Microcontroladores PIC16F877A • • • Testes e desvios condicionais Chamadas e desvio (controle de fluxo) Controle (da CPU) No anexo A existe uma tabela resumo de todas as instruções. Recomenda-se tirar uma cópia desta pagina e tela sempre à mão para consulta rápida. 2.11.1 Manipulação de Byte As instruções de manipulação de byte permitem atribuir valores a endereços da RAM e ao registro W. É importante ressaltar que apesar de normalmente o mnemônico dessas instruções trazer a palavra move (mover) o valor do registro é na verdade copiado, isto é, o registro de destino recebe o valor do registro de origem, mas o valor da origem não é alterado. CLRW "Zera" o registro W. O bit Z do registro STATUS é setado. Sintaxe CLRW Operadores Nenhum Operação (W) 00h Flags Afetados Z Ciclos 1 Exemplo CLRW Alterações nas Flags: Como a instrução resultou em um registro se tornar 0, o bit Z é setado indicando esse evento. CLRF "Zera" o registro indicado por f. O bit Z do registro STATUS é setado. Sintaxe CLRF f Operadores 0 ≤ f ≤ 127 Operação (f) 00h Flags Afetados Z Ciclos 1 Exemplo CLRF TEST Alterações nas Flags: Como a instrução resultou em um registro se tornar 0, o bit Z é setado indicando esse evento. MOVLW Move a constante k para W. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo MOVLW k 0 ≤ k ≤ 255 (W) k Nenhum 1 MOVLW 35h Exsto Tecnologia 39
  • 40. Microcontroladores PIC16F877A MOVF Move o valor do registro (f) para o destino. Se d é 0 destino é W; se d é 1 o destino é o próprio registro (f). Mover o valor do registro para ele mesmo é útil para testarmos se o valor é 0, uma vez que essa instrução afeta o bit Z do registro STATUS. Sintaxe Operadores MOVF f, d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (f) Z 1 MOVF TEST,0 Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: Z = 0: o valor movido, é diferente de zero. Z = 1: o valor movido, é 0. MOVWF Move o conteúdo de W para o registro f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo 2.11.2 MOVWF f 0 ≤ f ≤ 127 (f) W Nenhum 1 MOVWF TEST Manipulação de bit As operações de manipulação de bit são uma particularidade dos microcontroladores e dificilmente são encontradas em outros sistema computacionais. Sua função é permitir alterar o valor de um único bit de um determinado registro, sem qualquer influência nos demais bits. BCF "Zera" o bit b do registro f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo BCF f, b 0 ≤ f ≤ 127 0≤b≤7 f[b] 0 Nenhum 1 BCF CONTROLE,5 Exsto Tecnologia 40
  • 41. Microcontroladores PIC16F877A BSF "Seta" o bit b do registro f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo 2.11.3 BSF f, b 0 ≤ f ≤ 127 0≤b≤7 f[b] 1 Nenhum 1 BSF CONTROLE,7 Matemáticas As instruções matemáticas são capazes de realizar operações matemáticas básicas através da operação da ALU do microcontrolador. Como trata-se de um microcontrolador de 8 bits essas operações tem operadores e resultados de 8 bits. Para cálculos com valores maiores de 8 bits devese desenvolver rotinas fazendo uso das instruções básicas. Da mesma forma, operações mais complexas podem ser construídas a partir das rotinas básicas. Essa raciocínio se aplica para operações de multiplicação e divisão, que não suportadas pela ALU do PIC16. ADDLW Realiza a adição do valor contido em W com a constante k. O resultado é armazenado em W. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: ADDLW k 0 ≤ k ≤ 255 (W) (W) + k C, DC, Z 1 ADDLW 35h C = 1: o resultado da adição é maior que 255. C = 0: o resultado da adição é menor ou igual a que 255. DC = 1: o resultado da adição causou o transporte de 4o para o 5o bit DC = 0: o resultado da adição não causou o transporte de 4o para o 5o bit Z = 0: o resultado da adição é diferente de zero. Z = 1: o resultado da adição é 0. Pode ocorrer com 128 + 128 = 256: C=1 e o resultado da adição é igual a 0. ADDWF Realiza a adição do valor contido em W com o valor do registro f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro f. Exsto Tecnologia 41
  • 42. Microcontroladores PIC16F877A Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: ADDWF f, d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (W) + (f) C, DC,Z 1 ADDWF TEST,0 C = 1: o resultado da adição é maior que 255. C = 0: o resultado da adição é menor ou igual a que 255. DC = 1: o resultado da adição causou o transporte de 4o para o 5o bit DC = 0: o resultado da adição não causou o transporte de 4o para o 5o bit Z = 0: o resultado da adição é diferente de 0. Z = 1: o resultado da adição é 0. Pode ocorre com 128 + 128 = 256: C=1 e o resultado da adição é igual a 0. DECF Decrementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: DECF f,d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (f) – 1 Z 1 DECF COUNT,0 Z = 0: o resultado do decremento é diferente de zero. Z = 1: o resultado do decremento é 0 (quando o valor original for igual a 1). INCF Incrementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo INCF f,d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (f) + 1 Z 1 INCF COUNT,0 Exsto Tecnologia 42
  • 43. Microcontroladores PIC16F877A Alterações nos Flags: Z = 0: o resultado do incremento é diferente de zero. Z = 1: o resultado do incremento é igual a 0 (quando o valor original for igual a 255). SUBLW O valor contido em W é subtraído, pelo método do complemento 2, da constante de oito bits k. O Resultado é armazenado em W. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: SUBLW k 0 ≤ k ≤ 255 (W) k - (W) C, DC, Z 1 SUBLW 23h ATENÇÃO: nessa operação os bits C e DC tem significado inverso ao que seria esperado, isto é, quando ocorre um borrow ("estouro para menos"), os bits C e DC ficam em zero, ao contrário que quando ocorre um Carry ("estouro para mais"), quando C e DC ficam em 1. C = 1: o resultado da subtração é maior ou igual a 0. C = 0: o resultado da subtração é menor a 0. DC = 1: o resultado da subtração não causou o transporte de 5o para o 4o bit DC = 0: o resultado da subtração causou o transporte de 4o para o 5o bit Z = 0: o resultado da subtração é diferente de zero. Z = 1: o resultado da subtração é igual a 0. SUBWF O valor contido em W é subtraído, pelo método do complemento 2, do valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: SUBWF f,d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (W) (f) - (W) C, DC, Z 1 SUBWF TEST,0 ATENÇÃO: nessa operação os bits C e DC têm significado inverso ao que seria esperado, isto é, quando ocorre um borrow ("estouro para menos"), os bits C e DC ficam em zero, ao contrário que quando ocorre um Carry ("estouro para mais"), quando C e DC ficam em 1. Exsto Tecnologia 43
  • 44. Microcontroladores PIC16F877A C = 1: o resultado da subtração é maior ou igual a 0. C = 0: o resultado da subtração é menor a 0. DC = 1: o resultado da subtração não causou o transporte de 5o para o 4o bit. DC = 0: o resultado da subtração causou o transporte de 4o para o 5o bit. Z = 0: o resultado da subtração é diferente de zero. Z = 1: o resultado da subtração é igual a 0. 2.11.4 Lógicas Assim como as instruções matemáticas, as instruções lógicas realizam operações lógicas básicas fazendo uso da ALU. ANDLW Realiza uma operação lógica "E" entre o valor contido em W e a constante k. O resultado é armazenado em W. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: Z = 0: Z = 1: ANDLW k 0 ≤ k ≤ 255 (W) (W) E k Z 1 ANDLW 0Fh o resultado da operação "E" é diferente de zero. o resultado da operação "E" é igual a 0. ANDWF Realiza a operação "E" entre o valor contido em W o valor contido no registro f. O resultado é armazenado no destino: 0 para W ou 1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: ANDWF f, d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (W) E (f) Z 1 ANDWF TEST,1 Z = 0: o resultado da operação "E" é diferente de zero. Z = 1: o resultado da operação "E" é igual a 0. Exsto Tecnologia 44
  • 45. Microcontroladores PIC16F877A COMF Complementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: COMF f,d 0 ≤ f ≤ 127 d=0:W d = 1 :registro f (d) complemento de (f) Z 1 COMF TESTE,1 Z = 0: o resultado do complemento é diferente de zero. Z = 1: o resultado do complemento é 0. O complemento de 255 (11111111b) é 0 (00000000b). IORLW Realiza uma operação "OU" bit a bit entre o valor contido em W e a constante k. O resultado é armazenado em W. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: IORLW k 0 ≤ k ≤ 255 (W) (W) OU (f) Z 1 IORLW TEST Z = 0 o resultado da operação "OU" é diferente de zero. Z = 1 o resultado da operação "OU" é igual a 0 (0 OU 0 é igual a zero) IORWF Realiza a operação "OU" bit a bit entre o valor contido em W com o valor do registro indicado por f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: [label] IORWF 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (W) OU (f) Z 1 IORWF TEST,1 f, d Z = 0 o resultado da operação "OU" é diferente de zero. Z = 1 o resultado da operação "OU" é igual a 0 (0 OU 0 é igual a zero). Exsto Tecnologia 45
  • 46. Microcontroladores PIC16F877A RLF O valor contido em f é rotacionado para a esquerda através do bit de Carry (bit C do registro STATUS). O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. A operação de rotação a esquerda consiste no deslocamento sucessivo de bits de sua posição inicial para a posição consecutiva de modo que o último bit do registro f vá para C e o bit que estava em C vá para o primeiro bit do registro f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo RLF f,d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f veja a figura abaixo C 1 RLF TEST,1 C Registro f Alterações nas Flags: C passa conter o valor (0 ou 1) do 8 bit do registro f. RRF O valor contido em f é rotacionado para a direita através do bit de Carry (bit C do registro STATUS). O resultado é armazenado no destino: 0 para W ou 1 para o registro designado por f. A operação de rotação a direita consiste no deslocamento sucessivo de bits de sua posição inicial para a posição consecutiva de modo que o primeiro bit do registro f vá para C e o bit que estava em C vá para o último bit do registro f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo RRF f,d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f veja a figura abaixo C 1 RRF TEST,1 C Registro f Alterações nas Flags: C passa a conter o valor (0 ou 1) do registro f. Exsto Tecnologia 46
  • 47. Microcontroladores PIC16F877A SWAPF O nibble (conjuntos de 4 bits) mais significativo e o menos significativo do registro f são trocados. Ou seja, os bits de 7 a 4 vão para as posições de 3 a 0 e os bits de 3 a 0 vão para as posições de 7 a 4. A figura abaixo ilustra esse processo. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo SWAPF f,d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f Destino [7:4] f [3:0] Destino [3:0] f [7:4] Nenhum 1 SWAPF TEST,1 XORLW Realiza uma operação "OU exclusivo" entre o valor contido em W e a constante de oito bits k. O resultado é armazenado em W. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: XORLW k 0 ≤ k ≤ 255 (W) (W) XOU (f) Z 1 XORLW OFh Z = 0: o resultado da operação "OU exclusivo" é diferente de zero. Z = 1: o resultado da operação "OU exclusivo" é 0 (um valor "OU-exclusivo" consigo mesmo é igual a zero). XORWF Realiza a operação "OU exclusivo" entre o valor contido em W com o valor do registro indicado por f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores XORWF 0 ≤ f ≤ 127 d= 0 → W f, d Exsto Tecnologia 47
  • 48. Microcontroladores PIC16F877A Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: d=1 → registro f (d) ← (W) XOU (f) Z 1 XORWF TEST,0 Z = 0: o resultado da operação "OU exclusivo" é diferente de zero. Z = 1: o resultado da operação "OU exclusivo" é 0 (um valor "OU-exclusivo" consigo mesmo é igual a zero). 2.11.5 Testes BTFSC Testa o bit b do registro f : se o bit for '1' a próxima instrução é executada; se o bit for '0' a próxima instrução não é executada, em seu lugar é executada uma instrução NOP, seguindo o programa na segunda instrução após a BTFSC. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo BTFSC f, b 0 ≤ f ≤ 127 0≤ b≤7 se f[b]=0 salta a próxima instrução nenhum se o bit não estiver em 1; se o bit estiver em 1. BTFSC STATUS,Z GOTO ZERO BTFSS Testa o bit b do registro f : se o bit for '0' a próxima instrução é executada; se o bit for '1' a próxima instrução não é executada, em seu lugar é executada uma instrução NOP, seguindo o programa na segunda instrução após a BTFSS. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo BTFSS f, b 0 ≤ f ≤ 127 0≤ b≤7 se f[b]=1 salta a próxima instrução Nenhum se o bit não estiver em 1; se o bit estiver em 1. BTFSS STATUS,Z GOTO NO_ZERO DECFSZ Decrementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Se o resultado for diferente de 0 a próxima instrução é executada; se o resultado for 0 a próxima instrução não é executada, em seu lugar é executada uma instrução NOP, seguindo o programa na segunda instrução após a DECFSZ. Exsto Tecnologia 48
  • 49. Microcontroladores PIC16F877A Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo DECFSZ f,d 0 ≤ f ≤ 127 d=0→W d = 1 → registro f (d) (f) - 1 se f[b] = 1 salta a próxima instrução Nenhum 1 DECFSZ COUNT,1 INCFSZ Incrementa o valor contido no registro f. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Se o resultado for diferente de 0 a próxima instrução é executada; se o resultado for 0 a próxima não é executada, em seu lugar é executada uma instrução NOP e o seguindo o programa na segunda instrução após a INCFSZ. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo 2.11.6 INCFSZ f,d 0 ≤ f ≤ 127 d= 0 → W d=1 → registro f (d) ← (f)+1 se f[b]=1 salta a próxima instrução Nenhum 1 INCFSZ COUNT,1 Chamadas e desvio CALL Chamada de sub-rotina. O endereço de retorno (próxima instrução) é guardado no topo da pilha (TOS) e um valor de 11 bits é carregado nos bits menos significativos do PC (PC[10:0]), fazendo a seqüência do programa ser transferida para o endereço indicado por k. Os bits superiores do PC (PC[12:11]) são carregados a partir de PCLATH. Ver tópico "Desvio X Chamada" para maiores informações. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo CALL k 0 ≤ k ≤ 2047 TOS PC+1 PC[10:0] k PC[12:11] (PCLATCH[4:3]) Nenhum 2 CALL TX_SERIAL Exsto Tecnologia 49