Você está na página 1de 146

APOSTILA

DE

MICROCONTROLADOR

PIC16F877















Campina Grande 2006
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 2
ndice
1 - Microcontroladores versus Microprocessadores .................... 6
1.1 - Estrutura Bsica de Microcontrolador .................................................................. 6
1.1.1 - Unidade de Memria ......................................................................................... 6
1.1.2 - Unidade Central de Processamento ................................................................. 6
1.1.3 - Bus ...................................................................................................................... 6
1.1.4 - Unidade de entrada/sada ................................................................................. 7
1.1.5 - Interface de Comunicao Serial Sncrona/Assncrona ................................ 7
1.1.6 - Unidade de temporizao ................................................................................. 8
1.1.7 - Watchdog ........................................................................................................... 8
1.1.8 - Conversor analgico digital ........................................................................... 9
2 - PIC 16F877 ................................................................................ 11
2.1 - Introduo ............................................................................................................... 11
2.2 - Arquitetura HAVARD x Von Neumann .............................................................. 12
2.3 - Relgio / Ciclo de Instruo................................................................................... 13
2.4 - Pipelining ................................................................................................................ 13
2.5 - Pinagem ................................................................................................................... 14
2.6 - Gerador de relgio oscilador .............................................................................. 16
2.6.1 - Tipos de osciladores ........................................................................................ 16
2.6.1.2 - Oscilador RC ............................................................................................ 17
2.7 - Reset ........................................................................................................................ 18
2.7.1 - Formas de RESET do PIC 16F877: ............................................................... 18
2.8 - Unidade Central de Processamento ...................................................................... 19
2.9 - Unidade Lgica Aritmtica (ALU) ....................................................................... 20
2.10 - Registrador de Status ........................................................................................... 22
2.11 - Registrador OPTION ........................................................................................... 24
2.12 - Portas ..................................................................................................................... 25
2.12.1 - Porta A ........................................................................................................... 26
2.12.2 - Porta B ............................................................................................................ 26
2.12.3 - Porta C ........................................................................................................... 27
2.12.4 - Porta D ........................................................................................................... 28
2.12.5 - Porta E ............................................................................................................ 29
2.13 - Organizao da memria..................................................................................... 29
2.13.1 - Memria de programa .................................................................................. 29
2.13.3 - Registradores SFR......................................................................................... 30
2.13.4 - Bancos de Memria ....................................................................................... 30
2.13.5 - Contador de Programa ................................................................................. 32
2.13.6 - Pilha ............................................................................................................... 32
2.13.7 - Programao no Sistema .............................................................................. 32
2.13.8.1 - Endereamento Direto ............................................................................ 32
2.13.8.2 - Endereamento Indireto.......................................................................... 33
3 - Interrupes .............................................................................. 35
3.1 - Registrador INTCON (endereo 0Bh).................................................................. 36
3.2 - Registrador PIE1 (endereo 8Ch) ......................................................................... 37
3.3 - Registrador PIR1 (endereo 0Ch) ........................................................................ 38
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 3
3.4 - Registrador PIE2 (endereo 0Ch) ......................................................................... 40
3.5 - Registrador PIR2 (endereo 0Ch) ........................................................................ 41
3.6 - Salvando o contexto da aplicao ......................................................................... 41
3.7 - Interrupo externa no pino RB0/INT do microcontrolador ............................ 44
3.8 - Interrupo devido ao overflow do contador TMR0 ...................................... 44
3.9 - Interrupo por variao nos pinos 4, 5, 6 e 7 do porto B .................................. 44
3.10 - Interrupo por fim de escrita na EEPROM .................................................... 44
4 - Temporizadores ........................................................................ 47
4.1 TIMER 0 ................................................................................................................. 47
4.1.1 Interrupo do Timer 0 .................................................................................. 48
4.1.2 Pr-escalonador .............................................................................................. 48
4.1.3 Registradores associados ao Timer 0 ............................................................ 48
4.2 TIMER 1 ................................................................................................................. 50
4.2.1 Resetando o Timer 1 usando uma sada de Trigger do mdulo CCP ........ 51
4.2.2 Pr-escalonador do Timer 1........................................................................... 51
4.2.3 Registrador de controle do Timer 1 T1CON (endereo 10h) .................. 51
4.2.4 Registradores associados ao Timer 1 (modos Timer/Contador) ................ 52
4.3 TIMER 2 ................................................................................................................. 52
4.3.1 Pr-Escalonador e Ps-Escalonador do Timer 2 ......................................... 53
4.3.2 Registrador de Controle do Timer 2 T2CON (endereo 12h) ................. 53
4.3.3 Registradores associados com o Timer 2 (modos Timer/Contador) .......... 54
5 Mdulo de Captura, Comparao e PWM ........................... 55
5.1 Mdulo CCP1 ......................................................................................................... 55
5.2 Mdulo CCP2 ......................................................................................................... 55
5.3 Registradores de Controle CCP1CON e CCP2CON (endereos 17h e 1Dh) ... 55
5.4 Modo Captura ........................................................................................................ 56
5.4.1 Pr-escalonador do mdulo CCP .................................................................. 57
5.6 Modo PWM ............................................................................................................ 57
5.7 Registradores associados com o PWM e Timer 2 ............................................... 59
5.8 Registradores associados com o Capture, Compare e Timer 1 ......................... 59
6 CONVERSOR A/D .................................................................. 60
6.1 - Diagrama de blocos do conversor A/D ................................................................. 62
6.2 - Registrador ADCON0 - Controla a operao do mdulo A/D (endereo 1Fh).
.......................................................................................................................................... 63
6.3 - Registrador ADCON1 Configura a funo dos pinos das portas (A e E)
(endereo 9Fh) ................................................................................................................ 63
6.4 - Registradores associados com o mdulo do conversor A/D ............................... 65
7 - Comunicao Serial .................................................................. 66
7.1 - Conceitos ................................................................................................................. 66
7.1.1 - Canais de Comunicao .................................................................................. 66
7.1.2 - Comunicao Serial ........................................................................................ 66
7.1.3 - Taxa de Transferncia (Baud Rate) .............................................................. 66
7.1.4 - Transmisso Assncrona x Transmisso Sncrona ....................................... 67
7.1.5 - Checksum e Paridade ..................................................................................... 68
7.1.6 - Interface Serial RS232 (EIA232) ................................................................... 69
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 4
7.1.6.1 - O que RS232 ? ........................................................................................ 69
7.1.6.2. - Definio de Sinais ................................................................................... 70
7.1.6.3 - Pinagem ..................................................................................................... 71
7.1.6.4 - Caractersticas dos Sinais ......................................................................... 72
7.2 Mdulo USART do PIC ........................................................................................ 74
7.2.1 - USART - Modo Assncrono ............................................................................ 74
7.2.1.1 - Registrador de Controle e Status da Transmisso (End. 98H) ............... 75
7.2.1.2 - Registrador de Controle e Status da Recepo (End. 18H) ..................... 76
7.2.1.3 - Registradores associados com a transmisso assncrona ........................ 77
7.2.1.4 - Registradores associados com a recepo assncrona ............................. 78
8 - Memria de dados EEPROM .................................................. 79
8.1 - Lendo a Memria EEPROM ................................................................................. 80
8.3 - Escrevendo na Memria EEPROM...................................................................... 80
9 - Programao em Linguagem Assembly ................................. 82
9.1 - Introduo ............................................................................................................... 82
9.2 - Linguagem Assembly ............................................................................................. 83
9.2.1 - Instrues ......................................................................................................... 83
9.2.2 - Operandos ........................................................................................................ 84
9.2.3 - Comentrios ..................................................................................................... 84
9.2.4 - Diretivas ........................................................................................................... 84
9.2.5 - Diretivas de controle ....................................................................................... 86
9.2.5.1 - #DEFINE Troca de uma poro de texto por outra ................................ 86
9.2.5.2 - INCLUDE Incluir um arquivo adicional ................................................. 86
9.2.5.4 - VARIABLE Atribui um valor numrico varivel designao textual .. 87
9.2.5.5 - SET Definir uma varivel assembler ........................................................ 87
9.2.5.6 - EQU Definindo uma constante em assembler ......................................... 88
9.2.5.8 - END Fim do programa ............................................................................. 88
9.2.6 - Instrues condicionais ................................................................................... 89
9.2.6.1 - IF Ramificao condicional do programa ............................................... 89
9.2.6.2 - ELSE Assinala um bloco alternativo se a condio termo_condicional
presente em 'IF' no se verificar ............................................................................ 89
9.2.6.3 - ENDIF Fim de uma seo condicional do programa ............................. 89
9.2.6.5 - ENDW Fim da parte condicional do programa ....................................... 90
9.2.6.6 - IFDEF Executar uma parte do programa se um smbolo estiver definido
.................................................................................................................................. 91
9.2.6.7 - IFNDEF Execuo de uma parte do programa se o smbolo no tiver
sido definido ............................................................................................................. 91
9.2.7 - Diretivas de Dados ........................................................................................... 91
9.2.7.1 - CBLOCK Definir um bloco para as constantes nomeadas ..................... 91
9.2.7.2 - ENDC Fim da definio de um bloco de constantes ............................... 92
9.2.7.3 - DB Definir um byte de dados .................................................................... 92
9.2.7.4 - DE Definir byte na memria EEPROM ................................................ 93
9.2.7.5 - DT Definindo uma tabela de dados .......................................................... 93
9.2.8 - Configurando uma diretiva ............................................................................ 93
9.2.8.1 - __CONFIG Estabelecer os bits de configurao ..................................... 93
9.2.8.2 - PROCESSOR Definindo o modelo de microcontrolador ........................ 94
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 5
9.2.10 - Arquivos criados ao compilar um programa .............................................. 95
9.2.11 - Macros ............................................................................................................ 95
10 - MPLAB .................................................................................... 97
10.1 - Introduo ............................................................................................................. 97
10.2 Instalando o programa - MPLAB ......................................................................... 97
10.2.1 - Instalao do MPLAB ................................................................................... 97
10.3 - MPLAB .............................................................................................................. 102
10.3.1 - Escolhendo o modo de desenvolvimento ................................................... 102
10.3.2 - Implementando um projeto ........................................................................ 103
10.3.3 - Criando um novo arquivo assembler (escrevendo um novo programa) 106
10.3.4 - Escrevendo um programa .......................................................................... 107
10.3.5 - Simulador MPSIM ...................................................................................... 108
10.3.6 - Barra de ferramentas .................................................................................. 110
11 Compilador CCS .................................................................. 114
11.1 - Elaborao de um programa para o PIC usando o ambiente de
desenvolvimento PIC C. ............................................................................................... 114
11.2 - Descrio dos comandos e diretivas .................................................................. 126
12 - Conjunto de Instrues da Famlia PIC16Fxxx de
Microcontroladores ...................................................................... 130
12.1 - Transferncia de dados ...................................................................................... 130
12.2 - Lgicas e aritmticas .......................................................................................... 130
12.3 - Operaes sobre bits .......................................................................................... 130
12.4 - Direo de execuo de um programa.............................................................. 130
12.5 - Perodo de execuo da instruo ..................................................................... 131
12.6 - Listagem das instrues ..................................................................................... 131
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 6
1 - Microcontroladores versus Microprocessadores
Um microcontrolador difere de um microprocessador em vrios aspectos. Primeiro e o mais
importante, a sua funcionalidade. Para que um microprocessador possa ser usado, outros
componentes devem ser associados a este, por exemplo, memria e perifricos de
comunicao. Por outro lado, o microcontrolador foi projetado para ter tudo num s
dispositivo, assim, pouco ou mesmo nenhum outro componente externo necessrio nas
aplicaes, uma vez que todos os perifricos necessrios j esto contidos nele.

1.1 - Estrutura Bsica de Microcontrolador
1.1.1 - Unidade de Memria
Responsvel pelo armazenamento de dados e o firmware (programas embarcados) do
sistema.

Figura 1 Unidade de Memria
1.1.2 - Unidade Central de Processamento
Responsvel pela execuo das instrues, podendo esta ser dividida em vrias etapas de
execuo. Possui um conjunto de unidades de armazenamento temporrio denominadas de
registradores.

Figura 2- Unidade Central de Processamento (CPU)

1.1.3 - Bus
De forma equivalente memria de sistemas
microprocessados, o acesso as locaes de
memria de um microcontrolador so
gerenciados por sinais de endereo e
controle, indicados na figura 1 pelas setas:


e

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 7
Realiza a interligao entre os blocos internos do microcontrolador, como por exemplo
memria e CPU. Os barramentos so designados de acordo com o tipo de dados que trafega
pelo mesmo, sendo em geral divididos em barramentos de dados (bidirecional), endereo
(unidirecional) e controle (unidirecional).

Figura 3 - Barramentos
1.1.4 - Unidade de entrada/sada
A interao com o meio externo uma das caractersticas dos microcontroladores. Esta
interao realizada atravs das portas de Entrada/Sada, ou simplesmente portas de E/S.
Na maioria dos microcontroladores possvel configurar a funo que os pinos de E/S
desempenharo em um sistema, diferentemente dos microprocessadores, onde a funo dos
pinos definida no instante de fabricao do dispositivo. A cada porta de E/S est
associado um conjunto de registradores responsveis pela configurao dos pinos das
portas e tambm para armazenamento de dados de entrada/sada.

Figura 4- Unidade de Entrada e Sada
1.1.5 - Interface de Comunicao Serial Sncrona/Assncrona
Os microcontroladores apresentam um conjunto de recursos de comunicao que permitem
enviar/receber dados para/de dispositivos que no integram a mesma placa de circuitos do
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 8
microcontrolador. Dado a distncia e o custo e problemas tcnicos de enviar dados de
forma paralela (por vrios caminhos paralelos) a longas distncias, esta se da de forma
serial, atravs de uma mesma linha (Half-Duplex) ou duas linhas (Full-Duplex), segundo
protocolos de comunicao como o NRZ (Non Return Zero), que utilizado pelo padro
RS232. Em sistemas sncronos, onde o sinal de relgio do dispositivo responsvel pelo
controle do fluxo de dados na rede de comunicao deve enviar este sinal, utilizada uma
linha a mais, denominada de linha de Clock.


Figura 5 Interface de Comunicao Serial

1.1.6 - Unidade de temporizao
Os microcontroladores em geral possuem blocos para gerao de sinais ou mesmo
identificao de eventos, ou instantes de ocorrncia de eventos, onde se faz necessrio uma
base de tempo precisa. Para atender a esta demanda, so encontrados nesses dispositivos,
unidades de temporizao com possibilidade de configurao atravs de registros, os quais
permitem definir, entre outras coisas: escalonamento de clock, perodos de contagem de
tempo, etc.

Figura 6 Unidade de Temporizao
1.1.7 - Watchdog
Como os microcontroladores so indicados para uso em sistemas autnomos, onde em geral
no h a superviso contnua de um operador, faz-se necessrio garantir que a execuo do
programa embarcado (firmware), ocorra sem travamento ou funcionamento esprio,
comportamentos que podem ser provocados por interferncia, comuns em ambientes
industriais. O WatchDog o bloco responsvel por garantir que na eventualidade de uma
falha de execuo ou mesmo travamento do sistema, este possa ser reiniciado para voltar
operao em condies normais. Para isso, o bloco de WatchDog conta com um contador,
cuja contagem periodicamente zerada em situao de operao normal e nas situaes de
falha, a mesma estoura (overflow), provocando um RESET no sistema.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 9

Figura 7 Bloco WatchDog

1.1.8 - Conversor analgico digital
Os microcontroladores, como os microprocessadores, so dispositivos digitais, assim, s
conseguem processar dados que estejam em formato digital e binrio. As grandezas fsicas
que representam as informaes a serem processadas, em geral so contnuas, desta forma,
faz-se necessrio converte-las para o formato digital binrio, atravs de um processo de
converso Analgica/Digital. Todos os microcontroladores possuem conversores A/D
internos, diferindo apenas em tamanho da palavra digital gerada e velocidade. Quanto
maior a palavra digital gerada por um conversor A/D, maior ser a resoluo obtida na
converso, ou seja, menor ser a quantidade fsica representada por cada bit da palavra
binria.

Figura 8 - Conversor Analgico/Digital
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 10


Figura 9 Estrutura simplificada de microcontrolador

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 11
2 - PIC 16F877
2.1 - Introduo
O PIC 16F877 pertence a uma classe de microcontroladores de 8 bits, com uma arquitetura
RISC. Os blocos bsicos da estrutura genrica so apresentados a seguir:.

Memria de programa (FLASH) - para armazenar o firmware. Como a memria fabricada
com tecnologia FLASH pode ser programada e apagada mais que uma vez, ela torna-se
adequada para o desenvolvimento de novos projetos.

EEPROM - Memria onde so armazenados os dados que necessitam ser preservados
quando a alimentao desligada. Normalmente usada para guardar dados importantes,
como por exemplo, dados de configurao de dispositivos perifricos gerenciados pelo
microcontrolador, set points, etc.

RAM - Memria onde so armazenadas variveis temporrias, usadas em tempo de
processamento, cujos valores podem ser perdidos quando ocorre o desligamento de energia
do dispositivo, sem prejuzo a operao normal do sistema

Portas: A, B, C, D e E - So ligaes fsicas entre o microcontrolador e o mundo exterior.
O nmero de pinos e descrio dos mesmos, para cada porta sero abordados a frente.

Contador/Temporizador - um registro de 8/16 bits no interior do microcontrolador, que
trabalha independentemente do programa. No fim de cada conjunto de quatro ciclos de
relgio do oscilador, ele incrementa o valor armazenado, at atingir o valor mximo
(255/65535), neste instante, a contagem recomea a partir de zero. Uma aplicao imediata
dos temporizadores na medio de intervalos de tempo, j que conhecido o tempo exato
entre dois incrementos sucessivos do contedo dos mesmos.

Portas de Comunicao So interfaces que permitem a troca de dados com outros
dispositivos ou sistemas, por meio de protocolos predefinidos. As interfaces so divididas
em Serial (sncrona e assncrona) e Paralela.

Conversor Analgico/Digital (CA/D) - O conversor A/D interno pode realizar a
digitalizao de um conjunto de at oito sinais analgicos, conectados as entradas
analgicas multiplexadas do microcontrolador. So geradas palavras digitais de 10 bits a
taxas de at 10KSamples/s. A taxa limitada basicamente pelo tempo necessrio para
comutar entre os canais analgicos, sem que haja a contaminao entre os sinais de canais
adjacentes.

Unidade Central de Processamento - Faz a conexo com todos os outros blocos do
microcontrolador. Coordena o trabalho dos outros blocos e executa o firmware.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 12


Figura 10 - Esquema simplificado do microcontrolador PIC16F877

2.2 - Arquitetura HAVARD x Von Neumann
A arquitetura Harvard uma topologia mais recente que a de Von-Neumann. Ela adveio da
necessidade de disponibilizar microcontroladores com capacidade de processamento maior,
sem que necessariamente fossem elevadas as freqncias de clock. Na arquitetura Harvard,
a memria de dados est separada da memria de programa. Assim, possvel uma maior
fluncia de dados atravs da unidade central de processamento e, claro, uma maior
velocidade de funcionamento. A separao da memria de dados da memria de programa,
faz com que as instrues possam ser representadas por palavras de mais que 8 bits. O
PIC16F877, usa 14 bits para cada instruo, o que permite que todas as instrues ocupem
uma s palavra de instruo. tambm tpico da arquitetura Harvard ter um repertrio com
menos instrues que a de Von-Neumann, instrues essas, geralmente executadas apenas
num nico ciclo de relgio. Este nmero reduzido de instrues o que permite classificar
o microcontrolador PIC como sendo um dispositivo RISC.


Figura 11 - Arquiteturas Harvard versus Von Neumann

O termo RISC provm de Computador com um Conjunto Reduzido de Instrues"
(Reduced Instruction Set Computer). Os microcontroladores com uma arquitetura Von-
Neumann so geralmente dispositivos com um Conjunto Complexo de Instrues
(Complex Instruction Set Computer), sendo designados por dispositivos CISC.
Como o PIC16F877 um microcontrolador RISC, disso resulta que possui um nmero
reduzido de instrues, mais precisamente 35 (por exemplo, os microcontroladores da Intel
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 13
e da Motorola tm mais de cem instrues). Todas estas instrues so executadas num
nico ciclo, exceto no caso de instrues de salto e de ramificao. De acordo com
informaes do fabricante (MICROCHIP), o PIC16F877 geralmente atinge resultados de 2
para 1 na compresso de cdigo e 4 para 1 na velocidade, em relao aos outros
microcontroladores de 8 bits da sua classe.

2.3 - Relgio / Ciclo de Instruo
O relgio (clock), quem determina o passo com que as instrues sero executadas pelo
microcontrolador. O clock do oscilador, ligado ao microcontrolador atravs dos pinos
OSC1/OSC2. Dentro do microcontrolador o sinal de relgio dividido em quatro fases, Q1,
Q2, Q3 e Q4 que no se sobrepem. Estas quatro pulsaes perfazem um ciclo de instruo
(tambm chamado ciclo de mquina) e durante o qual uma instruo executada.
A execuo de uma instruo, antecedida pela leitura da instruo que est na linha
seguinte. O cdigo da instruo lido da memria de programa em Q1 e escrito no
registro de instruo em Q4.
A decodificao e execuo dessa mesma instruo, faz-se entre as fases Q1 e Q4 seguintes.
No diagrama abaixo, podemos observar a relao entre o ciclo de instruo e o clock do
oscilador (OSC1/OSC2) assim como as fases Q1-Q4.
O contador de programa (Program Counter ou PC) guarda o endereo da prxima instruo
a ser executada.

Figura12 Ciclo de Instruo
2.4 - Pipelining
Cada ciclo de instruo inclui as fases Q1, Q2, Q3 e Q4. A LEITURA do cdigo de uma
instruo da memria de programa, feita num ciclo de instruo, enquanto que a sua
decodificao e execuo, so feitos no ciclo de instruo seguinte. Contudo, devido
sobreposio pipelining (o microcontrolador ao mesmo tempo em que executa uma
instruo extrai simultaneamente da memria o cdigo da instruo seguinte), podemos
considerar que, para efeitos prticos, cada instruo demora um ciclo de instruo para ser
executada. No entanto, se a instruo provocar uma mudana no contedo do contador de
programa (PC), ou seja, se o PC no tiver que apontar para o endereo seguinte na memria
de programa, mas sim para outro (como no caso de saltos ou de chamadas de subrotinas),
ento dever considerar-se que a execuo desta instruo demora dois ciclos. Isto acontece,
porque a instruo vai ter que ser processada de novo, mas, desta vez, a partir do endereo
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 14
correto. O ciclo de chamada comea na fase Q1, escrevendo a instruo no registro de
instruo (Instruction Register IR). A decodificao e execuo continuam nas fases Q2,
Q3 e Q4 do clock.


Figura 13 - Fluxograma das Instrues no Pipeline

TCY0: lido da memria o cdigo da instruo MOVLW 55h (no nos interessa a
instruo que foi executada, por isso no est representada por retngulo);
TCY1: executada a instruo MOVLW 55h e lida da memria a instruo MOVWF
PORTB;
TCY2: executada a instruo MOVWF PORTB e lida a instruo CALL SUB_1;
TCY3: executada a chamada (CALL) de uma subrotina CALL SUB_1 e lida a
instruo BSF PORTA,BIT3. Como esta instruo no a primeira instruo da subrotina
SUB_1, cuja execuo o que vem a seguir, a leitura de uma instruo tem que ser feita de
novo. Este um bom exemplo de uma instruo a precisar de mais que um ciclo.
TCY4: este ciclo de instruo totalmente usado para ler a primeira instruo da subrotina
no endereo SUB_1;
TCY5: executada a primeira instruo da subrotina SUB_1 e lida a instruo seguinte.

2.5 - Pinagem
O PIC16F877 tem um total de 40 pinos (encapsulamento PDIP), divididos entre 5 portas,
cujos pinos podem desempenhar um conjunto de funes, selecionadas atravs de registros
de configurao.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 15

Figura 14 Pinagem do 16F877
Os pinos no microcontrolador PIC16F877, tm o seguinte significado:
Pino Funo
1 MCLR - Entrada de reset ou entrada da tenso de programao Vpp do
microcontrolador.
2 Pino RA0 Digital E/S ou entrada analgica 0
3 Pino RA1 Digital E/S ou entrada analgica 1
4 Pino RA2 Digital E/S, ou entrada analgica 2, ou entrada de tenso de referncia
(low) do conversor A/D ou sada V
REF
do comparados.
5 Pino RA3 Digital E/S, ou entrada analgica 3, ou entrada de tenso de referncia
(high) do conversor A/D.
6 Pino RA4 Digital E/S (open-drain quando configurado como sada) ou entrada de
clock externo do Timer0 ou sada do comparador 1.
7 Pino RA5 Digital E/S, ou entrada analgica 4, ou entrada de seleo bloco SPI
(modo Slave) ou sada do comparador 2.
8 Pino RE0 Digital E/S, ou entrada analgica 5 ou entrada de controle de leitura da
porta paralela escrava
9 Pino RE1 Digital E/S, ou entrada analgica 6 ou entrada de controle de escrita da
porta paralela escrava
10 Pino RE2 Digital E/S, ou entrada analgica 7 ou entrada de controle de chip select
da porta paralela escrava
11 Tenso positiva de alimentao para circuitos lgicos e pinos de E/S
12 Referncia de terra dos circuitos lgicos e pinos de E/S
13 Entrada para conexo de cristal oscilador ou entrada de sinal de clock externo
14 Entrada para conexo de cristal oscilador ou entrada de sinal de clock externo
(associada entrada OSC1).
15 Pino RC0 Digital E/S, ou sada do Timer1 ou entrada de clock externo para
Timer1
16 Pino RC1 Digital E/S, ou entrada do oscilador do Timer1, ou entrada do bloco
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 16
Capture 2, ou sada do bloco Compare 2 ou sada PWM 2.
17 Pino RC2 Digital E/S, ou entrada do bloco Capture 1, ou sada do bloco
Compare 1 ou sada PWM 1.
18 Pino RC3 Digital E/S, ou sada/entrada de clock para serial sncrona do bloco SPI
ou sada/entrada de clock para serial sncrona do bloco I
2
C.
19 Pino RD0 Digital E/S ou pino de E/S da porta paralela escrava.
20 Pino RD1 Digital E/S ou pino de E/S da porta paralela escrava.
21 Pino RD2 Digital E/S ou pino de E/S da porta paralela escrava.
22 Pino RD3 Digital E/S ou pino de E/S da porta paralela escrava.
23 Pino RC4 Digital E/S, ou entrada de dados SPI ou E/S de dados I
2
C.
24 Pino RC5 Digital E/S ou sada de dados SPI.
25 Pino RC6 Digital E/S, ou TX USART ou sinal de clock para USART sncrona.
26 Pino RC7 Digital E/S, ou RX USART ou E/S de dados para USART sncrona.
27 Pino RD4 Digital E/S ou pino de E/S da porta paralela escrava.
28 Pino RD5 Digital E/S ou pino de E/S da porta paralela escrava.
29 Pino RD6 Digital E/S ou pino de E/S da porta paralela escrava.
30 Pino RD7 Digital E/S ou pino de E/S da porta paralela escrava.
31 Referncia de terra dos circuitos lgicos e pinos de E/S
32 Tenso positiva de alimentao para circuitos lgicos e pinos de E/S
33 Pino RB0 Digital E/S ou pino de entrada de interrupo externa.
34 Pino RB1 Digital E/S.
35 Pino RB2 Digital E/S.
36 Pino RB3 Digital E/S ou pino de habilitao de programao em baixa tenso no
modo ICSP.
37 Pino RB4 Digital E/S.
38 Pino RB5 Digital E/S.
39 Pino RB6 Digital E/S ou pino de sinal de clock para programao ICSP e
depurao de cdigo In-Circuit.
40 Pino RB7 Digital E/S ou pino de dados para programao ICSP e depurao de
cdigo In-Circuit.

2.6 - Gerador de relgio oscilador
2.6.1 - Tipos de osciladores
O PIC16F877 pode trabalhar com quatro configuraes de oscilador. Uma vez que as
configuraes com um oscilador de cristal e resistncia-capacitor (RC) so aquelas mais
frequentemente usadas, elas so as nicas que vamos mencionar aqui.
Quando o oscilador de cristal, a designao da configurao de XT, se o oscilador for
uma resistncia em srie com um capacitor, tem a designao RC. Isto importante, porque
h necessidade de optar entre os diversos tipos de oscilador, quando se escolhe um
microcontrolador.

2.6.1.1 - Oscilador XT (Opes: HS, XT ou LP de configurao do tipo de oscilador)
O oscilador de cristal est contido num invlucro de metal com dois pinos onde foi escrita a
freqncia na qual o cristal oscila. Dois capacitores cermicos devem ligar cada um dos
pinos do cristal massa. H modelos em que o cristal e os capacitores esto contidos no
mesmo encapsulamento. Quando projetamos um circuito com microcontrolador, a regra
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 17
colocar o oscilador to perto quanto possvel do microcontrolador, de modo a evitar
qualquer interferncia nas linhas que ligam o oscilador ao microcontrolador.

Figura 15 Oscilador a cristal
2.6.1.2 - Oscilador RC
Em aplicaes em que a preciso da temporizao no um fator crtico, o oscilador RC
torna-se mais econmico. A freqncia de ressonncia do oscilador RC depende da tenso
de alimentao, da resistncia R, capacitncia C e da temperatura de funcionamento.

Figura 16 Oscilador RC

O diagrama acima, mostra como um oscilador RC deve ser ligado a um PIC16F877. Com
um valor para a resistncia R abaixo de 2,2 K, o oscilador pode tornar-se instvel ou pode
mesmo parar de oscilar. Para um valor muito grande R (1M por exemplo), o oscilador
torna-se muito sensvel umidade e ao rudo. recomendado que o valor da resistncia R
esteja compreendido entre 3K e 100K. Apesar de o oscilador poder trabalhar sem capacitor
externo (C = 0 pF), conveniente, ainda assim, usar um capacitor acima de 20 pF para
evitar o rudo e aumentar a estabilidade. Qualquer que seja o oscilador a ser utilizado, a
freqncia de trabalho do microcontrolador a do oscilador dividida por 4. A freqncia de
oscilao dividida por 4 tambm fornecida no pino OSC2/CLKOUT e, pode ser usada,
para testar ou sincronizar outros circuitos lgicos pertencentes ao sistema.


Figura 17 - Relao entre o sinal de clock e os ciclos de instruo

Ao ligar a alimentao do circuito, o oscilador comea a oscilar. Primeiro com um perodo
de oscilao e uma amplitude instveis, mas, depois de algum tempo, o sinal estabiliza.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 18

Figura 18 - Sinal de clock do oscilador do microcontrolador depois de ser ligada a
alimentao

Para evitar que esta instabilidade inicial do clock afete o funcionamento do
microcontrolador, necessrio manter o microcontrolador no estado de reset enquanto o
clock do oscilador no estabiliza. O diagrama em cima, mostra uma forma tpica do sinal
fornecido por um oscilador de cristal de quartzo ao microcontrolador quando se liga a
alimentao.

2.7 - Reset
O reset usado para reiniciar o microcontrolador, colocando-o em um estado conhecido. O
processo de reinicializao pode ser necessrio aps uma falha de operao do
microcontrolador ou quando deseja-se que o mesmo esteja pronto para executar um
programa.
Durante um reset, os locais de memria da RAM (registros) no so alterados. Ou seja, os
contedos destes registros, so desconhecidos durante o restabelecimento da alimentao,
mas mantm-se inalterados durante qualquer outro reset. Ao contrrio dos registros de uso
geral, os SFR (registros com funes especiais) so reiniciados com um valor inicial pr-
definido. Um dos mais importantes efeitos de um reset, carregar no contador de programa
(PC), o valor zero (0000), o que faz com que o programa comece a ser executado a partir da
primeira instruo deste.

2.7.1 - Formas de RESET do PIC 16F877:
a) Reset quando se liga a alimentao, POR (Power-On Reset) Este reset ocorre sempre
que ligada a alimentao do microcontrolador e serve para ajustar todos os registros para
um estado inicial;
b) Reset durante o funcionamento normal, quando o pino MCLR do microcontrolador.
levado para terra (de modo a prevenir a ocorrncia de um zero lgico acidental no pino
MCLR, este deve ser ligado atravs de uma resistor de pull-up ao potncia positivo da
fonte de alimentao.);
c) Reset atravs do pino MCLR, quando o microcontrolador est no modo SLEEP;
d) Reset durante operao normal, quando o temporizador do watchdog (WDT) transborda
(passa para 0 depois de atingir o valor mximo);
e) Reset quando o temporizador do watchdog (WDT) transborda estando no regime de
SLEEP;
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 19
f) Reset quando o valor da alimentao desce abaixo do limite permitido (Brown-out Reset).

O pulso que provoca o reset durante o estabelecimento da alimentao (power-up), gerado
pelo prprio microcontrolador quando detecta um aumento na tenso Vdd (numa faixa
entre 1,2V e 1,8V). Esse pulso tem durao de aproximadamente 72ms, o que, em princpio,
tempo suficiente para que o oscilador estabilize. Esse intervalo de tempo de 72ms
definido por um temporizador interno PWRT, com um oscilador RC prprio. Enquanto
PWRT estiver ativo, o microcontrolador mantm-se no estado de reset. Contudo, quando o
dispositivo est em operao, pode surgir um problema no resultante de uma queda da
tenso para 0 volts, mas sim de uma queda de tenso para um valor abaixo do limite que
garante o correto funcionamento do microcontrolador. Trata-se de um fato muito provvel
de ocorrer na prtica, especialmente em ambientes industriais onde as perturbaes e
instabilidade da alimentao ocorrem frequentemente. Para resolver este problema,
necessrio certificar-se de que o microcontrolador entra no estado de reset cada vez que a
alimentao desce abaixo do limite mnimo pr-ajustado.

Figura 19 - Exemplos de quedas na alimentao abaixo do limite

2.8 - Unidade Central de Processamento
A unidade central de processamento (CPU) o crebro de um microcontrolador. Essa parte
responsvel por extrair a instruo, decodific-la e na seqncia execut-la.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 20

Figura 20 - Esquema da unidade central de processamento CPU

A unidade central de processamento, interliga todas as partes do microcontrolador. Uma
das suas funes mais importante , seguramente, decodificar as instrues do programa.
Quando o programador escreve um programa, as instrues assumem um claro significado
como o caso, por exemplo, de MOVLW 0x20. Contudo, para que um microcontrolador
possa entend-las, esta forma de escrita de uma instruo tem que ser traduzida numa srie
de zeros e uns que o opcode (operation code ou cdigo da operao). Esta passagem de
uma palavra escrita para a forma binria executada por tradutores assembler (ou
simplesmente assembler). O cdigo da instruo extrado da memria de programa, tem
que ser decodificado pela unidade central de processamento (CPU). A cada uma das
instrues do repertrio do microcontrolador, corresponde um conjunto de aes para a sua
execuo. Estas aes, podem envolver transferncias de dados de um local de memria
para outro, de um local de memria para as portas, e diversos clculos, pelo que se conclui
que, a CPU, tem que estar ligada a todas as partes do microcontrolador. Os barramentos de
dados, de endereo e a linhas de controle, so responsveis por isso.

2.9 - Unidade Lgica Aritmtica (ALU)
A unidade lgica aritmtica (ALU Arithmetic Logic Unit), responsvel pela execuo
de operaes de adio, subtrao, deslocamento (esquerda/direita dentro de um registro) e
operaes lgicas. O PIC16F877 contm uma unidade lgica aritmtica de 8 bits e registros
de uso genrico tambm de 8 bits.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 21

Figura 21 - Unidade lgica-aritmtica e como funciona

Por operando designa-se o contedo sobre o qual uma operao incide. Nas instrues com
dois operandos, geralmente um operando est contido no registro de trabalho W (working
register) e o outro operando ou uma constante ou ento est contido num dos outros
registros. Esses registros podem ser Registros de Uso Geral (General Purpose Registers
GPR) ou Registros com funes especiais (Special Function Registers SFR). Nas
instrues s com um operando, um deles o contedo do registro W ou o contedo de um
dos outros registros. Quando so executadas operaes lgicas ou aritmticas como o
caso da adio, a ALU controla o estado dos bits (que constam do registro de status).
Dependendo da instruo a ser executada, a ALU, pode modificar os valores dos flags
Carry (C), Carry de dgito (DC) e Z (zero) no registro status

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 22

Figura 22 - Diagrama em blocos do PIC16F877

2.10 - Registrador de Status
O registrador de Status contm o estado da ALU (C, DC, Z), estado de RESET (TO, PD) e
os bits para seleo do banco de memria (IRP, RP1, RP0). Considerando que a seleo do
banco de memria controlada atravs deste registrador, ele tem que estar presente em
todos os bancos. Se o registrador de Status for o registrador de destino para instrues que
afetem os bits Z, DC ou C, ento no possvel escrever nestes trs bits.




Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 23


bit 0 C (Carry) Transporte - Este bit afetado pelas operaes de adio, subtrao e
deslocamento. Recebe o valor 1 (set), quando um valor menor subtrado de um valor
maior e recebe o valor 0 (reset) quando um valor maior subtrado de um menor.
1= Ocorreu um transporte no bit mais significativo;
0= No ocorreu transporte no bit mais significativo;
O bit C afetado pelas instrues ADDWF, ADDLW, SUBLW e SUBWF.


bit 1 DC (Digit Carry) Transporte de dgito - Este bit afetado pelas operaes de
adio e subtrao. Ao contrrio do anterior, DC assinala um transporte do bit 3 para o bit 4
do resultado. Este bit recebe o valor 1, quando um valor menor subtrado de um valor
maior e recebe o valor 0 quando um valor maior subtrado de um menor.
1= Ocorreu um transporte no quarto bit mais significativo;
0= No ocorreu transporte nesse bit;
O bit DC afetado pelas instrues ADDWF, ADDLW, SUBLW e SUBWF.

bit 2 Z (bit Zero) Indicao de resultado igual a zero - Este bit recebe o valor 1 quando
o resultado da operao lgica ou aritmtica executada igual a 0.
1= resultado igual a zero;
0= resultado diferente de zero;

bit 3 PD (Bit de baixa de tenso Power Down) - Este bit setado (recebe 1`) quando o
microcontrolador alimentado e comea a funcionar, depois de um reset normal e depois
da execuo da instruo CLRWDT. A instruo SLEEP reseta este bit, ou seja, quando o
microcontrolador entra no regime de baixo consumo. Este bit pode tambm ser setado, no
caso de ocorrer um impulso no pino RB0/INT, uma variao nos quatro bits mais
significativos da porta B, ou quando concluda uma operao de escrita na DATA
EEPROM ou ainda pelo watchdog.
1 = depois de ter sido ligada a alimentao;
0 = depois da execuo de uma instruo SLEEP.

bit 4 TO Time-out (transbordo do Watchdog) - Este bit setado, depois da alimentao
ser ligada e depois da execuo das instrues CLRWDT e SLEEP. O bit resetado quando
o watchdog consegue chegar ao fim da sua contagem (overflow = transbordar), o que indica
uma condio de falha.
1 = no ocorreu transbordo;
0 = ocorreu transbordo.

bits 5 e 6 RP1:RP0 (bits de seleo de banco de registros da RAM) - Estes dois bits so
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 24
a parte mais significativa do endereo utilizado para endereamento direto. Como as
instrues que endeream diretamente a memria, dispem somente de sete bits para este
efeito, preciso mais um bit para poder enderear todos os 512 registros do PIC16F877.
11 = banco de registros 3
10 = banco de registros 2
01 = banco de registros 1
00 = banco de registros 0

bit 7 IRP (Bit de seleo de banco de registros) - Este bit utilizado no endereamento
indireto da RAM interna, como oitavo bit.
1 = bancos 2 e 3 (endereos de 100h a 1FFh)
0 = bancos 0 e 1 (endereos de 00h a FFh)


2.11 - Registrador OPTION
O registrador OPTION um registrados de escrita e leitura que contm vrios bits de
controle usados para configurao do pr-escalonador do sinal de relgio do TIMER 0 e a
configurao do prprio TIMER 0, o pr-escalonador do sinal de relgio do Watchdog e a
configurao dos resistores de pull-up da porta B.



bits 0 a 2 PS0, PS1, PS2 (bits de seleo do divisor Prescaler) - Estes trs bits definem o
fator de diviso do prescaler.


bit 3 PSA (Bit de Atribuio do Prescaler) - Bit que atribui o prescaler ao TMR0 ou ao
watchdog.
1 = prescaler atribudo ao watchdog;
0 = prescaler atribudo ao temporizador TMR0.

bit 4 T0SE (bit de seleo de borda ativa em TMR0) - Se for permitido aplicar impulsos
em TMR0, a partir do pino RA4/TOCK1, este bit determina se os impulsos ativos so os
impulsos ascendentes ou os impulsos descendentes.
1 = bordo descendente;
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 25
0 = bordo ascendente.

bit 5 TOCS (bit de seleo da fonte de clock em TMR0) - Este bit seleciona a fonte do
sinal de clock do temporizador. Esta fonte pode ser o clock do microcontrolador
(freqncia de clock dividida por 4) ou um sinal externo aplicado ao pino RA4/TOCKI.
1 = sinais externos;
0 = do clock interno.

bit 6 INDEDG (bit de seleo da borda de interrupo) - Se esta interrupo estiver
habilitada, possvel definir a borda que vai ativar a interrupo no pino RB0/INT.
1 = borda ascendente;
0 = borda descendente.

bit 7 RBPU (Habilitao dos pull-up nos bits do porto B) - Este bit introduz ou retira as
resistncias internas de pull-up da porta B.
1 = resistncias de pull-up desligadas;
0 = resistncias de pull-up ligadas.

2.12 - Portas
Porta, um grupo de pinos num microcontrolador que podem ser acessados
simultaneamente, e, no qual possvel colocar uma combinao de zeros e uns ou ler dele o
estado existente. Fisicamente, a porta um registro dentro de um microcontrolador que est
ligado por fios aos pinos do microcontrolador. As portas representam a conexo fsica da
Unidade Central de Processamento (CPU) com o mundo exterior. O microcontrolador
utiliza as portas para observar ou comandar outros componentes ou dispositivos. Para
aumentar a sua funcionalidade, os mesmos pinos podem ser configuradores para
desempenhar duas ou mais funes distintas, como, por exemplo, RA4/TOCKI, que
simultaneamente o bit 4 da porta A e uma entrada externa para o contador/temporizador
TMR0. A escolha de uma destas duas funes feita atravs dos registradores de
configurao. Um exemplo disto o TOCS, quinto bit do registrador OPTION. Ao
selecionar uma das funes, a outra automaticamente inibida.

Figura 23 - Relao entre os bits do registrador TRISA e a porta A
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 26

Todos os pinos das portas podem ser definidos como de entrada ou de sada, de acordo com
as necessidades do projeto. Para definir um pino como entrada ou como sada, preciso, em
primeiro lugar, escrever no registrador TRIS, a combinao apropriada de zeros e uns. Se
no local apropriado de um registrador TRIS for escrito o valor lgico 1, ento o
correspondente pino da porta definido como entrada. Se for escrito um valor 0, o pino
definido como sada. Todos as portas, tm um registrador TRIS associado. Assim, no
PIC16F877 h cinco registradores TRIS, iniciando no endereo 85h.

2.12.1 - Porta A
A porta A est associada a 6 pinos. O registrador de direo de dados correspondente o
TRISA, no endereo 85h. Setando um bit do registrador TRISA, equivale a definir o
correspondente pino da porta A, como entrada e resetando um bit do mesmo registrador,
equivale a definir o correspondente pino da porta A, como sada.
O quinto pino do porto A tem uma funo dupla. Nesse pino est tambm situada a entrada
externa do temporizador TMR0. Cada uma destas opes escolhida setando ou resetando
o bit TOCS (bit de seleo de fonte de clock de TMR0). De acordo com o valor do bit
TOCS, o sinal de clock do Timer 0 ser obtido do oscilador interno ou de um sinal externo
aplicado pino RA4/TOCKI. Outros pinos da porta A so multiplexados com entradas
analgicas e entradas VREF. A operao de cada pino selecionada setando/resetando os
bits de controle no registrador ADCON1 (A/D Control Register1). O registrador TRISA
controla a direo dos pinos da porta A mesmo quando eles so usados como entradas
analgicas, neste caso os respectivos bits do TRISA devem estar setados.


Este exemplo mostra como os pinos 0, 1, 2, 3 e 4 da porta A so declarados como entradas.

Resumo dos registradores associados a porta A



2.12.2 - Porta B
A porta B tem 8 pinos associados a ela. O respectivo registrador de direo de dados
chama-se TRISB e tem o endereo 86h. Tal como no caso da porta A, setando um bit do
registrador TRISB, configura o correspondente pino da porta como entrada e resetando um
bit do registrador TRISB, o pino correspondente vai ser uma sada. Cada pino da Porta B
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 27
possui uma pequena resistncia de pull-up (resistncia que define a linha como tendo o
valor lgico 1). As resistncias de pull-up so ativadas resetando o bit RBPU (bit 7) do
registrador OPTION. Estas resistncias de pull-up so automaticamente desligadas
quando os pinos da porta so configurados como sadas. Quando a alimentao do
microcontrolador ligada, as resistncias de pull-up so tambm desativadas.
Trs pinos da porta B so multiplexados com a funo de Programao em Baixa Tenso
(RB3/PGM, RB6/PGC e RB7/PGD). Cada pino da porta B pode ser ajustado para funcionar
com um resistor de pull-up. O bit RBPU (OPTION_REG<7>) controla esta configurao,
quando resetado ativa os resistores de pull-up.
Os pinos de RB7 a RB4 podem gerar interrupes quando configurados como pinos de
entrada. Os valores dos pinos so comparados com o valor da ltima leitura destes pinos,
gravada no latch. As diferenas dos quatro pinos passa por uma operao lgica OU, para
gerar a interrupo RB Port Change e ajustar o respectivo bit de flag RBIF (Bit 0 do
registrador INTCON). RB0/INT pode ser configurado tambm como um pino de
interrupo. A borda que identifica a interrupo configurada a partir do bit INTEDG (bit
6) do registrador OPTION.

O exemplo acima mostra como os pinos 0, 1, 2 e 3 so definidos como entradas e 4, 5, 6 e 7
como sadas.

Resumo dos registradores associados a porta B


2.12.3 - Porta C
A porta C possui 8 pinos associados a ela. O respectivo registrador de direo de dados
chama-se TRISC e tem o endereo 87h. Tal como no caso da porta B, setando um bit do
registrador TRISC, configura o correspondente pino da porta como entrada e resetando um
bit do registrador TRISC, o pino correspondente vai ser uma sada. A porta C
compartilhada por vrios perifricos, principalmente os blocos de comunicao (SPI,
USRAT, I
2
C). Quando os pinos so configurados para operar como entradas/sada/controle
de perifricos, deve-se ter cuidado ao executar instrues de leitura/modificao/escrita,
que tenham o registrador TRISC como destino.

Resumo dos registradores associados a porta C
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 28


2.12.4 - Porta D
A porta D possui 8 pinos com buffer de entrada com Schmitt Trigger. Cada pino pode ser
individualmente configurado como uma entrada ou uma sada, setando ou resetando,
respectivamente, o bit no TRISD (endereo 88h) associados ao pino que deseja-se
configurar. A porta D tambm pode ser configurada como uma porta paralela escrava,
setando o bit de controle PSPMODE (bit 4 do registrador TRISE), Nesse modo, os buffers
de entrada so TTL.
Quando a porta D configurada como uma porta paralela escrava, os seus pinos podem ser
conectados a um barramento de dados de 8 bits e operaes de escrita e leitura de palavras
de 8 bits podem ser realizadas atravs do ajuste apropriado dos sinais de controle
implementados atravs dos pinos RE0/RD (habilita leitura), RE1/WR(habilita escrita)
eRE2/CS(habilita porta paralela). Observa-se que os pinos da porta E passam a funo de
sinais de controle para operao da porta paralela escrava e so configurados assim quando
o bit de controle PSPMODE setado, os bits do registrador TRISE so setados,
configurando os pinos RE0, RE1 e RE2 como entradas e os bits PCFG3:PCFG0 (bits 3 a 0)
do registrador ADCON1 so setados, configurando os pinos RE0, RE1 e RE2 como E/S
digital.
A porta paralela escrava implementada utilizando dois latches, um de entrada (latch-in) e
um de sada (latch-out), ambos acessados no mesmo endereo. Quando realizada uma
escrita na porta paralela escrava, (sinais WR e CS, ativos, ambos iguais a zero lgico), que
corresponde a um dispositivo externo enviando dados para a porta D do PIC, o bit de status
IBF (bit 7 do registrador TRISE) setado, junto com o bit PSPIF (bit 7 do registrador
PIR1). O bit IBF apagado quando feita uma leitura do latch de entrada. Essa tambm a
nica forma de resetar o bit IBF. Caso um segundo byte seja escrito na porta paralela
escrava, sem que o byte anterior tenha sido lido, o bit de status IBOV (Input Buffer
OVerflow, bit 5 do registrador TRISE) setado.
Uma leitura da porta paralela escrava ocorre quando ambos os sinais CS e RD so
colocados em nvel lgico zero. Quando isso ocorre um byte lido do latch-out e copiado
para os pinos da porta D. A indicao de que o ltimo byte que foi copiado para o latch-out
pelo firmware do PIC j foi lido por um dispositivo externo sinalizada pelo bit OBF
(Output Buffer Full, bit 6 do registrador TRISE). Esse bit automaticamente resetado
quando os sinais RD e CS so ambos zero por algum intervalo. Quando qualquer dos sinais
RD ou CS mudam para nvel lgico alto, o bit PSPIF setado, indicando que a leitura foi
concluda. O bit OBF permanece resetado at que um novo byte seja escrito no latch-out
pelo firmware do PIC.

Resumo dos registradores associados a porta D
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 29


2.12.5 - Porta E
A porta E possui 3 pinos com buffer de entrada com Schmitt Trigger. Cada pino pode ser
individualmente configurado como uma entrada ou uma sada, setando ou resetando,
respectivamente o bit no TRISE (endereo 89h) associados ao pino que deseja-se
configurar. A porta E torna-se entrada de controle para a porta paralela (porta D), quando o
bit PSPMODE (bit 4 de TRISE) setado. Nesse modo, os bits de 2 a 0 de TRISE devem
estar setados para configurar os respectivos pinos da porta E como entradas digitais e os
bits PCFG3:PCFG0 do registrador ADCON1 devem estar ajustados para configurar
RE2:RE0 como E/S digital.
Os pinos da porta E so multiplexados com entradas analgicas. Quando selecionados
como uma entrada analgica, leituras desses pinos retornam 0. O TRISE controla a direo
dos pinos RE mesmo quando eles esto sendo usados como entradas analgicas (deve ser
garantido que os pinos esto configurados como entradas pelo TRISE, cabendo aos bits do
registrador ADCON1, definir que so entradas.analgicas)

Resumo dos registradores associados a porta E


2.13 - Organizao da memria
O PIC16F877 possui dois blocos de memria separados, um para dados e o outro para o
programa. A memria EEPROM e os registros de uso genrico (GPR) na memria RAM
constituem o bloco para dados e a memria FLASH constitui o bloco de programa.

2.13.1 - Memria de programa
A memria de programa implementada usando tecnologia FLASH, o que torna possvel
programar o microcontrolador muitas vezes antes de se obter a verso final do firmware de
um sistema. A programao aps isso tambm possvel, desde que a memria no tenha
sido protegida, onde nesse caso no possvel reprogramar o microcontrolador. O tamanho
da memria de programa de 8K endereos de palavras de 14 bits, destes, os endereos
zero e quatro esto reservados, respectivamente, para o reset e para o vetor de interrupo.

2.13.2 - Memria de dados
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 30
A memria de dados compreende memria EEPROM e memria RAM. A memria
EEPROM consiste em 256 posies para palavras de oito bits e cujos contedos no se
perdem durante o desligamento do dispositivo. A memria EEPROM no faz parte
diretamente do espao de memria, mas acessada indiretamente atravs dos registros
EECON1, EECON2, EEADR, EEADRH, EEDATA e EEDATAH. Como a memria
EEPROM serve usualmente para guardar parmetros de configurao do sistema, set-points,
etc, existe um procedimento especfico para escrever na EEPROM que tem que ser seguido
de modo a evitar uma escrita acidental. A memria RAM para dados, ocupa um espao no
mapa de memria desde o endereo 0x20 at 0x7F (apenas no banco 0, nos demais bancos,
os 16 ltimos endereos correspondem aos 16 ltimos endereos do banco 0. Nos bancos 2
e 3 apenas os 16 primeiros endereos so usados por registradores de propsito especial,
liberando 16 posies de memria RAM em cada banco). Somando as posies de memria
RAM em cada banco, atinge-se o nmero de 368 locaes de memria. Estas posies de
memria RAM so tambm chamadas de registros GPR (General Purpose Registers =
Registros de uso geral). Os registros GPR so acessados aps a definio do banco de
memria, salvo as 16 ltimas posies dos bancos 1, 2 e 3, que podem ser acessadas sem
ser necessrio o conhecimento do banco com o qual se est trabalhando.

2.13.3 - Registradores SFR
Os registradores que ocupam as 32 primeiras locaes de memria nos bancos 0 e 1 e as 16
primeiras locaes nos bancos 2 e 3, so registros especiais e tm a ver com a manipulao
de certos blocos do microcontrolador. Estes registradores so os SFR (Special Function
Registers ou Registros de Funes Especiais).

2.13.4 - Bancos de Memria
Alm da diviso em comprimento entre registros SFR e GPR, o mapa de memria est
tambm dividido em largura em quatro reas chamadas bancos. A seleo de um dos
bancos feita por intermdio dos bits RP0 e RP1 do registro STATUS.

Exemplo :
bcf STATUS, RP0
A instruo BCF limpa o bit RP0 (RP0 = 0) do registro STATUS e, assim, seleciona o
banco 0.
bsf STATUS, RP0
A instruo BSF seta o bit RP0 (RP0 = 1) do registro STATUS e, assim, seleciona o banco
1.

Normalmente, os grupos de instrues muito usados so ligados numa nica unidade que
pode ser facilmente invocada por diversas vezes num programa, uma unidade desse tipo
chama-se genericamente Macro e, normalmente, essa unidade designada por um nome
especifico facilmente compreensvel. Com a sua utilizao, a seleo entre os dois bancos
torna-se mais clara e o prprio programa fica mais legvel.

BANK0 macro
bcf STATUS, RP0 ;Selecionar o banco 0 da memria
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 31
Endm

BANK1 macro
bsf STATUS, RP0 ; Selecionar o banco 1 da memria
Endm


Figura 24 - Organizao da memria no microcontrolador PIC16F84

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 32

Os locais de memria 20h 7Fh (banco 0), A0h EFh (banco 1), 120h 16Fh (banco
2) e 1A0h 1EFh (banco 3) so registros de uso genrico (GPR) e so usados como
memria RAM. Quando os endereos F0h FFh (banco 1), 170h 17Fh (banco 2) e
1F0h 1FFh (banco 3) so acessados, se est acessando as locaes de 70h a 7Fh do
banco 0.

2.13.5 - Contador de Programa
O contador de programa (PC = Program Counter), um registro de 13 bits que contm o
endereo da instruo que vai ser executada. Ao incrementar ou alterar (por exemplo no
caso de saltos) o contedo do PC, o microcontrolador consegue executar todas as instrues
do programa, uma aps outra.

2.13.6 - Pilha
O PIC16F877 tem uma pilha (stack) de 13 bits e 8 nveis de profundidade, o que
corresponde a 8 locais de memria com 13 bits de largura. O seu papel bsico guardar o
valor do contador de programa quando ocorre um salto do programa principal para o
endereo de uma subrotina. Depois de ter executado a subrotina, para que o
microcontrolador possa continuar com o programa principal a partir do ponto em que o
deixou, ele tem que ir buscar na pilha esse endereo e carreg-lo no contador de programa.
Quando ocorre desvio de um programa para uma subrotina, o contedo do contador de
programa salvo na pilha (um exemplo disto a instruo CALL). Quando so executadas
instrues tais como RETURN, RETLW ou RETFIE, no fim de uma subrotina, o contador
de programa retirado da pilha, de modo que o programa possa continuar a partir do ponto
em que a seqncia de execuo foi interrompida. Estas operaes de salvar e retirar da
pilha o contador de programa, so designadas por PUSH (salvar na pilha) e POP (tirar da
pilha), estes dois nomes provm de instrues com estas designaes, existentes em alguns
microcontroladores de maior porte.

2.13.7 - Programao no Sistema
Para carregar o firmware na memria de programa, o microcontrolador tem que entrar num
modo especial de funcionamento no qual a tenso no pino MCLR elevada para 13,5V e a
tenso de alimentao, Vdd, deve permanecer estvel entre 4,5V e 5,5V. A memria de
programa pode ser programada In-Circuit, usando dois pinos do microcontrolador
data/clock (pinos RB7 e RB6, respectivamente) que devem ser desconectados
eletricamente de outros circuitos, aos quais eventualmente estejam conectados, de modo
que no ocorram erros durante a programao.

2.13.8 - Modos de endereamento
Os locais da memria RAM podem ser acessados direta ou indiretamente.
2.13.8.1 - Endereamento Direto
O endereamento direto feito atravs de um endereo de 9 bits. Este endereo obtido
juntando os sete bits do endereo direto de uma instruo, mais dois bits (RP1 e RP0) do
registro de Status, como mostrado na figura abaixo. Qualquer acesso aos registros
especiais (SFR), pode ser um exemplo de endereamento direto.

Bsf STATUS, RP0 ; Banco 1
movlw 0xFF ; w = 0xFF
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 33
movwf TRISA
;o endereo do registro TRISA tirado do cdigo da instruo
movwf TRISA

Figura 25 - Endereamento Direto

2.13.8.2 - Endereamento Indireto
O endereamento indireto, ao contrrio do direto, no obtm um endereo do cdigo
instruo. Neste modo de endereamento utiliza-se as informaes armazenadas no bit IRP
do registro de Status e valor no registro FSR. O local endereado acessado atravs do
registro INDF e coincide com o endereo contido em FSR. Qualquer instruo que use
INDF como registro, acessa dados apontados pelo registro FSR, por exemplo, considere
que o registro de uso geral de endereo 21h contm o valor 20. Escrevendo o valor de 21h
no registro FSR, obtm-se um ponteiro para o registro 21h e, ao ler o registro INDF, obtm-
se o valor 20, o que significa que lemos o contedo do registro 21h, sem o especificar
explicitamente (mas atravs de FSR e INDF). Pode parecer que este tipo de endereamento
no tem quaisquer vantagens sobre o endereamento direto, mas existem problemas que s
podem ser resolvidos de uma forma simples, atravs do endereamento indireto.
Um exemplo pode ser enviar um conjunto de dados atravs de uma interface serial, usando
buffers e ponteiros, um outro exemplo limpar o contedo de todas as posies de
memria RAM do banco 0, como se pode ver a seguir.
movlw 0x20 ;definio do endereo inicial
movwf FSR ;FSR aponta para o endereo 0x20h
loop: clrf INDF ;INDF = 0
incf FSR ; endereo = endereo inicial + 1
btfss FSR,7 ;todos os locais de memria limpos?
goto loop ; no, desvia para loop
continue:
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 34
; sim, continuar com o programa

Quando o contedo do registro FSR igual a zero, ler dados do registro INDF resulta no
valor 0 e escrever em INDF resulta na instruo NOP (no operation = nenhuma operao).


Figura 26 - Endereamento Indireto


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 35
3 - Interrupes
As interrupes so um mecanismo existente em vrios dispositivos de processamento,
sejam microprocessadores ou microcontroladores, que permitem a estes dispositivos,
responder a eventos no momento em que eles ocorrem, qualquer que seja a tarefa que os
mesmos estejam executando no momento da ocorrncia do evento. Geralmente, cada
interrupo muda a direo de execuo do programa, suspendendo a sua execuo,
enquanto o microcontrolador desvia para uma subrotina de atendimento da interrupo.
Aps a execuo da subrotina, o microcontrolador continua com a execuo do programa
principal, a partir do ponto em que o tinha interrompido.
A famlia PIC 16F87x possui 14 fontes de interrupo, cada uma podendo ser habilitada ou
desabilitada individualmente a partir de bits dos registradores INTCON, PIE1 e PIE2. Alm
dos bits de habilitao individual h um bit que habilita a CPU a receber requisies de
interrupo, denominada bit GIE (bit 7, registrador INTCON). Para que uma interrupo
possa ser solicitada a CPU do microcontrolador necessrio que o bit GIE, o bit de
habilitao individual da interrupo e o bit de flag, que sinaliza a ocorrncia do evento
associado a interrupo estejam setados simultaneamente. Na figura abaixo mostrado na
forma de um circuito combinacional como funciona a estrutura de habilitao das
interrupes em um PIC da famlia 16F87x. Os bits de flag das interrupes esto
distribudos entre os registradores INTCON, PIR1 e PIR2.


Figura 27 Estrutura de interrupo do PIC 16F877

Quando uma interrupo atendida pela CPU, o bit GIE resetado, inibindo a solicitao
de outra interrupo durante a execuo da subrotina da interrupo corrente. Na seqncia
do processo de atendimento da interrupo, o endereo para onde o processamento deve
retornar ao concluir a rotina de servio da interrupo salvo na pilha e o contador de
programa carregado com o valor 0004h. Deve ser observado aqui que o processamento
sempre desvia para esse endereo, logo, o programador deve implementar uma rotina que
faa uma verificao dos flags de interrupo, nos registradores INTCON, PIR1 e PIR2 de
modo a determinar que interrupo foi solicitada. Tambm percebe-se desse procedimento
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 36
a importncia de manter os flags das interrupes resetados, de modo que seja possvel
identificar, sem ambigidade, a interrupo que foi solicitada. Outro fator que exige que ao
fim das rotinas de servio de cada interrupo, o respectivo flag da interrupo seja
resetado que dessa forma evita-se uma chamada recursiva da interrupo.



Figura 28 - Uma das possveis fontes de interrupo e como afeta o programa principal

O incio de execuo de uma rotina de servio de interrupo sofre uma latncia que pode
ser igual a quatro ciclos de instruo. A latncia exata depende do momento em que a
interrupo ocorreu.

3.1 - Registrador INTCON (endereo 0Bh)


Bit 0 (bit RBIF, indica alterao no estado da porta B) Este bit indica o evento
decorrente de uma mudana dos nveis lgicos nos pinos 4, 5, 6 e 7 da porta B.
1= pelo menos um destes pinos mudou de nvel lgico
0= no ocorreu nenhuma variao nestes pinos

Bit 1 (bit INTF, interrupo externa INT) Este bit indica a ocorrncia de uma
interrupo externa
1= ocorreu uma interrupo externa
0= no ocorreu uma interrupo externa
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 37
Se uma mudana de nvel (01 ou 10 detectada no pino RB0/INT, o bit INTF setado
(o tipo de borda, subida ou descida, definida atravs do bit INTEDG do registrador
OPTION).

Bit 2 (bit TOIF, interrupo por overflow de TMR0) Este bit indica que o ocorreu
um overflow no contador TMR0, ou seja, ele contou de FFh para 00h .
1= Houve overflow
0= No houve overflow

Bit 3 (bit RBIE, habilitao da interrupo por variao na porta B) Este bit habilita
a interrupo por variao dos nveis lgicos nos pinos 4, 5, 6 e 7 da porta B.
1= habilita a interrupo por variao dos nveis lgicos
0= desabilita a interrupo por variao dos nveis lgicos

Bit 4 (bit INTE, habilitao da interrupo externa INT) Este bit habilita uma
interrupo externa no pino RB0/INT.
1= interrupo externa habilitada
0= interrupo externa desabilitada

Bit 5 (bit TOIE, habilitao de interrupo por overflow de TMR0) Este bit
habilita a interrupo por overflow do contador TMR0.
1= interrupo habilitada.
0= interrupo desabilitada

Bit 6 (bit PEIE, habilitao das interrupes de perifricos) Este bit habilita/desabilita
todas as interrupes dos blocos perifricos.
1= interrupes habilitadas
0= interrupes desabilitadas.

Bit 7 (bit GIE, habilitao global de interrupo) Este bit habilita ou desabilita todas
as interrupes.
1= todas as interrupes so permitidas
0= todas as interrupes impedidas

3.2 - Registrador PIE1 (endereo 8Ch)


Bit 0 (bit TMR1IE, habilitao da interrupo do TMR1) Este bit habilita a
interrupo gerada quando ocorre um overflow no contador do Timer 1, TMR1, ou seja,
quando o contador conta de FFFFh para 0000h.
1= habilita interrupo
0= desabilita interrupo
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 38

Bit 1 (bit TMR2IE, habilitao da interrupo do TMR2) Este bit habilita a
interrupo gerada quando os valores do contador do Timer 2, TMR2 e o valor do
registrador PR2 coincidem
1= habilita interrupo
0= desabilita interrupo

Bit 2 (bit CCP1IE, habilitao da interrupo do bloco CCP1) Este bit habilita a
interrupo gerada por um evento de Capture ou Compare do bloco CCP1 .
1= habilita interrupo do bloco CCP1.
0= desabilita interrupo do bloco CCP1.

Bit 3 (bit SSPIE, habilitao da interrupo da porta serial sncrona) Este bit habilita
uma interrupo gerada por uma de um conjunto de condies associadas a porta serial
assncrona..
1= habilita a interrupo da SSP (Synchronous Serial Port)
0= desabilita a interrupo da SSP (Synchronous Serial Port)

Bit 4 (bit TXIE, habilitao da interrupo de transmisso da USART) Este bit
habilita uma interrupo quando concluda a transmisso de um byte pela USART (buffer
de transmisso vazio).
1= interrupo habilitada
0= interrupo desabilitada

Bit 5 (bit RCIE, habilitao da interrupo de recepo da USART) Este bit habilita
a interrupo quando um byte recebido pela USART (buffer de recepo cheio).
1= interrupo habilitada.
0= interrupo desabilitada

Bit 6 (bit ADIE, habilitao da interrupo do conversor A/D) Este bit habilita uma
interrupo gerando pela concluso de uma converso A/D.
1= interrupo habilitada
0= interrupo desabilitada.

Bit 7 (bit PSPIE, habilitao da interrupo da porta paralela escrava) Este bit
habilita uma interrupo gerada por uma operao de escrita/leitura na porta paralela (porta
D).
1= todas as interrupes so permitidas
0= todas as interrupes impedidas

3.3 - Registrador PIR1 (endereo 0Ch)


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 39

Bit 0 (bit TM12IF, indica a ocorrncia de um overflow do contador TMR1) Este bit
indica a ocorrncia de um overflow no contado TMR1, ou seja, o contador contou de
FFFFh para 0000h.
1 = ocorreu um overflow em TMR1
0 = no ocorreu overflow em TMR1.

Bit 1 (bit TMR2IF, indica que os valores de TMR2 e PR2 coincidem) Este bit indica a
ocorrncia do evento em que o valor do registrador de contagem do Timer 2, TMR2,
coincide com o valor armazenado no registrador PR2.
1 = TMR2 igual a PR2
0 = TMR2 diferente de PR2.

Bit 2 (bit CCP1IF, indica se um evento de Capture ou Compare do mdulo CCP1
ocorreu) Este bit indica a ocorrncia de um dos evento abaixo no mdulo CCP1:
Modo capture
1 = Um evento de captura do valor de contagem do TMR1 ocorreu
0 = Nenhum evento de captura ocorreu;
Modo compare
1 = Um evento de comparao (valor de contagem do TMR1 coincidiu com valor
do registrador de comparao) ocorreu
0 = Nenhum evento de comparao ocorreu;
Modo PWM
No usado nesse modo.

Bit 3 (bit SSPIF, indica se um evento do conjunto associado a porta serial sncrona
ocorreu) Este bit indica a ocorrncia de um dos evento abaixo na porta serial sncrona:
1 = SPI Uma transmisso/recepo ocorreu;
I
2
C escravo Uma transmisso/recepo ocorreu;
I
2
C mster
Uma transmisso/recepo ocorreu;
A condio iniciada de START foi concluda pelo mdulo SSP;
A condio iniciada de STOP foi concluda pelo mdulo SSP;
A condio iniciada de RESTART foi concluda pelo mdulo SSP;
A condio iniciada de ACKNOWLEDGE foi concluda pelo
mdulo SSP;
A condio de START ocorreu enquanto o mdulo SSP estava
desocupado (sistema multi-master);
A condio de STOP ocorreu enquanto o mdulo SSP estava
desocupado (sistema multi-master);
0 = Nenhuma condio de interrupo do mdulo SSP ocorreu.

Bit 4 (bit TXIF, indica se um byte j foi enviado pela SART) Este bit indica o evento
decorrente da transmisso completa de um byte que foi enviado a USART pela CPU.
1= buffer de transmisso da USART vazio
0= buffer de transmisso da USART cheio.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 40
Bit 5 (bit RCIF, indica se o buffer de recepo da USART possui um byte novo) Este
bit indica o evento decorrente da recepo de um byte pela porta serial assncrona
(USART).
1= buffer de recepo da USART cheio
0= buffer de recepo da USART vazio.

Bit 6 (bit ADIF, indica concluso de uma converso A/D) Este bit indica se o
conversor A/D concluiu uma converso analgica/digital.
1= converso concluda
0= converso no concluda.

Bit 7 (bit PSPIF, indica operao de escrita/leitura na porta paralela escrava) Este
bit indica o evento decorrente de uma operao de escrita/leitura na porta paralela escrava.
1= uma operao de leitura ou escrita ocorreu na porta paralela
0= no ocorreu nenhuma operao de leitura ou escrita na porta paralela

3.4 - Registrador PIE2 (endereo 0Ch)



Bit 0 (bit CCP2IE, habilitao da interrupo do bloco CCP2) Este bit habilita a
interrupo gerada por um evento de Capture ou Compare do bloco CCP2 .
1= habilita interrupo do bloco CCP2.
0= desabilita interrupo do bloco CCP2.

Bits 2 e 1 (no implementados, lidos como 0)

Bit 3 (bit BCLIE, habilitao da interrupo por coliso em barramento I
2
C) Este bit
habilita a interrupo gerada quando h uma coliso no barramento de dados, quando o
bloco SSP opera no modo I
2
C.
1= habilita interrupo
0= desabilita interrupo

Bit 4 (bit EEIE, habilitao da interrupo de escrita na EEPROM) Este bit habilita
a interrupo gerada quando concluda uma escrita na memria EEPROM.
1= habilita interrupo
0= desabilita interrupo

Bit 5 (no implementado, lido como 0)

Bit 6 (bit CMIE, habilitao da interrupo do mdulo de comparao) Este bit
habilita a interrupo decorrente de uma mudana no estado do pino de comparao.
1= habilita interrupo
0= desabilita interrupo
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 41

Bit 7 (no implementado, lido como 0)

3.5 - Registrador PIR2 (endereo 0Ch)



Bit 0 (bit CCP2IF, indica se um evento de Capture ou Compare do mdulo CCP2
ocorreu) Este bit indica a ocorrncia de um dos evento abaixo no mdulo CCP2:
Modo capture
1 = Um evento de captura do valor de contagem do TMR2 ocorreu
0 = Nenhum evento de captura ocorreu;
Modo compare
1 = Um evento de comparao (valor de contagem do TMR2 coincidiu com valor
do registrador de comparao) ocorreu
0 = Nenhum evento de comparao ocorreu;
Modo PWM
No usado nesse modo.

Bits 1 e 2 (no implementados, lidos como 0)

Bit 3 (bit BCLIF, indica coliso no barramento I
2
C) Este bit indica que houve uma
coliso no barramento I
2
C, quando o mdulo SSP opera no modo I
2
C..
1 = ocorreu uma coliso no barramento quando SSP est configurado como I
2
C, modo
mestre
0 = Nenhuma coliso identificada.

Bit 4 (bit EEIF, indica concluso de escrita na EEPROM) Este bit indica que uma
operao de escrita na memria EEPROM foi concluda.
1= escrita na EEPROM concluda.
0= escrita na EEPROM ainda no foi concluda.

Bit 5 (no implementado, lido como 0)

Bit 6 (bit CMIF, indica mudana no estado do pino de comparao) Este bit indica
que o sinal no pino de comparao mudou de estado.
1= sinal na entrada do comparador mudou
0= sinal na entrada do comparador no mudou.

Bit 7 (no implementado, lido como 0)

3.6 - Salvando o contexto da aplicao
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 42
A nica informao que guardada na pilha durante uma interrupo o valor de retorno
do contador de programa (endereo da instruo que estava para ser executada, mas que
no foi, por causa de ter ocorrido a interrupo). Guardar apenas o valor do contador de
programa no , muitas vezes, suficiente. Alguns registradores que j foram usados no
programa principal, podem tambm vir a ser usados na rotina de interrupo. Se os seus
contedos no forem salvos, ao retornar da subrotina,l os contedos dos registradores
podem ser inteiramente diferentes, o que causaria um erro no programa. Um exemplo para
este caso o contedo do registrador de trabalho W (work register). Se o programa
principal utilizava o registrador de trabalho W em alguma das suas operaes e se ele
contiver algum valor que seja importante para a instruo seguinte, ento a interrupo que
ocorre antes desta instruo vai alterar o valor do registrador de trabalho W, influenciando
diretamente na continuao do programa principal.
O procedimento para a gravao de registradores importantes antes de desviar para a
subrotina de interrupo, designa-se por PUSH, enquanto que o procedimento que
recupera esses valores, chamado POP. PUSH e POP so instrues provenientes de outros
microcontroladores (da Intel), agora esses nomes so aceites para designar estes dois
processos de salvaguarda e recuperao de dados. Como o PIC16F877 no possui
instrues comparveis, elas tm que ser programadas.

Figura 29 Salvamento de contexto

Devido sua simplicidade e uso freqente, estas partes do programa podem ser
implementadas como macros. No exemplo que se segue, os contedos de W e do
registrador de STATUS so guardados nas variveis W_TEMP e STATUS_TEMP antes de
desviar para a rotina de interrupo. No incio da rotina PUSH, necessrio verificar qual o
banco que est selecionado, porque W_TEMP e STATUS_TEMP esto situados no banco
0. Para troca de dados entre estes dois registradores, usada a instruo SWAPF em vez de
MOVF, pois a primeira no afeta os bits do registrador de STATUS.

Exemplo:
1. Verificar que banco est selecionado;
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 43
2. Guardar o registrador W qualquer que seja o banco;
3. Guardar o registrador de STATUS no banco 0;
4. Executar a rotina de servio de interrupo ISR (Interrupt Service Routine);
5. Recuperao do registrador de STATUS;
6. Restaurar o valor do registrador W.

Se existirem mais variveis ou registradores que necessitem de ser salvos, ento os mesmos
podero ser salvos s aps salvar o registrador de STATUS (passo 3) e recuper-los depois
de restaurar o registrador de STATUS (passo 5).

A mesma operao pode ser realizada usando macros, desta maneira obtemos um programa
mais legvel. Os macros que j esto definidos podem ser usados para escrever novos
macros. Os macros BANK1 e BANK0 so usados nos macros push e pop.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 44


3.7 - Interrupo externa no pino RB0/INT do microcontrolador
A interrupo externa no pino RB0/ INT desencadeada por uma transio positiva (se o
bit INTEDG = 1 no registrador OPTION<6>), ou por uma transio negativa (se INTEDG
= 0), no pino RB0. Quando o sinal correto surge no pino INT, o bit INTF do registrador
INTCON setado. O bit INTF (INTCON<1>) tem que ser resetado na rotina de interrupo,
a fim de evitar a chamada recursiva da interrupo. Esta uma parte importante do
programa e que o programador no pode esquecer, caso contrrio, o programa ir
constantemente saltar para a rotina de interrupo. A interrupo pode ser inibida,
resetando o bit de controle INTE (INTCON<4>).

3.8 - Interrupo devido ao overflow do contador TMR0
O overflow do contador TMR0 (passagem de FFh para 00h), seta o bit TOIF
(INTCON<2>). Esta interrupo pode ser habilitada ou desabilitada, setando ou resetando o
bit TOIE (INTCON<5>).

3.9 - Interrupo por variao nos pinos 4, 5, 6 e 7 do porto B
Uma variao em um dos 4 bits de entrada da Porta B (bits 4 a 7), seta o bit RBIF
(INTCON<0>). A interrupo ocorre, quando o nvel lgico em pelo menos um dos pinos
RB7, RB6, RB5 e RB4 da porta B, mudam do valor lgico 1 para o valor lgico 0 ou
vice-versa. Para que estes pinos detectem as variaes, eles devem ser definidos como
entradas. Se qualquer deles for definido como sada, nenhuma interrupo ser gerada
quando surgir uma variao do nvel lgico. Se estes pinos forem definidos como entradas,
o seu valor atual comparado com o valor anterior, que foi guardado quando se fez a
leitura anterior da porta B. Esta interrupo pode ser habilitada/desabilitada
setando/resetando, respectivamente, o bit RBIE do registrador INTCON.

3.10 - Interrupo por fim de escrita na EEPROM
Esta interrupo apenas de natureza prtica. Como escrever num endereo da EEPROM
leva cerca de 10ms (o que representa muito tempo quando se fala de um microcontrolador),
no recomendvel que se deixe o microcontrolador um grande intervalo de tempo sem
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 45
fazer nada, espera do fim da operao da escrita. Assim, atravs do mecanismo de
interrupo, possibilita-se que o microcontrolador continue a executar o programa principal,
enquanto, concomitantemente ocorre o processo de escrita na EEPROM. Quando esta
operao de escrita concluda, uma interrupo informa o microcontrolador desse evento.
O bit EEIF, atravs do qual esta informao dada, pertence ao registrador EECON1. A
ocorrncia desta interrupo pode ser desabilitada, resetando o bit EEIE do registrador
INTCON.

3.11 - Iniciao da interrupo
Para que num microcontrolador possa usar um mecanismo de interrupo, preciso
proceder a algumas tarefas preliminares. Estes procedimentos so designados
resumidamente por iniciao. Na iniciao, so habilitadas as interrupes as quais o
microcontrolador deve responder e desabilitadas as demais.



O exemplo acima, mostra a iniciao da interrupo externa no pino RB0 de um
microcontrolador. No posio em que vemos 1, isso significa que essa interrupo est
habilitada. A ocorrncia de outras interrupes no permitida, e todas as interrupes em
conjunto esto mascaradas at que o bit GIE seja setado.

O exemplo a seguir, ilustra uma maneira tpica de lidar com as interrupes. O PIC16F877
possui um nico endereo para a rotina de interrupo. Isto significa que, primeiro,
necessrio identificar qual a origem da interrupo (se mais que uma fonte de interrupo
estiver habilitada), e a seguir deve-se executar apenas a parte da subrotina que se refere
interrupo solicitada.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 46


O retorno de uma rotina de interrupo pode ser executada com as instrues
RETURN, RETLW e RETFIE. Recomenda-se que seja usada a instruo RETFIE
porque, essa instruo a nica que automaticamente seta o bit GIE, permitindo
assim, que novas interrupes possam ocorrer.


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 47
4 - Temporizadores
Os temporizadores permitem relacionar uma dimenso real que o tempo, com uma
varivel que representa o estado de um temporizador dentro de um microcontrolador.
Fisicamente, o temporizador um registrador cujo valor est continuamente sendo
incrementado, at atingir um valor mximo, que depende do tamanho da palavra binria do
contador. Ao atingir este valor mximo, o valor de contagem resetado e ocorre o evento
denominado de overflow.


Figura 30 Relao entre o temporizador TMR0 e o prescaler

O incremento da contagem do temporizador pode ocorrer de forma sncrona ou assncrona
com as operaes realizadas pela CPU do microcontrolador
O PIC16F877, possui trs temporizadores, sendo dois de 8 bits e um de 16 bits. O nmero
de bits determina a quantidade de valores diferentes que a contagem pode assumir, antes de
voltar novamente para zero. No caso de um temporizador de 8 bits esse valor 256. Um
esquema simplificado da relao entre um temporizador e um pr-escalonador est
representado no diagrama acima. Pr-escalonador a designao para a parte do
microcontrolador que divide a freqncia de oscilao do clock antes que os respectivos
pulsos possam incrementar o temporizador.

4.1 TIMER 0
O mdulo do Timer 0 possui as seguintes caractersticas:
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 48
Contador/Timer de 8 bits;
Registrador de contagem de escrita e leitura;
Pr-escalonador (divisor de freqncia) programvel;
Utiliza sinal de clock interno ou externo;
Gera interrupo quando a contagem muda de FF para 00;
Permite selecionar o tipo de transio quando usa clock externo (Borda de subida ou
descida).

O modo de operao do Timer 0 definido a partir do bit T0CS (bit 5 do Reg. OPTION).
No modo timer, o Timer 0 incrementa a cada ciclo de instruo (sem pr-escalonador). Se
ocorrer uma escrita no registrador TMR0, o incremento inibido pelos dois ciclos de
instruo seguintes.

O modo de contagem selecionado setando o bit T0CS. No modo de contagem , o Timer 0
incrementar a cada subida ou descida do sinal no pino RA4/TOCKL. A borda definida
pelo bit T0SE (bit 4 do Reg. OPTION).

4.1.1 Interrupo do Timer 0
A interrupo TMR0 gerada quando o registrador TMR0 estoura (overflow), conta de FF
para 00. Este overflow seta o bit T0IF (bit 2 do Reg. INTCON). A interrupo pode ser
mascarada resetando o bit T0IE (bit 5 do Reg. INTCON). O bit T0IF deve ser apagado por
software (na rotina de servio de interrupo do Timer 0) antes de reabilitar a prpria.

4.1.2 Pr-escalonador
H um nico pr-escalonador que compartilhado com o WatchDogTimer de forma
mutuamente excludente (se o Timer 0 usa o pr-escalonador o WatchDog no pode usar e
vice versa). Os bits PSA e PS2:PS0 (bits 3 a 0 do Reg. OPTION) determinam o fator de
escalonamento da freqncia do sinal de clock do Timer 0. Quando atribudo ao Timer 0,
todas as instrues que escrevem para o registrador TMR0 (CLRF 1, MOVWF 1, BSF
1,x...) apagaro o contador do pr-escalonador mas no alteraro a sua configurao.

4.1.3 Registradores associados ao Timer 0


O exemplo seguinte mostra como iniciar o Timer 0 para contar os pulsos provenientes de
uma fonte de clock externa com um prescaler 1:4.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 49


O mesmo exemplo pode ser implementado atravs de uma interrupo da forma a seguir:



O pr-escalonador tanto pode ser atribudo ao temporizador TMR0, como ao watchdog. O
watchdog um mecanismo que o microcontrolador usa para se recuperar de forma
autnoma de falhas de execuo do programa. Como qualquer circuito eltrico, tambm os
microcontroladores podem ter uma falha no seu funcionamento. Infelizmente, o
microcontrolador tambm pode ter problemas com o seu programa. Quando isto acontece, o
microcontrolador pra de trabalhar e mantm-se nesse estado at que algum faa o reset.
Por causa disto, foi introduzido o mecanismo de watchdog (co de guarda). Depois de um
certo perodo de tempo, o watchdog faz o reset do microcontrolador (o que realmente
acontece, que o microcontrolador executa o reset de si prprio). O watchdog trabalha na
base de um princpio simples: se ocorrer um overflow no seu temporizador, feito o reset
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 50
do microcontrolador e este comea a executar de novo o programa a partir do princpio.
Deste modo, o reset poder ocorrer tanto no caso de funcionamento correto como no caso
de funcionamento incorreto. O prximo passo evitar o reset no caso de funcionamento
correto, isso feito escrevendo zero no registrador WDT (instruo CLRWDT) sempre que
este est prximo de gerar um overflow. Assim, o programa ir evitar um reset enquanto
est funcionando corretamente. Se ocorrer um travamento na execuo do programa, este
zero no ser escrito, haver um overflow do temporizador WDT e ir ocorrer um reset
que vai fazer com que o microcontrolador comece de novo a trabalhar corretamente.

O pr-escalonador pode ser atribudo ao temporizador TMR0, ou ao temporizador do
watchdog, isso feito atravs do bit PSA no registrador OPTION. Fazendo o bit PSA igual
a 0, o pr-escalonador atribudo ao temporizador TMR0. Quando o pr-escalonador
atribudo ao temporizador TMR0, todas as instrues de escrita no registrador TMR0
(CLRF TMR0, MOVWF TMR0, BSF TMR0,...) vo limpar o pr-escalonador. Quando o
pr-escalonador atribudo ao temporizador do watchdog, somente a instruo CLRWDT
ir limpar o pr-escalonador e o temporizador do watchdog ao mesmo tempo. A mudana
do pr-escalonador est completamente sob o controle do programador e pode ser
executada enquanto o programa est sendo executado

4.2 TIMER 1
O mdulo Timer 1 um timer/contador de 16 bits, dividido em dois registradores de 8 bits
(TMR1H e TMR1L), que so de escrita e leitura. O par de registradores (TMR1H e
TMR1L) incrementa de 0000h a FFFFh e retorna a 0000h (overflow). A interrupo TMR1,
se habilitada, seta o bit de flag TMR1IF (bit 0 do Reg. PIRI) quando ocorre o overflow.
Essa interrupo pode ser habilitada/desabilitada setando/resetando, respectivamente, o bit
de habilitao de interrupo TMR1IE (bit 0 do Reg. PIE1).

O Timer 1 pode operar de dois modos:
Como timer: Neste modo o Timer 1 incrementa a cada ciclo de instruo;
Como contador: Neste modo o Timer 1 incrementa a cada transio do sinal de clock
externo.
O modo de operao determinado pelo bit de seleo de clock, TMR1CS (bit 1 do Reg.
T1CON).

O Timer 1 pode ser habilitado/desabilitado setando/resetando, respectivamente, o bit de
controle TMR1ON (bit 0 do registrador). O Timer tambm possui um reset interno que
pode ser gerado pelos mdulos Capture/Compare/PWM CCP. Quando o oscilador do
Timer 1 est habilitado (T1OSCEN setado), os pinos RC1/T1OSI/CCP2 e
RC0/T1OSO/T1CKL tornam-se entradas independente do valor dos bits 1 e 0 do
registrador TRIS, que so ignorados.
Quando operando no modo TIMER, o Timer 1 pode ser configurado para operar de forma
sncrona ou assncrona. No modo sncrono, o sinal de clock externo sincronizado com o
sinal de clock interno do microcontrolador, assim, caso o microcontrolador ente no modo
Sleep, a contagem do Timer para, mesmo que o sinal de clock externo esteja ativo,
porque o circuito de sincronizao desligado nesta condio.
Quanto operando no modo Timer assncrono, a contagem no Timer 1 ocorrer em qualquer
estado que o microcontrolador esteja, mesmo no estado Sleep, enquanto houver um sinal
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 51
de clock externo. Dessa forma, o bloco do Timer 1 poder despertar o microncotrolador do
estado Sleep atravs de uma interrupo gerada por overflow do contador do Timer 1.
Os procedimentos de leitura/escrita do registrador de contagem do Timer 1 (TMR1H e
TMR1L) devem ser realizados observando-se alguns cuidados. Na leitura, como a
contagem feita de forma assncrona ao processo de leitura, pode ocorrer de entre a leitura
do byte menos significativo (TMR1L) e o bit mais significativo (TMR1H) ocorra um
overflow. No processo de escrita uma conteno na operao de escrita pode ocorrer
enquanto o contador est incrementando, o que pode levar a um resultado imprevisvel
sobre o valor efetivamente gravado nos registradores de contagem.
Devido as incertezas envolvidas no processo de leitura e escrita de dados nos registrador de
contagem TMR1 do Timer 1 quando este opera no modo TIMER ASSNCRONO, um
aconselhvel parar o contador, realizar a operao de leitura/escrita e na seqncia reativar
o mesmo.

4.2.1 Resetando o Timer 1 usando uma sada de Trigger do mdulo CCP
Se o mdulo CCP1 ou CCP2 (este apenas no PIC 16F877) configurado no modo de
comparao para gerar um special event trigger (CCP1M3:CCP1M0 = 1011), esse sinal
resetar o Timer 1. Nos casos em que uma escrita coincide com um special event trigger
de CCP1 ou CCP2, a escrita ter precedncia. Nesse modo de operao os registradores
CCPRxH:CCPRxL tornam-se os registradores de perodo do Timer 1.

4.2.2 Pr-escalonador do Timer 1
O contador pr-escalonador apagado quando so escritos valores para os registradores
TMR1H e TMR1L.

4.2.3 Registrador de controle do Timer 1 T1CON (endereo 10h)

Bit 0 (bit TMR1ON bit de ativao do Timer 1) Este bit ativa ou desativa a operao
do Timer 1.
1 = Timer 1 ativado
0 = Timer 1 desativado;

Bit 1 (bit TMR1CS bit que seleciona a fonte de clock do Timer 1) Este bit seleciona
que sinal ser usado como sinal de clock para o bloco do Timer 1.
1 = Sinal de clock externo (pino RC0/T1OSO/T1CKI (contagem ocorre na borda de subida
do sinal)
0 = Sinal interno de clock (Fosc/4).

Bit 2 (bit T1SYNC bit de sincronizao do clock externo) Este bit define se o sinal
de clock externo ser ou no sincronizado com o sinal interno de clock no bloco do Timer 1.
TMR1CS =1
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 52
1 = No sincroniza sinal de clock externo
0 = Sincroniza sinal de clock externo.
TMR1CS =o
No tem efeito

Bit 3 (bit T1OSCEN bit de habilitao do oscilador do Timer 1) Este bit habilita o
oscilador do bloco do Timer 1. Este oscilador habilitado quando configura-se o PIC para
operar com oscilador interno. O mesmo gera um sinal com uma freqncia de 200KHz.
1 = oscilador habilitado
0 = oscilador desligado (elimina consumo de energia)

Bits 5-4 (bits de seleo do pr-escalonador do sinal da entrada de clock) Estes bits
permitem escalonar o sinal de clock da entrada pelos fatores indicados abaixo:
11 = Escalonamento de 1:8
10 = Escalonamento de 1:4
01 = Escalonamento de 1:2
00 = Escalonamento de 1:1

Bits 7-6 (bits no usados lidos como 0)

4.2.4 Registradores associados ao Timer 1 (modos Timer/Contador)


4.3 TIMER 2
O Timer 2 um timer de 8 bits com um pr-escalonador e ps-escalonador. O mesmo pode
ser usado como a base de tempo no modo PWM dos mdulos CCP. O TMR2 um
registrador de escrita e leitura e apagado em qualquer evento de reset.

A entrada de clock (Fosc/4) possui uma opo de escalonamento de 1:1, 1:4 ou 1:16,
selecionada pelos bits de controle T2CKPS1:T2CKPS0 (bits 1 e 0 do Reg. T2CON), que
faz com que o sinal de clock do timer 2 seja dividido, respectivamente, por 1, 4 e 16. O
mdulo do Timer 2 possui um registrador de perodo de 8 bits PR2, que indica o valor
mximo que pode ser atingido pelo TMR2, assim, o timer 2 incrementa de 00h at atingir
PR2 e ento reseta para 00h no ciclo de incremento seguinte. PR2 um registrador de
escrita e leitura e inicializado com FFh aps qualquer RESET.
O sinal de sada resultante da comparao do PR2 com o TMR2 passa por um ps-
escalonador (escalas de 1:1, 1:4 e 1:16) para gerar a interrupo TMR2 (quando ocorre, o
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 53
bit 1 (TMR2IF) do Reg. PIR1 setado), ou seja, quando a interrupo est habilitada a
mesma ocorrer aps 1, 4 ou 16 vezes em que o valor do contador do timer 2 (TMR2)
atingir o valor gravado no registrador PR2.
O Timer 2 pode ser desligado resetando o bit de controle TMR2ON (bit 2 do registrador
T2CON).

4.3.1 Pr-Escalonador e Ps-Escalonador do Timer 2
Os contadores do pr-escalonador e do ps-escalonador so apagados quando algum dos
eventos abaixo ocorre:
Uma escrita para o registrador TMR2;
Uma escrita para o registrador T2CON;
Qualquer reset do dispositivo (POR, MCLR reset, WDT reset ou BOR).
O Timer 2 no apagado quando ocorre uma escrita para registrador de configurao do
timer 2 T2CON.

4.3.2 Registrador de Controle do Timer 2 T2CON (endereo 12h)


Bits 1-0 (bit T2CKPS1 e T2CKPS0 bit de seleo do pr-escalonador) Estes bits
selecionam o fator de escalonamento do sinal de clock do Timer 2.
00 = Escalonamento de 1
01 = Escalonamento de 4
1x = Escalonamento de 16

Bit 2 (bit TMR2ON bit de ativao do Timer 2) Este bit ativa ou desativa a operao
do Timer 2.
1 = Timer 2 ativado
0 = Timer 2 desativado;

Bits 6-3 (bits TOUTPS3:TOUTPS0 bits de seleo do ps-escalonador) Estes bits
permitem selecionar um fator de escalonamento que define o nmero de vezes em que os
valores dos registradores TMR2 e PR2 devem coincidir para que seja gerada uma
interrupo (se habilitada).
0000 = Escalonamento de 1
0001 = Escalonamento de 2
0010 = Escalonamento de 3



1110 = Escalonamento de 15
1111 = Escalonamento de 16
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 54

Bit 7 (bit no usado lido como 0)

4.3.3 Registradores associados com o Timer 2 (modos Timer/Contador)


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 55
5 Mdulo de Captura, Comparao e PWM
Os mdulos CCP (Captura/Comparao/PWM) so formados por um registrador de 16 bits
que pode operar como:
Registrador de captura de 16 bits;
Registrador de comparao de 16 bits
Registrador de duty-cycle no modo PWM Mestre/Escravo.

Ambos os mdulos CCP1 e CCP2 (PIC16F877 possui dois CCPs) so idnticos em
operao , com exceo do special event trigger

5.1 Mdulo CCP1
O registrador CCP do mdulo CCP1 (CCPR1) formado por dois registradores de 8 bits:
CCPR1L (byte menos significativo) e CCPR1H (byte mais significativo). O special event
trigger gerado quando o contedo deste registrador e o contedo do registrador de
contagem do Timer 1 so iguais, resetando este ltimo.

5.2 Mdulo CCP2
O registrador CCP do mdulo CCP2 (CCPR2) formado por dois registradores de 8 bits:
CCPR2L (byte menos significativo) e CCPR2H (byte mais significativo). O registrador
CCP2CON controla a operao do CCP2. Da mesma forma como para o CCP1, o special
event trigger gerado quando o contedo deste registrador e o contedo do registrador de
contagem do Timer 1 so iguais, resetando este ltimo. No caso do CCP2, alm de resetar o
Timer 1, tambm iniciada uma converso A/D.

Modo de operao do mdulo CCP e recursos de Timer necessrios


Interao entre dois mdulos CCP


5.3 Registradores de Controle CCP1CON e CCP2CON (endereos 17h e 1Dh)

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 56

Bits 3-0 (bit CCPxM3: CCPxM0 bits de seleo de modo de operao) Estes bits
selecionam o modo como operaro os blocos CCP1 e CCP2.
0000 = Modos Captura/Comparao/PWM desligados (reseta mdulo CCPx )
0100 = Modo captura, a cada 1 transio negativa (10)
0101 = Modo captura, a cada 1 transio positiva (01)
0110 = Modo captura, a cada 4 transies positivas (10)
0111 = Modo captura, a cada 16 transies positivas (10)
1000 = Modo comparao, seta pino de sada (bit CCPxIF setado)
1001 = Modo comparao, reseta pino de sada (bit CCPxIF setado)
1010 = Modo comparao, gera interrupo (bit CCPxIF setado, pino CCPx no
afetado)
1011 = Modo comparao, ativa Special Event trigger(bit CCPxIF seta, pino
CCPx no afetado); CCP1 reseta TMR1; CCP2 reseta TMR1 e inicia uma
converso A/D (se mdulo A/D habilitado).
11xx = Modo PWM

Bits 5-4 (bits CCPxX:CCPxY bits menos significativos do PWM) Estes bits
representam os dois bits menos significativos do valor de duty-cycle do sinal PWM.
Modo Captura: No usado
Modo Comparao: No usado
Modo PWM: Dois bits LSB do duty-cycle do sinal PWM. Os oito MSBs so
gravados no registrador CCPRxL.

Bits 7-6 (bits no usados lidos como 0)

5.4 Modo Captura
No modo captura o valor de 16 bits do registrador TMR1 copiado para os registradores
CCPR1H:CCPR1L e/ou CCPR2H:CCPR2L (apenas PIC 16F877), quando um dos eventos
ocorre no pino RC2/CCP1 e/ou RC1/CCP2 (PIC16F877) ou no pino RB3/CCP1 (PIC
16F628):
A cada borda de descida do sinal no pino RC2, RC1 (PIC 16F877) ou RB3 (PIC
16F628);
A cada borda de subida do sinal no pino RC2, RC1 (PIC 16F877) ou RB3 (PIC
16F628);
A cada 4 bordas de subida do sinal no pino RC2, RC1 (PIC 16F877) ou RB3 (PIC
16F628);
A cada 16 bordas de subida do sinal no pino RC2, RC1 (PIC 16F877) ou RB3 (PIC
16F628);

O tipo de evento selecionado pelos bits de controle CCP1M3:CCP1M0 (bits de 3 a 0 do
Reg. CCP1CON). Quando uma captura realizada, o flag de requisio de interrupo, bit
CCP1IF (bit 2 do Reg. PIR1) setado. Este bit deve ser apagado por software. Se uma
outra captura ocorrer antes que o valor no registrador CCPR1 for lido, o valor anterior ser
perdido.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 57
No modo captura os pinos RC2/CCP1, RC1/CCP2 (PIC 16F877) e RB3/CCP1 (PIC
16F628) devem ser configurados como uma entrada, setando o bit 1 e 2 do registrador
TRISC (PIC 16F877) ou o bit 3 do registrador TRISB (PIC 16F628). O Timer 1 deve estar
operando no modo timer ou no modo contador com sincronizao do sinal de clock externo
com o clock interno.

5.4.1 Pr-escalonador do mdulo CCP
H quatro ajustes do pr-escalonador, especificados pelos bits CCP1M3:CCP1M0. Sempre
que o mdulo CCP desligado, ou o mdulo CCP no est no modo captura, o contador do
pr-escalonador apagado. Tambm, qualquer Reset apagar o pr-escalonador.

OBSERVAO: Se os pinos RC2/CCP1, RC1/CCP2 e RB3/CCP1 so configurados
como uma entrada, uma escrita para a porta pode causar uma condio de captura.

5.5 Modo Comparao
No modo comparao o valor do registrador CCPR1 (16 bits) e/ou CCPR2 (16 bits)
(apenas para o PIC 16F877) (so) constantemente comparado(s) com o valor do
registrador TMR1. Quando os valores se igualam, o pino RC2/CCP1 e/ou RC1/CCP2 (PIC
16F877) ou o pino RB3/CCP1 (PIC 16F628) (so):
Ativado;
Desativado
Permanece inalterado
A ao no(s) pino(s) definida pelos bits de controle CCP1M3:CCP1M0 (bits de 3 a 0 do
Reg. CCP1CON). Ao mesmo tempo o flag de interrupo setado, bit CCP1IF, gerando
uma interrupo, se habilitada.

No modo comparao os pinos RC2/CCP1, RC1/CCP2 e RB3/CCP1 devem ser
configurados como sadas, resetando os bits 1 e 2 do registrador TRISC (PIC 16F877) ou o
bit 3 do registrador TRISB (PIC 16F628). O Timer 1 deve estar operando no modo timer ou
no modo contador com sincronizao do sinal de clock externo com o clock interno.

No modo de comparao pode ser gerado um special event trigger, a partir de um trigger
interno. Este evento, no mdulo CCP1, reseta o par de registradores que forma o TMR1.
No mdulo CCP2 (apenas PIC 16F877), a mesma operao realizada, alm de iniciar uma
converso A/D (se o mdulo A/D est habilitado).

5.6 Modo PWM
No modo PWM o pino CCPx produz um sinal de PWM com uma resoluo de at 10 bits.
Como os pinos RC2/CCP1 e RC1/CCP2 so multiplexados com o latch de dados da porta C
no PIC 16F877 e o pino RB3/CCP1 multiplexado com o latch de dados da porta B no PIC
16F628, os bits 1 e 2 de TRISC, PIC 16F877 e bit 3 de TRISB, PIC 16F628, devem ser
resetados para tornar os pinos RC2/CCP1, RC1/CCP2 e/ou RB3/CCP1 uma sada.

Um sinal PWM caracterizado pelo seu perodo e um o duty-cycle, que corresponde ao
tempo em que o sinal permanece em nvel alto. O perodo do sinal PWM especificado
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 58
pelo registrador PR2, sendo calculando segundo a frmula: Perodo PWM = [(PR2) + 1] 4
TOSC (TMR2 prescale value).
Quando TMR2 igual a PR2, os seguintes eventos ocorrem:
O TMR2 apagado;
O pino CCP1 setado (exceto se o duty-cycle do PWM = 0%, quando o CCP1 no ser
setado);
O PWM duty-cycle copiado de CCPR1L para CCPR1H.

O duty-cycle do PWM definido escrevendo para o registrador CCPR1L e para os bits 5 e
4 do registrador CCP1CON, onde os 8 bits do registrador CCPR1L representa os 8 bits
mais significativos e os bits 5 e 4 de CCP1CON, representam os dois bits menos
significativos. A partir da equao abaixo possvel determinar o duty-cycle em termos de
tempo:

Duty Cycle do PWM = (CCPR1L:CCP1CON<5:4>) Tosc (TMR2 prescale value)

Os valores podem ser copiados para o registrador CCPR1L e para os bits 5 e 4 do
registrador CCP1CON em qualquer instante, mas o novo valor do duty-cycle s ser
copiado para o CCPR1H, quando os valores dos registradores PR2 e TMR2 coincidirem
(ao fim do perodo PWM). No modo PWM CCPR1H um registrador apenas de leitura.

Os seguintes passos devem ser seguidos quando ajustando o mdulo CCP para funcionar no
modo PWM:
1. Ajustar o perodo do sinal PWM, escrevendo um valor adequado no registrador PR2;
2. Ajustar o duty-cycle do sinal PWM, escrevendo um valor adequado para o registrador
CCPR1L e para os bits 5 e 4 do registrador CCP1CON;
3. Configurar o pino RC2/CCP1, RC1/CCP2 (PIC 16F877) ou RB3/CCP1 (PIC 16F628)
como uma sada (resetar o bit 1 e/ou 2 do reg. TRISC, PIC 16F877 ou o bit 3 do reg.
TRISB, PIC 16F628);
4. Ajustar o valor do pr-escalonador e habilitar o Timer 2 configurando o registrador
T2CON;
5. Configurar o mdulo CCP1 e/ou CCP2 (apenas PIC 16F877) para operao no modo
PWM;













Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 59
5.7 Registradores associados com o PWM e Timer 2


5.8 Registradores associados com o Capture, Compare e Timer 1



Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 60
6 CONVERSOR A/D
O mdulo do conversor A/D possui 8 entradas analgicas, que possuem um capacitor de
sample-and-hold. A sada do sample-and-hold conectada a entrada do conversor A/D a
partir de um multiplex 8 x 1. O conversor A/D gera uma palavra binria de 10 bits para
representar o valor de tenso na entrada analgica selecionada.
O mdulo A/D tem duas entradas de tenso de referncia (alta e baixa), que so
selecionadas por software, entre algumas opes de combinao pr-estabelecidas. Uma
caracterstica apenas presente no mdulo conversor A/D que o mesmo pode operar
mesmo o PIC estando no modo SLEEP. Para operar neste modo o sinal de clock do
conversor A/D (CAD) deve ser derivado do oscilador RC interno do PIC.
O conversor A/D possui quatro registradores:
Registrador do byte mais significado do resultado da converso (ADRESH);
Registrador do byte menos significado do resultado da converso (ADRESL);
Registrador de controle 0 (ADCON0) e
Registrador de controle 1. (ADCON1)

Os registradores ADRESH:ADRESL contm os 10 bits do resultado da converso. Quando
a mesma concluda, o resultado carregado nesses registradores, o bit GO/DONE (bit 2
do Reg. ADCON0) resetado e o flag de interrupo, bit ADIF, setado.
Aps a configurao do mdulo como desejado, o canal cujo sinal analgico deve ser
convertido, deve ser selecionado antes da converso ser iniciada. Os canais de entrada
analgicos devem ter seus correspondentes bits TRIS ajustados para que os pinos das portas
A e E se comportem como entradas. Aps o perodo de aquisio do sinal ter finalizado
(aproximadamente 20s) a converso A/D pode ser iniciada conforme os seguintes passos:

1. Configure o mdulo A/D
Configure os pinos de entrada analgica, as tenses de referncia e os pinos de
I/O digital (ADCON1);
Selecione o canal de entrada analgica (ADCON0);
Selecione a freqncia do sinal de clock do conversor A/D (ADCON0);
Ative o mdulo A/D;
2. Configure a interrupo do mdulo A/D (se desejado);
Reset o bit ADIF;
Sete o bit ADIE;
Sete o bit GIE;
3. Aguarde o tempo de aquisio requerido;
4. Inicie a converso
Sete o bit GO/DONE (ADCON0)
5. Aguarde o tempo de converso ter transcorrido;
Realize um POLLING no bit GO/DONE, verificando se o seu valor zero
(indicativo de fim de converso A/D);
ou aguarde pela interrupo gerada pelo mdulo A/D ao fim da converso;
6. Leia o par de registradores (ADRESH:ADRESL), resete o bit ADIF se a interrupo
do conversor A/D est sendo utilizada;
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 61
7. Para realizar uma nova converso retorne ao passo 1 ou 2 (antes de uma nova
converso ser iniciada, deve ser aguardado um tempo de 2T
AD
, que o tempo de
converso por bit, cujo valor definido na tabela 1).

O conversor A/D necessita de no mnimo 12 T
AD
para realizar uma converso de 10 bits. A
fonte do clock do conversor A/D selecionada por software entre as possibilidades abaixo:
2Tosc
8Tosc
32Tosc
Oscilador RC interno

Para uma converso correta, o clock do conversor A/D deve ser selecionado para garantir
um T
AD
mnimo de 1.6s. A tabela 1 mostra os valores de T
AD
em funo da seleo da
fonte do clock.

Tabela1 T
AD
x Mxima freqncia de converso


Se o bit GO/DONE for resetado durante uma converso, esta ser abortada. Os
registradores de resultado do mdulo A/D no sero atualizados com a parcialmente
concluda converso. Assim, os registradores ADRESH:ADRESL continuaram
armazenando o valor da ltima converso concluda (ou o ltimo valor escrito para os
registradores ADRESH:ADRESL). Aps uma converso ser abortada, um tempo de 2T
AD

necessrio antes de uma nova converso ser iniciada. Aps este tempo, a aquisio do canal
selecionado automaticamente iniciada.
O par de registradores ADRESH:ADRESL comporta 16 bits, assim, o valor convertido de
10 bits pode ser justificado a direita ou esquerda, de acordo com o bit seleo de formato
do conversor A/D (ADFM), que controla a justificao. Os bits extras no utilizados so
carregados com 0 (zeros). Quando o mdulo A/D no estiver sendo utilizado, os
registradores ADRESH:ADRESL podem ser usados como dois registradores de propsito
geral de 8 bits.


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 62

Figura 31 - Justificao do resultado da converso A/D

6.1 - Diagrama de blocos do conversor A/D

Figura 32 - Diagrama de blocos do conversor A/D


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 63
6.2 - Registrador ADCON0 - Controla a operao do mdulo A/D (endereo 1Fh).


Bit 0 (bit ADON bit que ativa o conversor A/D) Este bit ativa a operao do
conversor A/D.
1 = conversor A/D ativado
0 = conversor A/D desligado

Bit 1 (bit no usado lido como 0)
Bit 2 (bit GO/ DONE bit de status de converso) Este bit indica se uma converso
iniciada j foi concluda.
Se ADON =1
1 = converso A/D em andamento
0 = no h converso A/D em andamento (esse bit automaticamente resetado quando a
converso A/D concluda).

Bits 5-3 (bits CHS2:CHS0 bits de seleo de canal) Estes bits selecionam a entrada
analgica cujo sinal ser convertido.
000 = canal 0, (RA0/AN0)
001 = canal 1, (RA1/AN1)
010 = canal 2, (RA2/AN2)
011 = canal 3, (RA3/AN3)
100 = canal 4, (RA5/AN4)
101 = canal 5, (RE0/AN5)
110 = canal 6, (RE1/AN6)
111 = canal 7, (RE2/AN7)

Bits 7-6 (bits ADCS1:ADCS0 bits de seleo de clock) Estes bits selecionam a fonte
do sinal de clock para o conversor A/D.
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (clock derivado de um oscilador RC)

6.3 - Registrador ADCON1 Configura a funo dos pinos das portas (A e E)
(endereo 9Fh)

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 64


Bits 3-0 (bits PCFG3:PCFG0 bits de controle de configurao ps portas A/D) Este
bits configuram os pinos analgicos das Portas A e E, conforme a tabela abaixo.


Bits 6-4 (bits no usados lido como 0)

Bit 7 (bit ADFM bit de seleo de formato do resultado da converso A/D) Este bit
seleciona o formato de justificao do resultado gerado pelo conversor A/D.
1 = Justificao direita. Os 6 bits mais significativos de ADRESH sero iguais a 0.
0 = Justificao esquerda. Os 6 bits menos significativos de ADRESL sero iguais a 0.

Os registradores ADCON1 e TRIS controlam a operao dos pinos das portas A/D. Os
pinos das portas que sero entradas analgicas devem ter seus correspondentes bits TRIS
setados. Se o bit est resetado, o nvel de tenso da sada digital ser convertido. A
operao do conversor A/D independe do estado dos bits CHS2:CHS0 e dos bits TRIS

Observaes:
1 Quando o registrador da porta lido, qualquer pino configurado como um canal de
entrada analgica ser lido como zero (nvel baixo). Pinos configurados como entradas
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 65
digitais iro se converter em entradas analgicas. Nveis analgicos em uma entrada
configurada como digital, no afetaro a preciso da converso.

2 Nveis analgicos em qualquer pino que definido como uma entrada digital (incluindo
os pinos AN7:AN0) podem fazer com que o buffer de entrada consuma corrente que est
fora das especificaes do dispositivo.

6.4 - Registradores associados com o mdulo do conversor A/D


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 66
7 - Comunicao Serial
7.1 - Conceitos
7.1.1 - Canais de Comunicao
Um canal de comunicao um caminho sobre o qual a informao pode trafegar. Ela pode
ser definida por uma linha fsica (fio) que conecta dispositivos de comunicao, ou por um
rdio, laser, ou outra fonte de energia radiante. Em comunicao digital, a informao
representada por bits de dados individuais, que podem ser encapsulados em mensagens de
vrios bits. Um byte (conjunto de 8 bits) um exemplo de uma unidade de mensagem que
pode trafegar atravs de um canal digital de comunicaes. Uma coleo de bytes pode ser
agrupada em um frame ou outra unidade de mensagem de maior nvel. Esses mltiplos
nveis de encapsulamento facilitam o reconhecimento de mensagens e interconexes de
dados complexos.
Um canal no qual a direo de transmisso inalterada denominado como canal simplex.
Por exemplo, uma estao de rdio um canal simplex porque ela sempre transmite o sinal
para os ouvintes e nunca permitida a transmisso inversa.
Um canal half-duplex um canal fsico simples no qual a direo pode ser revertida. As
mensagens podem fluir nas duas direes, mas nunca ao mesmo tempo. Em uma chamada
telefnica, uma parte fala enquanto a outra escuta. Depois de uma pausa, a outra parte fala e
a primeira escuta. Falar simultaneamente resulta em sons que no podem ser
compreendidos.
Um canal full-duplex permite que mensagens sejam trocadas simultaneamente em ambas
as direes. Ele pode ser visto como dois canais simplex, um canal direto e um canal
reverso, conectados nos mesmos pontos.

7.1.2 - Comunicao Serial
A maioria das mensagens digitais mais longa que alguns poucos bits. Por no ser prtico
nem econmico transferir todos os bits de uma mensagem simultaneamente, a mensagem
quebrada em partes menores e transmitida seqencialmente. A transmisso bit-serial
converte a mensagem em um bit por vez atravs de um canal. Cada bit representa uma parte
da mensagem. Os bits individuais so ento rearranjados no destino para compor a
mensagem original. Em geral, um canal ir passar apenas um bit por vez. A transmisso bit-
serial normalmente chamada de transmisso serial, e o mtodo de comunicao
escolhido por diversos perifricos de computadores. A transmisso byte-serial converte 8
bits por vez atravs de 8 canais paralelos. Embora a taxa de transferncia seja 8 vezes mais
rpida que na transmisso bit-serial, so necessrios 8 canais, e o custo poder ser maior do
que 8 vezes para transmitir a mensagem. Quando as distncias so curtas, factvel e
econmico usar canais paralelos como justificativa para as altas taxas de transmisso. A
interface Centronics de impressoras um caso tpico de transmisso byte-serial.

7.1.3 - Taxa de Transferncia (Baud Rate)
A taxa de transferncia refere-se velocidade com que os dados so enviados atravs de
um canal e medido em transies eltricas por segundo. Na norma EIA232, ocorre uma
transio de sinal por bit, e a taxa de transferncia e a taxa de bit (bit rate) so idnticas.
Nesse caso, uma taxa de 9600 bauds corresponde a uma transferncia de 9600 dados por
segundo, ou um perodo de aproximadamente, 104 ms (1/9600 s).
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 67
Outro conceito a eficincia do canal de comunicao que definido como o nmero de
bits de informao utilizvel (dados) enviados atravs do canal por segundo. Ele no inclui
bits de sincronismo, formatao, e deteco de erro que podem ser adicionados
informao antes da mensagem ser transmitida, e sempre ser no mximo igual a um.

Figura 33 Frame de dados comunicao serial

7.1.4 - Transmisso Assncrona x Transmisso Sncrona
Geralmente, dados serializados no so enviados de maneira uniforme atravs de um canal.
Ao invs disso, pacotes com informao regulares so enviados seguidos de uma pausa. Os
pacotes de dados binrios so enviados dessa maneira, possivelmente com comprimentos
de pausa varivel entre pacotes, at que a mensagem tenha sido totalmente transmitida. O
circuito receptor dos dados deve saber o momento apropriado para ler os bits individuais
desse canal, saber exatamente quando um pacote comea e quanto tempo decorre entre bits.
Quando essa temporizao for conhecida, o receptor dito estar sincronizado com o
transmissor, e a transferncia de dados precisa torna-se possvel. Falhas na manuteno do
sincronismo durante a transmisso iro causar a corrupo ou perda de dados.
Duas tcnicas bsicas so empregadas para garantir a sincronizao correta. Em sistemas
sncronos, canais separados so usados para transmitir dados e informao de tempo. O
canal de temporizao transmite pulsos de clock para o receptor. Atravs da recepo de
um pulso de clock, o receptor l o canal de dado e armazena o valor do bit encontrado
naquele momento. O canal de dados no lido novamente at que o prximo pulso de
clock chegue. Como o transmissor responsvel pelos pulsos de dados e de temporizao,
o receptor ir ler o canal de dados apenas quando comandado pelo transmissor, e, portanto
a sincronizao garantida.

Figura 34 Sinal de clock e canal de dados

Existem tcnicas que compem o sinal de clock e de dados em um nico canal. Isso usual
quando transmisses sncronas so enviadas atravs de um modem. Dois mtodos no qual
os sinais de dados contm informao de tempo so: codificao NRZ (Non-Return-to-
Zero) e a codificao Manchester.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 68
Em sistemas assncronos, a informao trafega por um canal nico. O transmissor e o
receptor devem ser configurados antecipadamente para que a comunicao se estabelea a
contento. Um oscilador preciso no receptor ir gerar um sinal de clock interno que igual
(ou muito prximo) ao do transmissor. Para o protocolo serial mais comum, os dados so
enviados em pequenos pacotes de 10 ou 11 bits, dos quais 8 constituem a mensagem.
Quando o canal est em repouso, o sinal correspondente no canal tem um nvel lgico 1.
Um pacote de dados sempre comea com um nvel lgico 0 (start bit) para sinalizar ao
receptor que um transmisso foi iniciada. O start bit inicializa um temporizador interno
no receptor avisando que a transmisso comeou e que sero necessrios pulsos de clocks.
Seguido do start bit, 8 bits de dados de mensagem so enviados na taxa de transmisso
especificada. O pacote concludo com os bits de paridade e de parada (stop bit).


Figura 35 Formato do pacote serial de bits do padro RS232

O comprimento do pacote de dados pequeno em sistemas assncronos para minimizar o
risco do oscilador do transmissor e do receptor variar. Quando osciladores a cristal so
utilizados, a sincronizao pode ser garantida sobre os 11 bits de perodo. A cada novo
pacote enviado, o start bit reseta a sincronizao, portanto a pausa entre pacotes pode ser
longa.

7.1.5 - Checksum e Paridade
Rudos e distrbios eltricos momentneos podem causar mudanas nos dados quando
esto trafegando pelos canais de comunicao. Se o receptor falhar ao detectar isso, a
mensagem recebida ser incorreta, resultando em conseqncias possivelmente srias.
Como uma primeira linha de defesa contra erros de dados, eles devem ser detectados. Se
um erro pode ser sinalizado, pode ser possvel pedir que o pacote com erro seja reenviado,
ou no mnimo prevenir que os dados sejam tomados como corretos. Se uma redundncia na
informao for enviada, 1 ou 2 bits de erros podem ser corrigidos pelo hardware no
receptor antes que o dado chegue ao seu destino.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 69
O bit de paridade adicionado ao pacote de dados com o propsito de deteco de erro. Na
conveno de paridade-par (even-parity), o valor do bit de paridade escolhido de tal
forma que o nmero total de dgitos 1 dos dados adicionado ao bit de paridade do pacote
seja sempre um nmero par. Na recepo do pacote, a paridade do dado precisa ser
recalculada pelo hardware local e comparada com o bit de paridade recebido com os dados.
Se qualquer bit mudar de estado, a paridade no ir coincidir, e um erro ser detectado. Se
um nmero par de bits for trocado, a paridade coincidir e o dado com erro ser validado.
Contudo, uma anlise estatstica dos erros de comunicao de dados tem mostrado que um
erro com bit simples muito mais provvel que erros em mltiplos bits na presena de
rudo randmico. Portanto, a paridade um mtodo confivel de deteco de erro.

Outro mtodo de deteco de erro envolve o clculo de um checksum quando mensagens
com mais de um byte so transmitidas pelo canal de comunicao. Nesse caso, os pacotes
que constituem uma mensagem so adicionados aritmeticamente. Um nmero de checksum
adicionado a seqncia do pacote de dados de tal forma que a soma dos dados mais o
checksum zero. Quando recebido, os dados devem ser adicionados pelo processador local.
Se a soma do pacote der resultado diferente de zero, ocorreu um erro. Na ocorrncia de
erros improvvel (mas no impossvel) que qualquer corrupo de dados resultem em
checksum igual a zero.

Podem ocorrer erros que no sejam apenas detectados, mas tambm sejam corrigidos se
cdigo adicional for adicionado a seqncia de dados do pacote. A correo de erros em
uma transmisso, contudo, abaixa a eficincia do canal, e o resultado uma queda na
transmisso.

7.1.6 - Interface Serial RS232 (EIA232)
7.1.6.1 - O que RS232 ?
RS uma abreviao de Recommended Standard. Ela relata uma padronizao de uma
interface comum para comunicao de dados entre equipamentos, criada no incio dos anos
60, por um comit conhecido atualmente como Electronic Industries Association (EIA).
Naquele tempo, a comunicao de dados compreendia a troca de dados digitais entre um
computador central (mainframe) e terminais de computador remotos, ou entre dois
terminais sem o envolvimento do computador. Estes dispositivos poderiam ser conectados
atravs de linha telefnica, e consequentemente necessitavam um modem em cada lado
para fazer a decodificao dos sinais.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 70
Dessas idias nasceu o padro RS232. Ele especifica as tenses, temporizaes e funes
dos sinais, um protocolo para troca de informaes, e as conexes mecnicas. A mais de 30
anos desde que essa padronizao foi desenvolvida, a EIA publicou trs modificaes. A
mais recente, EIA232E, foi introduzida em 1991. Ao lado da mudana de nome de RS232
para EIA232, algumas linhas de sinais foram renomeadas e vrias linhas novas foram
definidas.

Definio dos sinais da interface serial



Figura 36 Conectores macho/fmea do canal RS232

7.1.6.2. - Definio de Sinais
Se a norma EIA232 completa for implementada, o equipamento que faz o processamento
dos sinais chamado DTE (Data Terminal Equipment usualmente um computador ou
terminal), tem um conector DB25 macho, e utiliza 22 dos 25 pinos disponveis para sinais
ou terra. O equipamento que faz a conexo (normalmente uma interface com a linha
telefnica) denominado de DCE (Data Circuit-terminating Equipment usualmente um
modem), tem um conector DB25 fmea, e utiliza os mesmos 22 pinos disponveis para
sinais e terra. Um cabo de conexo entre dispositivos DTE e DCE contm ligaes em
paralelo, no necessitando mudanas na conexo de pinos. Se todos os dispositivos
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 71
seguissem essa norma, todos os cabos seriam idnticos, e no haveria chances de haver
conexes incorretas.

Figura 37 Conexo entre equipamento DTE e DCE via RS232

Diversos sinais so necessrios para conexes onde o dispositivo DCE um modem, e eles
so utilizados apenas quando o protocolo de software os emprega. Para dispositivos DCE
que no so modem, ou quando dois dispositivos DTE so conectados diretamente, poucos
sinais so necessrios.
Os sinais de temporizao de transmisso e recepo so utilizados somente quando o
protocolo de transmisso utilizado for sncrono. Para protocolos assncronos, padro 8 bits,
os sinais de temporizao externos so desnecessrios.
Os nomes dos sinais que implicam em uma direo, como Transmit Data e Receive
Data, so nomeados do ponto de vista dos dispositivos DTE. Se a norma EIA232 for
seguida a risca, estes sinais tero o mesmo nome e o mesmo nmero de pino do lado do
DCE. Infelizmente, isto no feito na prtica pela maioria dos engenheiros, provavelmente
porque em alguns casos torna-se difcil definir quem o DTE e quem o DCE. A figura a
seguir apresenta a conveno utilizada para os sinais mais comuns.


Figura 38 Ligao entre pinos dos equipamentos DTE e DCE

7.1.6.3 - Pinagem
As funes dos sinais da norma EIA232 podem ser subdivididos em 6 categoria,
apresentados na tabela a seguir.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 72




7.1.6.4 - Caractersticas dos Sinais
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 73
Todas as linhas, sejam elas de informaes de dados, temporizao ou controle, podem ser
representadas pelo mesmo circuito eltrico equivalente da figura a seguir:

Figura 39 Modelo eltrico de um canal RS232

Este circuito equivalente aplica-se aos sinais originados tanto no DTE quanto no DCE. A
capacitncia Co no especificada na norma, mas deve ser assumida como pequena e
consistir apenas de elementos parasitas. Ro e Vo so escolhidos de forma tal que a
corrente de curto-circuito no exceda a 500 mA.
Sinais com tenso entre 3 volts e 25 volts com relao ao terra (pino 7) so considerados
nvel lgico 1 (condio marca), e tenses entre +3 volts e +25 volts so considerados
nvel lgico 0 (condio espao). A faixa de tenses entre 3 volts e +3 volts
considerada uma regio de transio para o qual o estado do sinal indefinido.

Figura 40 Nveis de sinal do padro RS232

IMPORTANTE: Se forem inseridos LED's ou circuitos de teste para visualizar o estado dos
sinais, o sinal de tenso cair em magnitude e poder afetar o rendimento da interface se o
cabo for longo. Tambm deve-se notar que alguns perifricos baratos so alimentados com
os prprios sinais da interface para no utilizar fonte de alimentao prpria. Embora isso
normalmente funcione sem problemas, mantenha o cabo curto, e tome cuidado que a
imunidade a rudos ir diminuir.
Os sinais de sada foram projetados para funcionar em aberto, ou com curto-circuito com
outros sinais do condutor, incluindo o sinal de terra, sem danificar o outro circuito
associado. Os sinais de entrada tambm foram projetados para aceitar qualquer tenso entre
25 volts sem danificar.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 74
Quatro sinais foram implementados com segurana falhas (fail-safe design) no qual
durante a
desenergizao ou desconexo do cabo, seus sinais estaro desabilitados (nvel lgico 0).
So eles:
* Sinal RTS desabilitado
* Sinal SRTS desabilitado
* Sinal DTR DTE no pronto
* Sinal DSR DCE no pronto

7.2 Mdulo USART do PIC
O mdulo Transmissor Receptor Sncrono Assncrono Universal (USART) pode ser
configurado como um sistema Full Duplex, que pode se comunicar com dispositivos
perifricos segundo um padro de comunicao serial como o RS232, por exemplo. O
mesmo mdulo pode ser configurado como um sistema Half Duplex sncrono, capaz de se
comunicar com dispositivos como A/D, D/A, EEPROM Serial, etc.

O mdulo USART pode ser configurado nos seguintes modos:
Assncrono (Full Duplex)
Sncrono Master (Half Duplex)
Sncrono Slave (Half Duplex)

O bit 7 do registrador SPEN (bit RCSTA) e os bits 6 e 7 do registrador TRISB, devem ser
setados de forma a configurar o pino RC6/TX/CK e o pino RC7/RX/DT como os pinos de
transmisso e recepo da porta serial, respectivamente.

7.2.1 - USART - Modo Assncrono
Nesse modo a USART usa o padro NRZ Non-Return-to-Zero de codificao (um Start
bit, oito ou nove bits de dados e um Stop bit). O formato de dados mais comum o de oito
bits. A USART transmite e recebe o LSB primeiro. O transmissor e receptor da USART
so independentes, mas utilizam o mesmo formato de dados e o mesmo Baud Rate. A
paridade no suportada pelo Hardware, mas pode ser implementada por software (e
armazenado como o nono bit). O modo assncrono parado durante o modo SLEEP.
O modo assncrono selecionado resetando o bit SYNC do registrador TXSTA (bit 4). O
mdulo formado pelos seguintes blocos:

Gerador de Baud Rate;
Circuito de Amostragem;
Transmissor Assncrono;
Receptor Assncrono.

Seqncia para implementao de uma transmisso serial assncrona.
1 Inicializar o registrador SPBRG para o Baud Rate desejado. Se um Baud Rate de alta
velocidade for desejado, setar o bit BRGH;
2 Habilitar a porta serial assncrona, resetando o bit SYNC e setando o bit SPEN;
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 75
3 Setar o bit TXIE para habilitar a interrupo que indica quando o registrador de escrita
da porta serial est vazio (dado j transferido para o registrador de deslocamento que
serializa o dado para o pino TX da porta serial);
4 Setar o bit de transmisso (bit TX9) se a transmisso de dados de 9 bits for requerida;
5 Habilitar a transmisso, setando o bit TXEN, que setar o bit TXIF;
6 Se a transmisso de 9 bits for selecionada o nono bit deve ser carregado no bit TX9D;
7 Carregar o dado para o registrador TXREG (incio da transmisso).

Seqncia para implementao de uma recepo serial assncrona.
1 Inicializar o registrador SPBRG para o Baud Rate desejado. Se um Baud Rate de alta
velocidade for desejado, setar o bit BRGH;
2 Habilitar a porta serial assncrona, resetando o bit SYNC e setando o bit SPEN;
3 Setar o bit RCIE para habilitar a interrupo que indica quando o registrador de leitura
da porta tem um byte pronto para ser lido;
4 Setar o bit de recepo (bit RX9) se a recepo de dados de 9 bits for requerida;
5 Habilitar a recepo, setando o bit CREN;
6 O bit de flag RCIF ser setado quando uma recepo tiver sido completada e uma
interrupo ser gerada se o bit RCIE estiver setado;
7 Ler o registrador RCSTA para obter o nono bit (se habilitado) e determinar se houve
algum erro durante a recepo;
8 Ler os 8 bits de dados recebidos no registrador RCREG;
9 Se houve algum erro na recepo, limpar o erro, resetando o bit CREN.

7.2.1.1 - Registrador de Controle e Status da Transmisso (End. 98H)


Bit 0 (bit TX9D nono bit do dado transmitido) Este bit pode representar um bit de
paridade implementado por software.

Bit 1 (bit TRMT status do registrador de deslocamento do transmissor da USART)
Este bit indica se o registrador de deslocamento do transmissor da USART est cheio ou
vazio.
1 = Registrador de deslocamento vazio
0 = registrador de deslocamento cheio

Bit 2 (bit BRGH seleo de alta taxa de transmisso (High Baud Rate)) Este bit
seleciona uma taxa de transmisso (baud rate) alta.
No modo Assncrono
1 = Alta taxa de transmisso
0 = Baixa taxa de transmisso.
No modo Sncrono
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 76
No usado

Bit 3 (bit no usado, lido como 0

Bit 4 (bit SYNC bit de seleo do modo de operao da USART) Este bit seleciona
como a USART operar, no modo assncrono ou sncrono.
1 = Modo sncrono
0 = Modo assncrono.

Bit 5 (bit TXEN bit de habilitao de transmisso) Este bit habilita o mdulo de
transmisso da USART.
1 = Transmisso habilitada
0 = Transmisso desabilitada.
Nota: SREN/CREN tem prioridade sobre o bit TXEN no modo sncrono

Bit 6 (bit TX9 bit de habilitao da transmisso do nono bit) Este bit habilita a
transmisso do nono bit de dados.
1 = Seleciona transmisso de 9 bits
0 = Seleciona transmisso de 8 bits.

Bit 7 (bit CSRC bit de seleo da fonte de clock para a USART) Este bit seleciona a
fonte do sinal de clock quando a USART opera no modo sncrono.
Modo assncrono
No usado
Modo Sncrono
1 = Modo Mestre (clock gerado internamente pelo RG)
0 = Modo escravo (clock externo).

7.2.1.2 - Registrador de Controle e Status da Recepo (End. 18H)


Bit 0 (bit RX9D nono bit do dado recebido) Este bit pode representar um bit de
paridade implementado por software.

Bit 1 (bit OERR bit de erro de overrun) Este bit setado quando um segundo byte
gravado no registrador de recepo da porta serial, antes do byte anterior ter sido lido.
1 = Erro de overrun (este bit pode ser apagado resetando o bit CREN)
0 = No houve erro de overrun.

Bit 2 (bit FERR bit de erro de frame) Este bit setado quando detectado um erro de
frame..
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 77
1 = Erro de frame (pode ser atualizado lendo o registrador RCREG e recepo do prximo
byte vlido
0 = No houve erro de frame.

Bit 3 (bit ADDEN bit que habilita a deteco de endereo) Este bit permite a utilizar
o nono bit da palavra de dados para identificao de palavras de endereo (RX9 1).
Modo assncrono, bit 9 habilitado
1 = Habilita deteco de endereo, habilita interrupo e faz leitura do buffer de recepo
quando RSR<8> setado
0 = Desabilita a deteco de endereo. Todos os bytes so recebidos e o nono bit pode ser
usado como bit de paridade.

Bit 4 (bit CREN bit que habilita a recepo no modo contnuo) Este bit habilita a
USART a receber de forma contnua dados seriais.
Modo Assncrono
1 = habilita recepo contnua
0 = Desabilita recepo contnua.
Modo Sncrono
1 = habilita recepo contnua at o bit CREN ser resetado (CREN tem prioridade
sobre SREN)
0 = Desabilita recepo contnua.

Bit 5 (bit SREN bit de habilitao de recepo byte-a-byte) Este bit habilita o
mdulo de recepo da USART a receber dados byte a byte.
Modo Assncrono
No usado nesse modo
Modo Sncrono (Mestre)
1 = habilita recepo byte-a-byte
0 = Desabilita recepo byte-a-byte.
Nota: Esse bit resetado aps a recepo do byte
Modo Sncrono (Escravo)
No usado nesse modo

Bit 6 (bit RX9 bit de habilitao da recepo do nono bit) Este bit habilita a
recepo do nono bit de dados.
1 = Seleciona recepo de 9 bits
0 = Seleciona recepo de 8 bits.

Bit 7 (bit SPEN bit de habilitao da porta serial) Este bit ativa ou desliga o bloco de
comunicao serial.
1 = Porta serial habilitada (configura os pinos RC7/RX/DT e RC6/TX/CK como pinos da
porta serial)
0 = Porta serial desabilitada.

7.2.1.3 - Registradores associados com a transmisso assncrona
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 78


7.2.1.4 - Registradores associados com a recepo assncrona


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 79
8 - Memria de dados EEPROM
O PIC16F877 tem 256 bytes de localizaes de memria EEPROM, correspondentes aos
endereos de 00h a FFh e onde podemos ler e escrever. A caracterstica mais importante
desta memria de no perder o seu contedo quando a alimentao desligada. Na prtica,
isso significa que os dados escritos permanecem no microcontrolador, mesmo quando a
alimentao desligada. Sem alimentao, estes dados permanecem no microcontrolador
durante mais de 40 anos (especificaes do fabricante do microcontrolador PIC), alm
disso, esta memria suporta at 10000 operaes de escrita.

A memria EEPROM colocada num espao de memria especial e pode ser acessada
atravs dos registros especiais:
EEDATA (endereo 10Ch): Contm o byte menos significativo do dado de 14 bits a
ser lido/escrito na EEPROM;
EEDATAH (endereo 10Eh): Contm o byte mais significativo do dado de 14 bits a
ser lido/escrito na EEPROM;
EEADR (endereo 10Dh): Contm o byte menos significativo do endereo de 13
bits da posio de memria da EEPROM a ser lida/escrita;
EEADRH (endereo 10Fh): Contm o byte mais significativo do endereo de 13
bits da posio de memria da EEPROM a ser lida/escrita;
EECON1 (endereo 18Ch): Registrador de controle de acesso a memria EEPROM;
EECON2 (endereo 18Dh): Este registro no existe fisicamente e serve para
proteger a EEPROM de uma escrita acidental.

O registro EECON1 ocupa o endereo 18Ch e um registro de controle com cinco bits
implementados.
Os bits 4, 5 e 6 no so usados e, se forem lidos, so sempre iguais a zero.
Os bits do registro EECON1, devem ser interpretados do modo que se segue.





Bit 0 RD (bit de controle de leitura): Ao setar este bit (Bit 0 = 1), tem incio a transferncia
do dado do endereo definido em EEADRH:EEADR para o registro EEDATAH:EEDATA.
Como o tempo no essencial, tanto na leitura como na escrita, o dado de EEDATAH:
EEDATA pode j ser usado na instruo seguinte.
1 = inicia a leitura
0 = no inicia a leitura
Este bit resetado, (Bit 0 = 0) por hardware uma vez que a escrita tenha terminado.

Bit 1 WR (bit de controle de escrita): Ao setar este bit ( Bit 1 = 1), tem incio a escrita do
dado a partir do registro EEDATAH:EEDATA para o endereo especificado no registro
EEADRH:EEADR.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 80
1 = inicia a escrita
0 = no inicia a escrita
Este bit resetado, (Bit 1 = 0) por hardware uma vez que a escrita tenha terminado.

Bit 2 WREN (bit de habilitao de escrita na EEPROM): Permite a escrita na EEPROM.
Se este bit no estiver em um lgico, o microcontrolador no permite a escrita na EEPROM.
1 = a escrita permitida
0 = no se pode escrever

Bit 3 WRERR (Erro de escrita na EEPROM): Erro durante a escrita na EEPROM
Este bit setado (Bit 3 = 1) quando a escrita na EEPROM for interrompida por um sinal de
reset ou por um transbordo no temporizador do watchdog (no caso deste estar ativo).
1 = ocorreu um erro
0 = no houve erros

Bit 7 EEPGD (Bit que indica acesso a memria de programa (FLASH) ou a memria de
dados EEPROM)
1 = Acesso a memria de programa (FLASH)
0 = Acesso a memria de dados (EEPROM)

8.1 - Lendo a Memria EEPROM
Setando o bit RD inicia-se a transferncia do dado do endereo guardado no registrador
EEADR para o registrador EEDATA. Como para ler os dados no preciso tanto tempo
como para escrev-los, os dados extrados do registrador EEDATA podem ser usados na
instruo seguinte.

Um trecho de programa que leia um dado da EEPROM, pode ser semelhante ao seguinte:


Depois da ltima instruo do programa, o contedo do endereo 0 da EEPROM pode ser
encontrado no registrador de trabalho w.

8.3 - Escrevendo na Memria EEPROM
Para escrever dados num local da EEPROM, o programador tem que primeiro enderear o
registrador EEADR e carregar a palavra de dados no registrador EEDATA. A seguir, deve
setar o bit WR, o que faz desencadear o processo. O bit WR dever ser resetado e o bit
EEIF ser setado ao fim da operao de escrita, o que pode ser usado no processamento de
interrupes. Os valores 55h e AAh so as primeira e segunda chaves que tornam
impossvel que ocorra uma escrita acidental na EEPROM. Estes dois valores so escritos
em EECON2 que serve apenas para isto, ou seja, para receber estes dois valores e assim
prevenir contra uma escrita acidental na memria EEPROM. As linhas do programa
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 81
marcadas como 1, 2, 3 e 4 tm que ser executadas nesta ordem em intervalos de tempo
especficos. Portanto, muito importante desativar as interrupes que possam interferir
com a temporizao necessria para executar estas instrues. Depois da operao de
escrita, as interrupes podem ser de novo habilitadas.

Exemplo do trecho de programa que escreve a palavra 0xEE no primeiro endereo da
memria EEPROM:




Recomenda-se que WREN esteja sempre inativo, exceto quando se escreve uma
palavra de dados na EEPROM, deste modo, a possibilidade de uma escrita acidental
mnima.
Todas as operaes de escrita na EEPROM limpam automaticamente o local de
memria, antes de escrever de novo nele !


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 82
9 - Programao em Linguagem Assembly
9.1 - Introduo
A linguagem que os microcontroladores e o homem usam para se comunicar entre si
designada por linguagem assembly. O prprio ttulo no tem um significado profundo,
trata-se apenas de um nome como por exemplo ingls ou francs. Mais precisamente,
linguagem assembly apenas uma soluo transitria. Os programas escritos em
linguagem assembly devem ser traduzidos para uma linguagem de zeros e uns de modo a
que um microcontrolador possa interpretar os comandos. Linguagem assembly e
assembler so coisas diferentes. A primeira, representa um conjunto de regras usadas
para escrever um programa para um microcontrolador e a outra, um programa que traduz
a linguagem assembly para uma linguagem de zeros e uns. Um programa escrito em
zeros e uns diz-se que est escrito em linguagem mquina.

Figura 41 - O processo de comunicao entre o homem e o microcontrolador

Fisicamente, Programa representa um arquivo em um disco de computador (ou na
memria se estivermos lendo de um microcontrolador) e escrito de acordo com as regras
do assembly ou qualquer outra linguagem de programao de microcontroladores. O
homem pode entender a linguagem assembly j que ela constituda por smbolos
alfabticos e palavras. Ao escrever um programa, certas regras devem ser seguidas para
alcanar o efeito desejado. Um Tradutor interpreta cada instruo escrita em linguagem
assembly como uma srie de zeros e uns com significado para a lgica interna do
microcontrolador.
Consideremos, por exemplo, a instruo RETURN que um microcontrolador utiliza para
regressar de uma subrotina.
Quando o assembler a traduz, ns obtemos uma srie de uns e zeros correspondentes a 14
bits que o microcontrolador sabe como interpretar.


Exemplo: RETURN 00 0000 0000 1000
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 83

Analogamente ao exemplo anterior, cada instruo assembly interpretada na srie de
zeros e uns correspondente.
O resultado desta traduo da linguagem assembly, designado por um arquivo de
execuo. Muitas vezes encontramos o nome de arquivo HEX. Este nome provm de
uma representao hexadecimal desse arquivo, bem como o sufixo hex" no ttulo, por
exemplo correr.hex". Uma vez produzido, o arquivo de execuo inserido no
microcontrolador atravs de um programador.
Um programa em Linguagem Assembly escrito por intermdio de um processador de
texto (editor) e capaz de produzir um arquivo ASCII no disco de um computador ou em
ambientes prprios como o MPLAB.

9.2 - Linguagem Assembly
Os elementos bsicos da linguagem assembly so:
Labels (rtulos)
Instrues
Operandos
Diretivas
Comentrios

Um Label (rtulo) uma designao textual (geralmente de fcil leitura) de uma linha num
programa ou de uma seco de um programa para onde um microcontrolador deve saltar ou,
ainda, o incio de um conjunto de linhas de um programa. Tambm pode ser usado para
executar um desvio de um programa (tal como Goto....), o programa pode ainda conter uma
condio que deve ser satisfeita, para que uma instruo Goto seja executada. importante
que um rtulo (label) seja iniciado com uma letra do alfabeto ou com um trao baixo _. O
comprimento de um rtulo pode ir at 32 caracteres. tambm importante que o rtulo
comece na primeira coluna.

9.2.1 - Instrues
As instrues so especficas para cada microcontrolador, assim, se quisermos utilizar a
linguagem assembly temos que estudar as instrues desse microcontrolador. O modo
como se escreve uma instruo designado por "sintaxe". No exemplo que se segue,
possvel reconhecer erros de escrita, dado que as instrues movlp e gotto no existem no
microcontrolador PIC16F877
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 84

9.2.2 - Operandos
Operandos so os elementos da instruo necessrios para que a instruo possa ser
executada. Normalmente so dados de registradores, variveis e constantes. As constantes
so designadas por literais. A palavra literal significa nmero.

9.2.3 - Comentrios
Comentrio um texto que o programador escreve no programa a fim de tornar este mais
claro e legvel. colocado logo a seguir a uma instruo e deve comear com um ponto-e-
vrgula ";".

9.2.4 - Diretivas
Uma diretiva parecida com uma instruo mas, ao contrrio desta, independente do tipo
de microcontrolador e uma caracterstica inerente prpria linguagem assembly. As
diretivas servem-se de variveis ou registradores para satisfazer determinados propsitos.
Por exemplo, NIVEL, pode ser uma designao para uma varivel localizada no endereo
0Dh da memria RAM. Deste modo, a varivel que reside nesse endereo, pode ser
acessada pela palavra NIVEL. muito mais fcil a um programador recordar a palavra
NIVEL, que lembrar-se que o endereo 0Dh contm informao sobre o nvel.



Exemplo de como se escreve um programa
O exemplo a seguir, mostra como um programa simples pode ser escrito em linguagem
assembly, respeitando regras bsicas.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 85
Quando se escreve um programa, alm das regras fundamentais, existem princpios que,
embora no obrigatrios so convenientes de serem seguidos. Um deles, escrever no seu
incio, o nome do programa, aquilo que o programa faz, a verso deste, a data em que foi
escrito, tipo de microcontrolador para o qual foi escrito e o nome do programador.



Uma vez que estes dados no interessam ao tradutor de assembly, so escritos na forma de
comentrios. Deve-se atentar que um comentrio comea sempre com ponto e vrgula e
pode ser colocado na linha seguinte ou logo a seguir instruo.
Depois deste comentrio inicial ter sido escrito, devem incluir-se as diretivas. Isto
mostrador no exemplo acima.
Para que o seu funcionamento seja correto, preciso definir vrios parmetros para o
microcontrolador, tais como:
- tipo de oscilador
- quando o temporizador do watchdog est ligado e
- quando o circuito interno de reset est habilitado.

Tudo isto definido na diretiva seguinte:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 86
Logo que todos os elementos necessrios so definidos, possvel iniciar a escrita do
programa. Primeiro, necessrio definir o endereo para o qual o microcontrolador deve ir
quando se liga a alimentao. esta a finalidade de (org 0x00).
O endereo para onde um programa salta se ocorrer uma interrupo (org 0x04).
Como este um programa simples, suficiente dirigir o microcontrolador para o incio de
um programa com uma instruo "goto Main" (Main = programa principal).
As instrues encontradas em Main, selecionam o banco 1 (BANK1) de modo a poder
acessar o registrador TRISB, para configurar a Porta B como uma sada (movlw 0x00,
movwf TRISB).
O prximo passo selecionar o banco de memria 0 e colocar os bits da porta B no estado
lgico 1 e, assim, o programa principal fica terminado.
preciso, no entanto, um outro ciclo (loop), onde o microcontrolador possa permanecer
sem que ocorram erros. Trata-se de um loop infinito que executado continuamente,
enquanto a alimentao no for desligada. Finalmente, necessrio colocar a palavra end"
no fim de cada programa, de modo a informar o tradutor de assembly de que o programa
no contm mais instrues.

9.2.5 - Diretivas de controle
9.2.5.1 - #DEFINE Troca de uma poro de texto por outra
Sintaxe:
#define<nome> [< texto atribudo a nome > ]

Descrio:
Cada vez que a palavra <nome> aparece no programa, vai ser substituda por <texto
atribudo a nome>.

Exemplo:
#define ligado 1
#define desligado 0

Diretivas similares: #UNDEFINE, IFDEF, IFNDEF


9.2.5.2 - INCLUDE Incluir um arquivo adicional
Sintaxe:
include <<nome_do_arquivo>>
include <nome_do_arquivo>

Descrio:
A aplicao desta diretiva faz com que um arquivo completo seja copiado para o local em
que a diretiva include se encontra. Se o nome do arquivo estiver entre aspas, trata-se de
um arquivo do sistema, se no estiver entre aspas, mas sim entre os sinais < >, trata-se de
um arquivo do usurio. A diretiva include, contribui para uma melhor apresentao do
programa principal.
Exemplo:
include < regs.h >
include subprog.asm
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 87


9.2.5.3 - CONSTANT Atribui um valor numrico constante a uma designao textual
Sintaxe:
constant < nome > = < valor >

Descrio:
Cada vez que < nome > aparece no programa, substitudo por < valor > .

Exemplo:
constant MAXIMO = 100
constant Comprimento = 30

Diretivas similares: SET, VARIABLE


9.2.5.4 - VARIABLE Atribui um valor numrico varivel designao textual
Sintaxe:
variable < nome > = < valor >

Descrio:
Ao utilizar esta diretiva, a designao textual muda o seu valor.
Difere da diretiva CONSTANT pelo fato de que, depois da diretiva ser aplicada, o valor da
designao textual poder variar.

Exemplo:
variable nivel = 20
variable tempo = 13

Diretivas similares: SET, CONSTANT


9.2.5.5 - SET Definir uma varivel assembler
Sintaxe:
< nome_variavel > set <valor>

Descrio:
varivel < nome_variavel > atribuda a expresso <valor> . A diretiva SET
semelhante a EQU, mas com a diretiva SET possvel tornar a definir a varivel com outro
valor.

Exemplo:
nivel set 0
comprimento set 12
nivel set 45

Diretivas similares: EQU, VARIABLE
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 88


9.2.5.6 - EQU Definindo uma constante em assembler
Sintaxe:
< nome_da_constante > equ < valor >

Descrio:
Ao nome de uma constante < nome_de_constante > atribudo um valor < valor >

Exemplo:
cinco equ 5
seis equ 6
sete equ 7

Diretivas similares: SET


9.2.5.7 - ORG Define o endereo a partir do qual o programa armazenado na memria
do microcontrolador
Sintaxe:
<rtulo> org <valor>

Descrio:
Esta a diretiva mais frequentemente usada. Com esta diretiva possvel definir em que
posio na memria de programa o programa vai comear.

Exemplo:
Inicio org 0x00
movlw 0xFF
movwf PORTB

As duas instrues aps diretiva 'org', so guardadas a partir do endereo 00.


9.2.5.8 - END Fim do programa
Sintaxe:
end

Descrio:
No fim do programa, necessrio colocar a diretiva 'end', para que o tradutor do assembly
(assembler), saiba que no existem mais instrues no programa.

Exemplo:
..
movlw 0xFF
movwf PORTB
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 89
end


9.2.6 - Instrues condicionais
9.2.6.1 - IF Ramificao condicional do programa
Sintaxe:
if <termo_condicional>

Descrio:
Se a condio em <termo_condicional> estiver satisfeita, a parte do programa que se segue
diretiva IF, dever ser executada. Se a condio no for satisfeita, ento executada a
parte que se segue s diretivas ELSE ou ENDIF.

Exemplo:

if nivel = 100
goto ENCHER
else
goto DESPEJAR
endif

Diretivas similares: ELSE, ENDIF


9.2.6.2 - ELSE Assinala um bloco alternativo se a condio termo_condicional presente
em 'IF' no se verificar
Sintaxe:
Else

Descrio:
Usado com a diretiva IF como alternativa no caso de termo_condicional ser falso.

Exemplo:
if tempo < 50
goto DEPRESSA
else goto DEVAGAR
endif

Instrues similares: ENDIF, IF


9.2.6.3 - ENDIF Fim de uma seo condicional do programa
Sintaxe:
endif

Descrio:
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 90
Esta diretiva escrita no fim de um bloco condicional, para informar o tradutor do
assembly de que o bloco condicional terminou.

Exemplo:
if nivel = 100
goto METER
else
goto TIRAR
endif

Diretivas similares: ELSE, IF


9.2.6.4 - WHILE A execuo da seo do programa prossegue, enquanto a condio se
verificar
Sintaxe:
while <condio>
endw

Descrio:
As linhas do programa situadas entre WHILE e ENDW devem ser executadas, enquanto a
condio for verdadeira. Se a condio deixar de se verificar, o programa dever executar
as instrues a partir da linha que sucede a ENDW. O nmero de instrues compreendidas
entre WHILE e ENDW pode ir at 100 e podem ser executadas at 256 vezes.

Exemplo:
while i < 10
i = i + 1
endw


9.2.6.5 - ENDW Fim da parte condicional do programa
Sintaxe:
endw

Descrio:
Esta diretiva escrita no fim do bloco condicional correspondente a WHILE, assim, o
assembler fica informado de que o bloco condicional chegou ao fim.

Exemplo:
while i < 10
i = i + 1
endw

Diretivas similares: WHILE


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 91
9.2.6.6 - IFDEF Executar uma parte do programa se um smbolo estiver definido
Sintaxe:
ifdef < designao >

Descrio:
Se a designao <designao> tiver sido previamente definida (normalmente atravs da
diretiva #DEFINE), as instrues que lhe sucedem sero executadas at serem encontradas
as diretivas ELSE ou ENDIF.

Exemplo:
#define teste
ifdef teste ; como teste foi definido
...............; as instrues nestas linhas vo ser executadas
endif

Diretivas similares: #DEFINE, ELSE, ENDIF, IFNDEF, #UNDEFINE


9.2.6.7 - IFNDEF Execuo de uma parte do programa se o smbolo no tiver sido
definido
Sintaxe:
ifndef <designao>

Descrio:
Se a designao <designao> no tiver sido previamente definida ou se esta definio tiver
sido mandada ignorar atravs da diretiva #UNDEFINE, as instrues que se seguem
devero ser executadas, at que as diretivas ELSE ou ENDIF, sejam alcanadas.

Exemplo:
#define teste
........
#undefine teste
.........
ifndef teste ; como teste no est definido
........ ; as instrues nestas linhas so executadas
endif

Diretivas similares: #DEFINE, ELSE, ENDIF, IFDEF, #UNDEFINE


9.2.7 - Diretivas de Dados
9.2.7.1 - CBLOCK Definir um bloco para as constantes nomeadas
Sintaxe:
Cblock [< termo >]
<rtulo> [:<incremente>], <rtulo> [:<incremente>]......
endc

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 92
Descrio:
Esta diretiva usada para atribuir valores s constantes a seguir nomeadas. A cada termo
seguinte, atribudo um valor superior em uma unidade ao anterior. No caso de
<incremente> estar preenchido, ento o valor de <incremente> que adicionado
constante anterior.
O valor do parmetro <termo>, o valor inicial. Se no for dado, ento ser considerado
igual a zero.

Exemplo:
cblock 0x02
primeiro, segundo ; primeiro = 0x02, segundo = 0x03
terceiro ;terceiro = 0x04
endc

cblock 0x02
primeiro : 4, segundo : 2 ; primeiro = 0x06, segundo = 0x08
terceiro ; terceiro = 0x09
endc

Diretivas similares: ENDC


9.2.7.2 - ENDC Fim da definio de um bloco de constantes
Sintaxe:
endc

Descrio:
Esta diretiva utilizada no fim da definio de um bloco de constantes, para que o tradutor
de assembly saiba que no h mais constantes.

Diretivas similares: CBLOCK


9.2.7.3 - DB Definir um byte de dados
Sintaxe:
[<termo>] db <termo> [, <termo>,......,<termo>]

Descrio:
Esta diretiva reserva um byte na memria de programa. Quando h mais termos a quem
preciso atribuir bytes, eles sero atribudos um aps o outro.

Exemplo:
db t, 0x0f, e, s', 0x12

Instrues similares: DE, DT
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 93


9.2.7.4 - DE Definir byte na memria EEPROM
Sintaxe:
[<termo>] de <termo> [, <termo>,......,<termo>]

Descrio:
Esta diretiva reserva um byte na memria EEPROM. Apesar de ser destinada em primeiro
lugar para a memria EEPROM, tambm pode ser usada em qualquer outro local de
memria.

Exemplo:
org H2100
de Verso 1.0, 0

Diretivas similares: DB, DT


9.2.7.5 - DT Definindo uma tabela de dados
Sintaxe:
[<termo>] dt <termo> [, <termo>,......,<termo>]

Descrio:
Esta diretiva vai gerar uma srie de instrues RETLW, uma instruo para cada termo.

Exemplo:
dt Mensagem , 0
dt primeiro, segundo, terceiro

Diretivas similares: DB, DE

9.2.8 - Configurando uma diretiva
9.2.8.1 - __CONFIG Estabelecer os bits de configurao
Sintaxe:
__config<termo> ou __config <endereo>, <termo>

Descrio:
So definidos o tipo de oscilador, e a utilizao do watchdog e do circuito de reset interno.
Antes de usar esta diretiva, tem que declarar-se o processador atravs da diretiva
PROCESSOR.

Exemplo:
__CONFIG _CP_OFF & _WDT_OFF & PWRTE_ON & _XT_OSC

Diretivas similares: __IDLOCS, PROCESSOR
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 94


9.2.8.2 - PROCESSOR Definindo o modelo de microcontrolador
Sintaxe:
processor <tipo_de_microcontrolador>

Descrio:
Esta diretiva, estabelece o tipo de microcontrolador em que o programa vai correr.

Exemplo:
processor 16f84

9.2.9 - Operadores aritmticos de assembler


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 95


9.2.10 - Arquivos criados ao compilar um programa
Os arquivos resultantes da traduo de um programa escrito em linguagem assembly so os
seguintes:
Arquivo de execuo (nome_do_programa.hex)
Arquivo de erros no programa (nome_do_programa.err)
Arquivo de listagem (nome_do_programa.lst)

O primeiro arquivo contm o programa traduzido e que vai ser gravado no
microcontrolador quando este programado.
O segundo arquivo contm erros possveis que foram cometidos no processo de escrita e
que foram identificados pelo assembler durante a traduo. Estes erros tambm so
mencionados no arquivo de listagem list. No entanto prefervel utilizar este arquivo de
erros err, em casos em que o arquivo lst muito grande e, portanto, difcil de consultar.
O terceiro arquivo o mais til para o programador. Contm muita informao tal como o
posicionamento das instrues e variveis na memria e a sinalizao dos erros.

9.2.11 - Macros
As macros so elementos muito teis em linguagem assembly. Uma macro pode ser
descrita em poucas palavras como um grupo de instrues definido pelo usurio que
acrescentado ao programa pelo assembler, sempre que a macro for invocada. possvel
escrever um programa sem usar macros. Mas, se as utilizarmos, o programa torna-se muito
mais legvel, especialmente no caso do desenvolvimento distribudo de um sistema, quando
vrios programadores podem trabalhar em conjunto. As macros tm afinidades com as
funes nas linguagens de alto nvel.

Escrita de uma Macro:
<rtulo> macro
[<argumento1>,<argumento2>,.....,<argumentoN>]
.........
.........
endm

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 96
Pelo modo como so escritas, observa-se que as macros podem aceitar argumentos, o que
tambm muito til em programao.
Quando o argumento invocado no interior de uma macro, ele vai ser substitudo pelo
valor <argumentoN>.
Exemplo:

O exemplo acima, mostra uma macro cujo propsito enviar para a porta B, o argumento
ARG1, definido quando a macro foi invocada. Para utilizar a macro num programa, basta
escrever uma nica linha: ON_PORTB 0xFF e, assim, coloca-se o valor 0xFF na porta B.
Para utilizar uma macro no programa, necessrio incluir o arquivo macro no programa
principal, por intermdio da diretiva #include nome_da_macro.inc. O contedo da macro
automaticamente copiado para o local em que esta macro est escrita. Isto pode se melhor
visto no arquivo lst..

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 97
10 - MPLAB
10.1 - Introduo
O MPLAB um pacote de programas para o Windows e que tornam mais fcil escrever ou
desenvolver um programa. O MPLAB disponibiliza um ambiente IDE "Integrated
Development Environment" (Ambiente Integrado de Desenvolvimento) que torna o
processo de programao mais fcil.

10.2 Instalando o programa - MPLAB

O MPLAB compreende vrias partes:
- Agrupamento de todos os arquivos do mesmo projeto, num nico projeto (Project
Manager)
- Escrever e processar um programa (Editor de Texto)
- Simular o funcionamento no microcontrolador do programa que se acabou de escrever
(Simulador)

10.2.1 - Instalao do MPLAB
Logo no incio, necessrio selecionar quais os componentes do MPLAB que sero
instalados. Como, em princpio, no dispomos dos componentes de hardware originais da
Microchip tais como programadores ou emuladores, as nicas coisas que vamos instalar o
ambiente MPLAB, Assembler, Simulador e instrues.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 98

Figura 42 - Selecionando os componentes do ambiente de desenvolvimento MPLAB

Considerando a instalao em computadores com o Windows XP, todas as opes
relacionadas ao sistema operacional DOS (se houver) no devem ser selecionados ao fazer
a seleo da linguagem assembler.

Figura 43 - Selecionando o Assembler e o sistema operacional

Como qualquer outro programa, o MPLAB deve ser instalado em um diretrio. O diretrio
escolhido, pode ser qualquer um no disco do computador. Se no houver objees, pode-se
aceitar a escolha indicada por default.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 99

Figura 44 - Escolhendo o diretrio em que o MPLAB vai ficar instalado

Os usurios que j tenham o MPLAB instalado (verso mais antiga que esta), necessitam da
opo que se segue.
O propsito desta opo salva cpias de todos os arquivos que foram modificados durante
o processo de mudana da verso antiga para a verso mais moderna do MPLAB. Caso seja
a primeira instalao, deve-se selecionar a opo NO.

Figura 45 - Opes para usurios que esto instalando uma nova verso do MPLAB por
cima de outra verso instalada, mais antiga
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 100
O menu Iniciar (START) contm um conjunto de ponteiros para programas e selecionado
clicando na opo INICIAR ao fundo, no canto esquerdo da tela. Para que o MPLAB
tambm possa ser iniciado a partir daqui, necessrio deixar esta opo ativada.

Figura 46 - Introduzindo o MPLAB no menu iniciar
Na janela a seguir, selecionando um diretrio especial, o MPLAB guarda todos os
arquivos relacionados com o linker, num diretrio separado.

Figura 47 - Definio do diretrio dos arquivos linker

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 101
Geralmente, todos os programas que executam no Windows, tm os arquivos do sistema
guardados no diretrio Windows. Depois de mltiplas instalaes, o diretrio Windows
torna-se demasiado grande. Assim, alguns programas permitem que os seus arquivos do
sistema fiquem guardados nos mesmos diretrios em que esto os programas. O MPLAB
um exemplo e por isso, deve ser selecionada a opo do fundo.

Figura 48 - Seleo de um diretrio para os arquivos do sistema

Depois de realizados estes passos, a instalao inicia-se ao clicar em Next.

Figura 49 - Tela antes da instalao
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 102
Depois de concluda a instalao, aparecem duas telas de dilogo, uma que menciona as
ltimas informaes e correes relativas ao programa e a outra que uma tela de boas
vindas.
Se os arquivos de texto (Readme.txt) forem abertos, preciso, fech-los a seguir.

10.3 - MPLAB
A seguir sero apresentadas as etapas do processo de desenvolvimento de um programa em
linguagem Assembly para o PIC 16F877, familiarizando o usurio com o ambiente de
desenvolvimento MPLAB e com elementos bsicos do MPLAB, tais como:
Escolher um modo de desenvolvimento
Designar um projeto
Designar um arquivo para o programa original
Escrever um programa elementar na linguagem de programao assembler
Traduzir um programa para linguagem mquina
Iniciar o programa
Abrir uma nova janela de simulao
Abrir uma nova janela para as variveis cujos valores queremos observar (watch
window)
Guardar a janela para as variveis cujos valores queremos observar (janela anterior)
Definir breakpoints no simulador (pontos de paragem)

10.3.1 - Escolhendo o modo de desenvolvimento
Para que o MPLAB possa saber que ferramentas vo ser usadas na execuo do programa
escrito, necessrio definir o modo de desenvolvimento. Assim, necessrio preparar o
simulador para as condies de uso do projeto. Clicando em OPTIONS--->
DEVELOPMENT MODE, uma nova janela idntica a da figura abaixo, ser apresentada

Figura 50 - Definindo um modo de desenvolvimento

Deve ser selecionada a opo MPLAB-SIM Simulator, porque neste ambiente que o
programa vai ser avaliado. Alm desta opo, est tambm disponvel a opo Editor
Only (somente editor). Esta ltima opo s usada, se apenas deseja-se escrever o
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 103
programa e usar um programador para transferir um arquivo hex para o microcontrolador.
A seleo do modelo de microcontrolador feita no lado direito.

10.3.2 - Implementando um projeto
Para comear a escrever um programa preciso primeiro criar um projeto. Clicando em
PROJECT --> NEW PROJECT voc pode dar um nome ao seu projeto e guard-lo num
diretrio sua escolha. Na figura abaixo, um projeto designado por 'proba.pjt' criado e
guardado no diretrio c:\PIC\PROJEKTI\.

Figura 51 - Abrindo um novo projeto
Depois de dar um nome ao projeto clique em OK. Observa-se que aparece uma nova
janela, mostrada na figura seguinte.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 104

Figura 52 - Ajuste dos elementos do projeto
Com o mouse, clique em "proba [.hex], o que ativa a opo 'Node properties', ao
fundo no lado direito. Clicando esta opo, obtm-se a janela seguinte.

Figura 53 - Definindo os parmetros do assembler MPASM
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 105
Na figura pode se verificar que existem muitos parmetros diferentes. Cada um deles,
corresponde a um termo na linha de comandos. Observando a figura, verifica-se
rapidamente quais as opes que esto selecionadas. Clicando em OK, retorna janela
anterior onde "Add node" agora uma opo ativa. Clicando nela, obtm-se a seguinte
janela onde possvel definir o nome do programa assembler. No exemplo o mesmo foi
denominado "Proba.asm".

Figura 54 - Abrindo um novo projeto
Clicando em OK, retorna-se janela inicial onde observa-se que foi adicionado um
arquivo assembler.


Figura 55 - Arquivo assembler adicionado
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 106

Clicando em OK retorna-se a ao ambiente MPLAB.

10.3.3 - Criando um novo arquivo assembler (escrevendo um novo programa)
Depois da parte de criao do "project", ter terminado, j possvel escrever o programa
assembly. Um novo arquivo deve ser aberto e vai ser designado por "proba.asm". O arquivo
tem que ser designado por "proba.asm" porque, em projetos constitudos por um nico
arquivo, o nome do projeto e o nome do arquivo fonte tem que ser o mesmo.
Para abrir um novo arquivo, clica-se em FILE>NEW. Assim, obtm-se uma janela de texto
dentro do espao de trabalho do MPLAB.

Figura 56 - Um novo arquivo assembler foi aberto

A nova janela representa o arquivo onde o programa vai ser escrito. Para salvar o novo
arquivo com o nome Proba.asm, basta clicar em FILE>SAVE AS. Deste modo,
apresentada uma janela anloga mostrada na figura a seguir.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 107


Figura 57 - Dando um nome e guardando um novo arquivo assembler

Aps aberta a janela Save File As, deve-se escrever o nome do arquivo 'proba.asm' na
caixa de edio 'File name:' e clicar em OK. Aps isso, o nome do arquivo aparece no topo
da janela.

10.3.4 - Escrevendo um programa
Concludas todas as operaes precedentes possvel comear a escrever um programa
(usar o cdigo exemplo a seguir).

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 108

Quando o programa copiado para a janela "proba.asm", pode ser utilizado o comando
PROJECT -> BUILD ALL (se no existirem erros) e, uma nova janela idntica
representada na figura seguinte, vai aparecer.

Figura 58 - Janela com as mensagens durante a compilao do programa assembler

Na figura pode-se observar que foi obtido o arquivo "proba.hex" como resultado do
processo de compilao. A ltima frase que aparece na janela, 'Build completed
successfully', informa que a compilao foi bem sucedida.
No caso de serem indicados erros, necessrio clicar duplamente nas mensagens de erros
da janela 'Build Results'. Desta forma, a ferramenta MPLAB acessa automaticamente a
linha do programa assembler em que erro se encontra.

10.3.5 - Simulador MPSIM
O simulador a parte do ambiente MPLAB que fornece uma melhor viso interna do modo
como o microcontrolador trabalha. Atravs de um simulador possvel monitorizar os
valores atuais das variveis, os valores dos registradores e os estados lgicos dos pinos das
portas.. Como o microcontrolador executa as instrues uma a uma, o simulador
concebido para executar o programa passo a passo (linha a linha), mostrando o que
acontece aos dados dentro do microcontrolador. Quando o programa est completamente
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 109
escrito, convm que o programador, em primeiro lugar, verifique o seu programa num
simulador e, s a seguir o experimente numa situao real.
A primeira coisa que precisa ser feita numa situao real, resetar o microcontrolador com
o comando DEBUG > RUN > RESET. Este comando faz com que surja em negrito a linha
de incio do programa e que, o contador de programa contenha o valor zero como se pode
verificar na linha de estado (pc: 0x00).

Figura 59 - Incio da simulao do programa Reset do microcontrolador

Uma das principais caractersticas de um simulador, a possibilidade de observar o estado
dos registradores dentro do microcontrolador. Principalmente os registradores com funes
especiais (SFR).
possvel abrir uma janela com os registradores SFR, clicando em WINDOW->SPECIAL
FUNCTION REGISTERS, ou, no cone SFR.
Alm dos registradores SFR, pode ser til observar os contedos dos outros registradores.
Uma janela com as filas-registros pode ser aberta, clicando em WINDOW->FILE
REGISTERS.
Se existirem variveis no programa, tambm conveniente observ-las. A cada varivel
pode ser atribuda uma janela (Watch Windows) clicando em WINDOW->WATCH
WINDOWS.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 110

Figura 60 - Simulador com janelas abertas para registradores SFR, filas de registradores e
variveis

O prximo comando num simulador DEBUG>RUN>STEP que inicia a simulao passo
a passo do programa. O mesmo comando pode ser executado atravs da tecla <F7> do
teclado (de um modo geral, todos os comandos mais significativos tm teclas atribudas no
teclado). Utilizando a tecla F7, o programa executado passo-a-passo. Quando utiliza-se
uma macro, o arquivo que contm a macro aberto (Bank.inc) e possvel prosseguir
atravs da macro. Na janela dos registradores SFR, pode-se observar como o registrador de
trabalho W recebe o valor 0xFF e como este valor transferido para a porta B. Clicando de
novo em F7 nada acontece porque o programa entra num "loop infinito". Loop infinito
um termo que representa um lao do qual o microcontrolador no pode sair, a menos que
ocorra uma interrupo (se o programa utilizar interrupes) ou, ento, quando executado
o reset do microcontrolador.

10.3.6 - Barra de ferramentas
Como o MPLAB tem vrios componentes, cada um desses componentes tem a sua prpria
barra de ferramentas (toolbar). Contudo, existe uma barra de ferramentas que uma espcie
de resumo de todas as barras de ferramentas. Esta barra de ferramentas , normalmente
suficiente para a maior parte das necessidades e vai ser explicada com mais detalhes. Na
figura debaixo, pode-se observar esta barra de ferramentas, juntamente com uma breve
explicao de cada con.. Normalmente esta barra de ferramentas est colocada
horizontalmente por baixo do menu, ao longo do tela.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 111

Figura 61 - Barra de ferramentas universal com uma explicao sumria dos cones

Significado dos cones na barra de ferramentas

Sempre que se clica este con, uma nova toolbar aparece. Se for clicado quatro
vezes seguidas, a barra atual reaparece.

cone para abrir um projeto. O projeto aberto desta maneira contm todos os
ajustamentos da tela e todos os elementos que so importantes para o projeto
atual.

con para guardar um projeto. O projeto guardado conserva todos os
ajustamentos de janelas e parmetros. Quando o programa for lido de novo,
tudo retornar a tela, de modo similar a quando o programa foi fechado.

Para procurar uma parte do programa ou palavras em programas maiores.
Usando este con possvel encontrar rapidamente uma parte do programa,
rtulos, macros, etc.

con para cortar uma parte do texto. Este e os trs cones seguintes so
padronizados em todos os programas que lidam com arquivos de texto. Como
cada programa representado por uma poro de texto, estas operaes so
muito teis.

Para copiar uma parte de texto. Existe uma diferena entre este e o con
anterior. Quando se corta, tira-se uma parte de texto para fora da tela (e do
programa), que poder ser colado a seguir. Mas, tratando-se de uma operao
de cpia, o texto copiado mas no cortado e permanece visualizado na tela.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 112

Quando uma poro de texto copiada ou cortada, ela move-se para uma parte
da memria que serve para transferir dados no sistema operacional Windows.
Mais tarde, clicando neste con, ela pode ser colada num texto, na posio
onde se encontra o cursor.

Guardar um programa (arquivo assembler).

Comear a execuo do programa. Essa execuo, reconhecida pelo
aparecimento de uma linha de estado amarela. Nesta modalidade de execuo,
o simulador executa o programa a toda a velocidade at ser interrompido pelo
clicar no con de trfego vermelho.

Pra a execuo do programa. Depois de clicar neste con, a linha de status
torna-se de novo cinzenta e a execuo do programa pode continuar passo a
passo.

Execuo do programa passo a passo. Clicando neste con, inicia a execuo de
uma instruo na linha de programa a seguir linha atual.

Passar por cima. Como um simulador no mais que uma simulao da
realidade por software, possvel passar por cima de algumas instrues e o
programa prosseguir normalmente, depois disso. Normalmente, a parte do
programa que interessa ao programador a que segue a esse salto por cima.

Faz o reset do microcontrolador. Clicando neste con, o contador de programa
posicionado no incio do programa e a simulao pode comear.

Clicando neste con obtm-se uma janela com um programa, mas neste caso na
memria de programa, onde p possvel ver quais as instrues e em que
endereos.

Com a ajuda deste con, obtm-se uma janela com o contedo da memria RAM
do microcontrolador .

Clicando neste con, aparece a janela dos registradores SFR (registradores com
funes especiais). Como os registradores SFR so usados em todos os
programas, recomenda-se que, no simulador, esta janela esteja sempre ativa.

Se um programa contiver variveis cujos valores necessitam de
acompanhamento (por exemplo um contador), ento necessria uma janela
para elas, isso pode ser feito usando este con.

Quando certos erros num programa se manifestam durante o processo de
simulao, o programa tem que ser corrigido. Como o simulador usa o arquivo
HEX como entrada, aps a correo dos erros, necessrio recompilar o
programa, de maneira a que estas mudanas tambm sejam transferidas para o
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 113
simulador. Clicando neste cone, o projeto completo de novo traduzido e,
assim, obtm-se a nova verso do arquivo HEX para o simulador.


Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 114
11 Compilador CCS
O compilador CCS formado por trs compiladores separados, que podem ser invocados a
partir da IDE do compilador CCS. Os compiladores so o PCB, PCM e o PCH . O
compilador PCB usado para dispositivos PIC com palavra de cdigo de 12 bits. O
compilador PCM usado com dispositivos PIC com palavra de cdigo de 14 bits e o PCH
com dispositivos PIC com palavra de cdigo de 16 e 18 bits.. Esses compiladores so
especificamente desenvolvidos para atender as necessidades dos microcontroladores da
famlia PIC. As ferramentas disponibilizadas pelos trs compiladores permite desenvolver
de forma rpida softwares aplicativos para os controladores da famlia PIC em linguagem
C.
Os compiladores possuem algumas limitaes quando comparado aos compiladores C mais
tradicionais. As limitaes de hardware da CPU dos microcontroladores PIC tornam sem
efeito muitas caractersticas dos compiladores C, por exemplo, o compilador no permite
definir um ponteiro para um vetor de constantes. Isso ocorre pelo fato de haver uma
separao fsica entre as reas de memria de cdigo e dados no microcontrolador PIC e
pela sua inabilidade de tratar reas da ROM como reas de dados. Por outro lado, o
compilador tem conhecimento das limitaes da CPU e trabalha de forma a decidir qual a
melhor implementao para o algoritmo do usurio. Os compiladores podem implementar
eficientes construtores C, operaes de entrada/sada e operaes de rotao de bits.
A seguir ser apresentado um procedimento passo-a-passo para elaborao de um programa
em C no ambiente IDE do CCS, bem como os passo para compilao do programa.

11.1 - Elaborao de um programa para o PIC usando o ambiente de desenvolvimento
PIC C.
A seqncia de passos a seguir permite criar um programa para o PIC sem o programador
ter que se preocupar com a programao dos registros de configurao do microcontrolador,
diretamente no cdigo do programa. Com a ferramenta PIC Wizard, os detalhes de
configurao so apresentados em telas onde todas as opes disponveis para o dispositivo
so disponibilizadas, bastando ao programador apenas selecionar as de seu interesse.

Passo 1 Iniciar um novo projeto.
Na tela principal do PIC C selecionar na seqncia as seguintes opes: Project\New\PIC
Wizard, como mostrado na figura 62.



Figura 62 - Tela principal do CCS
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 115

Passo 2 Seleo de modelo de PIC, freqncia de operao, tipo de oscilador, etc.
Aps esta seleo ser apresentada a janela mostrada na figura 63. Nesta janela o
programador selecionar o modelo do microcontrolador que ser utilizado (Device) e a
freqncia de trabalho do mesmo (oscillator frequency). As opes no quadro Function
Generation e as opes referentes ao debug, memria RAM e Watchdog podem ficar
como mostrado na figura 63 (sem marcao). No quadro Fuses o programador deve
selecionar o tipo de circuito oscilador utilizado e se o cdigo gravado na memria de
programa ser totalmente protegido, parcialmente protegido ou no protegido. Estas duas
selees so feitas a partir das opes das duas caixas de opes. As outras opes so
selecionadas marcando o quadrinho ao lado das mesmas. Estas opes podem seguir a
indicada na figura 63, onde foi selecionado apenas o reset quando ocorre um brownout.
As selees feitas no quadro Fuses, definem a palavra de configurao a ser gravada na
posio 2007, durante a programao do PIC.
As selees feitas na janela da figura 63, geraro o cdigo indicado no quadro apresentado
na figura 64, que compor o arquivo xxx.h da aplicao. O contedo deste arquivo pode ser
copiado para o arquivo do cdigo fonte, bastando apenas substituir a diretiva de chamada
do arquivo xxx.h, #include <xxx.h>, pelo contedo do prprio.



Figura 63 Tela inicial de configurao do PIC Wizard.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 116


Figura 64 Cdigo gerado automaticamente em funo das opes selecionadas na tela de
configuraes inicial do PIC Wizard




Figura 65 Configurao da porta serial assncrona.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 117
Passo 3 Habilitao/Desabilitao das interfaces de comunicao serial e paralela.
Na tela mostrada na figura 65 o programador habilita as interfaces de comunicao serial
(RS232 e/ou I
2
C) e de comunicao paralela (Hardware PSP). Pela tela da figura 65, para
o programa teste5.c, nenhuma interface de comunicao, serial ou paralela foi habilitada.

Passo 4 Configurao da Porta Serial Sncrona (MSSP Mster Serial Synchronous
Port).
A porta serial sncrona permite a comunicao serial sncrona entre dois dispositivos
atravs de dois modos: Serial Peripheral Interface (SPI) e Inter-Integrated Circuit (I2C).
Conforme mostrado na figura 66, nenhum modo de operao da porta serial sncrona foi
habilitado.



Figura 66 Configurao da porta serial sncrona.

Passo 5 Configurao dos Timers e do Watchdog Timer.
O PIC 16F877 possui trs timers e um circuito Watchdog que podem ser configurados a
partir das opes da tela TIMERS, mostrada na figura 67. No quadro WDT
(configurao do Watchdog timer) o programador pode habilitar ou desabilitar o watchdog.
Se habilitado o mesmo pode gerar um reset aps no mnimo 18 ms e no mximo aps 2304
ms.
No quadro Timer 0 (RTCC), o programador pode selecionar a fonte do sinal de clock,
interna ou externa. Se externa, tambm pode ser selecionado se o Timer responder a borda
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 118
de subida ou a borda de descida do sinal de clock. A outra seleo quando o clock externo
usado a freqncia do mesmo, que define a resoluo do timer.
No quadro Timer 1, o programado pode desabilitar o Timer 1 ou selecionar um clock
interno ou externo para o mesmo. Se for usado um clock externo possvel determinar a
freqncia do mesmo e pode indicar que o clock externo ser sincronizado com o clock
interno. A resoluo dependente da freqncia do clock que alimenta o Timer 1.
No quadro Timer 2, o programador pode habilitar o timer 2, definir a sua resoluo e
indicar o nmero de ciclos aps o qual a contagem resetada (Overflow Period) e tambm
o nmero de resetes de contagem aps o qual ser gerada uma interrupo (Interrupt
Period).



Figura 67 Passo 3 Habilitao/Desabilitao das interfaces de comunicao serial e
paralela.
Wathdog Timer, Timer 0, Timer 1 e Timer 2.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 119
Passo 6 As opes de ajuste de PCH Timer's so por default desabilitadas.



Figura 68 Configurao do PCH Timer.

Passo 7 Programao de pinos das portas de E/S como entradas analgicas e de
referncia.
Na tela Analog, mostrada na figura 69, no quadro Analog Pins, o programador pode
selecionar entre as opes disponveis o conjunto de pinos que sero utilizados para entrada
de sinais analgicos ou tenses de referncia. Na caixa Units, o programador seleciona o
nmero de bits do conversor A/D 8 bits = 0-255, 10 bits = 0-1023 ou 16 bits = 0-65472. Na
outra caixa de seleo o programador seleciona a freqncia do sinal de clock do conversor
A/D. Conforme mostrado na figura 69, nenhum pino foi selecionado como entrada
analgica no programa exemplo teste5.c.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 120


Figura 69 Configurao dos pinos de entrada analgica e do nmero de bits do conversor
A/D

Passo 8 Configurao das entradas Capture/Compare ou Sada PWM.
Na tela Other, mostrada na figura 70, so habilitados/desabilitados os mdulos de
Comparao/Captura/PWM do PIC16F877. Se habilitados os mesmos podem ser
configurados para funcionar no modo Capture, quando o pino RC2/CCP1 aguarda por
uma (1 edge), quatro (4 edges) ou dezesseis (16 edges) transies positivas (rising) ou
negativas (falling) do sinal no respectivo pino. Quando o evento ocorre o valor de
contagem do Timer 1 copiado para o registrador CCPR1H:CCPR1L.
No modo Compare, o valor do registrador CCPR1H:CCPR1L comparado com o valor do
registrador de contagem do Timer 1, quando ocorre uma igualdade as seguintes aes
podem ser selecionadas no quadro CCPx Settings: (1) gerada uma interrupo e o pino
RC2/CCP1 ajustado para zero, (2) gerada uma interrupo e o pino RC2/CCP1
ajustado para um, (3) gerada uma interrupo e o pino RC2/CCP1 no alterado ou reseta
o registrador de contagem do Timer 1 e no altera o estado do pino RC2/CCP1.
No modo PWM, pode ser gerado um sinal com largura de pulso varivel no pino
RC2/CCP1, com resoluo de 10 bits (duty de 0 1024), 8 bits (duty de 0 256) ou 6 bits
(duty de 0 64).
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 121
Conforme mostrado na figura 70, os mdulos CCP1 e CCP2 no foram habilitados no
programa exemplo teste5.c.



Figura 70 Configurao das entradas de comparao e dos mdulos
Capture/Compare/PWM

Passo 9 Habilitao de interrupes.
O PIC 16F877 possui 14 fontes de interrupo, as quais so apresentadas no quadro
Interrupts, na tela Interrupts, mostrada na figura 71. Ao selecionar uma ou mais
interrupes no quadro abaixo, a mesma ser habilitada e no cdigo gerado PIC Wizard j
constar o prottipo que implementar a rotina de servio da interrupo, conforme
mostrado na figura 72, onde pode ser observado o cdigo gerado quando a interrupo
Timer 1 overflow habilitada.
Conforme mostrado na figura 71, nenhuma interrupo foi selecionada no programa
exemplo teste5.c.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 122


Figura 71 Seleo de interrupes que sero ativadas

No cdigo mostrado na figura 72 o trecho

#int_TIMER1
TIMER1_isr()
{
// Aqui vai o cdigo da rotina de servio de interrupo
}

Deve ser copiado no caberio do programa fonte, antes da funo main(). Enquanto as
linhas de cdigo

enable_interrupts(INT_TIMER1); //Habilita a interrupo especfica do perifrico
//Timer1
enable_interrupts(GLOBAL); //Habilita o PIC a atender as interrupes dos
//perifricos

Devem ser acrescentadas as linhas de cdigo dentro da funo main().

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 123


Figura 72 Trecho de cdigo referente a rotina de servio de interrupo do Timer1.

Passo 10 Selecionar drives de perifricos usado em conjunto com o PIC.
Na tela Drivers pode ser selecionado o drive de alguns dispositivos perifricos que iro
funcionar com o PIC. O drive nada mais do que um conjunto de funes de alto nvel que
mascara os detalhes de acesso ao dispositivo, por exemplo, ao escrever uma mensagem
para o LCD (Display de Cristal Lquido), o programador simplesmente usa uma funo do
tipo printf(mensagem, pos), que escreve a string mensagem, na posio indicada por
pos. Assim ele no precisa se preocupar com um conjunto de sinais de controle que
devem ser gerados pelo microcontrolador para que a ao de escrever no LCD ocorra.



Figura 73 Seleo de drives de dispositivos
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 124
Conforme mostrado na figura 73, nenhum drive de dispositivo foi selecionado no programa
exemplo teste5.c.

Passo 11 Configurao dos pinos das portas de E/S.
Na tela I/O Pins, mostrada na figura 74, podem ser configurados os pinos das portas de E/S
individualmente. Cada pino permite selecionar entre as opes: input, output,
input/output, not used e analog. Tambm nesta tela possvel ativar os resistores de Pull-
Up dos pinos da porta de E/S B.
Conforme mostrado na figura 13, as configuraes default dos pinos de E/S foram mantidas
no programa exemplo teste5.c.



Figura 74 Listagem com indicao da funo dos pinos do microcontrolador PIC segundo
as configuraes selecionadas.

Passo 12 Seleo dos arquivos header a serem associados ao arquivo do programa
fonte.
Na tela Header Files, h uma lista de arquivos header que contm a definio de
funes da linguagem C, que podem ser necessrios compilao (os arquivos header
contm a informao dos prottipos das funes e os tipos dos argumentos, que so
necessrios durante o processo de compilao, por exemplo, o arquivo math.h contm o
prottipo das funes trigonomtricas sin(), cos(), etc.)
Conforme mostrado na figura 75, nenhum arquivo header foi adicionado ao cdigo do
programa exemplo teste5.c.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 125



Figura 75 Seleo de arquivos .h a serem includos no projeto




Figura 76 Linhas de cdigo geradas de acordo com as configuraes selecionadas.
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 126
A linha #include C:\usr\cunha\PIC-Programas\teste5.h, da figura 76 pode ser
substituda pelo conjunto de linhas marcadas em negrito na figura 77. Estas linhas de fato
representam o contedo do arquivo teste5.h que o #include anterior incluiria no arquivo
fonte do programa.



Figura 77 Incluso das linhas de cdigo do arquivo teste5.h gerado no arquivo teste5.c

11.2 - Descrio dos comandos e diretivas
a) #include <16F877.h>: A diretiva #include indica ao compilador que o arquivo
entre os sinais de <> deve ser associado ao arquivo teste5.c, que o arquivo fonte
do programa. O arquivo 16F877.h contm informaes referentes a valores de
constante usados nas funes de configurao do PIC, como por exemplo,
setup_adc( ). No arquivo 16F877.h, cada constante denominada por um
label.
b) #device adc=8: A diretiva #device adc define o nmero de bits que so retornados
aps uma leitura do conversor A/D do PIC. O nmero de bits gerado pelo conversor
A/D pode variar de um modelo de PIC para outro. No presente caso, a diretiva est
ajustando o nmero de bits de leitura do conversor para 8 bits (este valor pode ser
alterado para 10, no caso do 16F877, j que seu A/D de 10 bits).
c) #use delay(clock=4000000): A diretiva #use delay(clock xxxxx) indica ao
compilador a freqncia de operao do PIC. No presente caso, esta de 4MHz.
d) #fuses WDT,XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD,
NOWRT, NODEBUG: Na opo VIEW/Valid Fuses (figura abaixo), do menu do
PCW, pode ser verificada a lista de fuses disponveis para o modelo de PIC que
ser usado.

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 127


Figura 78 Verificao das opes Fuses.

Ao selecionar a opo Valid Fuses apresentada a tela abaixo com as opes que
podem compor a diretiva #fuses, como a do caberio do programa teste5.c .
Observe que o modelo de PIC deve ser selecionado na caixa Device.
A diretiva #fuses gera um dado de 16 bits para programao da palavra de configurao
(endereo 2007h). No caso do programa teste5.c, as opes selecionadas foram:
WDT Uso do WatchDog timer;
XT Uso de oscilador a cristal com freqncia <= 4MHz;
NOPUT Sem Power-up Timer;
NOPROTECT Cdigo no protegido contra leitura;
BROWNOUT Reseta o PIC quando uma condio de Brownout detectada
NOLVP Programao em baixa tenso desabilitada (pinos RB3 (PIC16) ou
RB5 (PIC18) podem ser usados para funo de E/S );
NOCPD Dados de memria EEPROM no protegidos;
NOWRT Memria de programa no protegida;
NODEBUG Modo Debug para uso com ICD desabilitado;

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 128


Figura 79 Tela de apresentao do resultado de verificao das opes Fuses.

e) setup_adc_ports(NO_ANALOGS): Define que pinos das portas de E/S que
podem funcionar como entradas analgicas, sero entradas analgicas. No caso do
programa teste5.c, nenhum pino foi designado como de entrada analgica, o que
identificado pelo valor do argumento da funo setup_adc_ports(),
NO_ANALOGS;
f) setup_adc(ADC_OFF): Esta funo configura o modo de operao do conversor
A/D do PIC. No caso do programa teste5.h, o mesmo foi desativado,
ADC_OFF
g) setup_psp(PSP_DISABLED): Esta funo inicializa a porta paralela do PIC
(quando a mesma existe). No caso do programa teste5.h, a porta paralela no foi
habilitada, PSP_DISABLED
h) setup_spi(FALSE): Esta funo inicializa a Serial Port Interface (SPI). No caso do
programa teste5.h, a SPI no foi habilitada, FALSE
i) setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1): Esta funo inicializa o
Timer 0. No caso do programa teste5.h, a fonte de clock do Timer 0 interna
RTCC_INTERNAL e fator de diviso da freqncia do sinal de clock igual a 1
RTCC_DIV_1;
j) setup_timer_1(T1_DISABLED): Esta funo inicializa o Timer 1. No caso do
programa teste5.h, o mesmo est desabilitado T1_DISABLED;
k) setup_timer_2(T2_DISABLED,0,1): Esta funo inicializa o Timer 2, definindo o
fator de diviso do clock, o nmero de ciclos de relgio para que a contagem seja
resetada e o nmero de resetes para que seja gerada uma interrupo. No caso do
programa teste5.h, o Timer 2 foi desabilitado, T2_DISABLED e apesar de ter
sido desabilitado, na funo necessrio definir o nmero de ciclos para o reset da
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 129
contagem (neste caso 0) e o nmero de resetes para que haja uma interrupo (neste
caso 1).
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 130
12 - Conjunto de Instrues da Famlia PIC16Fxxx de Microcontroladores
O conjunto completo de instrues da famlia de microcontroladores PIC16Fxxxx,
compreende 35 instrues. Uma razo para este pequeno nmero de instrues resulta
principalmente do fato de se tratar de um microcontrolador RISC, cujas instrues foram
otimizadas tendo em vista a rapidez de funcionamento, simplicidade de arquitetura e
minimizao do tamanho do cdigo. A seguir apresentada uma discusso a cerca das
instrues, agrupadas de acordo com a operao realizada.

12.1 - Transferncia de dados
A transferncia de dados num microcontrolador, ocorre entre o registro de trabalho (W) e
um registro f que representa qualquer local de memria na RAM interna (quer se trate de
um registro especial ou de um registro de uso genrico).
As primeiras trs instrues (observe a tabela seguinte) referem-se escrita de uma
constante no registro W (MOVLW uma abreviatura para MOVa Literal para W), cpia
de um dado do registro W na RAM e cpia de um dado de um registro da RAM no
registro W (ou nele prprio, caso em que apenas o flag do zero afetada) . A instruo
CLRF escreve a constante 0 no registro f e CLRW escreve a constante 0 no registro W. A
instruo SWAPF troca o nibble (conjunto de 4 bits) mais significativo com o nibble menos
significativo de um registro, passando o primeiro a ser o menos significativo e o outro o
mais significativo do registrador.

12.2 - Lgicas e aritmticas
De todas as operaes aritmticas possveis, os microcontroladores PIC, tal como a grande
maioria dos outros microcontroladores, apenas suportam a subtrao e a adio. Os bits ou
flags C, DC e Z, so afetados conforme o resultado da adio ou da subtrao, com uma
nica exceo: uma vez que a subtrao executada como uma adio com um nmero
negativo, o flag C (Carry), comporta-se inversamente no que diz respeito subtrao, ou
seja, O flag C setado se a operao possvel e resetado se um nmero maior tiver que
ser subtrado de outro menor.
A lgica dentro do PIC tem a capacidade de executar as operaes AND, OR, XOR,
complemento (COMF) e rotaes (RLF e RRF). Estas ltimas instrues, rotacionam o
contedo do registro atravs do prprio e do flag C, de um bit para a esquerda (na direo
do bit 7), ou para a direita (na direo do bit 0). O bit que sai do registro escrito no flag C
e o contedo anterior deste flag, escrito no bit situado do lado oposto no registro.

12.3 - Operaes sobre bits
As instrues BCF e BSF resetam e setam, respectivamente, qualquer bit de qualquer
posio da memria. Apesar de parecer uma operao simples, ela executada do seguinte
modo, a CPU primeiro l o byte completo, altera o valor de um bit e, a seguir, escreve o
byte completo na mesma posio de memria.

12.4 - Direo de execuo de um programa
As instrues GOTO, CALL e RETURN so executadas do mesmo modo que em todos os
outros microcontroladores, a diferena que a pilha independente da RAM interna e
limitada a oito nveis. A instruo RETLW k idntica instruo RETURN, exceto que,
ao retornar de uma subrotina, escrita no registro W uma constante definida pelo operando
da instruo. Esta instruo, permite-nos implementar facilmente listagens (tambm
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 131
chamadas tabelas de lookup). A maior parte das vezes, a usamos determinando a posio do
dado na nossa tabela adicionando-a ao endereo em que a tabela comea e, ento, lido o
dado nesse local (que est situado normalmente na memria de programa).
A tabela pode apresentar-se como uma subrotina que consiste numa srie de instrues
RETLW k onde as constantes k, so membros da tabela.

Ns escrevemos a posio de um membro da nossa tabela no registro W e, usando a
instruo CALL, ns chamamos a subrotina que contm a tabela. A primeira linha da
subrotina ADDWF PCL, f, adiciona o endereo da posio da tabela que deseja-se acessar,
armazenado em W, ao endereo do incio da tabela e que est no registro PCL, assim, ns
obtemos o endereo real do dado da tabela na memria de programa. Quando retornamos
da subrotina, o registro W conter o dado da posio endereada da tabela. No exemplo
anterior, a constante k2 estar no registro W, aps o retorno da subrotina.
RETFIE (RETurn From Interrupt Interrupt Enable ou retorno da rotina de interrupo
com as interrupes habilitadas) um retorno de uma rotina de servio de interrupo e
difere de RETURN apenas pelo fato de que, automaticamente, seta o bit GIE (habilitao
global das interrupes). Quando a interrupo comea, este bit automaticamente resetado.
Tambm quando a interrupo tem incio, somente o valor do contador de programa salvo
no topo da pilha. No fornecida uma capacidade automtica de armazenamento do
registro de estado, ou seja, o contexto da aplicao no salvo, sendo isto deixado a cargo
do programador.
Os saltos condicionais esto sintetizados em duas instrues: BTFSC e BTFSS. Consoante
o estado lgico do bit do registro f que est sendo testado, a instruo seguinte no
programa ou no executada.

12.5 - Perodo de execuo da instruo
Todas as instrues so executadas num nico ciclo, exceto as instrues de ramificao
condicional se a condio for verdadeira, ou se o contedo do contador de programa for
alterado pela instruo. Nestes casos, a execuo requer dois ciclos de instruo e o
segundo ciclo executado como sendo um NOP (Nenhuma Operao). Quatro perodos de
clock perfazem um ciclo de instruo. Se for usado um oscilador com 4MHz de freqncia,
o tempo normal de execuo de uma instruo ser de 1ms e, no caso de uma ramificao
condicional de 2ms.

12.6 - Listagem das instrues
f Qualquer local de memria num microcontrolador
W Registro de trabalho
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 132
b Posio de bit no registro f
d Registro de destino
label Grupo de oito caracteres que marca o incio de uma parte do programa (rtulo)
TOS Topo da pilha
[] Opcional
<> Grupo de bits num registro

A.1 MOVLW Escrever constante no registro W
Sintaxe: [label] MOVLW k
Descrio: A constante de 8-bits k vai para o registro W.
Operao: k ( W )
Operando: 0 k 255
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: MOVLW 0x5A (Depois da instruo: W= 0x5A)
Exemplo 2: MOVLW REGISTAR (Antes da instruo: W = 0x10 e REGISTAR = 0x40)
(Depois da instruo: W = 0x40)

A.2 MOVWF Copiar W para f
Sintaxe:
[label] MOVWF f
Descrio:
O contedo do registro W copiado para o registro f
Operao:
W ( f )
Operando:
0 f 127
Flag:
-
Nmero de palavras:
1
Nmero de ciclos:
1
Exemplo 1:
MOVWF OPTION_REG (Antes da instruo: OPTION_REG = 0x20)
W = 0x40
Depois da instruo: OPTION_REG = 0x40
W = 0x40
Exemplo 2:
MOVWF INDF
Antes da instruo: W = 0x17
FSR = 0xC2
Contedo do endereo 0xC2 = 0x00
Depois da instruo: W = 0x17
FSR = 0xC2
Contedo do endereo 0xC2 = 0x17

A.3 MOVF Copiar f para d
Sintaxe:
[label] MOVF f, d
Descrio: O contedo do registro f guardado no local determinado pelo operando d
Se d = 0, o destino o registro W
Se d = 1, o destino o prprio registro f
A opo d = 1, usada para testar o contedo do registro f, porque a execuo
desta instruo afeta o flag Z do registrador de STATUS.
Operao:
f ( d )
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 133
Operando:
0 f 127, d [0, 1]
Flag:
Z
Nmero de palavras:
1
Nmero de ciclos:
1
Exemplo 1: MOVF FSR, 0
Antes da instruo: FSR = 0xC2
W = 0x00
Depois da instruo: W = 0xC2
Z = 0
Exemplo 2: MOVF INDF, 0
Antes da instruo: W = 0x17
FSR = 0xC2
contedo do endereo 0xC2 = 0x00
Depois da instruo: W = 0x00
FSR = 0xC2
contedo do endereo 0xC2 = 0x00
Z = 1

A.4 CLRW Escrever 0 em W
Sintaxe: [label] CLRW
Descrio: O contedo do registro W passa para 0 e o flag Z do registrador de STATUS
setado para 1.
Operao: 0 ( W )
Operando: -
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo: CLRW
Antes da instruo: W = 0x55
Depois da instruo: W = 0x00
Z = 1

A.5 CLRF Escrever 0 em f
Sintaxe: [label] CLRF f
Descrio: O contedo do registro f passa para 0 e o flag Z do registrador de STATUS
setado para 1.
Operao: 0 f
Operando: 0 f 127
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: CLRF STATUS
Antes da instruo: STATUS = 0xC2
Depois da instruo: STATUS = 0x00
Z = 1
Exemplo 2: CLRF INDF
Antes da instruo: FSR = 0xC2
contedo do endereo 0xC2 = 0x33
Depois da instruo: FSR = 0xC2
contedo do endereo 0xC2 = 0x00
Z = 1

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 134
A.6 SWAPF Copiar o contedo de f para d, trocando a posio dos 4 primeiros
bits com a dos 4 ltimos
Sintaxe: [label] SWAPF f, d
Descrio: Os 4 bits + significativos e os 4 bits significativos de f, trocam de posies.
Se d = 0, o resultado guardado no registo W
Se d = 1, o resultado guardado no registo f
Operao: f <0:3> d <4:7>, f <4:7> d <0:3>,
Operando: 0 f 127, d [0, 1]
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: SWAPF REG, 0
Antes da instruo: REG = 0xF3
Depois da instruo: REG = 0xF3
W = 0x3F
Exemplo 2: SWAPF REG, 1
Antes da instruo: REG = 0xF3
Depois da instruo: REG = 0x3F

A.7 ADDLW Adicionar W a uma constante
Sintaxe: [label] ADDLW k
Descrio: O contedo do registro W, adicionado constante de 8-bits k e o resultado
guardado no registro W.
Operao: ( W ) + k W
Operando: 0 k 255
Flag: C, DC, Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: ADDLW 0x15
Antes da instruo: W= 0x10
Depois da instruo: W= 0x25
Exemplo 2: ADDLW REG
Antes da instruo: W = 0x10
REG = 0x37
Depois da instruo: W = 0x47

A.8 ADDWF Adicionar W a f
Sintaxe: [label] ADDWF f, d
Descrio: Adicionar os contedos dos registros W e f
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: (W) + ( f ) d, d [0, 1]
Operando: 0 f 127
Flag: C, DC, Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: ADDWF FSR, 0
Antes da instruo: W = 0x17
FSR = 0xC2
Depois da instruo: W = 0xD9
FSR = 0xC2
Exemplo 2: ADDWF INDF,0
Antes da instruo: W = 0x17
FSR = 0xC2
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 135
contedo do endereo 0xC2 = 0x20
Depois da instruo: W = 0x37
FSR = 0xC2
Contedo do endereo 0xC2 = 0x20

A.9 SUBLW Subtrair W a uma constante
Sintaxe: [label] SUBLW k
Descrio: Do contedo do registro W, subtrado constante k e o resultado,
guardado no registro W.
Operao: k - ( W ) W
Operando: 0 k 255
Flag: C, DC, Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: SUBLW 0x03
Antes da instruo: W= 0x01, C = x, Z = x
Depois da instruo: W= 0x02, C = 1, Z = 0 Resultado > 0
Antes da instruo: W= 0x03, C = x, Z = x
Depois da instruo: W= 0x00, C = 1, Z = 1 Resultado = 0
Antes da instruo: W= 0x04, C = x, Z = x
Depois da instruo: W= 0xFF, C = 0, Z = 0 Resultado < 0
Exemplo 2: SUBLW REG
Antes da instruo: W = 0x10
REG = 0x37
Depois da instruo: W = 0x27
C = 1 Resultado > 0

A.10 SUBWF Subtrair W a f
Sintaxe: [label] SUBWF f, d
Descrio: O contedo do registro W subtrado do contedo do registro f
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: ( f ) - (W) d
Operando: 0 f 127, d [0, 1]
Flag: C, DC, Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo: SUBWF REG, 1
Antes da instruo: REG= 3, W= 2, C = x, Z = x
Depois da instruo: REG= 1, W= 2, C = 1, Z = 0 Resultado > 0
Antes da instruo: REG= 2, W= 2, C = x, Z = x
Depois da instruo: REG=0, W= 2, C = 1, Z = 1 Resultado = 0
Antes da instruo: REG=1, W= 2, C = x, Z = x
Depois da instruo: REG= 0xFF, W=2, C = 0, Z = 0 Resultado < 0

A.11 ANDLW Fazer o E lgico de W com uma constante
Sintaxe: [label] ANDLW k
Descrio: executado o E lgico do contedo do registro W, com a constante k
O resultado guardado no registro W.
Operao: ( W ) .AND. k W
Operando: 0 k 255
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: ANDLW 0x5F
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 136
Antes da instruo: W= 0xA3 ; 0101 1111 (0x5F)
; 1010 0011 (0xA3)
Depois da instruo: W= 0x03; 0000 0011 (0x03)
Exemplo 2: ANDLW REG
Antes da instruo: W = 0xA3 ; 1010 0011 (0xA3)
REG = 0x37 ; 0011 0111 (0x37)
Depois da instruo: W = 0x23 ; 0010 0011 (0x23)

A.12 ANDWF Fazer o E lgico de W com f
Sintaxe: [label] ANDWF f, d
Descrio: Faz o E lgico dos contedos dos registros W e f
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: (W) .AND. ( f ) d
Operando: 0 f 127, d [0, 1]
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: ANDWF FSR, 1
Antes da instruo: W= 0x17, FSR= 0xC2; 0001 1111 (0x17)
; 1100 0010 (0xC2)
Depois da instruo: W= 0x17, FSR= 0x02 ; 0000 0010 (0x02)
Exemplo 2: ANDWF FSR, 0
Antes da instruo: W= 0x17, FSR= 0xC2; 0001 1111 (0x17)
; 1100 0010 (0xC2)
Depois da instruo: W= 0x02, FSR= 0xC2; 0000 0010 (0x02)

A.13 IORLW Fazer o OU lgico de W com uma constante
Sintaxe: [label] IORLW k
Descrio: executado o OU lgico do contedo do registro W, com a constante de 8
bits k, o resultado guardado no registro W.
Operao: ( W ) .OR. k W
Operando: 0 k 255
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: IORLW 0x35
Antes da instruo: W= 0x9A
Depois da instruo: W= 0xBF
Z= 0
Exemplo 2: IORLW REG
Antes da instruo: W = 0x9A
contedo de REG = 0x37
Depois da instruo: W = 0x9F
Z = 0

A.14 IORWF Fazer o OU lgico de W com f
Sintaxe: [label] IORWF f, d
Descrio: Faz o OU lgico dos contedos dos registros W e f
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: (W) .OR. ( f ) d
Operando: 0 f 127, d [0, 1]
Flag: Z
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 137
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: IORWF REG, 0
Antes da instruo: REG= 0x13, W= 0x91
Depois da instruo: REG= 0x13, W= 0x93
Z= 0
Exemplo 2: IORWF REG, 1
Antes da instruo: REG= 0x13, W= 0x91
Depois da instruo: REG= 0x93, W= 0x91
Z= 0

A.15 XORLW OU- EXCLUSIVO de W com uma constante
Sintaxe: [label] XORLW k
Descrio: executada a operao OU-Exclusivo do contedo do registro W, com a
constante k. O resultado guardado no registro W.
Operao: ( W ) .XOR. k W
Operando: 0 k 255
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: XORLW 0xAF
Antes da instruo: W= 0xB5 ; 1010 1111 (0xAF)
; 1011 0101 (0xB5)
Depois da instruo: W= 0x1A; 0001 1010 (0x1A)
Exemplo 2: XORLW REG
Antes da instruo: W = 0xAF ; 1010 1111 (0xAF)
REG = 0x37 ; 0011 0111 (0x37)
Depois da instruo: W = 0x98 ; 1001 1000 (0x98)
Z = 0

A.16 XORWF OU-EXCLUSIVO de W com f
Sintaxe: [label] XORWF f, d
Descrio: Faz o OU-EXCLUSIVO dos contedos dos registros W e f
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: (W) .XOR. ( f ) d
Operando: 0 f 127, d [0, 1]
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: XORWF REG, 1
Antes da instruo: REG= 0xAF, W= 0xB5 ; 1010 1111 (0xAF)
; 1011 0101 (0xB5)
Depois da instruo: REG= 0x1A, W= 0xB5 001 1010 (0x1A)
Exemplo 2: XORWF REG, 0
Antes da instruo: REG= 0xAF, W= 0xB5; 1010 1111 (0xAF)
; 1011 0101 (0xB5)
Depois da instruo: REG= 0xAF, W= 0x1A ; 0001 1010 (0x1A)

A.17 INCF Incrementar f
Sintaxe: [label] INCF f, d
Descrio: Incrementar de uma unidade, o contedo do registro f.
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: ( f ) + 1 d
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 138
Operando: 0 f 127, d [0, 1]
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: INCF REG, 1
Antes da instruo: REG = 0xFF
Z = 0
Depois da instruo: REG = 0x00
Z = 1
Exemplo 2: INCF REG, 0
Antes da instruo: REG = 0x10
W = x
Z = 0
Depois da instruo: REG = 0x10
W = 0x11
Z = 0

A.18 DECF Decrementar f
Sintaxe:
[label] DECF f, d
Descrio:
Decrementar de uma unidade, o contedo do registro f.
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao:
( f ) - 1 d
Operando:
0 f 127, d [0, 1]
Flag:
Z
Nmero de palavras:
1
Nmero de ciclos:
1
Exemplo 1:
DECF REG, 1
Antes da instruo: REG = 0x01
Z = 0
Depois da instruo: REG = 0x00
Z = 1
Exemplo 2:
DECF REG, 0
Antes da instruo: REG = 0x13
W = x
Z = 0
Depois da instruo: REG = 0x13
W = 0x12
Z = 0

A.19 RLF Rotacionar f para a esquerda atravs do Carry
Sintaxe: [label] RLF f, d
Descrio: O contedo do registro f rotacionado um bit para a esquerda, atravs de C
(flag do Carry).
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: ( f <n>) d<n+1>, f<7> C, C d<0>;
Operando: 0 f 127, d [0, 1]
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 139
Flag: C

Nmero de palavras: 1
Nmero de ciclos:
1
Exemplo 1: RLF REG, 0
Antes da instruo: REG = 1110 0110
C = 0
Depois da instruo: REG = 1110 0110
W = 1100 1100
C = 1
Exemplo 2: RLF REG, 1
Antes da instruo: REG = 1110 0110
C = 0
Depois da instruo: REG = 1100 1100
C = 1

A.20 RRF Rotacionar f para a direita atravs do Carry
Sintaxe: [label] RRF f, d
Descrio: O contedo do registro f rotacionado um bit para a direita, atravs de C (flag
do Carry).
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: ( f <n>) d<n-1>, f<0> C, C d<7>;
Operando: 0 f 127, d [0, 1]
Flag: C

Nmero de palavras: 1
Nmero de ciclos:
1
Exemplo 1: RRF REG, 0
Antes da instruo: REG = 1110 0110
W = x
C = 0
Depois da instruo: REG = 1110 0110
W = 0111 0011
C = 0
Exemplo 2: RRF REG, 1
Antes da instruo: REG = 1110 0110
C = 0
Depois da instruo: REG = 0111 0011
C = 0

A.21 COMF Complementar f
Sintaxe: [label] COMF f, d
Descrio: O contedo do registro f complementado.
Se d=0, o resultado guardado no registro W
Se d=1, o resultado guardado no registro f
Operao: () d
Operando: 0 f 127, d [0, 1]
Flag: Z
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: COMF REG, 0
Antes da instruo: REG= 0x13 ; 0001 0011 (0x13)
Depois da instruo: REG= 0x13 ; complementar
W = 0xEC ; 1110 1100 (0xEC)
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 140
Exemplo 2: COMF INDF, 1
Antes da instruo: FSR= 0xC2
contedo de FSR = (FSR) = 0xAA
Depois da instruo: FSR= 0xC2
contedo de FSR = (FSR) = 0x55

A.22 BCF Reseta o bit b de f
Sintaxe: [label] BCF f, b
Descrio: Limpar (tornar igual a 0), o bit b do registro f
Operao: 0 f<b>
Operando: 0 f 127, 0 b 7
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: BCF REG, 7
Antes da instruo: REG = 0xC7 ; 1100 0111 (0xC7)
Depois da instruo: REG = 0x47 ; 0100 0111 (0x47)
Exemplo 2: BCF INDF, 3
Antes da instruo: W = 0x17
FSR = 0xC2
contedo do endereo em FSR (FSR) = 0x2F
Depois da instruo: W = 0x17
FSR = 0xC2
contedo do endereo em FSR (FSR) = 0x27

A.23 BSF Setar o bit b de f
Sintaxe: [label] BSF f, b
Descrio: Tronar igual a 1, o bit b do registro f
Operao: 1 f<b>
Operando: 0 f 127, 0 b 7
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: BSF REG, 7
Antes da instruo: REG = 0x07 ; 0000 0111 (0x07)
Depois da instruo: REG = 0x17 ; 1000 0111 (0x87)
Exemplo 2: BSF INDF, 3
Antes da instruo: W = 0x17
FSR = 0xC2
contedo do endereo em FSR (FSR) = 0x2F
Depois da instruo: W = 0x17
FSR = 0xC2
contedo do endereo em FSR (FSR) = 0x28

A.24 BTFSC Testar o bit b de f, desviar se for = 0
Sintaxe: [label] BTFSC f, b
Descrio: Se o bit b do registro f for igual a zero, ignorar instruo seguinte. Se este bit b
for zero, aps a execuo da instruo atual, ser executada uma instruo
NOP, e no a instruo seguinte do programa, fazendo com que a instruo
atual, demore dois ciclos de instruo para ser executada.
Operao: Ignorar a instruo seguinte se (f<b>) = 0
Operando: 0 f 127, 0 b 7
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1 ou 2 dependendo do valor lgico do bit b
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 141
Exemplo: LAB_01 BTFSC REG, 1; Testar o bit 1 do registo REG
LAB_02 ........... ; Ignorar esta linha se for 0
LAB_03 ........... ; Executar esta linha depois da anterior, se for 1
Antes da instruo, o contador de programa contm o endereo LAB_01.
Depois desta instruo, se o bit 1 do registro REG for zero, o contador de
programa contm o endereo LAB_03. Se o bit 1 do registro REG for um, o
contador de programa contm o endereo LAB_02.

A.25 BTFSS Testar o bit b de f, desviar se for = 1
Sintaxe: [label] BTFSS f, b
Descrio: Se o bit b do registro f for igual a um, ignorar instruo seguinte. Se este bit b
for um, aps a execuo da instruo atual, ser executada uma instruo NOP,
e no a instruo seguinte do programa, fazendo com que a instruo atual
demore dois ciclos de instruo para ser executada.
Operao: Ignorar a instruo seguinte se (f<b>) = 1
Operando: 0 f 127, 0 b 7
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1 ou 2 dependendo do valor lgico do bit b
Exemplo: LAB_01 BTFSS REG, 1; Testar o bit 1 do registo REG
LAB_02 ........... ; Ignorar esta linha se for 1
LAB_03 ........... ; Executar esta linha depois da anterior, se for 0
Antes da instruo, o contador de programa contm o endereo LAB_01.
Depois desta instruo, se o bit 1 do registrador REG for um, o contador de
programa contm o endereo LAB_03. Se o bit 1 do registrador REG for zero, o
contador de programa contm o endereo LAB_02.

A.26 INCFSZ Incrementar f, desviar se resultado = 0
Sintaxe: [label] INCFSZ f, d
Descrio: Descrio: O contedo do registro f incrementado de uma unidade.
Se d = 0, o resultado guardado no registro W.
Se d = 1, o resultado guardado no registro f.
Se o resultado do incremento for = 0, a instruo seguinte substituda por
uma instruo NOP, fazendo com que a instruo atual demore dois ciclos de
instruo para ser executada.
Operao: (f) + 1 d
Operando: 0 f 127, d [0, 1]
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1 ou 2 dependendo do resultado
Exemplo: LAB_01 INCFSZ REG, 1; Incrementar o contedo de REG de uma unidade
LAB_02 ........... ; Ignorar esta linha se resultado = 0
LAB_03 ........... ; Executar esta linha depois da anterior, se der 0
Contedo do contador de programa antes da instruo, PC = endereo LAB_01.
Se o contedo do registro REG, depois da operao REG = REG + 1 ter sido
executada, for REG = 0, o contador de programa aponta para o label de
endereo LAB_03. Caso contrrio, o contador de programa mantm a sequncia
de execuo das instrues, ou seja, executar a instruo em LAB_02.

A.27 DECFSZ Decrementar f, desviar de resultado = 0
Sintaxe: [label] DECFSZ f, d
Descrio: O contedo do registro f decrementado uma unidade.
Se d = 0, o resultado guardado no registro W.
Se d = 1, o resultado guardado no registro f.
Se o resultado do decremento for = 0, a instruo seguinte substituda por
uma instruo NOP, fazendo assim com que a instruo atual demore dois ciclos
de instruo para ser executada.
Operao: (f) - 1 d
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 142
Operando: 0 f 127, d [0, 1]
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1 ou 2 dependendo do resultado
Exemplo: LAB_01 DECFSZ REG, 1; Decrementar o contedo de REG de uma unidade
LAB_02 ........... ; Ignorar esta linha se resultado = 0
LAB_03 ........... ; Executar esta linha depois da anterior, se der 0
Contedo do contador de programa antes da instruo, PC = endereo LAB_01.
Se o contedo do registo REG depois de a operao REG = REG 1 ter sido
executada, for REG = 0, o contador de programa aponta para o rtulo de
endereo LAB_03. Caso contrrio, o contador de programa contm o endereo
da instruo seguinte, ou seja, LAB_02.

A.28 GOTO Saltar para o endereo
Sintaxe: [label] GOTO k
Descrio: Salto incondicional para o endereo k.
Operao: k PC<10:0>, (PCLATH<4:3>) PC<12:11>
Operando: 0 k 2048
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 2
Exemplo: LAB_00 GOTO LAB_01; Saltar para LAB_01
:
LAB_01 ............
Antes da instruo: PC = endereo LAB_00
Depois da instruo: PC = endereo LAB_01

A.29 CALL Chamar uma subrotina
Sintaxe: [label] CALL k
Descrio: Esta instruo, chama uma subrotina. Primeiro, o endereo de retorno (PC+1) guardado
na pilha, a seguir, o operando k de 11 bits, correspondente ao endereo de incio da
subrotina, vai para o contador de programa (PC).
Operao: PC+1 Topo da pilha (TOS Top Of Stack)
Operando: 0 k 2048
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 2
Exemplo: LAB_00 CALL LAB_02 ; Chamar a subrotina LAB_02
LAB_01 :
:
LAB_02 ............
Antes da instruo: PC = endereo LAB_00
TOS = x
Depois da instruo: PC = endereo LAB_02
TOS = LAB_01

A.30 RETURN Retorno de uma subrotina
Sintaxe: [label] RETURN
Descrio: O contedo do topo da pilha guardado no contador de programa.
Operao: TOS Contador de programa PC
Operando: -
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 2
Exemplo: RETURN
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 143
Antes da instruo: PC = x
TOS = x
Depois da instruo: PC = TOS
TOS = TOS 1

A.31 RETLW Retorno de um subprograma com uma constante em W
Sintaxe: [label] RETLW k
Descrio: A constante k de 8 bits, guardada no registro W.
Operao: (k) W; TOS PC
Operando: 0 k 255
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 2
Exemplo: RETLW 0x43
Antes da instruo: W = x
PC = x
TOS = x
Depois da instruo: W = 0x43
PC = TOS
TOS = TOS 1

A.32 RETFIE Retorno de uma rotina de interrupo
Sintaxe: [label] RETLW k
Descrio: Retorno de uma subrotina de servio de interrupo. O contedo do topo da
pilha (TOS), transferido para o contador de programa (PC). Ao mesmo tempo,
as interrupes so habilitadas, pois o bit GIE de habilitao global das
interrupes, setado.
Operao: TOS PC ; 1 GIE
Operando: -
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 2
Exemplo: RETFIE
Antes da instruo: PC = x
GIE = 0
Depois da instruo: PC = TOS
GIE = 1

A.33 NOP Nenhuma operao
Sintaxe: [label] NOP
Descrio: Nenhuma operao executada, nem qualquer flag afetado.
Operao: -
Operando: -
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo: NOP

A.34 CLRWDT Iniciar o temporizador do watchdog
Sintaxe: [label] CLRWDT
Descrio: O temporizador do watchdog resetado. O pr-escalonador do temporizador de
Watchdog resetado e os bits do registro de estado so setados.
Operao: 0 WDT
0 prescaler de WDT
1
Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 144
1
Operando: -
Flag:
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo: CLRWDT
Antes da instruo: Contador de WDT = x
Prescaler de WDT = 1:128
Depois da instruo: Contador do WDT = 0x00
Prescale do WDT = 0



A.35 SLEEP Modo de repouso
Sintaxe: [label] SLEEP
Descrio: O processador entra no modo de baixo consumo. O oscilador pra. O
bit (Power Down) do registrador de Status resetado. O bit (Timer Out)
setado. O temporizador de WDT (Watchdog) e o respectivo prescaler so
resetados.
Operao: 0 WDT
0 prescaler do WDT
1
0 PD
Operando: -
Flag:
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: SLEEP
Antes da instruo: Contador do WDT = x
Prescaler do WDT = x
Depois da instruo: Contador do WDT = 0x00
Prescaler do WDT = 0



Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 145
Instrues C do Compilador CCS-PIC

B.1 MOVLW Escrever constante no registro W
Sintaxe: [label] MOVLW k
Descrio: A constante de 8-bits k vai para o registro W.
Operao: k ( W )
Operando: 0 k 255
Flag: -
Nmero de palavras: 1
Nmero de ciclos: 1
Exemplo 1: MOVLW 0x5A (Depois da instruo: W= 0x5A)
Exemplo 2: MOVLW REGISTAR (Antes da instruo: W = 0x10 e REGISTAR = 0x40)
(Depois da instruo: W = 0x40)

Apostila Microcontrolador PIC16F877
Laboratrio de Arquitetura de Sistemas Digitais 146
Referncias
1 Microcontrolador PIC 16F8X - Resumo da Arquitetura, ,MC404B - Nov 2001 -
Prof. Clio Guimares;
2 PIC16F87X Datasheet Microchip Technology Incorporated. USA. Nov 1999;
3 Microcontroladores PIC mikroElektronika , 2003;
4 Edmur Canzian, Minicurso Comunicao Serial RS232, CNZ Engenharia e
Informtica LTDA;