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
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