Buscar

Apostila Assembly

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 70 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 70 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 70 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Tendências e Demandas em Automação 
Industrial 
Zaqueu Dacoregio Heinzen 
 
 
 
 
 
 
 
 
Tubarão / SC 
2013 
Sumário 
 
Uma breve introdução aos microcontroladores ........................................................................................... 4 
Convenções ................................................................................................................................................... 5 
Arquitetura interna dos microcontroladores PIC ......................................................................................... 6 
Visão geral ................................................................................................................................................. 6 
Ports .......................................................................................................................................................... 7 
ULA (Unidade lógica e aritmética) ............................................................................................................ 8 
Memória de programa .............................................................................................................................. 9 
Contador de programa (Program Counter) e pilha de endereços (Stack) .............................................. 10 
Registradores .......................................................................................................................................... 12 
Registrador Work ou W .......................................................................................................................... 12 
Registradores GPR................................................................................................................................... 12 
Registradores SFR ................................................................................................................................... 14 
STATUS ................................................................................................................................................ 14 
OPTION ................................................................................................................................................ 16 
Resistores pull-up ................................................................................................................................ 17 
TRISA e TRISB ...................................................................................................................................... 19 
PORTA e PORTB ................................................................................................................................... 19 
Circuito de clock ...................................................................................................................................... 20 
Master Clear ............................................................................................................................................ 21 
Bits de configuração ................................................................................................................................ 21 
Interrupções ............................................................................................................................................ 22 
Interrupção externa (INT) ................................................................................................................... 24 
Timer 0 (TMR0) ................................................................................................................................... 24 
Timer 1 (TMR1) ................................................................................................................................... 24 
Timer2 (TMR2) .................................................................................................................................... 26 
Módulo CCP (Capture – Compare – PWM) ............................................................................................. 26 
Modo PWM ......................................................................................................................................... 27 
Memória EEPROM interna ...................................................................................................................... 28 
Lista de Exercícios – Módulo 01 .............................................................................................................. 30 
Linguagem Assembly................................................................................................................................... 31 
Instruções Byte-Oriented ........................................................................................................................ 31 
Instruções Bit-Oriented ........................................................................................................................... 33 
Instruções Literais e de Controle ............................................................................................................ 34 
 
Instrução SLEEP ................................................................................................................................... 35 
Ambiente Integrado de Desenvolvimento MPLAB ................................................................................. 35 
Diretiva #INCLUDE ............................................................................................................................... 37 
Acesso aos Bits de Configuração ......................................................................................................... 37 
Diretiva #DEFINE ................................................................................................................................. 37 
Comando ORG ..................................................................................................................................... 38 
Comandos CBLOCK e ENDC ................................................................................................................. 38 
Comando END ..................................................................................................................................... 39 
Comando EQU ..................................................................................................................................... 39 
Técnicas de programação em Assembly ................................................................................................. 39 
Comparação de valores....................................................................................................................... 39 
Atraso (Delay) ..................................................................................................................................... 40 
Debounce ............................................................................................................................................ 42 
Tratamento de interrupções ............................................................................................................... 42 
Timer0 ................................................................................................................................................. 43 
Lista de Exercícios – Módulo 02 .............................................................................................................. 45 
Linguagem C ................................................................................................................................................ 46 
Variáveis .................................................................................................................................................. 47 
Operadores .............................................................................................................................................49 
Condicionais e laços de repetição ........................................................................................................... 50 
Teste condicional if ............................................................................................................................. 50 
Teste condicional if/else ..................................................................................................................... 50 
Teste condicional switch/case ............................................................................................................ 51 
Laço for ................................................................................................................................................ 52 
Laço while ............................................................................................................................................ 52 
Laço do-while ...................................................................................................................................... 53 
Matrizes e vetores .................................................................................................................................. 54 
Ponteiros ................................................................................................................................................. 55 
Funções ................................................................................................................................................... 55 
Protótipos de funções ......................................................................................................................... 56 
Passagem de parâmetros e retorno de valores .................................................................................. 57 
Interrupções ............................................................................................................................................ 58 
Algumas bibliotecas úteis ....................................................................................................................... 58 
Display LCD alfanumérico em modo 4 bits ......................................................................................... 59 
Envio e recepção de caracteres via protocolo RS-232 ........................................................................ 60 
Conversão A/D .................................................................................................................................... 61 
Módulo PWM ...................................................................................................................................... 62 
Elaborando um projeto no compilador MikroC ...................................................................................... 63 
Lista de Exercícios – Módulo 03 .............................................................................................................. 67 
Referências bibliográficas ........................................................................................................................... 68 
 
 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 4 
Uma breve introdução aos microcontroladores 
 
A eletrônica digital foi a responsável pela modernização dos equipamentos utilizados em vários 
segmentos tecnológicos: aeroespacial, automobilístico, industrial, etc. As técnicas de construção de 
circuitos integrados possibilitaram que lógicas complexas de controle fossem realizadas por chips 
menores que um grão de arroz. Durante os anos setenta, surgiram os primeiros microprocessadores, 
capazes de realizar operações lógicas combinacionais e sequenciais de forma totalmente programável. 
Um microprocessador, neste caso, consistia em uma ULA (unidade lógica e aritmética) programável. O 
fabricante do equipamento integrava ao microprocessador uma memória de programa que indicava 
quais operações deveriam ser realizadas em determinada sequência, e uma memória de dados onde os 
resultados das operações eram armazenados. 
Já os microcontroladores foram desenvolvidos para conter, além da ULA, outros periféricos: 
memória EEPROM integrada, memória de programa, leitura de valores analógicos de tensão, módulos 
de comunicação de protocolos diversos (RS-232, SPI, I²C e mais recentemente USB e Ethernet), módulos 
de temporização e PWM (modulação por largura de pulso), tudo isto em uma única pastilha ou chip. 
Entre os diversos fabricantes de microcontroladores, destacam-se a Intel (fabricante dos 
famosos 8051), Microchip, Texas Instruments, Atmel (e a sua consagrada linha AVR). A linha PIC, da 
Microchip, por sua versatilidade, baixo custo e conjunto reduzido de instruções – fator este que facilita o 
aprendizado – foi a escolhida para este curso de microcontroladores. Conhecer o microcontrolador em 
seus mais diversos aspectos como tensões de alimentação, arquitetura interna, periféricos e a 
programação, é uma tarefa que demanda tempo e estudo. É essencial, porém, que o técnico em 
automação conheça estes dispositivos eletrônicos, pois podem ser utilizados na grande maioria dos 
projetos com redução considerável de custo quando comparado ao uso de tecnologias mais robustas, 
como os Controladores Lógico Programáveis e os Controladores de Processo universais. 
O requisito fundamental para o sucesso nesta disciplina é o estudo da eletrônica digital, pois os 
microcontroladores nada mais são do que circuitos digitais sequenciais e combinacionais programáveis. 
Outras áreas de conhecimento, como eletrônica analógica e lógica de programação, serão necessárias 
no decorrer do curso, por isso é importante que o leitor busque literaturas especializadas nestas áreas 
(No final desta apostila encontram-se as referências bibliográficas que podem ser consultadas). 
Bons estudos! 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 5 
Convenções 
 
Nesta apostila, números binários são representados nas instruções pelo prefixo b’ ou 0b, 
números hexadecimais pelo prefixo 0x e números decimais com prefixo d’. Caso um número não possua 
prefixo, subentende-se que o mesmo seja de base decimal. Termos em inglês ou termos técnicos são 
apresentados com estilo itálico. 
Subentende-se que o leitor esteja habituado às conversões de números binários em 
hexadecimais e/ou decimais e vice-versa. Maiores informações podem ser encontradas na bibliografia 
ao final do livro. 
Os softwares recomendados para confecção dos programas são o ambiente integrado de 
desenvolvimento MPLAB IDE (versão 8.73 ou superior) da Microchip®, e o compilador MikroC (versão 
5.01 ou superior) do fabricante MikroElektronika®. Pode-se ainda utilizar o software ISIS, do pacote 
Proteus para a simulação dos exemplos. O leitor pode optar ainda pela utilização do ambiente integrado 
de desenvolvimento MPLABX, que pode ser utilizado em dispositivos que suportem aplicativos Java. 
Neste último caso, a interface gráfica é ligeiramente diferente da versão convencional do MPLAB IDE, 
mas os programas que podem ser desenvolvidos são idênticos para ambas as versões. 
As instruções e trechos de código estão formatados com letra COURIER NEW. O número que 
precede cada instrução indica a linha de código para facilitar a leitura. 
Os comentários nos trechos de código assembly são identificados pelo ponto-e-vírgula (;) e 
comentários no compilador MikroC são precedidos por duas barras (//). 
Alguns estudantes podem sentir-se mais à vontade utilizando o compilador PCW, da fabricante 
CCS. Em sua versão paga este compilador é muito poderoso e de fácil utilização. No entanto, devido às 
limitações severas da versão gratuita, foi preferida a utilização do compilador MikroC, para queo 
estudante possa ter acesso mais amplo em seu computador pessoal, incentivando o auto aprendizado. 
O livro PIC – Programação em C, do autor Fabio Pereira, é indicado para aqueles que optarem pela 
utilização do compilador PCW. 
Esta apostila está dividida em três módulos. Para cada módulo existe uma lista de exercícios, 
para que o aluno possa assimilar de maneira mais concisa os assuntos discutidos no decorrer dos 
módulos. 
O primeiro módulo é dedicado à arquitetura interna dos microcontroladores PIC da linha 16F. 
Destacam-se neste módulo as noções básicas necessárias para o entendimento posterior do raciocínio 
lógico que envolve os programas. 
O segundo módulo envolve a linguagem Assembly, sua estrutura, a criação de pequenos 
programas e eventuais pormenores da arquitetura que são evidenciadas durante a fase de criação do 
programa do microcontrolador. 
O terceiro módulo apresenta a linguagem C através do compilador MikroC, possibilitando ao 
aluno a criação de projetos muito mais complexos em um tempo muito menor do que se fossem feitos 
utilizando-se a linguagem Assembly. 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 6 
Arquitetura interna dos microcontroladores PIC 
 
Visão geral 
 
Os microcontroladores PIC são dispositivos digitais programáveis, com níveis de tensão TTL (0 a 5V). 
Assim como qualquer microcontrolador, os PICs são compostos por ao menos um banco de memória de 
programa, uma unidade de processamento e pinos de entrada e saída, além de periféricos como 
comparadores, USART 1 , memória EEPROM, entre outros. Vamos ver como estes blocos estão 
organizados dentro de um PIC muito famoso, o PIC16F628A: 
 
Figura 1 – Arquitetura interna do microcontrolador PIC16F628A 
 
Fonte: Microchip (2007) 
 
1
Sigla para Universal Synchronous/Assynchronous Receiver and Transmitter 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 7 
A princípio, este diagrama parece muito complicado, certo? Mas lembre-se: só podemos utilizar da 
melhor maneira possível um dispositivo quando conhecemos a fundo o seu funcionamento! 
 
Ports 
 
Os ports são os grupos de pinos de entrada e saída. Nos microcontroladores PIC da série 16F, são 
comumente denominados como PORTx, sendo que x é uma letra que vai de A até E em alguns modelos. 
O microcontrolador PIC16F628A conta com o PORTA e o PORTB. 
 
Figura 2 – Pinos do microcontrolador PIC16F628A 
 
Fonte: Microchip (2007) 
 
Como você pode ver na figura 2, que demonstra os pinos físicos do microcontrolador 
PIC16F628A, os pinos são identificados da seguinte maneira: 
 
Port Número do pino Sigla do pino 
PORTA 
17 RA0/AN0 
18 RA1/AN1 
1 RA2/AN2/Vref 
2 RA3/AN3/CMP1 
3 RA4/T0CKI/CMP2 
4 
_________________ 
RA5/MCLR/Vpp 
15 RA6/OSC2/CLKOUT 
16 RA7/OSC1/CLKIN 
PORTB 
6 RB0/INT 
7 RB1/RX/DT 
8 RB2/TX/CK 
9 RB3/CCP1 
10 RB4/PGM 
11 RB5 
12 RB6/T1OSO/T1CKI/PGCC 
13 RB7/T1OSI/PGD 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 8 
ULA (Unidade lógica e aritmética) 
 
Em circuitos digitais combinacionais, desejamos que a(s) saída(s) tenham determinado valor a 
partir do valor de sua(s) entrada(s). Vamos voltar a um nível de abstração bem baixo: a já conhecida 
porta E. Como você sabe, a porta E (cujo símbolo está representado na figura 3) realiza a operação 
matemática booleana S = A.B, ou seja, a saída só terá nível lógico “alto” quando as duas entradas 
possuírem nível lógico “alto”, caso contrário, a saída terá nível lógico “baixo”. A tabela verdade desta 
porta lógica está representada na figura 4. 
 
Figura 3 – Porta E 
 
Fonte: Elaboração do autor (2012) 
 
Geralmente, as operações em circuitos digitais são muito mais complexas do que uma simples 
porta E. Por exemplo, determinado circuito pode servir para somar duas variáveis de oito bits e 
apresentar o resultado na saída, junto com o “carry-out”. Se você não entendeu alguma parte da frase 
anterior, é hora de pegar um livro ou apostila de eletrônica digital novamente! Algumas sugestões estão 
relacionadas nas referências bibliográficas, ao final desta apostila. Como você deve imaginar, para 
compor estes circuitos mais complexos são utilizadas várias portas lógicas em conjunto. 
 
Figura 4 – Tabela verdade da porta lógica E 
A B S = A.B 
0 0 0 
0 1 0 
1 0 0 
1 1 1 
Fonte: Elaboração do autor (2012) 
 
Uma ULA, no entanto, vai muito além de um somador! Esta unidade é o “cérebro” do 
microcontrolador. Ela recebe duas variáveis e realiza uma operação lógica (E, OU, XOR, etc) ou 
aritmética (soma, incremento, decremento, etc) – daí o seu nome – sendo que esta operação é 
selecionada pelo usuário em uma terceira variável de entrada. 
Mas como o microcontrolador recebe as variáveis de entrada e a operação a ser realizada? E em 
que endereço o resultado será armazenado? Esta é a tarefa da memória de programa. 
 
 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 9 
Memória de programa 
 
Quando queremos realizar uma operação qualquer, necessitamos saber qual será a operação, 
quais serão os dados de entrada e onde será armazenado o resultado. Em um microcontrolador, estas 
informações são armazenadas sequencialmente na memória de programa (Flash Program Memory, no 
diagrama). Este banco de memória, nos PICs da série 16F, possui vários endereços de 14 bits cada, 
sendo que até seis destes bits representam a operação a ser realizada. A partir de agora, nos 
referenciaremos às operações como instruções do microcontrolador. Ou seja, no máximo seis dos 
catorze bits de cada endereço de memória de programa referem-se à instrução que o microcontrolador 
irá realizar. Isto nos dá um total de 64 instruções possíveis! Na realidade, o conjunto de instruções dos 
microcontroladores PIC da série 16 é de 35 instruções, no total. Esta é a chamada tecnologia RISC 
(Reduced Instruction Set Computing), onde o fabricante minimiza o número total de operações que 
podem ser realizadas pelo microcontrolador. Este tipo de tecnologia facilita o aprendizado, pois o 
programador só necessita conhecer 35 instruções para construir seu programa. Por outro lado, qualquer 
operação mais complexa (como uma multiplicação, por exemplo) deve ser desenvolvida pelo 
programador a partir das instruções nativas. Outra tecnologia utilizada pelos fabricantes é a CISC 
(Complex Instruction Set Computing), que utiliza várias (tipicamente mais de cem) instruções. A 
desvantagem óbvia é que o programador deverá recorrer a uma tabela enorme com várias instruções 
disponíveis para fazer a mais simples operação, no entanto geralmente com um conjunto mais 
complexo de instruções é possível realizar instruções diversas sem “montá-las”, como multiplicação, 
divisão e até mesmo raiz quadrada ou exponenciação. 
A figura 4 mostra como cada valor do banco de memória de programa é utilizado. Note que 
existem instruções do tipo Byte Oriented, Bit Oriented e do tipo Literal/Control. Não se preocupe, 
quando estudarmos cada instrução veremos o que significam estes termos. 
 
Figura 5 – Instrução em um PIC da série 16 
 
Fonte: Microchip (2007) 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 10 
Bom, agora que você já sabe o que é uma instrução, vamos esclarecer uma das principais 
características de um microcontrolador. Sempre que nos referimos a microcontroladores, dizemos que 
os mesmos são circuitos programáveis sequenciais. Ou seja, existe uma lista de instruções que sãorealizadas de forma sequencial pela ULA. A sequência desta lista é o próprio banco de memória do 
microcontrolador! 
No caso dos PICs da série 16, precisamos conhecer dois endereços de memória importantes. O 
primeiro é o endereço 0x0000, que é chamado também de vetor de reset. Quando o microcontrolador é 
inicializado ou reiniciado, é neste endereço que o programa irá iniciar. Poderíamos começar nosso 
programa sempre a partir deste endereço sem nos preocuparmos com os próximos endereços, se não 
fosse um pequeno detalhe: no endereço 0x0004 está localizado o vetor de interrupção. Uma 
interrupção, como o próprio nome diz, é uma parada abrupta no programa principal. As interrupções, 
claro, são programáveis, e são importantíssimas nos microcontroladores. São elas as responsáveis, por 
exemplo, por informar que uma conversão A/D terminou, ou que um pino teve seu estado alterado. 
Podemos entender, então, que uma interrupção é um evento que pode acontecer a qualquer instante 
no programa. Sempre que uma interrupção ocorre, o programa é desviado para o endereço 0x0004. 
Portanto, uma prática comum é inserir uma instrução de desvio logo no primeiro endereço de programa. 
Veremos como fazer isso mais adiante. 
Um dos principais parâmetros de um microcontrolador é a sua memória de programa, ou seja, a 
sua capacidade de armazenar instruções. Em um computador, estas instruções são armazenadas no 
disco rígido, portanto, jamais nos preocuparemos se o programa que estamos escrevendo irá ocupar 
1000 instruções ou 200 instruções. Na verdade, os computadores modernos suportam programas com 
vários milhões de instruções! Quando nos deparamos com microcontroladores, a realidade é outra. Por 
exemplo, o microcontrolador PIC16F84A (modelo já obsoleto) possuía capacidade para armazenar 
somente 1024 palavras (1K) de programa. O já citado PIC16F628A possui capacidade para 2048 (2K) 
instruções, e alguns PICs mais modernos já atingiram a casa das centenas de milhares de instruções. Na 
maioria dos programas, principalmente se tratando de aplicações industriais simples como aquisição e 
envio de dados de sensores, pequenas lógicas de controle e apresentação de valores em displays, 1024 
instruções são mais que suficientes. 
No PIC16F628A, a memória de programa vai do endereço 0x0000 até o endereço 0x07FF (em 
decimal, 0 a 2047). No PIC16F877A, outro microcontrolador “padrão” da série 16, os endereços iniciam 
em 0x0000 e vão até o endereço 0x1FFF (em decimal, 0 a 8191, totalizando 8192 instruções ou 8K). 
Estas informações encontram-se no datasheet do componente, ferramenta essencial para quem 
trabalha com eletrônica, seja digital ou analógica. Para este curso, você irá precisar dos seguintes 
datasheets: PIC16F877A, PIC16F628A e PIC12F675, todos disponíveis no site do fabricante (Microchip). 
 
Contador de programa (Program Counter) e pilha de endereços (Stack) 
 
O responsável por fazer o controle do endereço de programa é o Program Counter (contador de 
programa - PC). Este dispositivo incrementa o endereço de programa a cada quatro pulsos de clock. 
Supondo então um clock de 8Mhz, teremos duas instruções processadas a cada microssegundo. Com 
4Mhz, teremos uma instrução a cada microssegundo, e assim por diante. O clock máximo suportado 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 11 
pelos PICs 16F628A, 16F877A e PIC12F675 é de 20Mhz, o que nos dá um máximo de cinco instruções por 
microssegundo. 
Um mecanismo interessante presente nos microcontroladores é a pilha de endereços (Stack). 
Quando o programa é desviado por algum motivo (uma interrupção, por exemplo), o microcontrolador 
se encarrega de salvar o endereço onde estava na pilha de endereços, para que ao término do evento 
de desvio ele continue de onde parou. Os microcontroladores PIC 16F não possuem uma pilha muito 
poderosa: podemos armazenar somente oito endereços, ou seja, não podemos fazer muitos “desvios 
em um desvio”, correndo o risco de retornar a um endereço totalmente equivocado, causando 
travamento ou alterando todo o sentido do programa. 
 
Figura 6 – Program Counter, Stack e banco de memória do PIC16F628A 
 
Fonte: Microchip (2007) 
 
Outros microcontroladores mais recentes, como os PIC18F por exemplo, possuem uma pilha 
com mais de trinta endereços consecutivos, aumentando consideravelmente a capacidade de fazer 
desvios de programas e retornar para onde estava. Em aplicações comuns não é necessário utilizar mais 
que um ou dois desvios consecutivos, portanto não precisamos nos preocupar muito com o tamanho da 
pilha. De fato, a maioria dos problemas com a pilha provém de erros na programação! 
Bom, você já sabe agora como o microcontrolador processa seus dados: a lista de instruções que 
ele irá obedecer é a memória de programa, onde estão armazenadas várias palavras em sequência. 
Cada palavra é composta pela instrução e por um ou mais dados de entrada, que são devidamente 
processadas pela ULA e apresentados na sua saída. Mas onde se localizam os valores a serem 
processados? E onde o resultado da ULA é armazenado? Bem, este é o papel dos registradores, e este é 
talvez um dos assuntos mais importantes tratando-se de microcontroladores. Você verá que a 
capacidade de fazer um programa com várias funcionalidades dependerá diretamente da sua 
capacidade de identificar e utilizar os registradores corretos. 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 12 
Registradores 
 
Os registradores são endereços específicos do microcontrolador destinados a memorizar dados 
temporários. É a famosa memória RAM do programa, onde valores são gravados a qualquer instante e 
se perdem após o desligamento ou reinicialização do microcontrolador. Existem três tipos distintos de 
registradores: o registrador Work, os registradores SFR (Specific Function Registers – Registradores de 
Funções Específicas) e GPR (General Purpose Registers – Registradores de propósito geral). 
 
Registrador Work ou W 
 
 Este registrador também é conhecido como acumulador. Ele não possui um endereço acessível 
ao programador, mas é utilizado constantemente. Ele serve como dado de entrada de boa parte das 
instruções do microcontrolador PIC. Embora o nome não seja idêntico em outras marcas e modelos, 
todo microcontrolador apresenta um registrador semelhante, que é capaz de armazenar o último 
resultado da ULA ou outro valor temporariamente. Vamos a um exemplo bem prático: a instrução 
MOVLW. Decompondo esta instrução, intuitivamente veremos o que ela quer dizer: MOVer um Literal 
para Work. Ou seja, iremos mover um número qualquer, como por exemplo, 15, para o registrador 
Work. Você deve estar se perguntando: Por que isto é necessário? Bem, basta olhar no conjunto de 
instruções do PIC16F628A para perceber que boa parte das instruções mais complexas deve trabalhar 
com o registrador Work como dado de entrada. 
Por exemplo, se quisermos realizar uma soma, só existem dois comandos disponíveis: ADDWF e 
ADDLW. As duas realizam uma soma do registrador Work com outro registrador e com uma literal, 
respectivamente. Na verdade, você pode observar na figura 1 que o W-REG está sempre presente como 
dado de entrada da ULA. Este método agiliza o processamento da operação, pois só é necessário buscar 
um valor para colocar na ULA, o outro está sempre disponível. Alguns PICs mais recentes possuem uma 
instrução para somar dois registradores, mas o que esta instrução faz é na verdade as operações 
MOVWF e ADDWF consecutivamente, ou seja, na arquitetura dos PICs o registrador Work está sempre 
presente. 
Podemos inserir qualquer valor entre 0 a 255 neste registrador, e o valor fica salvo até que 
algumaoutra operação faça uso do mesmo ou aconteça reset do microcontrolador. 
 
Registradores GPR 
 
 Os registradores GPR são endereços de memória RAM que podem ser utilizados pelo usuário 
para armazenar qualquer valor. Como a memória RAM é uma memória volátil, os valores armazenados 
nestes registradores são perdidos sempre que há reset no microcontrolador. Por exemplo, pode ser útil 
armazenar temporariamente a quantidade de peças que passaram por uma esteira e parar o processo 
caso a quantidade tenha superado o valor pré-ajustado. 
 Nos microcontroladores PIC16F628A, os endereços 0x20 a 0x7F, 0xA0 a 0xFF e 0x120 a 0x17F 
são destinados aos registradores do tipo GPR – observe-os na figura 7. 
 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 13 
Figura 7 – Mapa de registradores do PIC16F628A 
 
Fonte: Microchip (2007) 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 14 
ATENÇÃO 
Há um conceito muito importante a ser explicado agora que você já visualizou o mapa de memória do 
PIC16F628A: Ele é dividido em quatro bancos de memória. Isto é necessário porque dispomos apenas de 
sete bits na instrução para referenciar o endereço dos registradores que serão utilizados como dado de 
entrada ou saída para a operação. Então, é necessário dividir a memória total em vários bancos para 
que o microcontrolador possa ter acesso a todos os endereços. 
 
 
Registradores SFR 
 
 Os registradores SFR são utilizados para armazenar valores temporários que resultaram de 
alguma operação, interrupção ou outra função, ou como dado de entrada das mesmas. O estudo dos 
SFRs é muito importante, pois são eles que controlam, por exemplo, os valores dos pinos de entrada e 
saída dos microcontroladores, o valor a ser enviado pelo protocolo RS-232, o resultado de uma 
conversão A/D, o dado resultante de uma leitura na EEPROM, a configuração de um timer, etc. 
Vamos estudar agora os registradores mais relevantes. Os outros serão estudados no decorrer 
da apostila, quando for necessário. 
 
STATUS 
 
 Este registrador, localizado no terceiro endereço físico de todos os bancos, recebe informações 
a respeito do estado do microcontrolador. Vamos verificar os bits que compõem o mesmo: 
 
Figura 8 – Registrador STATUS 
 
Fonte: Microchip (2007) 
 
 Antes de continuarmos, é interessante aprender o que significa cada símbolo na figura acima. 
Na parte superior, podemos verificar duas informações: cada bit pode ser somente leitura (R) ou então 
leitura/escrita (R/W). O valor seguinte é o estado que o bit assume quando ocorre um reset. O valor “0” 
indica nível baixo, “1” indica nível alto e “x” indica que o valor é desconhecido. De fato, o 
microcontrolador “força” os valores de alguns bits de registradores que são importantes para 
determinadas funções na inicialização. 
Na parte inferior, podemos notar que lendo da esquerda para a direita iremos começar do 
sétimo bit (ou bit mais significativo – MSB) até o bit zero (ou bit menos significativo – LSB). 
É na parte central, portanto, que os bits são identificados conforme as suas funções. Conforme a 
figura 8, temos então os seguintes bits: 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 15 
Bit 7 IRP – bit de seleção de banco de memória (para endereçamento indireto) 
 1 = Bancos 2 e 3 (0x100 a 0x1FF) 
 0 = Bancos 0 e 1 (0x000 a 0x0FF) 
Bit 6-5 RP<1:0> - bit de seleção de banco de memória (para endereçamento direto) 
 00 = Banco 0 (0x00 a 0x7F) 
 01 = Banco 1 (0x80 a 0xFF) 
 10 = Banco 2 (0x100 a 0x17F) 
 11 = Banco 3 (0x180 a 0x1FF) 
Bit 4 
________ 
TO = bit de Time-Out 
 1 = Após a inicialização, instrução CLRWDT ou SLEEP 
 0 = Ocorreu um estouro de Watch-Dog Timer 
Bit 3 
________ 
PD = bit de Power-Down 
 1 = Após a energização ou a instrução CLRWDT 
 0 = Execução da instrução SLEEP 
Bit 2 Z = bit de resultado Zero 
 1 = O resultado de uma operação lógica ou aritmética foi zero 
 0 = O resultado de uma operação lógica ou aritmética foi diferente de zero 
Bit 1 
 __________________ 
DC = bit de Digit Carry/Borrow (instruções ADDWF, ADDLW, SUBLW, SUBWF) 
 1 = Ocorreu carry-out do quarto bit do resultado 
 0 = Não ocorreu carry-out do quarto bit do resultado 
Bit 0 
 __________________ 
DC = bit de Carry/Borrow (instruções ADDWF, ADDLW, SUBLW, SUBWF) 
 1 = Ocorreu carry-out do bit mais significativo 
 0 = Não ocorreu carry-out do bit mais significativo 
 
Vamos analisa-los, um por um. 
 
Primeiro, temos o bit IRP, utilizado para selecionar o banco de endereçamento indireto. O 
endereçamento indireto funciona da seguinte maneira: ao invés de acessar o valor de um endereço do 
registrador de destino, escrevemos este endereço em um registrador denominado FSR (File Select 
Register – não confundir com SFR!), e podemos ler ou escrever o valor do mesmo através de um 
segundo registrador denominado INDF. O endereçamento indireto facilita, por exemplo, a limpeza de 
vários endereços através de um loop de repetição. Veremos esta aplicação mais à frente. 
Em seguida, temos os dois bits que servem para escolher o banco de memória. Como você já 
sabe, temos que indicar o banco de memória em que se encontra o registrador que queremos acessar. 
Para fazer a seleção do banco, utilizamos os bits 6 e 5. 
O bit 4 (Time-out) indica se houve estouro de Watch-Dog Timer. Note que este bit é barrado, ou 
seja, se o mesmo possuir o valor “zero” então houve estouro. Nível alto neste bit indica que o reset foi 
causado pela inicialização normal, ou por uma instrução de limpeza de Watch-Dog Timer (CLRWDT) ou 
entrada em modo de espera (SLEEP). 
O terceiro bit indica que a última inicialização ocorreu normalmente (nível alto) ou antes da 
inicialização ocorreu uma instrução para a entrada em modo de espera (SLEEP). Os dois últimos bits são 
somente de leitura, ou seja, podemos apenas ler seus valores, mas não podemos modifica-los. Note 
também que este bit é barrado. 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 16 
O bit de Zero é uma ferramenta muito útil, como veremos mais à frente. Sua função é intuitiva: 
caso o resultado da última operação aritmética ou lógica foi igual à zero, então este bit entra em nível 
alto. Caso contrário, é forçado a nível baixo. 
O bit de Digit Carry-Out é forçado para nível alto caso o resultado de alguma das instruções 
ADDWF, ADDLW, SUBLW, SUBWF tenha um resultado maior que quatro bits. Por exemplo, ao somarmos 
o valor b’00000001’ com o valor b’00001111’, o resultado será b’00010000’. Neste caso o bit DC será 
levado a nível alto. 
O bit de Carry-Out é semelhante ao bit anterior, no entanto o mesmo funciona caso o resultado 
de uma operação for maior que oito bits. Desta forma, podemos literalmente trabalhar com variáveis de 
nove bits! Por exemplo, ao somar o valor b’11111111’ com o valor b’00000001’, o resultado seria 
b’111111111’, mas como só é possível armazenar oito bits, o nono bit é o próprio bit de Carry-Out. 
 
OPTION 
 
 Este registrador é responsável pelas principais configurações do microcontrolador. 
Figura 9 – Registrador OPTION 
 
Fonte: Microchip (2007) 
 
Bit 7 
______________ 
RPBU = bit de habilitação dos resistores de pull-up do PORTB 
 1 = Resistores de pull-up internos desabilitados 
 0 = Resistores de pull-up internos habilitados 
Bit 6 INTEDG = bit de seleção de nível de borda de interrupção 
 0 = Interrupção nopino RB0/INT na borda de subida 
 1 = Interrupção no pino RB0/INT na borda de descida 
Bit 5 T0CS = bit de seleção de fonte de clock do Timer0 
 1 = Transição de clock no pino RA4/T0CKI/CMP2 
 0 = Clock interno 
Bit 4 T0SE = bit de seleção de nível de borda do clock do Timer0 
 1 = Incremento na descida de clock no pino RA4/T0CKI/CMP2 
 0 = Incremento na subida de clock no pino RA4/T0CKI/CMP2 
Bit 3 PSA = bit de configuração de Prescaler 
 1 = Prescaler ligado ao Watch-Dog Timer 
 0 = Prescaler ligado ao Timer0 
Bit 2-0 PS<2:0> = bits de seleção do valor do Prescaler 
 
 
 Fonte: Microchip (2007) 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 17 
Resistores pull-up 
 
Conforme você aprendeu na disciplina de Eletrônica Digital, se utilizarmos uma chave mecânica 
(seja uma chave táctil, um fim de curso, etc) devemos colocar em paralelo com o pino de entrada do 
circuito integrado um resistor para “forçar” nível baixo ou nível alto quando a chave estiver aberta. 
Chamamos este resistor de pull-up quando o resistor está ligado ao nível alto e pull-down quando está 
ligado ao nível baixo. 
 
Figura 10 – Configurações Pull-Down e Pull-Up 
 
 Configuração Pull-Down Configuração Pull-Up 
Fonte: Elaboração do Autor (2012) 
 
Para ilustrar estes conceitos, atente-se à figura 10. Note que, no caso da utilização do circuito de 
pull-up (b) quando a chave está fechada o pino S2 é forçado a nível baixo, e quando ela está aberta o 
mesmo pino é forçado a nível alto pelo resistor R1. 
Já no caso do pull-down (a), quando a chave está fechada o pino S2 é forçado a nível alto, e 
quando ela está aberta o mesmo pino é conectado ao 0V pelo resistor R1, forçando-o a nível baixo. 
Embora a ideia do resistor de pull-down seja mais natural (nível alto com chave pressionada e 
nível baixo com chave aberta), na grande maioria dos casos utiliza-se o circuito de pull-up. Isto é 
necessário porque normalmente os botões e chaves localizam-se a uma distância considerável do pino 
de entrada, muitas vezes conectadas através de fios, e o pino fica sujeito às interferências captadas no 
decorrer do caminho – ruídos eletromagnéticos advindos de motores, circuitos de potência e até 
mesmo de outros circuitos eletrônicos próximos. 
No caso da utilização dos resistores de pull-down, o ruído é adicionado ao 0V, o que pode fazer 
com que o circuito interprete que há nível alto na entrada. No caso do pull-up, o ruído é adicionado aos 
5V, sendo que não há diferença para o microcontrolador pois o nível continua sendo alto com ou sem 
ruído. A desvantagem é que haverá uma queda de tensão caso a distância seja muito elevada, mas isto 
pode ser contornado utilizando-se acopladores ópticos. As duas situações estão ilustradas na figura 11. 
 
 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 18 
Figura 11 – Diferença, com relação ao ruído, entre as configurações pull-up e pull-down 
 
 
a) Configuração pull-down – Note que durante alguns 
instantes de tempo o ruído faz com que o 
microcontrolador detecte nível alto. 
 
b) Configuração pull-up – Note que o ruído não faz 
com que o nível deixe de ser alto. 
Fonte: Elaboração do autor (2012) 
 
Alguns microcontroladores PIC possuem internamente resistores de pull-up, que podem ser 
habilitados de maneira individual ou então em grupo. No caso do PIC16F628A, somente é possível 
habilitar todos os resistores de pull-up do PORTB ao mesmo tempo. Estes resistores funcionam somente 
quando configuramos o pino como entrada. Portanto, se habilitarmos os resistores de pull-up do PORTB 
mas somente um dos pinos tiver a função de entrada, então o resistor de pull-up funcionará somente 
neste pino. Quando utilizamos o resistor de pull-up interno, basta ligar a chave até o nível baixo (0V). 
Lembre-se que a lógica será inversa: nível alto para chave aberta, nível baixo para chave fechada. 
 
Figura 12 – Ligação de chave táctil com resistor de pull-up interno no pino RB0 
 
Fonte: Elaboração do autor (2012) 
Fonte de ruído 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 19 
Caso você queira habilitar os resistores de pull-up internos, o sétimo bit do registrador OPTION 
deve estar desligado. Após uma reinicialização, o estado normal destes resistores é desligado. 
O registrador OPTION conta ainda com outros bits de configuração, que serão estudados nas 
seções de interrupções e Watch-Dog Timer. 
 
TRISA e TRISB 
 
 Podemos configurar um pino do microcontrolador para funcionar como entrada ou como saída. 
O registrador responsável por esta configuração é o TRISx, sendo que “x” é a letra que representa o 
Port. Por exemplo, no PORTA o registrador responsável pelo controle da configuração é o TRISA, e assim 
por diante. Cada bit colocado em nível alto significa que o pino relacionado a este bit funciona como 
uma entrada, e em nível baixo funciona como uma saída. Uma dica para lembrar-se sempre do 
funcionamento do registrador TRIS é lembrar que “0” (nível baixo) é equivalente à letra inicial de output 
(saída), e “1” (nível alto) é equivalente à letra inicial de input (entrada). 
 
Figura 13 – Registradores TRISA e TRISB 
 
Fonte: Microchip (2007) 
 
Note na figura 13 que o registrador TRISA possui os bits TRISA7 até TRISA0, e por padrão todos 
eles estão em nível alto, ou seja, todos estão configurados como entrada. 
 
ATENÇÃO 
Quando configurado como saída, a corrente máxima de saída/entrada em cada pino é de 20mA. Quando 
configurado como entrada, deve-se tomar cuidado com o valor de possíveis resistores de pull-up ou pull-
down externos, pois um valor muito baixo implica em uma alta corrente de entrada, e um valor muito 
alto implica em uma redução na tensão efetivamente aplicada ao pino. Normalmente utiliza-se um 
resistor de 10k como pull-up ou pull-down externo. 
 
PORTA e PORTB 
 
Os registradores relacionados aos Ports estão relacionados tanto à escrita – quando configurado 
como saída – quanto à leitura dos valores. Assim como nos registradores TRIS, existem bits individuais 
para cada pino. 
Figura 14 – Registradores PORTA e PORTB 
 
Fonte: Microchip (2007) 
 
Falando em entrada e saída, devemos ter em mãos o datasheet do componente para identificar 
as funções individuais de cada pino. Normalmente, tratando-se de microcontroladores, os pinos são 
multiplexados e possuem várias funções selecionáveis. Por exemplo: o pino RA0/AN0 possui as funções 
de entrada e saída digital e também pode servir como entrada para o comparador interno; o pino RB0 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 20 
funciona como entrada e saída digital e também serve como pino de entrada para a interrupção 
externa; o pino RB1/RX/DT serve como entrada e saída digital e também serve como pino de recepção 
da USART ou entrada de dados de comunicação síncrona. Todas estas funções estão relacionadas no 
datasheet e variam de microcontrolador para microcontrolador, portanto não é necessário decorá-los. 
No entanto, é fundamental entender o propósito de cada função de cada pino. 
 
ATENÇÃO 
O pino RA5 do PIC16F628A só pode ser utilizado como entrada, e o pino RA4 do mesmo 
microcontrolador possui saída do tipo dreno aberto (somente liga o pino ao nível baixo, diferente dos 
outros tipos que possuem configuração do tipo totem-pole, possibilitando a saída tanto em nível alto 
quanto em nível baixo). 
 
Circuito de clock 
 
Os microcontroladores trabalham com listas de instruções, que são armazenadas na memória 
de programa eprocessadas pela unidade lógica e aritmética. O program counter é responsável por, 
sequencialmente, buscar a instrução na memória de programa e enviá-la para a ULA para ser 
processada. Esta busca é sincronizada pelo mecanismo de clock (relógio), que pode ser externo ou 
interno ao microcontrolador. Lembre-se que o tempo de cada instrução é o valor do clock/4. 
No caso do microcontrolador PIC16F628A, o mesmo pode utilizar tanto o clock interno de 4Mhz 
quanto um circuito externo de clock. Temos que nos atentar ao fato de que alguns microcontroladores, 
como o PIC16F877A, não possuem circuito de clock interno. Em aplicações em que funções de 
temporização devem ser muito precisas, o ideal é utilizar o clock externo com cristal de quartzo 
(ilustrado na figura 15) mesmo que o microcontrolador possua circuito de clock interno. O valor dos 
capacitores C1 e C2 fica em torno de 10pF a 33pF, dependendo da frequência do cristal. O datasheet 
fornece o valor de capacitância necessário. 
Figura 15 – Circuito de clock e Master Clear 
 
Fonte: Elaboração do autor (2012) 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 21 
Master Clear 
 ____ 
O pino MCLR, quando em nível baixo, faz com que ocorra reset do microcontrolador PIC. 
Portanto, devemos força-lo a nível alto. Também é interessante colocar um capacitor com pequeno 
valor para prevenir que as oscilações do circuito de clock e/ou ruídos externos façam com que o 
microcontrolador seja reiniciado por este pino. Observe na figura 15 o resistor R1 e o capacitor C3. Estes 
valores não são críticos, no entanto deve-se lembrar de que um valor alto de resistência pode fazer com 
que não haja tensão suficiente no pino. 
 
Bits de configuração 
 
Algumas configurações dos microcontroladores PIC só podem ser realizadas durante a etapa de 
gravação do mesmo. Estas configurações são realizadas ligando ou desligando bits específicos 
localizados em um endereço de programa que não é acessível pelo Program Counter (no caso do 
PIC16F628A, o endereço é o 0x2007). A linha PIC possui bits padronizados, no entanto nem todos os 
modelos apresentam todos os bits de configuração. Por exemplo, para o microcontrolador PIC16F628A, 
o datasheet especifica os seguintes bits de configuração: 
 
Figura 16 – Bits de configuração do microcontrolador PIC16F628A 
 
Fonte: Microchip (2007) 
 
A tabela abaixo indica a função de cada bit de configuração. Sempre que você se deparar com 
um modelo diferente de microcontrolador, deverá procurar no datasheet os bits de configuração 
existentes. 
 
Bit Nome Descrição 
 ________ ________ 
13 CP Proteção da memória de programa. 1 = Proteção desligada. 0 = Proteção ligada. 
 ____________ ________ 
8 CPD Proteção da memória de dados. 1 = Proteção desligada. 0 = Proteção ligada. 
7 LVP Programação em baixa tensão. 1 = Habilitada. 0 = Desabilitada. 
6 BOREN Reset por brown-out. 1 = Habilitado. 0 = Desabilitado. 
5 MCLRE Utilização do Master Clear no pino RA5/MCLR/Vpp. Ligado = Habilitado. 0 = Desabilitado. 
4, 1-0 FOSC <2:0> 111 = Oscilador tipo RC no pino RA7. Pino RA6 funciona como saída de clock. 
110 = Oscilador tipo RC no pino RA7. Pino RA6 funciona como I/O. 
101 = Oscilador interno. Pino RA6 funciona como saída de clock. 
100 = Oscilador interno. Pino RA6 funciona como I/O. 
011 = Clock externo. Pino RA7 funciona como entrada de clock e pino RA6 como I/O. 
010 = Oscilador tipo cristal de quartzo de alta velocidade externo (HS). 
001 = Oscilador tipo cristal de quartzo externo (XT). 
000 = Oscilador tipo cristal de quartzo externo de baixa potência (LP). 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 22 
 _____________________ ________ 
3 PWRTE Power-up Timer. 1 = Desabilitado. 0 = Habilitado. 
2 WDTE Watch-dog Timer. 1 = Habilitado. 0 = Desabilitado. 
 
Interrupções 
 
As interrupções são recursos poderosos existentes em qualquer microcontrolador ou 
microprocessador. Como o próprio nome sugere, as interrupções paralisam a sequência de programa e 
deslocam o Program Counter para um endereço de programa específico. Após o término da interrupção 
deve haver uma instrução para que o programa retorne de onde parou. Para que isto seja possível, o 
último endereço de memória de programa é salvo na pilha, e com a instrução de retorno o processador 
busca o endereço salvo na pilha e retorna de onde parou. 
 
Figura 17 – Ciclo de interrupções 
... 
Instrução 32 
Instrução 33 
Instrução 34 
Instrução 35 
Instrução 36 
Instrução 37 
Instrução 38 
Instrução 39 
Instrução 40 
Instrução 41 
Instrução 42 
... 
 
Fonte: Elaboração do autor (2012) 
 
No caso da linha de microcontroladores PIC 16F, o endereço 0x004 é reservado para o vetor de 
interrupções e a instrução de retorno é a RETFIE. 
Nos microcontroladores PIC16F, existe uma latência (atraso) de três ou quatro ciclos de clock (o 
número exato depende do instante em que ocorre a interrupção), desde o momento em que a 
interrupção acontece até que o programa seja desviado para o vetor de interrupção. 
Normalmente cada interrupção tem dois bits principais: o bit de enable, que habilita a 
interrupção, e o bit de flag, que aponta que uma interrupção ocorreu. O bit de enable pode ser colocado 
em nível alto ou baixo pelo programador, já o bit de flag somente pode ser forçado para nível baixo. 
O bit GIE, do registrador INTCON, habilita de maneira geral as interrupções. Se este bit estiver 
em nível baixo, nenhuma interrupção funcionará. Se estiver em nível alto, cada vez que ocorrer uma 
detecção o bit GIE é desligado, o endereço de programa atual é salvo na pilha e é então desviado para o 
endereço 0x004, mesmo que nenhuma outra interrupção específica esteja habilitada. A instrução 
Instrução A 
Instrução B 
Instrução C 
Instrução D 
Instrução de retorno 
Sinal de 
interrupção 
Vetor de interrupção 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 23 
RETFIE faz com que o bit GIE seja habilitado novamente, e o endereço de programa seja então 
desviado para onde se encontrava antes da interrupção. 
Várias instruções são chamadas de periféricas, e neste caso além do bit GIE devemos habilitar 
também o bit PEIE do registrador INTCON (nas figuras 18 e 19 as interrupções periféricas são as 
localizadas no canto esquerdo, note a necessidade de habilitar o bit PEIE para que a porta E envie o sinal 
adiante). 
 
Figura 18 – Mapa de interrupções do PIC16F628A 
 
Fonte: Microchip (2007) 
 
Figura 19 – Mapa de interrupções do PIC16F877A 
 
Fonte: Microchip (2001) 
 
A seguir veremos as interrupções mais utilizadas e os registradores que as controlam. 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 24 
Interrupção externa (INT) 
 
A interrupção mais simples e genérica de todas é a chamada interrupção externa, que gera o 
sinal para desvio de endereço quando uma mudança no estado de determinado pino é detectada. É 
possível configurar o nível do estado (passa de alto para baixo ou passa de baixo para alto). Nos 
microcontroladores PIC16F628A e PIC16F877A, o único pino que suporta esta interrupção é o pino RB0. 
Os registradores que controlam esta interrupção são o OPTION e o INTCON. 
No registrador OPTION, o bit 6 (INTEDG) seleciona o nível de detecção da borda (0 = baixo para 
alto, 1 = baixo para alto). No registrador INTCON, os bits 4 (INTE) e 1 (INTF) controlam, respectivamente, 
a habilitação e o flag desta interrupção. Esta interrupção pode fazer com que o microcontrolador saia do 
modo de Standby.Timer 0 (TMR0) 
 
O timer 0, presente em todos os dispositivos da linha 16F, é um temporizador/contador com 
resolução de oito bits. A fonte de clock deste temporizador pode ser interna ou externa – neste caso ele 
torna-se um contador – e é possível utilizar um fator de divisão (prescaler) para alterar a base de tempo 
facilmente. 
Para operar como timer (ou seja, fonte de clock interna), é necessário desligar o bit 5 (T0CS) do 
registrador OPTION. O valor do registrador TMR0 é então incrementado a cada ciclo de máquina (1μS 
para uma frequência de 4Mhz) caso não seja utilizado o Prescaler. Caso for conveniente, pode-se utilizar 
o Prescaler desligando o bit 3 (PSA) do registrador OPTION. Neste caso, haverá uma divisão da 
frequência de incremento por um fator configurável pelos bits 2, 1 e 0 (PS<2:0>) do registrador OPTION. 
Utilizando-se, por exemplo, um fator de 1:64 (bits PS<2:0> = 101) e um clock de 4Mhz teríamos 
uma frequência de incremento de 4.000.000 / 4 / 64 = 15625Hz (15,625Khz), ou seja, o registrador 
TMR0 seria incrementado a cada 64μS. 
Toda vez que o valor do registrador TMR0 passa de 0xFF para 0x00 o bit 2 (T0IF) do registrador 
INTCON é ligado, configurando uma interrupção. O Timer0 pode ser ligado ou desligado individualmente 
através do bit 5 (T0IE) do registrador INTCON. O Timer0 não acorda o processador do modo de Standby. 
Também é possível utilizar o Timer0 como contador com clock externo, para isto basta ligar o bit 
5 (T0CS) do registrador OPTION e configurar o bit 4 (TRISA4) do registrador TRIS como entrada. A 
interrupção continua ocorrendo a partir do momento em que o valor do registrador TMR0 passa de 0xFF 
para 0x00. Para configurar o preset do contador, é necessário lembrar que devemos diminuir o preset do 
valor 256. Por exemplo, se quisermos que o flag do Timer0 seja habilitado após 30 pulsos de clock, 
devemos iniciar o registrador TMR0 com o valor 226 (256-30). Após os 30 pulsos, o valor passará de 255 
(0xFF) para 0 (0x00) – lembre-se que o timer possui resolução de oito bits – e haverá então uma 
interrupção. 
 
Timer 1 (TMR1) 
 
O Timer1 é um temporizador/contador de dezesseis bits que também pode possuir fonte de 
clock interna ou externa. O valor do Timer1 é armazenado nos registradores TMR1H e TMR1L, que são 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 25 
os bytes mais significativo (parte mais alta) e menos significativo (parte mais baixa), respectivamente. O 
Timer1 conta com um prescaler de 1:1 até 1:8 e um aparato especial que permite a utilização de um 
oscilador externo, o que possibilita a geração de interrupções mesmo em modo de Standby. 
A interrupção ocorre quando o valor dos registradores TMR1H e TMR1L passa de 0xFFFF para 
0x0000. O Timer1 é uma interrupção periférica, que não existia nos primeiros modelos da linha PIC16F. 
No microcontrolador PIC16F628A as interrupções periféricas são controladas através do registrador PIE1 
e os flags são armazenados no registrador PIR1. Além destes dois registradores, o controle do Timer1 
também utiliza o registrador T1CON, apresentado na figura abaixo. 
 
Figura 20 – Registrador T1CON 
 
Fonte: Microchip (2007) 
 
Bit 5-4 T1CKPS<1:0> = bits de seleção do valor do Prescaler 
 11 = Prescaler 1:8 
 10 = Prescaler 1:4 
01 = Prescaler 1:2 
00 = Prescaler 1:1 
Bit 3 T1OSCEN = bit de controle do oscilador do Timer1 
 0 = Oscilador desligado 
 1 = Oscilador ligado 
Bit 2 
________________________ 
T1SYNC = bit de sincronização do clock externo do Timer1 
 1 = Sincronismo desligado 
 0 = Sincronismo ligado 
Obs.: Caso TMR1CS = 0 este bit é ignorado 
Bit 1 TMR1CS = bit de seleção de fonte de clock 
 1 = Clock externo na borda subida no pino RC0/T1OSO/T1CKI 
 0 = Clock interno 
Bit 0 TMR1ON = bit de habilitação do Timer1 
 1 = Timer1 habilitado 
 0 = Timer1 desabilitado 
 
Para utilizar o Timer1, devemos inicialmente configurar a fonte de clock (interna ou externa), o 
prescaler, e caso o clock seja interno devemos ligar o oscilador (TSOSCEN=1). Depois de configurado, 
devemos ligar o bit 0 (TMR1IE) do registrador PIE1 e o bit TMR1ON do registrador T1CON. Quando 
ocorrer a interrupção o bit 0 (TMR1IF) do registrador PIR1 será habilitado. 
Lembre-se que para operar este timer também devemos subtrair o valor do preset do valor 
65536, e inserir o resultado nos registradores TMR1H e TMR1L. Por exemplo, se quisermos que o Timer1 
estoure a cada 1000 contagens (supondo um Prescaler de 1:1), devemos carregar o valor 65436 (65536-
1000) nos registradores TMR0H e TMR0L. A “quebra” da word em dois bytes deve ser feito pelo 
programador. 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 26 
Timer2 (TMR2) 
 
O último Timer presente no PIC16F628A e PIC16F877A é o Timer2. Este timer possui resolução 
de oito bits, além do prescaler configurável possui também um postscaler e é utilizado geralmente para 
criar a base de tempo do módulo CCP quando em modo PWM. 
 
Figura 21 – Registrador T2CON 
 
Fonte: Microchip (2007) 
 
Bit 6-3 TOUTPS<3:0> = bits de seleção do Postscaler do Timer2 
 0000 = Postscaler 1:1 
 0001 = Postscaler 1:2 
0010 = Postscaler 1:3 
... 
1110 = Postscaler 1:15 
1111 = Postscaler 1:16 
Bit 2 TMR2ON = bit de habilitação do Timer2 
 1 = Timer2 habilitado 
 0 = Timer2 desabilitado 
Bit 1-0 T2CKPS<1:0> = bits de seleção do Prescaler do Timer2 
 00 = Prescaler 1:1 
 01 = Prescaler 1:4 
1x = Prescaler 1:16 
 
O funcionamento do Timer2 difere um pouco do Timer0 e Timer1, pois o valor de preset é 
inserido diretamente no registrador PR2. Toda vez que o valor do registrador TMR2 atingir o valor de 
PR2, o valor de TMR2 volta a zero e ocorre a interrupção. Deste modo, não é necessário subtrair o valor 
de preset do valor 256, como deve ser feito no Timer0. 
Se quisermos, por exemplo, que o Timer2 gere uma interrupção a cada 100 incrementos 
(supondo Prescaler e Postscaler = 1:1), basta carregar o valor 99 no registrador PR2 (lembre-se que a 
contagem inicia em zero). Quando o valor de TMR2 passar de 99 para 0, ocorrerá uma interrupção. 
 
Módulo CCP (Capture – Compare – PWM) 
 
Um dispositivo especial presente nos PICs é o módulo CCP. Este módulo pode realizar: 
 Captura do período de um sinal digital periódico; 
 Comparação dos registradores TMR1H e TMR1L com um valor pré-estabelecido; 
 Geração de um sinal PWM. 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 27 
Alguns dispositivos, como o PIC16F877A, possui mais de um módulo CCP. O PIC16F628A, no 
entanto, possui somente um módulo. Podemos configurar este módulo para trabalhar somente em um 
dos modos (captura, comparação ou PWM). 
O modo mais utilizado em projetos de automação industrial é o PWM, portanto iremos nos ater 
somente a este. É recomendado, no entanto, que você pesquise na bibliografia recomendada ou no 
datasheet do microcontrolador que você está trabalhando o funcionamento dos outros dois módulos, 
em especial o modo de captura. 
 
Modo PWM 
 
O sinal do tipo PWM (Pulse Width Modulation ou Modulação por Largura de Pulso) é 
amplamente utilizado para controle de potência, como em inversores de frequência, controle de 
motores CC e cargas CC em geral. Considere um sinal digital periódico com frequência f que não varia. 
Alterando a duração do tempo em que o sinal permanece em nível alto o valor médio deste sinal é 
alterado. Sendo assim, um sinal PWM é composto por quatro parâmetros: valor de nível alto, valor de 
nível baixo, frequência e o tempo em que o nível é alto, também denominado Duty Cicle. 
Como o PIC é um dispositivo TTL, o nível alto será 5V,o nível baixo será 0V e o usuário pode 
alterar a frequência e o duty cicle. 
A frequência é controlada diretamente pelo Timer2, ou seja, sempre que quisermos utilizar o 
modo PWM, primeiramente devemos configurar o Timer2 para gerar a frequência do sinal. Quanto mais 
alta a frequência mais fácil é uma possível filtragem posterior, no entanto altas frequências podem gerar 
aquecimento nos dispositivos de chaveamento de potência (MOSFets, transistores, etc). 
 
ATENÇÃO 
Quando você utilizar um simulador para verificar o funcionamento do módulo PWM, faça a simulação 
com uma frequência baixa (no máximo 1Khz), pois o uso de altas frequências pode fazer com que o 
simulador apresente lentidão ou mesmo trave. Na prática, a frequência do módulo PWM costuma estar 
em torno de 5Khz. 
 
Figura 22 – Funcionamento do modo PWM nos PIC16F 
 
Fonte: Microchip (2007) 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 28 
 
Para controlar o modo PWM do módulo CCP1, utilizamos os registradores CCP1CON e CCPR1L. A 
resolução é de dez bits, sendo que os oito bits mais significativos (MSBs) ficam armazenados no 
registrador CCPR1L e os outros dois bits menos significativos (LSBs) ficam armazenados nos bits 5 e 4 
(CCP1X e CCP1Y) do registrador CCP1CON, conforme a figura abaixo. 
 
Figura 23 – Estrutura do Duty Cicle do PWM do módulo CCP1 
Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 
Registrador CCP1RL <bits 7:0> CCP1X CCP1Y 
Fonte: Elaboração do autor (2012) 
 
Além do registro do PWM, são utilizados outros bits do registrador CCP1CON, que são descritos 
logo abaixo. 
Figura 24 – Registrador CCP1CON 
 
Fonte: Microchip (2007) 
 
Bit 3-0 CCP1M<3:0> = bits de seleção do modo de funcionamento do módulo CCP1 
 0000 = CCP1 desligado 
 0100 = Modo de captura a cada borda de descida 
0101 = Modo de captura a cada borda de subida 
0110 = Modo de captura a cada quatro bordas de subida 
0111 = Modo de captura a cada dezesseis bordas de subida 
1000 = Modo de comparação, liga a saída caso ocorra coincidência 
1001 = Modo de comparação, desliga a saída caso ocorra coincidência 
1010 = Modo de comparação, gera interrupção caso ocorra coincidência 
1011 = Modo de comparação, evento de trigger especial (reset do Timer1) 
11xx = Modo PWM 
 
O passo a passo para utilizar o módulo PWM é o seguinte: 
1. Ajustar o período do módulo PWM utilizando o Timer2; 
2. Ajustar o Duty Cicle do módulo PWM utilizando o registrador CCPR1L e os bits CCP1X e 
CCP1Y do registrador CCP1CON; 
3. Tornar o pino RB3/CCP1 uma saída através do TRISB; 
4. Habilitar o módulo PWM através do registrador T2CON, bit TMR2ON. 
 
Memória EEPROM interna 
 
Boa parte dos PICs possuem, além da memória RAM, uma memória não volátil do tipo EEPROM 
(Electrically Erasable and Programmable Read Only Memory). Utilizamos normalmente esta memória 
quando precisamos armazenar dados que não podem ser perdidos caso a alimentação do circuito seja 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 29 
desligada. No entanto, esta memória é extremamente lenta quando comparada à memória RAM, por 
isso seu uso deve ser sempre avaliado. 
Existem quatro registradores associados à memória EEPROM interna no caso do PIC16F628A: 
EECON1, EECON2, EEDATA e EEADR. 
No registrador EECON1 configuramos o uso da memória EEPROM interna e habilitamos uma 
instrução de leitura ou escrita. O registrador EEADR recebe o endereço a ser escrito/lido, e o registrador 
EEDATA recebe o dado a ser escrito ou o valor lido no endereço especificado. 
 
No caso de uma escrita na EEPROM devemos: 
1) Armazenar o endereço de memória no registrador EEADR; 
2) Armazenar o dado a ser escrito no registrador EEDATA; 
3) Desabilitar as interrupções; 
4) Setar o bit 3 (WREN) do registrador EECON1; 
5) Escrever, em sequência, os valores 0x55 e 0xAA no registrador EECON2 (senha padrão da 
Microchip para não permitir escritas indevidas na EEPROM); 
6) Setar o bit 1 (WR) do registrador EECON1 para iniciar a operação de escrita. 
7) Aguardar até que o bit WR seja desligado (indicando o término da escrita); 
8) Desligar o bit WREN para garantir a integridade da EEPROM; 
9) Habilitar novamente as interrupções. 
 
No caso de uma operação de leitura, devemos: 
1) Armazenar o endereço de memória no registrador EEADR; 
2) Setar o bit 0 (RD) do registrador EECON1; 
3) Ler o valor do registrador EEADR. 
 
Observe que uma operação de escrita na EEPROM pode demorar vários ciclos, por isso a 
importância de desabilitar as interrupções. 
 
ATENÇÃO 
Além dos módulos internos estudados até aqui, existem vários outros que serão analisados utilizando a 
linguagem C e o compilador MikroC, pois a dificuldade de utilização destes periféricos a nível de 
registradores é muito grande. Você deve, no entanto, procurar estudar estes módulos, seja com o 
datasheet do componente, seja com um livro sobre microcontroladores. 
 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 30 
Lista de Exercícios – Módulo 01 
 
1) (1,0pt) Qual a função da ULA? 
 
2) (1,0pt) O que diferencia os microcontroladores dos microprocessadores? 
 
3) (1,0pt) Qual a diferença entre as CPUs do tipo RISC e as CPUs do tipo CISC? 
 
4) (1,0pt) O que é um opcode? Quantos bits compõem um opcode nos microcontroladores PIC16? 
 
5) (1,0pt) Qual a diferença entre memórias do tipo volátil das do tipo não-volátil? 
 
6) (1,0pt) Qual a diferença entre a arquitetura Harvard e a arquitetura Von-Neumann? 
 
7) (1,0pt) O que são as interrupções? 
 
8) (1,0pt) Qual a vantagem da utilização de resistores Pull-Up ao invés de resistores Pull-Down? 
 
9) (2,0pts) Pesquise em datasheets e responda: quantas palavras de programa (guardadas na 
memória Flash) cabem nos microcontroladores PIC16F876, PIC16F914, PIC16F74 e PIC16F84? 
 
Não será permitida a entrega dos exercícios em formato impresso. Resolver os exercícios à mão. 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 31 
Linguagem Assembly 
 
Já comentamos algo a respeito das instruções. Você já sabe, por exemplo, que para mover um 
dado de oito bits para o registrador Work, você utiliza a instrução MOVLW. As instruções também são 
chamadas de mnemônicos ou opcodes. Na verdade, os opcodes são traduções de códigos binários que 
correspondem a comandos específicos relacionados ao processamento de dados. Obviamente ninguém 
gosta de decorar sequências de números binários, portanto os fabricantes utilizam palavras que sejam 
de memorização mais fácil: é a famosa linguagem Assembly. 
Quando lidamos com esta linguagem, estamos trabalhando diretamente com instruções do 
processador, ou seja, estamos muito próximos do código binário que compõe a lista de programa. Por 
este motivo, diz-se que Assembly é uma linguagem de baixo nível. Não confunda baixo nível com 
pobreza de informação! Na verdade, por melhor que seja um programador de outras linguagens, ele 
dificilmente conseguirá produzir um código tão “enxuto” quanto um bom programador Assembly. 
Em termos de eficiência – ao nível de processamento, claro – o Assembly sempre será muito 
melhor que qualquer outra linguagem. Pode-se, sem problemas, estudar outras linguagens para utilizar 
os microcontroladores, mas o melhor entendimento é conseguido quando se conhece a fundo como o 
microcontrolador trabalha, e é por isso que daremos início ao estudo dos microcontroladores PIC 
utilizando justamente a linguagem Assembly. 
É interessante notar que não existem compiladores Assembly, mas sim montadores, ou seja, 
programas que traduzem as instruções Assembly diretamente parao código binário ou código de 
máquina do microcontrolador. 
Vamos conhecer agora as instruções que compõem a linha PIC16. 
 
Instruções Byte-Oriented 
 
 Estas instruções trabalham com registradores (tanto do tipo SFR quanto GPR), realizando 
operações lógicas e matemáticas diversas. Na grande maioria dos casos, estas instruções seguem o 
seguinte padrão: 
 
1 INSTRUÇÃO REGISTRADOR, DESTINO 
 
Sendo que o registrador é especificado com o nome do mapa de memória (OPTION, STATUS, 
TRISB, CMCON, etc) e o destino pode ser “0” ou “1”, sendo que “0” faz com que o resultado da instrução 
seja armazenado no registrador Work, e “1” faz com que o resultado seja armazenado no próprio 
registrador utilizado na função. 
Por exemplo, supondo que o valor do registrador Work seja 0x01 e o valor do PORTA seja 0x02, 
vamos realizar a instrução seguinte: 
 
1 ADDWF PORTA, 0 
 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 32 
 Neste caso, o resultado da operação será 0x01+0x02 = 0x03. Este valor ficará salvo em W e o 
registrador PORTA não será alterado. Caso realizemos agora a seguinte operação, supondo W = 0x01 e 
PORTA = 0x02: 
 
1 ADDWF PORTA, 1 
 
 Agora, o resultado da operação (0x03) será armazenado no registrador PORTA, e W continuará 
igual a 0x01. 
 A tabela a seguir relaciona todas as instruções do tipo byte-oriented da linha PIC16F. 
 
Instrução e operadores Descrição Flags afetados 
ADDWF f,d Adiciona W com f C,DC,Z 
ANDWF f,d AND lógico entre W e f Z 
CLRF f Limpa f Z 
CLRW Limpa W Z 
COMF f,d Inverte os bits de f Z 
DECF f,d Decrementa f Z 
DECFSZ f,d Decrementa f e pula a próxima linha se resultado = zero - 
INCF f,d Incrementa f Z 
INCCFSZ f,d Incrementa f e pula a próxima linha se resultado = zero - 
IORWF f,d OU lógico entre W e f Z 
MOVF f,d Move f Z 
MOVWF f,d Move W para f - 
NOP f,d Não realiza nenhuma instrução (gasta um ciclo) - 
RLF f,d Rotaciona os bits de f à esquerda C 
RRF f,d Rotaciona os bits de f à direita C 
SUBWF f,d Subtrai W de f C, DC, Z 
SWAPF f,d Troca os nibbles de f - 
XORWF f,d OU Exclusivo lógico entreW e f Z 
 
Vamos então a um exemplo prático, onde será feita a configuração dos pinos do PORTB e a 
seguir todos eles serão colocados em nível baixo. 
 
1 MOVLW b‟00001111‟ 
2 MOVWF TRISB, 1 
3 MOVLW 0x00 
4 MOVWF PORTB, 1 
 
Na primeira linha, utilizamos a instrução MOVLW, que move o valor binário 00001111 para W. 
Em seguida, utilizamos a instrução MOVWF, que move o valor de W (b’00001111’) para o registrador 
TRISB, configurando assim os pinos RB0 a RB3 como entrada e RB4 a RB7 como saída. Na terceira linha, 
o valor hexadecimal 00 é movido para W, e na quarta linha o valor de W é movido para o PORTB. 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 33 
Outra maneira de fazer a mesma operação acima é substituir a terceira e a quarta linha por uma 
instrução CLRF: 
 
1 MOVLW b‟00001111‟ 
2 MOVWF TRISB, 1 
3 CLRF PORTB 
 
Apesar de economizar uma linha de código, devemos nos atentar que a instrução CLRF faz com 
que o bit Z do registrador STATUS seja afetado. 
 
Instruções Bit-Oriented 
 
Estas instruções conseguem trabalhar com registrados ao nível de bit. Elas são de grande valia 
para, por exemplo, verificar se determinado pino está em nível alto ou baixo, ou mesmo se alguma 
interrupção foi acionada. As instruções bit-oriented são estruturadas da seguinte maneira: 
 
1 INSTRUÇÃO REGISTRADOR, BIT 
 
Onde o bit é um número de 0 a 7, ou o nome do bit caso o registrador for SFR ou mesmo se for 
GPR e houver declaração do nome do bit no cabeçalho do programa. Vejamos quais são as instruções 
bit-oriented: 
 
Instrução e operadores Descrição Flags afetados 
BCF f,b Limpa o bit de f - 
BSF f,b Seta o bit de f - 
BTFSC f,b Testa o bit de f, pula a próxima linha se bit = 0 - 
BTFSS f,b Testa o bit de f, pula a próxima linha se bit = 1 - 
 
O exemplo a seguir configura o pino RB3 como saída digital e aplica nível lógico “1” no mesmo. 
 
1 BCF TRISB, 3 ;Configura o pino RB3 como saída 
2 NOP ;Aguarda um ciclo de máquina 
3 BSF PORTB, 3 ;Liga o pino RB3 
 
Note que foi inserida uma instrução NOP, que faz com que o microcontrolador gaste um ciclo de 
máquina (1μs para um clock de 4Mhz). É recomendável que haja um pequeno intervalo de tempo para 
estabilização da saída digital antes de fazer uma escrita na mesma, e este intervalo é conseguido através 
da instrução NOP. 
As instruções BTFSC e BTFSS são utilizadas para fazer comparação. Em ambos os casos, devemos 
escolher um registrador e um bit do mesmo (pode ser um número ou o nome do bit, conforme estiver 
no datasheet; ou nas declarações, conforme veremos mais à frente). 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 34 
Vamos, por exemplo, configurar o PORTB e utilizar a instrução BTFSC (Bit Test F Skip if Clear - 
Testa o Bit do registrador F e Pula uma linha se está em nível baixo) para verificar o estado do pino RB0 
e, caso seja verdadeiro, colocar nível alto no pino RB1: 
 
1 MOVLW b‟00000001‟ ;Configura o pino RB0 como entrada 
2 MOVWF TRISB, 1 ;Salva o valor de configuração 
3 BTFSC PORTB,RB0 ;Verifica o estado de RB0 
4 BSF PORTB,RB1 ;Caso estado = 0 irá pular esta linha 
5 NOP ;Gasta um ciclo de máquina 
 
Vamos agora utilizar a instrução BTFSS (Bit Test F Skip if Set – Testa o Bit do registrador F e Pula 
uma linha se está em nível alto) para desligar o pino RB1 caso o pino RB0 estiver em nível baixo. 
 
1 MOVLW b‟00000001‟ ;Configura o pino RB0 como entrada 
2 MOVWF TRISB, 1 ;Salva o valor de configuração 
3 BTFSS PORTB,RB0 ;Verifica o estado de RB0 
4 BCF PORTB,RB1 ;Caso estado = 1 irá pular esta linha 
5 NOP ;Gasta um ciclo de máquina 
 
Instruções Literais e de Controle 
 
Estas instruções não trabalham com registradores, apenas alteram ou verificam o valor de W e 
fazem alterações diretamente no controle do microcontrolador. 
Utilizamos estas instruções para, por exemplo, criar um loop (laço de repetição) no programa, 
ou para fazer com que o microcontrolador entre em estado de baixo consumo de potência (Stanby). 
Os loops, particularmente, são constantemente utilizados; lembre-se que os microcontroladores 
são sequenciais: processam a lista de programa e param de processar, só voltando ao início da lista caso 
sejam resetados ou caso alguma instrução oriente o program counter a retornar para determinada 
instrução. A estrutura destas instruções costuma envolver apenas a literal (numeral de oito bits) “k”, 
armazenando o resultado em W, da seguinte maneira: 
 
1 INSTRUÇÃO LITERAL 
 
Instrução e operadores Descrição Flags afetados 
ADDLW k Soma k com W C, DC, Z 
ANDLW k AND lógico entre k e W Z 
CALL k Chama a subrotina k - 
CLRWDT Limpa o Watch-Dog Timer TO, PD 
GOTO k Vai até a linha de programa k - 
IORLW k OU lógico entre k e W Z 
MOVLW k Move k para W - 
RETFIE Retorna da interrupção - 
Prof. Zaqueu Dacoregio Heinzen 
SENAI/SC 
Tendências e Demandas em Automação Industrial 35 
RETLW k Retorna com a literal k - 
RETURN Retorna da subrotina - 
SLEEP Entra em modo de Stanby (baixo consumo). TO, PD 
SUBLW k Subtrai W da literal k C, DC, Z 
XORLW k OU Exclusivo lógico entre k e W Z 
 
Vamos tratar um caso muito comum: precisamos criar um loop para verificar constantemente o 
estado do pino RB0, ligando ou desligando o pino RB1 conforme o estado: 
 
1 MOVLW b‟00000001‟ ;Configura o pino RB0 como entrada

Continue navegando

Outros materiais