P. 1
Apostila PIC-LE RevA

Apostila PIC-LE RevA

|Views: 8.566|Likes:
Publicado porsasukejosias

More info:

Published by: sasukejosias on May 17, 2011
Direitos Autorais:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

07/12/2013

pdf

text

original

Sections

  • Introdução
  • 1 CONCEITOS BÁSICOS
  • 1.1 Sistema Computacional
  • 1.1.1 Memórias
  • 1.1.2 Memória de programa
  • 1.1.3 Memória de Dados
  • 1.1.4 Barramentos
  • 1.1.5 Dispositivos de entrada e saída
  • 1.1.6 Periféricos
  • 1.1.7 CPU
  • 1.2 Arquitetura Computacional
  • 1.2.1 Arquitetura von-Neumann
  • 1.2.2 Arquitetura Harvard
  • 2 O MICROCONTROLADOR PIC16F877A
  • 2.1 A Microchip
  • 2.2 Microcontroladores PIC
  • 2.3 A Arquitetura do PIC16F877A
  • 2.4 Geração de clock
  • 2.4.1 Modos LP,XT e HS
  • 2.4.2 Modos RC
  • 2.4.3 Modo INTOSC
  • 2.4.4 Comparação entre os modos de oscilador
  • 2.4.5 Clock e execução das instruções
  • 2.5 Memórias
  • 2.5.1 Memória de programa
  • 2.5.2 Memória de dados
  • 2.6 RESET
  • 2.6.1 POR – Power-On Reset
  • 2.6.2 PWRT – Power-up Timer
  • 2.6.3 OST – Oscillator Start-up Timer
  • 2.6.4 BOR – Brown-out Reset
  • 2.6.5 Seqüência de inicialização
  • 2.6.6 Identificação de Reset pelo Software
  • 2.7 Watch-Dog Timer
  • 2.8 Modo de baixo consumo – Modo SLEEP
  • 2.9 Características especiais
  • 2.9.1 Proteção de Código (Code Protect)
  • 2.9.2 Locais de Identificação (ID Locations)
  • 2.9.3 Pinagem e Hardware Básico
  • 2.11 O conjunto de instruções do PIC16F877A
  • 2.11.1 Manipulação de Byte
  • 2.11.2 Manipulação de bit
  • 2.11.3 Matemáticas
  • 2.11.4 Lógicas
  • 2.11.5 Testes
  • 2.11.6 Chamadas e desvio
  • 2.11.7 Controle
  • 2.12 Programando em assembly
  • 2.13 Estrutura do Programa
  • 2.14 Programação estruturada
  • 3 PROGRAMANDO O PIC16F877A
  • 3.1 Diretivas
  • 3.2 Variáveis
  • 3.3 Sub-rotinas
  • 3.3.1 Passagem de Parâmetros
  • 3.3.2 Chamada X Desvio (CALL X GOTO)
  • 3.4 Atribuição
  • 3.5 Entrada e Saída
  • 3.6 Estruturas de Decisão
  • 3.7 Condições
  • 3.8 Se
  • 3.9 Se senão
  • 3.10 Se senão se
  • 3.11 Caso
  • 3.12 Estruturas de repetição
  • 3.12.1 Faça-Enquanto
  • 3.12.2 Enquanto
  • 3.12.3 Para
  • 3.13 Temporização por software – Rotinas de atraso
  • 4 RECURSOS AVANÇADOS
  • 4.1 Display de cristal Líquido
  • 4.2 Teclado
  • 4.3 Interrupções
  • 4.3.1 Utilização das Interrupções
  • 4.3.2 Interrupção externa em RB0
  • 4.3.3 Interrupção por mudança no portal B
  • 5 PERIFÉRICOS DO PIC16F877A
  • 5.1 Timers
  • 5.1.1 Timer 1
  • 5.1.2 Oscilador do timer 1
  • 5.1.3 Interrupção
  • 5.2 Módulo CCP
  • 5.2.1 Modo captura
  • 5.2.2 Modo comparação
  • 5.2.3 Modo PWM
  • 5.2.4 Interrupção
  • 5.3 Comunicação Serial
  • 5.3.1 Comunicação Paralela
  • 5.3.2 Comunicação serial
  • 5.3.3 EIA-232C
  • 5.3.4 A USART do PIC16F877A
  • 5.3.5 Transmissão
  • 5.3.6 Recepção
  • 5.4 Conversor Analógico para digital – ADC
  • 5.4.1 Configuração e uso
  • 5.5 Memórias EEPROM e Flash
  • 5.5.1 Memória EEPROM
  • 5.5.2 Rotinas de acesso a EEPROM
  • 5.5.3 Memória FLASH de programa
  • 5.5.4 Rotinas de acesso a FLASH
  • Apêndices
  • Apêndice A – Conjunto de Instruções do PIC16
  • Apêndice B – Mapeamento de memória de dados

Exsto Tecnologia

Kit de Microcontroladores PIC

Apostila de microcontroladores PIC16

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

Microcontroladores PIC16F877A

2

Revisão 1

Principais Autores José Domingos Adriano

Descrição da Versão Revisão inicial para a nova versão do kit

Data de Término

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

“Desenvolvido e produzido com orgulho no Brasil”

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

Exsto Tecnologia

Microcontroladores PIC16F877A

3

ÍNDICE

PÁGINA

Introdução .............................................................................................................................................. 6 1 CONCEITOS BÁSICOS ................................................................................................................ 7 1.1 Sistema Computacional .......................................................................................................... 7 1.1.1 Memórias........................................................................................................................... 8 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 Memória de programa ...................................................................................................... 8 Memória de Dados ............................................................................................................ 9 Barramentos ...................................................................................................................... 9 Dispositivos de entrada e saída ....................................................................................... 10 Periféricos ........................................................................................................................ 13 CPU .................................................................................................................................. 14

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

O MICROCONTROLADOR PIC16F877A ................................................................................. 20 2.1 2.2 2.3 A Microchip .......................................................................................................................... 20 Microcontroladores PIC ........................................................................................................ 20 A Arquitetura do PIC16F877A ............................................................................................. 21

2.4 Geração de clock................................................................................................................... 22 2.4.1 Modos LP,XT e HS ............................................................................................................ 23 2.4.2 2.4.3 2.4.4 2.4.5 Modos RC......................................................................................................................... 25 Modo INTOSC .................................................................................................................. 26 Comparação entre os modos de oscilador ...................................................................... 26 Clock e execução das instruções ..................................................................................... 26

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

2.6 RESET .................................................................................................................................. 31 2.6.1 POR – Power-On Reset .................................................................................................... 31 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 2.7 2.8 PWRT – Power-up Timer ................................................................................................. 31 OST – Oscillator Start-up Timer ....................................................................................... 31 BOR – Brown-out Reset ................................................................................................... 31 Seqüência de inicialização ............................................................................................... 32 Identificação de Reset pelo Software .............................................................................. 32 Watch-Dog Timer ................................................................................................................. 33 Modo de baixo consumo – Modo SLEEP............................................................................. 33 Exsto Tecnologia

........... 48 Chamadas e desvio.....................................10 Locais de Identificação (ID Locations) ....................................................................................................................................................................................................................... 73 Caso .......... 64 Atribuição .......... 80 Display de cristal Líquido ..........................................................1 3..............................................................................................1 Proteção de Código (Code Protect) .........9 Características especiais ..11 Chamada X Desvio (CALL X GOTO) ........................................ 67 Estruturas de Decisão.................................................................................1 Passagem de Parâmetros ......................................... 87 Exsto Tecnologia RECURSOS AVANÇADOS ..........................................................5 2........................................1 Faça-Enquanto .............................................................9...........................................................................................3 Sub-rotinas ..... 36 2........................3 2...9......................................................3 3.................................................. 49 Controle....................................... 52 Estrutura do Programa .13 2................12 Estruturas de repetição .........................11..................................................14 3 3............................................................................... 77 3...... 62 3.............................. 78 3.......... 84 ................................................... 51 Programando em assembly ......... 71 Se senão ........................................6 3.........................................................2 2...............................10 3................3.......................... 53 Programação estruturada............................................................ 79 Temporização por software – Rotinas de atraso ............................11............13 4 4............ 72 Se senão se ...............................................5 3................................................. 44 Testes ..................................8 3..............................................11..................... 68 Condições ......................... 56 Diretivas ................................................................................................................................2 3.. 63 3.............................................................2 Enquanto ..4 2.9 3.................... 75 3.......... 37 2................... 41 Lógicas ........................................... 69 Se ....................................11..........................................................................9........................................................................ 66 Entrada e Saída ...........................Microcontroladores PIC16F877A 4 2................................................................................................................................................................... 58 3.............7 3.........11......................................................1 Manipulação de Byte ..........................3......................................................................................................................................................................................................................................... 78 Para ..........................12........ 34 2.....11.. 40 Matemáticas .......12............................................................ 34 2....................................................6 2..12 2......................................................................................................................................................2 3........................................ 61 PROGRAMANDO O PIC16F877A ......................................................................................................................................................................................................................4 3..... 39 2........................................................................................................................................................................................................................................................................................................................................................11.........................................................................................................................................................................................................................................11 O conjunto de instruções do PIC16F877A ..................... 34 Gravação .......7 2......12......................... 84 Teclado ................................................................ 58 Variáveis ................2 Manipulação de bit ....... 34 Pinagem e Hardware Básico ............................................3 2.....................1 4......2 2........................

... 114 5............................ ..................1................................................................................................5 Memórias EEPROM e Flash..................................................................... 113 5........................ 103 Interrupção ...............................................................................3.3 Oscilador do timer 1 .................................................. 103 Modo PWM ...................................................................................................2........................................................3.....................................................................................3.......................... 122 Apêndice B – Mapeamento de memória de dados...............................................1 Timer 1.................................................................................................................1 Utilização das Interrupções ....4 Conversor Analógico para digital – ADC............. 118 5..2 5........................4 Rotinas de acesso a EEPROM ......4..............................................................................3...................... 118 5... 112 Recepção .................................................................................. 92 4......................... 109 A USART do PIC16F877A...........................................................2 4......................... 89 4............... 98 5...................4 Modo comparação .............................................................................................................................5.....................3 Interrupções ........................................................................ 123 Exsto Tecnologia ......................2 5......................................... 122 Apêndice A – Conjunto de Instruções do PIC16 ............................................................................3.....................................................................3 5 Interrupção externa em RB0 .....3.................................................................................5..................2 5.............................................1 Modo captura ....................................................................... 101 Interrupção .........4 5. 106 5....Microcontroladores PIC16F877A 5 4............................3 5.......................................................................................................................................................1........................................................1 Comunicação Paralela ................ 120 Apêndices .......... 98 5..3 Comunicação Serial ............... 116 5.................................2........................................................................................................................................................................ 101 5..2....................... 101 5.........3...2...................................................... 96 Interrupção por mudança no portal B ...................................... 110 Transmissão .................................................................................................... 107 EIA-232C ....... 96 PERIFÉRICOS DO PIC16F877A .....................6 Comunicação serial............ 120 Rotinas de acesso a FLASH.................... 119 Memória FLASH de programa ............................................................................ 106 5............. 106 5.......................3 5..............................................................................3 5............................................. 98 5..3.........3........5...................................................................................................................................1 Timers ................................................1 Configuração e uso ...5 5................5...........1.................................... 102 5.........................1 Memória EEPROM ....................................................................................................2 Módulo CCP ...............................2 5...........

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

Em contrapartida. tão ou mais comuns que os PC´s. que são sistemas computacionais. pois permite estabelecer as bases conceituais para a comparação de suas características. É necessário que exista um software para ser executado. Como exemplo de sistema computacional. É importante este embasamento teórico não somente para garantir um melhor aproveitamento no estudo do PIC 16F877A como também para tornar o leitor apto a entender o funcionamento de outros microcontroladores. um mesmo hardware pode executar uma infinidade de funções diferentes. O que caracteriza um sistema computacional é a possibilidade de ser programado. que são o objetivo desse nosso estudo. hoje tão difundido. os vídeo-games. O hardware dos sistemas computacionais. que estão presentes nas mais diversas aplicações.1 Sistema Computacional Inicialmente devemos conceituar o que vem a ser um sistema computacional. tanto da linha PIC como de outros fabricantes. simplesmente alterando o seu software. Um sistema computacional é composto por hardware (parte física) e software (programa). obtendo-se diferentes resultados. Por exemplo. Esses conhecimentos também são importantes na escolha do microcontrolador a ser utilizado em um projeto.1). etc.Microcontroladores PIC16F877A 7 1 CONCEITOS BÁSICOS Inicialmente será apresentado o conceito de microcontroladores de forma genérica. 1. A estrutura de um sistema computacional é como a apresentada no diagrama em blocos abaixo (Figura 1. os mini-games. Exsto Tecnologia . é necessária uma música que possa ser executada a fim de se obter algum resultado. Uma boa analogia é imaginar o hardware como um instrumento musical e o software como uma partitura. palm-top´s. que posteriormente será estendido ao PIC16F877A e pode ser aplicado a qualquer outro microcontrolador. Contudo. Além disso. um programa será composto por um conjunto limitado de símbolos (no caso da partitura são as notas musicais e no caso do programa são as instruções) que podem ser organizados de diversas formas diferentes. o primeiro que nos vem em mente é o computador pessoal (PC). Da mesma forma que a música contida na partitura. não possui uma aplicação específica. Um piano por si só não faz nada. Os sistemas computacionais são compostos por sistemas combinacionais e seqüenciais. ao contrário do que ocorre com sistema combinacionais e seqüenciais. existem vários equipamentos. as calculadoras. temos os microcontroladores.

o que em quantidades muito grandes reduz custos. a memória de programa é uma memória não volátil. assim como a memória. chamados vetores. Geralmente chamada de masked-ROM (masked = mascarado). De uma forma geral.1. Existem também Registros (bytes de memória) com funções especiais que trabalham junto ao processador (CPU).2 Memória de programa Sua função é armazenar o software (programa) a ser executado no sistema. quando há a necessidade de se poder alterar o software. que é para onde o programa desvia quando ocorreu um pedido de interrupção (trataremos desse conceito mais adiante). utilizada em produção.1 Memórias Memórias são dispositivos que armazenam informações. O tipo dessa memória pode ser: • ROM (Read Only Memory): somente de leitura. EPROM (Erasable Progrmable Read Only Memory) : apagável através de luz ultravioleta. 1. • • Exsto Tecnologia . Também é utilizada para guardar tabelas de constantes Existem endereços de memória de programa existem alguns com finalidade específica. essa informação.1 – Diagrama em blocos genérico de um sistema computacional 1.Microcontroladores PIC16F877A 8 Memória Dados Controle (CPU) Programa Barramento de Dados Dispositivos de Entrada e saída e periféricos “Mundo Externo” Figura 1. que são endereços para onde o programa desvia quando ocorrem determinados eventos. que é o endereço pelo qual o programa começa a ser executado e o vetor de interrupções. pode ser dividida em dois tipos: de programa e de dados.1. No caso de um sistema computacional. Utilizada no processo de desenvolvimento e algumas vezes no produto acabado. OTP (Only Time programming): programável somente uma vez. é gravada pelo fabricante do componente. Temos o vetor de reset.

temos então sistemas de 8 bits.Microcontroladores PIC16F877A 9 • Flash: é uma memória eletricamente apagável (EEPROM – Electricaly Eresable Read Only Memory) com tempos de acesso para leitura rápido. 1.1. pois a mesma apresenta muitas vantagens a um custo dos mais baixos. Barramento de programa: por onde o processador recebe as instruções que compõe o programa. que são ligações físicas de comunicação paralela entre os componentes.). etc.1. Os microcontroladores são em sua maioria de 8 bits. apesar de existirem alguns modelos de 16 bits. ou vias. Todos os dispositivos de um sistema computacional fazem uso do barramento de dados para trafegar informações. 32bits. pois geralmente é possível reprogramar um equipamento sem troca de componentes. Para que o sistema funcione corretamente podemos apresentar o processo de forma simplificada assim: o processador (que coordena o processo) escreve no barramento de endereços o endereço do dispositivo a ser acessado. São eles: • • • • Barramento de dados: pelo qual os dispositivos de I/O e memórias trocam dados com o processador Barramento de endereços: permite ao processador “endereçar” qual dispositivo será acessado Barramento de controle: indica se o acesso é de leitura ou escrita.4 Barramentos As várias partes de um sistema computacional (CPU. um barramento de endereços de 10 bits permite acessar 210 = 1024 endereços. 1. memórias. Por exemplo. Atualmente quase todos os microcontroladores possuem versões em memória Flash. Já o tamanho do barramento de endereços nos informa qual a quantidade máxima de endereços de memória ou dispositivos de I/O e periféricos podem ser acessados. 16 bits. O tamanho do barramento de dados limita o tamanho de dados que trafegam pelo sistema. Alguns microcontroladores disponibilizam também memórias EEPROM para armazenar dados que não devem ser perdidos com a falta de energia. a memória utilizada para armazena-los é do tipo RAM. No caso de um aceso de leitura o dispositivo escreve no Exsto Tecnologia . Através do barramento de controle ele informa ao dispositivo se o acesso é de leitura ou escrita (a definição de leitura ou escrita de dispositivos sempre é feita pelo ponto de vista do processador). se é feito a posição de memória ou a I/O.3 Memória de Dados É a memória onde são armazenados os dados a serem processados pelo computador (as variáveis dos programas e outras informações. Como se trata de uma memória volátil. Como esses dados são constantemente alterados. Oferece uma grande flexibilidade. Praticamente todos os microcontroladores já possuem internamente algum desses tipos de memória de programa. quando a alimentação é cortada esses dados são perdidos. dispositivos de entrada e saída) são ligadas entre si através de barramentos. Por isso é comum classificar os sistemas computacionais pelo tamanho de seu barramento.

respectivamente. o processador envia dados para o barramento de dados que são lidos pelo dispositivo acessado. A função dos portais de saída é transferir ao “mundo externo” um dado que esteja presente no barramento de dados. Para a operação de leitura. que apresenta nível alto na saída quando o valor do barramento de endereços é o endereço do portal. Assim temos ‘1’ no terminal de habilitação de saída do buffer e o valor em sua entrada é transferido para o barramento de dados. abaixo. Como dispositivos de um sistema computacional usam o mesmo barramento de dados para trafegar informações é preciso que. são tradicionalmente utilizados buffers com saída tri-state para essa função. ports) ou simplesmente portais. mostra um exemplo de utilização de buffers e latches como portais de entrada e saída. Os portais de entrada devem permitir a transferência de dados do “mundo externo” para o barramento de dados quando acionados e em alta impedância no restante do tempo. De fato.1 A figura 1. portais de I/O (no inglês.1. quando um dispositivo estiver escrevendo no barramento (portanto aplicando níveis de tensão ao barramento) os demais dispositivos não causem conflito de dados.2.Microcontroladores PIC16F877A 10 barramento de dados e a informação é lida pelo processador. todos os dispositivos presentes em um sistema computacional são capazes de ficar em estado de “alta impedância” enquanto não forem acessados para leitura. São comumente chamados de dispositivos de I/O (Input/Output – Entrada/Saída). retendo esses dados independente de haverem alterações em suas entradas. podendo ser armazenado pela CPU. pois permitem o “carregar” dados somente quando são acionados. Para tanto. É através deles que um sistema computacional adquire dados externos e aciona processos. 1.5 Dispositivos de entrada e saída São responsáveis por realizar a interface do processador com o “mundo externo”. Os sinais RD (read – ler). Para isso são utilizados latches. WR (write – escrever) e IORQ (I/O request – requisição de I/O) constituem o barramento de controle. os sinais IORQ e RD são acionados. Cada portal possui um decodificador (DEC). o endereço do portal é colocado no barramento de dados. No caso de um acesso de escrita. Exemplo 1. Em seguida. Exsto Tecnologia . A seleção dos dispositivos de I/O a partir do barramento de endereços é feita por decodificadores ligados ao barramento de endereços e seu acionamento é feita através do barramento de controle. Ambos os portais estão ligados ao barramento de dados.O decodificador decodifica o endereço do portal de leitura e coloca em sua saída nível lógico 0.

que diminuem a eficiência do código gerado quando se trabalha intensamente com entrada e saída.2 – Portais de entrada e saída Para realizar uma operação de escrita do portal . havendo instruções específicas para acesso aos portais e outras implicações.O decodificador decodifica o endereço do portal de escrita e coloca em sua saída nível lógico 0. Para otimizar essa função.2 – Portais de entrada e saída A função do microcontrolador. Nesse instante temos ‘1’ nas três entradas da porta AND que aciona o terminal E do latch. o processador inicialmente coloca os dados a serem escritos no barramento de dados e o endereço do portal no barramento de endereço.Microcontroladores PIC16F877A 11 Figura 1. seus portais de entrada e saída são tratados como registros de funções especiais. é controlar processos e circuitos. como o próprio nome diz. Exsto Tecnologia . que faz com ele carregue os dados presentes no barramento na saída. ou seja. Figura 1. Então são acionados os sinais WR e IORQ. são lidos e escritos como se fossem simples bytes de memória. Em sistemas como microprocessadores geralmente o tratamento é diferente.

Outros microcontroladores utilizam configurações semelhantes. O registro de direção de dados é habilitado através do controle WR TRIS e a informação de direção fica armazenada em sua saída.Microcontroladores PIC16F877A 12 Para maior flexibilidade do sistema. Figura 1. Se este último Q ”barra” =0 o transistor “N” será cortado e “P” será ativado permitindo que a tensão Vdd apareça no pino I/O como nível lógico 1 que era a informação original do barramento de dados. o latch de saída (Data Latch) armazena a informação complementar do barramento de dados em sua saída complementar Q “barra”. o pino I/O estará configurado como saída e tem-se a transferência da informação Q ”barra” do latch de saída para o driver do pino I/O conforme o arranjo das portas lógicas. individualmente. Exsto Tecnologia . geralmente os microcontroladores utilizam um sistema de portais mais complexo que o apresentado acima.3b abaixo mostram o esquema genérico de um bit de portal do PIC16F877A.3a – Esquema típico de um pino de I/O OPERAÇÃO DE ESCRITA OU SAÍDA DE DADOS: ao acionar o controle WR PORT. Para Q=0 e Q ”barra”=1 na saída do registro de direção. que permite que um mesmo terminal do microcontrolador seja configurado como entrada ou saída. Esse último permite selecionar a direção de cada bit de um portal de saída. Se Q “barra” =1 o transistor “P” será cortado e “N” estará ativo. A figura 1. Para que isso seja possível é utilizado um registro de portal (PORT) e um registro de direção de dados (DDR – Data Direction Register).3a e 1. A tensão no pino I/O cai para o nível Vss indicando nível lógico 0. Vamos admitir que o registro de direção de dados (TRIS Latch) foi carregado inicialmente com o valor ‘0’.

o arranjo das portas lógicas permite o corte simultâneo dos dois transistores do driver configurando o pino I/O como entrada de dados. Esses dispositivos nada mais são do que circuitos destinados a realizar funções especiais. que é o mesmo escrito no latch de dados anteriormente. Exsto Tecnologia .3b – Esquema típico de um pino de I/O OPERAÇÃO DE LEITURA OU ENTRADA DE DADOS: novamente admitamos que o registro de direção foi carregado inicialmente com o valor ‘1’ em sua saída. conversores AD e DA. Agora. comparação e PWM). Como periféricos mais comuns podemos citar os temporizadores e contadores (Timers). pois o driver está desativado. mas não será transferido para o terminal. módulos de CCP (Captura. drivers de LCD. Por outro lado. podemos ter muitos outros tipos de dispositivos ligados ao barramento de dados.Microcontroladores PIC16F877A 13 Figura 1.1. os módulos de comunicação serial. No restante do tempo o buffer fica em alta impedância. o valor lido será o dado presente no terminal. o que possibilita que a informação do pino de I/O trafegue pelo barramento de dados. o dado escrito será armazenado no latch de dados. Esses dispositivos periféricos são particularmente importantes nos microcontroladores. etc. o controle RD PORT habilita o latch de entrada e o buffer tri-state. Assim. Caso seja feita uma operação de escrita em um terminal configurado como entrada. comparadores analógicos. se for realizada uma operação de leitura em um terminal configurado como saída.6 Periféricos Além dos portais de I/O e as memórias. 1.

Genericamente um processador é organizado conforme o diagrama em blocos da figura 1. É comum se referir à CPU dos microcontroladores como core (núcleo). apesar de cada microcontrolador apresentar um conjunto de periféricos diferentes. e um ou mais registros de entrada e saída de dados. 1. Ela também é capaz de interpretar e colocar em execução as instruções que compõe o programa e realizar operações lógicas e aritméticas. As vias em amarelo representam o barramento de dados interno do processador. que comumente são escritos nessa língua. Exsto Tecnologia . Eles muitas vezes possuem vários registros de parâmetros que podem ser configurados. Para tanto ela controla todas as demais partes do sistema e envia ou recebe dados dessas partes. As vias em verde são outras vias de dados e sinais de controle. Sua função é executar as instruções do programa e processar dados. que é ligado ao barramento de dados do sistema. Quando estivermos tratando dos periféricos do PIC16F877A mostraremos como trabalhar com eles e.7 CPU A CPU (Central Processing Unit – Unidade Central de Processamento) ou processador é parte principal de um sistema computacional. seu funcionamento é muito semelhante. Os blocos pontilhados podem ou não estar presentes.4 – Diagrama em blocos de uma CPU Os nomes de cada bloco estão em inglês no diagrama para facilitar a identificação desses blocos nos manuais de microcontroladores e microprocessadores.1.4.Microcontroladores PIC16F877A 14 O modo de acesso aos periféricos é semelhante ao de acesso aos portais de I/O. Figura 1.

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

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

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

Exsto Tecnologia . Isto quer dizer que por exemplo.6 abaixo. composta de operadores. visto que os operandos das instruções são geralmente do mesmo tamanho do barramento de dados. Enquanto uma instrução está sendo executada. Processadores desse tipo são chamados CISC (Complex Instruction Set CPU – CPU com Set de Instruções Complexo). a seguinte está sendo lida. A principal vantagem dessa arquitetura é que a leitura de instruções e de alguns tipos de operandos pode ser feita ao mesmo tempo em que a execução das instruções (tempo Tcy). Memória Programa CPU Dados Barramento de Dados I/O Figura 1. Podemos concluir que arquitetura von-Neumann consome muito tempo de processamento com a leitura da instrução e dos operandos. Por outro lado. Outra característica da arquitetura von-Neumann é que. tem como principal característica acessar a memória de dados separadamente da memória de programa. Nota-se que dessa forma o processador está parte do tempo ocupado com a leitura da memória de programa e. que indicam o que será feito. o que acarreta um significativo ganho de velocidade. podemos ter um set de instruções tão complexo quanto se queira. para um barramento de 8 vias. que é utilizada nos microcontroladores PIC. 1. quanto mais complexa a instrução maior será a quantidade de endereços ocupados por ela na memória. uma instrução de 16 bits é buscada e executada em duas partes de 8 bits. Isso significa que o sistema fica todo o tempo executando instruções. que são os parâmetros envolvidos na operação.Desta forma. o que equivale a dizer que possuem um grande número de instruções e cada instrução realiza uma grande seqüência de ações. como a complexidade da instrução não tem limite a não ser o espaço ocupado.2. Conclui-se também que instruções diferentes ocupam quantidades diferentes de memória e são executadas em tempos diferentes. conseqüentemente não fica executando o firmware o tempo todo.2 Arquitetura Harvard Já a arquitetura chamada de arquitetura Harvard.Microcontroladores PIC16F877A 18 Vale lembrar aqui que uma instrução é como uma operação matemática.5 – Arquitetura von-Neumann Os sistemas de arquitetura von-Neumann geralmente têm conjuntos de instruções complexos. isto é. Esse processo é conhecido como pipelining (canalização) e é ilustrado pela figura 1. e operandos. o processo de execução de cada instrução é dividido em dois momentos: a leitura da instrução e a leitura dos operandos (fetch) e a execução da instrução propriamente dita.

Dessa forma.Microcontroladores PIC16F877A 19 Figura 1. ou seja. não existem instruções complexas. o que nos permite carregar toda a instrução em um único ciclo de leitura da memória. os PIC´s são considerados processadores RISC (Reduced Instruction Set CPU – CPU com Set de Instruções Reduzido).7 – Arquitetura Harvard Pode-se notar então que os tempos de execução e de leitura estão atrelados e são os menores possíveis. Memória de Programa CPU Memória de Dados Barramento de Programa I/O Barramento de Dados Figura 1. O número de instruções é reduzido. Exsto Tecnologia . o que não significa que não se possa executar programas complexos. Isso acarreta em as instruções não poderem executar uma grande seqüência de ações. mas sim que seqüências complexas de ações devem ser construídas por seqüências de instruções básicas.6 – Pipeline O barramento de programa não necessariamente tem o mesmo tamanho do barramento de dados. em uma única palavra da memória de programa pode conter operando e operadores. Por isso.

Dessa forma. se está adquirindo conhecimento para trabalhar com microcontroladores de toda a família. com as quais o aluno entrará em contato mais adiante. As famílias são se dividem ainda conforme o tamanho do barramento de bits.Microcontroladores PIC16F877A 20 2 O MICROCONTROLADOR PIC16F877A 2.2 Microcontroladores PIC Os PICs são divididos em famílias. Atualmente ela é um dos maiores fabricante mundiais de microcontroladores de 8. que provavelmente é uma das causas de seu sucesso. havendo microcontroladores de 8. 2. As famílias de microcontroladores PIC são: • 8 bits o Família PIC10 o Família PIC12 o Família PIC14 e PIC17 o Família PIC16 o Família PIC18 16 bits: o Famílias PIC24F e PIC24H o Familias dsPIC30F e dsPIC33F 32 bits Exsto Tecnologia • • . no entanto o código desenvolvido para um componente de uma determinada família é compatível com os demais componentes da mesma família. além de possuir uma ampla linha de memórias e componentes analógicos. 16 e 32 bits. 16 e 32 bits. exceto por umas poucas alterações. Em seu site (www.microchip.1 A Microchip O fabricante dos microcontroladores PIC é a empresa americana Microchip. Cada família tem seu próprio set (conjunto) de instruções. Além dos manuais dos componentes. ao se estudar um componente específico de uma família. Cada família. tem vários componentes. com tamanhos e recursos diferentes. existem muitas notas de aplicação (Application Notes) e projetos de referência. que ser referem principalmente aos periféricos. ou plaforma.com) existe uma grande quantidade de informação disponível. A Microchip trabalha com uma política de suporte ao cliente muito eficiente. Essas instruções são comandos em linguagem de programação assembly que compõe os softwares gravados nos microcontroladores. que são de grande ajuda para a formação da base de conhecimentos do estudante de microcontroladores PIC.

Microcontroladores PIC16F877A 21 o PIC32 o Os componentes diferem entre si basicamente em: • Quantidade de memória RAM • Quantidade de memória EEPROM de dados (alguns não têm nada) • Quantidade de memória Flash de programa • Número de pinos (8. nota-se como operandos da ALU e de endereçamento da memória de dados vem diretamente da memória de programa. que estão ligados ao barramento de dados.1 apresenta o diagrama em blocos do PIC16F877A. .3 A Arquitetura do PIC16F877A A figura 1. Além disso. localizados na parte inferior do diagrama.40. Trata-se de um microcontrolador de 8 bits de arquitetura Harvard. Podem ser observados os barramentos de dados e de programa. Exsto Tecnologia .) • Freqüência máxima de clock • Periféricos Nesse curso abordaremos o PIC16F877A. Também são dignos de nota os periféricos. Seu funcionamento e análise também são semelhantes à aquele sistema genérico consistindo nas etapas de busca de instrução com habilitação e leitura de memória de programa e.14. 2.18. Conforme foi dito anteriormente... que é um dos componentes mais completos da família PIC16. execução da instrução com decodificação da instrução e acionamento de dispositivos em seqüência para o processamento da atividade programada. ao se estudar um membro de uma família o estudante torna-se apto a trabalhar com toda a família. A estrutura do PIC16F877A é semelhante ao sistema genérico estudado na aula 1.28. Seu barramento de programa é de 14 bits.

1 – Diagrama em blocos do PIC16F877A 2. e cada componente da família utiliza alguns deles. são capazes de gerar seu próprio clock (ou sinal de relógio) com acréscimo de poucos (ou nenhum) componentes externos. São eles: • • • • LP: Cristal/Ressonador de baixa freqüência e baixo consumo (Low Frequency (Power) Crystal) XT: Cristal/Ressonador (Crystal/Resonator).4 Geração de clock Os microcontroladores PIC possuem um circuito de oscilação interna. Exsto Tecnologia • . HS: Cristal/Ressonador de Alta Freqüência (High Speed Crystal/Resonator). RC: Oscilador RC Externo (External Resistor/Capacitor). o Com saída de clock o Sem saída de clock INTOSC (INTRC): Oscilador RC Interno de 4MHz (Internal Resistor/Capacitor) Esse modo não está presente no PIC16F877A.Microcontroladores PIC16F877A 22 Figura 2. O modo de clock para cada aplicação é selecionado no momento da gravação do microcontrolador e não pode ser alterado pelo programa. mas existe em outros componentes da família PIC16. Existem sete modos diferentes de clock. isto é.

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

no caso do modo de baixo consumo) quando o oscilador se estabilizar. além dos capacitores. Exsto Tecnologia . pois a oscilação não ocorre de forma imediata assim que o circuito é alimentado. Esse tempo deve ser considerado pois o programa só será iniciado (ou reiniciado.1 – Seleção de capacitores para oscilador a cristal Capacitores maiores aumentam a estabilidade do oscilador.3. Esse tempo depende de uma série de fatores.2 – Circuito do Oscilador a Cristal/Ressonador Modo de Oscilador LP Freqüência do Cristal Capacitores C1 e C2 32 kHz 33 pF 200 kHz 15 pF 100 kHz 47 a 68 pF XT 1 MHz 15 pF 4 MHz 15 pF 4 MHz 15 pF HS 8 MHz 15 a 33 pF 20 MHz 15 a 33 pF Tabela 2. mas também aumenta o tempo de partida.conforme mostra a figura2.Microcontroladores PIC16F877A 24 Figura 2. tensão de alimentação e até capacitâncias parasitas do lay-out da placa. com temperatura.O tempo de partida do oscilador é o tempo necessário para que o oscilador se estabilize.

variações de temperatura). por exemplo). O resistor REXT deve estar entre 3kΩ e 100kΩ e o capacitor CEXT deve ser superior a 20pF. variação na tensão de alimentação.4. bastando para isso selecionar o modo relativo a faixa de sinal utilizado.2 Modos RC Também é possível trabalhar com osciladores RC (Resistor/Capacitor). a variação da freqüência é maior para resistores maiores e capacitores menores. Essa situação é que justifica a utilização do modo. Além disso. 2. mas nessa situação ele se torna muito suscetível a variações drásticas de freqüência devido a capacitâncias externas (do próprio lay-out. Por exemplo. tensão de alimentação. O circuito pode funcionar sem capacitor CEXT. Exsto Tecnologia .4 – Circuito do oscilador no modo RC. Assim esse modo só é recomendado para aplicações nas quais a freqüência não é um fator crítico.3 – Partida do oscilador Também é possível aplicar sinais de clock gerados externamente. Nesse caso o sinal deve ser aplicado ao pino OSC1/CLKIN e o pino OSC2/CLKOUT deve permanecer em aberto. Para isso é utilizada a montagem da figura 2. temperatura) e apresenta pouca estabilidade (tolerância dos resistores e capacitores. Não é possível garantir precisão em nada que se baseie em tempo no programa. O modo RC apresenta algumas limitações: a freqüência de trabalho é dependente de vários fatores (valores de resistor e de capacitor. em uma produção em quantidade de produtos utilizando PIC´s no modo RC. Figura 2.Microcontroladores PIC16F877A 25 Figura 2. pois um oscilador RC tem custo menor que um a cristal. a freqüência de cada produto pode variar em função da tolerância dos resistores utilizados.4 e selecionado o modo de oscilador como RC.

Ou seja. que pode ser utilizado como fonte de clock para outros pontos do circuito.2. Esses 4 ciclos compõem um ciclo de instrução (TCY) que dura 4 vezes mais que um ciclo Q .4 Comparação entre os modos de oscilador Na tabela 2.5 Clock e execução das instruções Cada instrução executado pelos microcontroladores PIC16 gasta 4 ciclos de clock. ele libera terminais do microcontrolador para serem utilizados como I/O. Quesito Tipo de Oscilador Cristal (HS.2 – Ciclos de execução das instruções Exsto Tecnologia . 2. Já no modo sem saída de clock. com tolerâncias entre +/.1 e 10 %. conforme mostrado na tabela 2.5. Tipicamente o oscilador interno é menos preciso que o oscilador a cristal é mais preciso que o oscilador RC.3 Modo INTOSC Esse modo de oscilador não está disponível no PIC16F877A. XT e HS) RC Externo Precisão Preciso Impreciso Estabilidade Estável Instável Variedade de freqüências Pequena Grande Custo Alto Baixo Tabela 2. mas pode ser encontrado em outros modelos de microcontroladores. No modo INTOSC (ou INTRC) não se necessita de nenhum outro componente externo. porém o “resistor” e “capacitor” são implementados na própria pastilha do componente. Devido a isso temos geralmente uma ou duas freqüências de clock fixas.4.4. esse terminal pode ser utilizado como I/O.2 – Seleção de capacitores para oscilador a cristal RC Interno Pouco preciso Pouco Estável Nenhuma Nenhum 2. Portanto. Graficamente esse processo é apresentado na figura 2.Microcontroladores PIC16F877A 26 No modo RC com saída de clock o terminal OSC2/CLKOUT apresenta a freqüência do oscilador divida por quatro. Em cada um dos ciclos Q é realizada uma etapa da instrução. Nesse modo. o tempo de execução de cada instrução e de 4 períodos de clock. o sinal de clock é obtido de forma semelhante ao funcionamento do modo RC. chamados “ciclos Q”. Ciclo Ação Q1 Ciclo de decodificação da instrução Q2 Ciclo de leitura de dados Q3 Ciclo de processamento Q4 Ciclo de escrita de dados Tabela 1. além da redução de custos. portanto um ciclo de instrução tem ¼ da freqüência do oscilador e o sinal desse ciclo maior é chamado de clock de instrução ou clock de periféricos.2 é feita uma comparação entre os diferentes modos de oscilador.4. 2.

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

2.Microcontroladores PIC16F877A 28 0000h Vetor de reset 0001h 0002h Uso geral 0003h 0004h Vetor de interrupção 0005h Página 0 . . além de conterem os registros dos portais. alguns não tem todas as páginas implementadas. A memória RAM pode ser acessada de duas formas: por acesso direto e por acesso indireto.5. Os SFR são responsáveis pelo controle da CPU e dos periféricos. Contudo. 17FFh 1800h .2 Memória de dados O core (núcleo ou processador do microcontrolador) da família PIC16 existem 9 vias de endereçamento o que permite um acesso a 512 endereços diferentes (29 = 512). portanto tem 4kwords.6 – Mapeamento de memória do PIC16F877A Os demais microcontroladores da família PIC16F seguem esse mesmo mapeamento de memória. Por exemplo. . 07FFh 0800h . No PIC16F877A existem 368 bytes de memória RAM de dados. . Já o acesso indireto é feito através de duas variáveis. somente a página 0. 1FFFh Figura 1. já o 16F628A tem 2k-words. ou seja. Ela é composta por registros de funções especiais (SFR – Special Function Registers) e a RAM de uso geral (GPR – General Purpose RAM). A quantidade e a disposição da RAM de dados varia de microcontrolador para microcontrolador. Acesso direto ocorre quando o endereço acessado faz parte da própria instrução (é um dos operandos). Uso geral Página 1 . isto é. nem sempre temos memória RAM implementada para todos os endereços. 0FFFh 1000h . . Na RAM de uso geral é onde o programa armazenará suas variáveis. o PIC16F874A tem as páginas 0 e 1 mas não as 2 e 3. uma contendo o endereço a ser acessado e a outra Exsto Tecnologia . Uso geral Página 3 . Uso geral Página 2 . contudo nem todos os modelos têm 8k-words. Uso geral .

No anexo B encontra-se o mapa de memória do PIC16F628A. se não é implementado. da direita para a esquerda. que a mesma utilizada no manual dos componentes. Note que apesar de ser possível acessar 512 bytes. Também contém sua situação após o reset.3. Como cada instrução tem apenas 14 bits.4 . não havendo a preocupação com o endereço que eles ocupam. retornando novamente ao banco 0. o endereço é armazenado em um registro de função especial chamado FSR. Pode-se observar os nomes dos SFR e as regiões de uso geral. é necessário ajustar previamente RP1 e RP0. são necessários 9 bits para compor os endereços. Isso ocorre porque a capacidade de máxima de acesso de memória dos microcontroladores PIC é de 512 bytes. apenas o nome do mesmo.Seleção de bancos de RAM No caso do endereçamento indireto. O nome do registro aparece em baixo. Existe um arquivo desses para cada PIC e a forma de incluí-lo no programa será mostrado mais adiante. foram implementados apenas 224 bytes. ‘1’ ou desconhecida (x). Na verdade. e mudamos para os demais bancos quando necessário. Note ainda que os últimos 16 endereços de todos os bancos acessam os mesmos bytes no banco 0. podendo ser ‘0’. falta 1 bit. quando é ‘1’. Portanto. sobre o bit RP0 está escrito R/W-0. Como trata-se de um registro de 8 bits. R/W – 0 IRP Bit 7 R/W – 0 RP1 R/W – 0 RP0 R–1 NOT_TO R– 1 NOT_PD R/W – x Z R/W – x DC R/W – x C Bit 0 STATUS Os bits são numerados de 0 a 7. Por exemplo. Na apresentação desses registros será seguida a convenção abaixo. Exsto Tecnologia . Podemos então tratar os SFR pelo seus nomes. Para acessar um registro em um banco diferente do banco atual. Quando IRP é ‘0’ são acessados os bancos 0 e 1. e esses bits devem ser divididos entre operadores e operandos. A divisão de bancos é feita conforme a tabela 1. Banco 0 1 2 3 RP1 0 0 1 1 RP0 0 1 0 1 Endereços 00h ~ 7Fh 80h ~ FFh 100h ~ 17Fh 180h ~ 1FFh Tabela 1.Microcontroladores PIC16F877A 29 se comportando como o byte acessado. que se chama IRP e faz parte do STATUS. Este último modo de endereçamento pode ser muito útil em algumas situações e será estudado mais adiante. a RAM é dividida em 4 bancos. Sobre cada bit temos algumas informações: se ele pode ser lido (R) escrito (W). Para acesso direto. que significa que pode ser lido ou escrito e seu valor no reset é 0. não há espaço para um endereço de 9 bits. Já que dois bits podem gerar 4 combinações. as instruções armazenam apenas 7 bits do endereço a ser acessado. Os dois bits restantes fazem parte do registro de função especial STATUS e são chamados RP1 e RP0. Na prática utilizamos o máximo possível endereços do banco 0. são acessados os bancos 2 e 3. existe essa divisão em 4 bancos. Os registros de funções especiais têm seus nomes e os nomes de seus bits já definidos em um arquivo. Também não é necessário saber qual bit de um registro tem determinada função. As posições não implementadas estão em cinza na figura.

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

garantido assim o reset inicial. conforme trato no tópico “Modos LP. em situações como as mostradas na figura2. O modo como os registros se comportam em cada reset é variado.Microcontroladores PIC16F877A 31 2.6. Além disso. 2.6 RESET O PIC possui várias fontes de reset (reinicialização). É útil. reset dos demais componentes.) antes do programa começar a ser executado. que são: • • • • • • Reset ao ligar (POR – Power-on Reset).6. sendo um terminal baixo ativo. XT e HS. Reset por Watch-Dog durante operação normal. O reset por MCLR é acionado quando ao terminal MCLR (pino 4) é aplicado nível lógico baixo. Reset por Watch-Dog no modo SLEEP.1 POR – Power-On Reset Essa funcionalidade detecta quando o circuito é ligado. o terminal de MCLR possui internamente um filtro para evitar que ruídos possam causar reset acidental. Dessa forma podemos dispensar o resistor e capacitor tradicionalmente ligados ao terminal de reset para gerar um nível lógico baixo quando o sistema é ligado. isto é. 2. pois permite ao sistema ter tempo de se estabilizar (tensão. presente no manual de cada PIC.4 BOR – Brown-out Reset Essa funcionalidade visa reiniciar o sistema se houver uma queda na tensão de alimentação.2 PWRT – Power-up Timer Trata-se de um timer de aproximadamente 72ms que mantém o microcontrolador em condição de reset durante esse tempo. percebendo a subida da tensão de alimentação. MCLR é o terminal de Reset do componente. o reset ocorre em ‘0’. Reset por MCLR no modo SLEEP (que será tratado adiante). Exsto Tecnologia . 2. O BOR ocorre quando a alimentação atinge aproximadamente 4V por mais de 100µs (quedas por tempo intervalos menores que esse são ignorados pois podem se tratar de ruídos na alimentação). A seguir são detalhadas algumas fontes e funcionalidades associadas ao reset. 2.3 OST – Oscillator Start-up Timer Este timer “conta” 1024 ciclos válidos de clock antes de sair da condição de reset. Reset por queda de alimentação (BOR – Brown-Out Reset). Essa funcionalidade é habilitada somente nos modos LP. Reset por MCLR durante operação normal. permitindo assim que o oscilador se estabilize. e realiza o reset do microcontrolador.6.6.8. XT e HS”. etc. deve ser consultada a tabela de situações iniciais dos registros. Para saber quais são os “valores iniciais” de cada registro. O terminal MCLR pode ser ligado diretamente ao nível lógico alto sendo recomendado utilizar um resistor de 10 kΩ ligando-o à VDD.

8 mostra como é a lógica de reset.6 Identificação de Reset pelo Software Apesar de existirem várias fontes de Reset. 4. O esquema da figura 1. O sistema aguarda o tempo de PWRT (aprox. 2. O oscilador começa a funcionar: 1024 ciclos são contados (OST). permitindo que providências sejam tomadas em situações específicas de problema.6.6. Exsto Tecnologia . 5.4 – Bits de status e seus significados NOT_TO 1 0 x 1 0 0 U 1 NOT_PD 1 X 0 1 1 0 U 0 Essa informação pode ser útil. O circuito é ligado: a tensão de alimentação começa a subir. 2. O programa começa a ser efetivamente executado. Para isso existem 4 bits: NOT_TD e NOT_PD do registro STATUS e NOT_BOR e NOT_POR do registro PCON (Banco 1). 3.5 Seqüência de inicialização 1. As condições desses bits para cada reset podem ser vistas na tabela 2. 72 ms).Microcontroladores PIC16F877A 32 Figura 2. É detectada a subida da tensão: ocorre POR.4.7 – Situações de Brown-out 2. Condição NOT_POR NOT_BOR Reset por Power-on 0 X Impossível 0 X Impossível 0 X Reset por Brown-out 1 0 Reset pelo Watchdog 1 1 Dispertar pelo Watchdog 1 1 Reset pelo MCLR em operação normal 1 1 Reset pelo MCLR no modo SLEEP 1 1 Tabela 2. é possível determinar qual reset ocorreu.

Qualquer periférico que estiver com sua respectiva interrupção habilitada (incluso INT e interrupção por mudança no Portal B). Essa funcionalidade é muito útil. Quando habilitado ele deve ser zerado a intervalos regulares menores que seu tempo máximo pela instrução CLRWDT. ocorre o reset. O período do watchdog é de 18 ms (típico). Desenvolvendo o código adequadamente é possível fazer com que o reset sequer tenha efeitos perceptíveis para o sistema. Ele é importante em situações em que. Ele é ativado pela execução da instrução SLEEP.Microcontroladores PIC16F877A 33 Figura 2. é melhor que o sistema reinicie do que fique inoperante.7 Watch-Dog Timer Esse timer de 8 bits. O microcontrolador pode ser “acordado” por qualquer um dos eventos abaixo: • • • Qualquer reset. Estouro do Watch-Dog (se este estiver habilitado). Dessa forma conseguimos reduzir drasticamente o consumo do sistema.8 – Lógica de reset 2. também chamado de modo SLEEP (sono. na grande maioria das situações práticas. por qualquer motivo. tendo sido habilitada essa função na gravação. gera um reset quando “estoura”. Nesse modo o oscilador é desligado. o microcontrolador “trava”. como será visto mais adiante. que é baseado em um oscilador RC interno próprio. Ao timer de 8 bits pode ser atribuído um pré-escala. 2. Com pré-escala máxima pode chegar a 2. fazendo com que o microcontrolador pare completamente a execução do programa.8 Modo de baixo consumo – Modo SLEEP O modo de baixo consumo (Power-dowm Mode). Exsto Tecnologia . o que é importante sobretudo em sistemas alimentados por bateria. é a situação de menor consumo do microcontrolador.3s. independente de qualquer outra coisa. em inglês). pois. Se o programa “para” e o Watch-Dog não é zerado.

Deve-se ter atenção ao fato de que no modo SLEEP o oscilador está desligado. o terminal trabalha como I/O. o programa recomeça sua execução no vetor de reset (0000h). o terminal é associado a ele serve ao periférico e sua função de entrada e saída fica desativada. Dessa forma.9 Características especiais 2. Dessa forma não podem ser utilizadas interrupções dos timer’s para a saída do modo. De uma forma geral. visto que assim se podem preservar os direitos autorais do autor do firmware e dificultar a cópia de produtos. o programa recomeça pelo vetor de interrupções (0004h) se desperto por interrupção. Se. muitos terminais possuem mais de uma função. de reset. pode ser impedida a sua leitura. o bit 7 do portal C por RC7. o PIC16F877A é um componente de 40 pinos. temos terminais de entrada e saída dos portais multiplexados com terminais dos periféricos. o bit 2 do portal A é representado por RA2. ocorrer um estouro do Watch-Dog ou a chamada de alguma interrupção o programa continua sua execução a partir do endereço imediatamente posterior a instrução SLEEP que ativou o modo de baixo consumo.9.1 Proteção de Código (Code Protect) O programa gravado em um PIC pode ser protegido. Para facilitar a escrita. de conexão com o oscilador e os terminais de portais e periféricos. quando usamos um determinado periférico. toda documentação da Microchip quando se refere a um terminal não utiliza a notação bit N do portal X. em seu encapsulamento PDIP (Plastic Dual In-line Package – Encapsulamento plástico em linha dupla). 2.2 Locais de Identificação (ID Locations) Existem 4 endereços não acessáveis pelo microcontrolador que podem ser utilizados para identificação do componente (por exemplo. se estes timer’s utilizarem como fonte de clock o oscilador interno. E ainda. Por exemplo. se desejamos que uma interrupção simplesmente “acorde” o microcontrolador.9. nem demais periféricos cujo funcionamento se baseie no oscilador principal do sistema. devemos desabilitar globalmente as interrupções. Quando o periférico não é utilizado. Assim. porém.Microcontroladores PIC16F877A 34 Quando da ocorrência de algum reset. isto é. Esses pinos podem ser divididos em terminais de alimentação. 2. com terminais do oscilador e terminais de reset. sobretudo quando se trata de produção industrial. A figura abaixo apresenta a pinagem do PIC 16F877A. Essa funcionalidade é muito importante.3 Pinagem e Hardware Básico Como já foi comentado anteriormente. e assim por diante. 2. e sim RX N. se o controle geral de interrupções estiver habilitado.9. Exsto Tecnologia . o número de série do produto ou a versão do firmware). Como se trata de um componente com diversas características e um pequeno número de terminais.

5 V 300 mA 250 mA 25 mA 25 mA 200 mA 200 mA 200 mA 200 mA Exsto Tecnologia .Microcontroladores PIC16F877A 35 Figura 2. Característica Valor Unidade Frequência de Operação 0 ~ 20 MHz MHz Resets POR. BOR Memória de Programa (FLASH) 8k palavras de 14 bits Memória de Dados (RAM) 368 bytes Memória de Dados Não Volátil (EEPROM) 256 bytes Interrupções 15 Timers 3 Módulo CCP 2 Módulo SSP (SPI e I2C) 1 Comparador analógico 2 Comunicação Paralela PSP Módulo ADC de 10-bits 8 canais Set de Instruções 35 instruções A tabela seguinte contém as características elétricas do PIC 16F877A.1 – Pinagem do PIC 16F877A As principais características do PIC são apresentadas na tabela abaixo. Característica Temperatura de Trabalho Vdd ( em relação à Vss) Máxima Corrente de saída em Vss Máxima Corrente de entrada em Vdd Máxima Corrente drenada por I/O Máxima Corrente de saída po I/O Máxima Corrente drenada por PORTA + PORTB + PORTE Máxima Corrente fornecida por PORTA + PORTB + PORTE Máxima Corrente drenada por PORTC + PORTD Máxima Corrente fornecida por PORTC + PORTD Min -55 4 Max Unidade 125 ºC 5.

portanto VDD e VSS devem estar devidamente conectados.0 VDD VDD 0.0 4.0 V.6 Unid V V V V V V Como já foi discutido.5V durante o processo de gravação. O buffer de entrada de cada pino pode ser do tipo TTL simples ou Schmitt Trigger. É necessário somente : • A alimentação de +5V. Esses cuidados são fundamentais quando se trabalha com freqüências altas.8 1. • Definir-se um esquema de clock conforme já tratado. bem regulada. Assim o circuito básico necessário para um PIC funcionar é bastante reduzido. Os valores são considerndo que a alimentação é de 5. é fazer com que os componentes externos do circuito oscilador fiquem bem próximo uns dos outros e todos bem próximos ao microcontrolador. Essa gravação é feita de forma serial utilizando somente dois pinos: PB7/PGD para envio de dados e RB6/PGC para clock. Recomenda-se a liga-lo a Vdd por um resistor (10kΩ).0. diminuindo seu comprimento e posicionando trilhas excessivamente próximas umas das outras. Isso é feito aumentando a espessura das trilhas. Exsto Tecnologia . • O terminal /MCLR é o terminal de reset do PIC e é baixo ativo. independente do tipo de oscilador escolhido. Além disso. quando for confeccionada uma placa de circuito impresso deve-se minimizar as indutâncias e capacitâncias parasitas.Microcontroladores PIC16F877A 36 Os níveis de tensão de entrada e saída para o PIC são apresentados na tabela abaixo.3 Max 0.0 4. Por isso ele deve ser mantido em nível lógico alto. Um cuidado que deve ser tomado. Não é necessário o circuito RC de reset. Além dos pinos RB7 e RB6 é necessário que o pino MCLR/VPP receba uma tensão de 13VDC +/. • Como em todo circuito digital. um microcontrolador possui todos os componentes básicos de um sistema computacional em um único chip. um capacitor de desacoplamento de 100nF bem próximo aos terminais de Vdd e Vss. Também é necessário que o microcontrolador esteja devidamente alimentado. Parâmetro VIH VIH VOL VOH Tipo de buffer TTL Schmitt Trigger TTL Schmitt Trigger Min Vss Vss 2. 2. Para saber qual o tipo de buffer deve-se consultar a parte do manual de cada componente relativo aos portais de I/O.10 Gravação A gravação do microcontrolador PIC pode ser realizada sem que o componente seja retirado da placa (gravação in-circuit).

Microcontroladores PIC16F877A 37 2. Fazendo uma analogia com um livro de culinária. uma instrução de soma inicia um processo interno do microcontrolador que realiza movimento de bytes. ajusta e realiza operações na unidade lógico-aritmética. Cada instrução na verdade é um código numérico (chamado Opcode) que o decodificador de instruções é capaz de interpretar e disparar uma seqüência de ações pré-definida. não mapeado em RAM. é um registro interno do microcontrolador. por conveniência esses nomes fazem referência a ação realiza. Significa também que microcontroladores de outras famílias ou fabricantes não são compatíveis com o código gerado para PIC16 ou para outro conjunto de instruções (não falam a mesma lingua). Cada processador (ou core) possui seu próprio conjunto de instruções (ou set de instruções). denominados mnemônicos. Isso significa que todos os microcontroladores da linha PIC16 são capazes de executar o mesmo código. Para assembler é o programa responsável por “traduzir” o código mnemônico (entendido pelo ser humano) para um código numérico composto de opcodes (entendido pelo core do microcontrolador). Para maior compreensão do funcionamento das instruções se faz necessário comentar o funcionamento do registro de STATUS. Como será visto. chamado no PIC de Working Register ou simplesmente W. carrega resultados em endereços de memória. falam a mesma língua. que está envolvido na maioria das instruções. Os bits desse registro nos apresentam a situação do Exsto Tecnologia . Por exemplo. o opcode indica a página onde estão os passos para a realização de uma receita. ele participa das instruções de movimentação e é um dos operandos ou o destino do resultado nas operações lógico e matemáticas. Como criar uma lógica complexa de programação usando apenas códigos numéricos seria um trabalho muito desgastante e o resultado muito confuso foi criada uma linguagem simbólica que associa nomes. Voltando a analogia com um instrumento musical. como poderá ser observado brevemente.11 O conjunto de instruções do PIC16F877A O set de instruções de um microcontrolador é o conjunto de todas as instruções que o processador pode interpretar e executar. aos opcodes. ou seja. Antes de estudar as instruções deve-se definir alguns termos que serão utilizados na descrição das instruções e na apresentação de sua sintaxe: f W b k x d PC NOT_TO NOT_PD TOS Registro da RAM (0x00~0x7F) Acumulador (Working register) Bit em um byte Constante de 8 bits Irrelevante destino: 0 => Acumulador (W) 1=> registro Program Counter Bit de time-out Bit de Power Down Topo da pilha (Top Of Stack) O acumulador. são como as notas musicais que o compositor usa para escrever uma partitura.

As instruções são divididas.17Fh ) o 01 = Banco 1 (80h . Finalmente. bit o 0 = não houve transporte do 8o. bit • • • • • O conjunto de instruções do core PIC16 é composto de 35 instruções. o 1 = Bancos 2 e 3 (100h . No campo “Ciclos” está o número de ciclos de máquina gastos para a execução da instrução. para o 5o. O campo “Operadores” indica quais os operadores envolvidos e quais seus domínios. conforme sua função. se uma soma causou “overflow”. Para borrow o sinal é inverso o 1 = houve transporte do 8o. Para borrow o sinal é inverso o 1 = houve transporte do 4o.Microcontroladores PIC16F877A 38 microcontrolador a cada instrução. usado para endereçamento indireto. bit o 0 = não houve transporte do 4o. usado para endereçamento direto. para o 5o. além do controle bancos de memória.1FFh ) o 10 = Banco 2 (100h . essas alterações são comentadas abaixo dos quadros. O campo “Sintaxe” mostra a forma de se escrever a instrução. o campo “Exemplo” apresenta um exemplo simples de utilização da instrução. O campo “Flags Afetados” mostra quais flags de STATUS são afetados pela execução da operação. “Operação” apresenta a operação realizada pela instrução. a situação do RESET.1FFh) o 0 = Bancos 0 e 1 (00h . exceto time-out do WDT o 0 = ocorreu um time-out do WDT NOT_PD: Bit indicador de Power-down o 1 = quando é ligado ou após a instrução CLRWDT o 0 = pela execução de uma instrução SLEEP Z: Bit indicador de zero o 1 = se o resultado de uma operação da ALU é zero o 0 = se o resultado de uma operação da ALU é diferente de zero DC: Carry/Borrow de dígito.FFh) RP1~RP0 : bit de seleção de banco. apresentadas a seguir. bit C: Carry/Borrow .7Fh ) NOT_TO: Bit indicador de Time-out o 1 = após todos os Resets. o 11 = Banco 3 (180h . Através deles podemos saber de resultados de operações da ALU (se uma subtração resultou em zero.FFh ) o 00 = Banco 0 (00h . etc). R/W – 0 IRP Bit 7 R/W – 0 RP1 R/W – 0 RP0 R–1 NOT_TO R/– 1 NOT_PD R/W – x Z R/W – x DC R/W – x C Bit 0 STATUS • • IRP :bit de seleção de banco. Esses bits são tipicamente chamados de flags (Bandeiras). nos seguintes tipos: • • • • Manipulação de byte Manipulação e bit Matemáticas Lógicas Exsto Tecnologia .

mas o valor da origem não é alterado. CLRW "Zera" o registro W. o bit Z é setado indicando esse evento.1 Manipulação de Byte As instruções de manipulação de byte permitem atribuir valores a endereços da RAM e ao registro W. O bit Z do registro STATUS é setado.11. Sintaxe CLRF f Operadores 0 ≤ f ≤ 127 Operação (f) 00h Flags Afetados Z Ciclos 1 Exemplo CLRF TEST Alterações nas Flags: Como a instrução resultou em um registro se tornar 0. Sintaxe CLRW Operadores Nenhum Operação (W) 00h Flags Afetados Z Ciclos 1 Exemplo CLRW Alterações nas Flags: Como a instrução resultou em um registro se tornar 0. CLRF "Zera" o registro indicado por f. Recomenda-se tirar uma cópia desta pagina e tela sempre à mão para consulta rápida. O bit Z do registro STATUS é setado. o registro de destino recebe o valor do registro de origem. MOVLW Move a constante k para W.Microcontroladores PIC16F877A 39 • • • Testes e desvios condicionais Chamadas e desvio (controle de fluxo) Controle (da CPU) No anexo A existe uma tabela resumo de todas as instruções. É importante ressaltar que apesar de normalmente o mnemônico dessas instruções trazer a palavra move (mover) o valor do registro é na verdade copiado. 2. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo MOVLW k 0 ≤ k ≤ 255 (W) k Nenhum 1 MOVLW 35h Exsto Tecnologia . o bit Z é setado indicando esse evento. isto é.

5 Exsto Tecnologia . é 0. Sintaxe Operadores MOVF f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo MOVWF f 0 ≤ f ≤ 127 (f) W Nenhum 1 MOVWF TEST 2. se d é 1 o destino é o próprio registro (f). MOVWF Move o conteúdo de W para o registro f. b 0 ≤ f ≤ 127 0≤b≤7 f[b] 0 Nenhum 1 BCF CONTROLE. Z = 1: o valor movido.0 Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: Z = 0: o valor movido. d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (f) Z 1 MOVF TEST. é diferente de zero.Microcontroladores PIC16F877A 40 MOVF Move o valor do registro (f) para o destino.2 Manipulação de bit As operações de manipulação de bit são uma particularidade dos microcontroladores e dificilmente são encontradas em outros sistema computacionais. Se d é 0 destino é W. Sua função é permitir alterar o valor de um único bit de um determinado registro. sem qualquer influência nos demais bits. BCF "Zera" o bit b do registro f.11. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo BCF f. Mover o valor do registro para ele mesmo é útil para testarmos se o valor é 0. uma vez que essa instrução afeta o bit Z do registro STATUS.

ADDWF Realiza a adição do valor contido em W com o valor do registro f. DC = 1: o resultado da adição causou o transporte de 4o para o 5o bit DC = 0: o resultado da adição não causou o transporte de 4o para o 5o bit Z = 0: o resultado da adição é diferente de zero. Z 1 ADDLW 35h C = 1: o resultado da adição é maior que 255.11.7 2.Microcontroladores PIC16F877A 41 BSF "Seta" o bit b do registro f. Exsto Tecnologia . Z = 1: o resultado da adição é 0. Como trata-se de um microcontrolador de 8 bits essas operações tem operadores e resultados de 8 bits. DC. Pode ocorrer com 128 + 128 = 256: C=1 e o resultado da adição é igual a 0. Essa raciocínio se aplica para operações de multiplicação e divisão. que não suportadas pela ALU do PIC16. Da mesma forma. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: ADDLW k 0 ≤ k ≤ 255 (W) (W) + k C. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro f. C = 0: o resultado da adição é menor ou igual a que 255.3 Matemáticas As instruções matemáticas são capazes de realizar operações matemáticas básicas através da operação da ALU do microcontrolador. operações mais complexas podem ser construídas a partir das rotinas básicas. b 0 ≤ f ≤ 127 0≤b≤7 f[b] 1 Nenhum 1 BSF CONTROLE. O resultado é armazenado em W. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo BSF f. ADDLW Realiza a adição do valor contido em W com a constante k. Para cálculos com valores maiores de 8 bits devese desenvolver rotinas fazendo uso das instruções básicas.

Microcontroladores PIC16F877A 42 Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: ADDWF f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo INCF f.d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (f) + 1 Z 1 INCF COUNT.0 C = 1: o resultado da adição é maior que 255. Z = 1: o resultado da adição é 0. DECF Decrementa o valor contido no registro f. C = 0: o resultado da adição é menor ou igual a que 255. Z = 1: o resultado do decremento é 0 (quando o valor original for igual a 1). INCF Incrementa o valor contido no registro f.d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (f) – 1 Z 1 DECF COUNT. Pode ocorre com 128 + 128 = 256: C=1 e o resultado da adição é igual a 0.Z 1 ADDWF TEST. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. DC = 1: o resultado da adição causou o transporte de 4o para o 5o bit DC = 0: o resultado da adição não causou o transporte de 4o para o 5o bit Z = 0: o resultado da adição é diferente de 0.0 Exsto Tecnologia . O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: DECF f.0 Z = 0: o resultado do decremento é diferente de zero. DC. d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (W) + (f) C.

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

11. O resultado é armazenado em W. Z = 1: o resultado da subtração é igual a 0. DC = 1: o resultado da subtração não causou o transporte de 5o para o 4o bit. Z = 0: o resultado da subtração é diferente de zero. Exsto Tecnologia . O resultado é armazenado no destino: 0 para W ou 1 para o registro designado por f. Z = 0: o resultado da operação "E" é diferente de zero.1 ANDLW k 0 ≤ k ≤ 255 (W) (W) E k Z 1 ANDLW 0Fh o resultado da operação "E" é diferente de zero. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: Z = 0: Z = 1: ANDWF Realiza a operação "E" entre o valor contido em W o valor contido no registro f. Z = 1: o resultado da operação "E" é igual a 0.Microcontroladores PIC16F877A 44 C = 1: o resultado da subtração é maior ou igual a 0. d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (W) E (f) Z 1 ANDWF TEST. 2. as instruções lógicas realizam operações lógicas básicas fazendo uso da ALU. o resultado da operação "E" é igual a 0. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: ANDWF f. ANDLW Realiza uma operação lógica "E" entre o valor contido em W e a constante k. DC = 0: o resultado da subtração causou o transporte de 4o para o 5o bit.4 Lógicas Assim como as instruções matemáticas. C = 0: o resultado da subtração é menor a 0.

Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: [label] IORWF 0 ≤ f ≤ 127 d=0:W d = 1 : registro f (d) (W) OU (f) Z 1 IORWF TEST. O complemento de 255 (11111111b) é 0 (00000000b). Z = 1 o resultado da operação "OU" é igual a 0 (0 OU 0 é igual a zero) IORWF Realiza a operação "OU" bit a bit entre o valor contido em W com o valor do registro indicado por f. Z = 1 o resultado da operação "OU" é igual a 0 (0 OU 0 é igual a zero). d Z = 0 o resultado da operação "OU" é diferente de zero.d 0 ≤ f ≤ 127 d=0:W d = 1 :registro f (d) complemento de (f) Z 1 COMF TESTE. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: IORLW k 0 ≤ k ≤ 255 (W) (W) OU (f) Z 1 IORLW TEST Z = 0 o resultado da operação "OU" é diferente de zero. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f.Microcontroladores PIC16F877A 45 COMF Complementa o valor contido no registro f.1 f. IORLW Realiza uma operação "OU" bit a bit entre o valor contido em W e a constante k. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f.1 Z = 0: o resultado do complemento é diferente de zero. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: COMF f. O resultado é armazenado em W. Exsto Tecnologia . Z = 1: o resultado do complemento é 0.

O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo RLF f.1 C Registro f Alterações nas Flags: C passa conter o valor (0 ou 1) do 8 bit do registro f.d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f veja a figura abaixo C 1 RRF TEST.1 C Registro f Alterações nas Flags: C passa a conter o valor (0 ou 1) do registro f. A operação de rotação a esquerda consiste no deslocamento sucessivo de bits de sua posição inicial para a posição consecutiva de modo que o último bit do registro f vá para C e o bit que estava em C vá para o primeiro bit do registro f. Exsto Tecnologia . RRF O valor contido em f é rotacionado para a direita através do bit de Carry (bit C do registro STATUS). O resultado é armazenado no destino: 0 para W ou 1 para o registro designado por f. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo RRF f.Microcontroladores PIC16F877A 46 RLF O valor contido em f é rotacionado para a esquerda através do bit de Carry (bit C do registro STATUS). A operação de rotação a direita consiste no deslocamento sucessivo de bits de sua posição inicial para a posição consecutiva de modo que o primeiro bit do registro f vá para C e o bit que estava em C vá para o último bit do registro f.d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f veja a figura abaixo C 1 RLF TEST.

Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo SWAPF f.1 XORLW Realiza uma operação "OU exclusivo" entre o valor contido em W e a constante de oito bits k. os bits de 7 a 4 vão para as posições de 3 a 0 e os bits de 3 a 0 vão para as posições de 7 a 4.Microcontroladores PIC16F877A 47 SWAPF O nibble (conjuntos de 4 bits) mais significativo e o menos significativo do registro f são trocados. Ou seja. A figura abaixo ilustra esse processo.d 0 ≤ f ≤ 127 d=0:W d = 1 : registro f Destino [7:4] f [3:0] Destino [3:0] f [7:4] Nenhum 1 SWAPF TEST. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. XORWF Realiza a operação "OU exclusivo" entre o valor contido em W com o valor do registro indicado por f. O resultado é armazenado em W. d Exsto Tecnologia . O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. Sintaxe Operadores XORWF 0 ≤ f ≤ 127 d= 0 → W f. Z = 1: o resultado da operação "OU exclusivo" é 0 (um valor "OU-exclusivo" consigo mesmo é igual a zero). Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: XORLW k 0 ≤ k ≤ 255 (W) (W) XOU (f) Z 1 XORLW OFh Z = 0: o resultado da operação "OU exclusivo" é diferente de zero.

seguindo o programa na segunda instrução após a BTFSS.Z GOTO ZERO Exsto Tecnologia . Se o resultado for diferente de 0 a próxima instrução é executada. O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. b 0 ≤ f ≤ 127 0≤ b≤7 se f[b]=0 salta a próxima instrução nenhum se o bit não estiver em 1.5 BTFSC Testes Testa o bit b do registro f : se o bit for '1' a próxima instrução é executada. se o bit for '0' a próxima instrução não é executada.0 Z = 0: o resultado da operação "OU exclusivo" é diferente de zero. em seu lugar é executada uma instrução NOP.11. 2. em seu lugar é executada uma instrução NOP. seguindo o programa na segunda instrução após a BTFSC. seguindo o programa na segunda instrução após a DECFSZ. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo DECFSZ Decrementa o valor contido no registro f. BTFSS f. em seu lugar é executada uma instrução NOP. se o bit for '1' a próxima instrução não é executada. BTFSS STATUS. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo BTFSS Testa o bit b do registro f : se o bit for '0' a próxima instrução é executada.Z GOTO NO_ZERO BTFSC f. BTFSC STATUS. se o bit estiver em 1. se o bit estiver em 1.Microcontroladores PIC16F877A 48 Operação Flags Afetados Ciclos Exemplo Alterações nas Flags: d=1 → registro f (d) ← (W) XOU (f) Z 1 XORWF TEST. se o resultado for 0 a próxima instrução não é executada. b 0 ≤ f ≤ 127 0≤ b≤7 se f[b]=1 salta a próxima instrução Nenhum se o bit não estiver em 1. Z = 1: o resultado da operação "OU exclusivo" é 0 (um valor "OU-exclusivo" consigo mesmo é igual a zero).

em seu lugar é executada uma instrução NOP e o seguindo o programa na segunda instrução após a INCFSZ.d 0 ≤ f ≤ 127 d= 0 → W d=1 → registro f (d) ← (f)+1 se f[b]=1 salta a próxima instrução Nenhum 1 INCFSZ COUNT. O endereço de retorno (próxima instrução) é guardado no topo da pilha (TOS) e um valor de 11 bits é carregado nos bits menos significativos do PC (PC[10:0]). fazendo a seqüência do programa ser transferida para o endereço indicado por k.1 2. Ver tópico "Desvio X Chamada" para maiores informações.11.6 CALL Chamadas e desvio Chamada de sub-rotina.1 se f[b] = 1 salta a próxima instrução Nenhum 1 DECFSZ COUNT. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo INCFSZ f.Microcontroladores PIC16F877A 49 Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo INCFSZ DECFSZ f. Se o resultado for diferente de 0 a próxima instrução é executada.d 0 ≤ f ≤ 127 d=0→W d = 1 → registro f (d) (f) . Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo CALL k 0 ≤ k ≤ 2047 TOS PC+1 PC[10:0] k PC[12:11] (PCLATCH[4:3]) Nenhum 2 CALL TX_SERIAL Exsto Tecnologia . O resultado é armazenado no destino: d=0 para W ou d=1 para o registro designado por f. se o resultado for 0 a próxima não é executada.1 Incrementa o valor contido no registro f. Os bits superiores do PC (PC[12:11]) são carregados a partir de PCLATH.

Os bits superiores do PC são carregados de PCLATH. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo RETLW k 0 ≤k ≤ 255 PC TOS (W) k nenhum 2 RETLW 69h Exsto Tecnologia . O endereço de retorno salvo na pilha quando da ocorrência da interrupção é carregado no PC. Ver tópico "Desvio X Chamada" para mais informações. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo RETURN Nenhum PC TOS Nenhum 2 RETURN RETLW Realiza o retorno de uma sub-rotina com o W contendo a constante de oito bits k . W passa a conter k e o endereço de retorno salvo na pilha quando da ocorrência da interrupção é carregado no PC. fazendo a seqüência do programa ser transferida para o endereço indicado por k.Microcontroladores PIC16F877A 50 GOTO Realiza um desvio incondicional para endereço k. Ver tópico "Desvio X Chamada" para mais informações. O endereço de 11 bits é carregado no PC. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo GOTO k 0 ≤ k ≤ 2047 PC[10:0] k PC[12:11] (PCLATCH[4:3]) Nenhum 2 GOTO INICIO RETURN Retorno de sub-rotina.

NOT_PD 1 CLRWDT NOP Nenhum Nenhuma Nenhum 1 NOP Flags Afetados Ciclos Exemplo Alterações nos Flags: NOT_PD = 1: indica que não houve queda de energia.11. NOT_TO = 1: indica que não houve time-out. O bit GIE do registro INTCON é setado (as interrupções são reativadas).7 NOP Controle Um ciclo de instrução ocorre sem que nenhuma ação seja realizada. O endereço de retorno salvo na pilha quando da ocorrência da interrupção é carregado no PC. Sintaxe Operadores Operação CLRWDT nenhum WDT 00h WDT prescaler 0 NOT_TO 1 NOT_PD 1 NOT_TO. Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo CLRWDT Reseta o timer do Watchdog.Microcontroladores PIC16F877A 51 RETFIE Retorno de interrupção. Exsto Tecnologia . O prescaler do Watchdog também é resetado. O bits NOT_TO e NOT_PD são setados.\ Sintaxe Operadores Operação Flags Afetados Ciclos Exemplo RETFIE nenhum PC TOS GIE 1 nenhum 2 RETFIE 2.

Cada linguagem possui sua sintaxe. O bit NOT_TO é setado. O bit NOT_PD é zerado. Dessa forma. pois em fazer o algoritmo é que está a verdadeira “arte” da programação. um algoritmo não necessariamente precisa ser implementado em um computador. Um mesmo algoritmo pode ser implementado por qualquer linguagem de programação: o que muda é como podemos escrever-lo numa linguagem. o que é chamado português estruturado ou “portugol”. NOT_PD 1 SLEEP Flags Afetados Ciclos Exemplo Alterações nos Flags: NOT_PD=0 e NOT_TO=1 indicam que o microcontrolador está em modo SLEEP. Sintaxe Operadores Operação SLEEP nenhum WDT 00h WDT prescaler 0 NOT_TO 1 NOT_PD 0 NOT_TO. suas instruções. Como não existe uma Exsto Tecnologia . suas regras de escritas. Exemplos de linguagem de programação são Assembly. para que o sistema possa entender o que deve ser feito.Microcontroladores PIC16F877A 52 SLEEP O Processador entra no modo SLEEP. O fluxograma. por se tratar de uma ferramenta gráfica. a principal característica de um sistema computacional é permitir que um mesmo hardware execute diferentes funções pela mudança de seu software. e não saber essa ou aquela linguagem. E ainda. Então. Basic. Na execução de um projeto. antes de se começar a programar é importante se ter bem claro os objetivos a serem alcançados e o modo de alcançá-los. para programar um sistema computacional deve-se criar uma seqüência lógica de comandos que possam ser traduzidos em uma determinada linguagem de programação. O fluxograma consiste em um diagrama em blocos (cada tipo de bloco representa um tipo de estrutura) ligados por setas que indicam qual o fluxo seguido pelo programa. Cobol. ou de forma gráfica. C/C++. é importante notar que o algoritmo é independente da linguagem de programação. O timer do Watchdog e seu prescaler são zerados. 2. desativando oscilador. simplesmente conhecer as instruções de uma linguagem está tão distante de se saber programar quanto saber várias palavras está longe de se saber escrever. Contudo não apresenta muitos detalhes de implementação. utilizando fluxogramas. De fato. A seqüência lógica de ações é o que chamamos de algoritmo. deixa bem clara a seqüência de ações realizadas pelo programa. Linguagem de programação é uma forma de escrever um programa. A apresentação de um algoritmo pode ser feita de forma escrita.12 Programando em assembly Como já foi visto. Pascal.

Quanto às linguagens de programação. Exsto Tecnologia . ’ (ponto e vírgula) indica comentário e os textos que vêm a direita eles são ignorados pelo montador. O Assembly do PIC é uma linguagem de baixo nível. sendo as de nível mais alto as próximas da linguagem humana e as de baixo nível as próximas à linguagem de máquina.Microcontroladores PIC16F877A 53 interpretação universal de fluxograma. O símbolo ‘ .13 Estrutura do Programa Abaixo temos a estrutura básica de um programa em assembly. que o que o microcontrolador/processador efetivamente entende. elas são classificadas em “níveis”. Suas principais características são possuir símbolos diferentes para entrada e saída de dados e possuir um símbolo de Atraso. foi desenvolvido um conjunto específico para trabalho com programação de microcontroladores para esse curso. devido à importância desse conceito para sistemas microcontrolados. 2.

Descrição da função da sub-rotina .============================================================= . *** Variáveis CBLOCK 20h Configuraçõe . . configurações do programa Cabeçalho . Saída: < parâmetros de saída > Rotina Principal RETFIE . <e-mail do autor> . . FIM DO CÓDIGO Exsto Tecnologia Sub-rotinas <nome da subrotina>: . *** Sub-Rotinas . vetor de interrupção .INC> . microcontrolador a ser utilizado __CONFIG <opções> . quando houverem > <aqui deve estar o retorno de contexto> . Entrada: < parâmetros de entrada> . <numero> <descrição da versão> . . <Nome do projeto/programa> .Ti = <tempo de instrução> . . Versão: . inicio do programa principal . *** Definições de Hardware .Microcontroladores PIC16F877A 54 <variáveis> ENDC . loop principal . <aqui deve estar o salvamento de contexto> <aqui devem ser inseridas as rotinas de tratamento de interrupções. *** Tratamento de interrupção org 0004H . *** Rotina principal INICIO: < aqui fica a inicialização> PRINCIPAL: Tratamento de Interrupção Início do Programa . < a rotina principal fica aqui > GOTO PRINCIPAL . <autor> . *** Software org 0000H GOTO INICIO .============================================================= #include<P16F877A. <aqui vem o código da sub-rotina> RETURN END . <Nome da empresa> . < as sub-rotinas podem ser inseridas aqui > (1) (2) (3) . Cristal <freqüência> . <descrição da finalidade e operação do programa> . vetor de reset Definições de hardware e Software .============================================================= .

Isso é feito visando documentar adequadamente o projeto. quem é o responsável pela sua implementação e outras observações que permitam estabelecer a finalidade e o contexto para os quais aquele código foi desenvolvido.Microcontroladores PIC16F877A 55 Como pude ser observado. Cabeçalho O cabeçalho contém informações sobre o programa. É mais cômodo nos referirmos a ele simplesmente por LED. ao retomar um programa com o qual não trabalhou por algumas semanas.. ENDC . pois. dentre outras. as definições de constantes e as definições de hardware. Assim como no cabeçalho. Esse procedimento é extremamente recomendado. várias partes da estrutura do programa não constituem código executável propriamente dito.. Definições de Hardware e Software Aqui são realizadas as declarações de variáveis. #DEFINE LED PORTB. não sendo preciso lembrar onde realmente está o LED. na escrita do programa. permitindo realizar melhor o entendimento e a manutenção do software. Por exemplo.2 . o código em Assembly muitas vezes não deixa claro o que está sendo feito. e não todo local onde se faça referências ao LED. Quando é necessária alguma manutenção em um programa. não é necessário lembrar qual função está associada a cada pino. e não há comentários. como logo será percebido.. além de seu desenvolvimento. mas comentários e outras informações.. CBLOCK 20h ENTRADA . Dessa forma. ARMAZENA OS VALORES DE ENTRADA CONT . se por algum motivo for preciso mudar o LED para o pino RB6. por pessoas que não o desenvolveram. Exsto Tecnologia . o trabalho se torna virtualmente impossível. Além disso. como objetivo.. É comum que um programador. revisões e seus motivos. em muitas outras partes do texto são feitos comentário e explicações sobre o que está sendo realizado. A idéia é atribuir nomes aos pinos e/ou aos portais. isto é. segundo sua função. Sua finalidade e documentar um resumo do programa. não se lembre mais do motivo de ter feito certas partes do código... O trecho de código abaixo exemplificar o que discutimos acima. Configurações Nesse ponto do programa é incluído o arquivo de definições do microcontrolador a ser utilizado e são realizadas as configurações dos bits de configuração. basta alterar somente a definição. suponhamos que existe um LED no pino RB2. Podemos fazer definições de hardware utilizando a diretiva #DEFINE para tornar o programa mais claro. apenas a função. CONTADOR PARA TEMPORIZAÇÃO . no bit 2 do PORTB. autor.. o LED está em RB2 . .

Rotina principal É o corpo principal do programa. para facilitar sua localização.14 Programação estruturada Programar de forma estruturada é seguir uma série de regras que fazem com que o software final tenha uma estrutura que facilite seu desenvolvimento. cujo funcionamento é totalmente descrito pelo cabeçalho. que resolvam problemas específicos. Ao utilizar sub-rotinas bem feitas e documentadas reduzimos o tempo de desenvolvimento.. Para resolver qualquer tipo de problema. que é o objetivo do software. Isto quer dizer que deve ser composto por partes independentes do todo. Na inicialização do microcontrolador serão realizadas todas as configurações do componente para que o programa opere conforme o desejado. informando sua função e seus parâmetros de entrada e saída. pois passamos a simplesmente organizar a rotinas já desenvolvidas. mas é comum que ele seja a primeira. compreensão e manutenção. que será repetido indefinidamente. Não existe uma ordem obrigatória da posição onde deve estar essa rotina. caso esta esteja sendo utilizada. as estrutura de decisão e as estruturas de repetição. conforme será discutido no futuro. as sub-rotinas nos permitem solucionar o problema. Na quase totalidade de programas para microcontroladores essa rotina é constituída por uma seqüência de inicialização e um loop. LED . ou a última. Sub-rotinas As sub-rotinas devem ser devidamente identificadas com seus cabeçalhos. que geralmente é um problema complexo. é necessário fazer um desvio para a rotina principal do programa. fica fácil identificar onde está ocorrendo algum problema e também solucionaExsto Tecnologia . Harmoniosamente organizadas. A diretiva ORG indica que o programa vai ser escrito a partir do vetor de reset (0000h). Essas partes são chamadas subrotinas. É importante que um programa estruturado seja modular. rotina do programa. 2. O problema a ser resolvido.. não sendo necessário refazer a rotina nem mesmo perder tempo estudando-a. e assim sucessivamente até que os sub-problemas atinjam uma simplicidade tal que possam ser resolvidos com o uso de estruturas básicas. Como logo em seguida temos o vetor de interrupção. A divisão do programa em módulos acarreta uma série de vantagens. deve ser dividido em blocos de problemas mais simples. Como cada função trata de um problema específico. quando estas forem utilizadas.Microcontroladores PIC16F877A 56 BSF .é o mesmo que BSF PORTB.2 -> acende o LED Início do programa É aqui que o programa que vai ser gravado no microcontrolador realmente começa. existe apenas três tipos de estruturas: a atribuição de valores. Tratamento de interrupção A partir do vetor de interrupção (0004h) é colocado o código para tratar das interrupções. independente de sua complexidade.

Além disso. reduzindo assim o tempo de desenvolvimento. Exsto Tecnologia . E ainda. um programa modular é mais facilmente compreendido quando lido. uma função pode facilmente ser “levada” para outro programa onde a mesma solução se faça necessária.Microcontroladores PIC16F877A 57 lo.

definições do 16F628A <MINHAS_MACROS. Sintaxe Exemplo END org INICIO: .. #INCLUDE Sintaxe Exemplo #include #include #include <nome_do_arquivo> <PIC16F628A.inc>. corpo do programa . Elas são reconhecidas ou interpretadas pelo processador e realizam várias funções na criação do programa.1 Diretivas Diretivas podem ser vistas como instruções dadas ao montador. fim do programa A diretiva END indica o fim do programa. inicio do programa org INICIO: CALL GOTO A diretiva ORG indica ao compilador que o código que se segue será alojado a partir da posição de memória indicada por <endereço>.. que serão utilizadas na grande maioria dos programas.inc> . end 0000h . inicio do programa . e não ao microcontrolador. Todo código escrito deve ser finalizado com END. Qualquer código escrito após END será ignorado pelo compilador.Microcontroladores PIC16F877A 58 3 PROGRAMANDO O PIC16F877A 3. Sempre é necessária uma diretiva ORG para indicar o começo do programa. biblioteca de macros Exsto Tecnologia . Trataremos aqui de algumas diretivas principais. ORG e END Sintaxe Exemplo ORG <endereço> 0000h INIT PRINCIPAL . conforme mostrado no exemplo.

.Microcontroladores PIC16F877A 59 A diretiva #INCLUDE permite incluir arquivos no código fonte principal. É especificado um valor inicial. ENDC Sintaxe Exemplo A diretiva CBLOCK permite criar um bloco de constantes consecutivas.. Apesar disso.5 Sintaxe Exemplo <nome> MEDIDA TESTE SETPOINT EQU EQU EQU EQU <texto> 20h 21h 32h . constante Essas duas diretivas têm função semelhante. que será o valor atribuído ao primeiro nome do bloco de constantes. CBLOCK e ENDC CBLOCK <valor_inicial> <nome_1> <nome_2> .. a partir dele. que são conjuntos de funções e/ou macros já prontas. pontos. temos esses dois casos #DEFINE e EQU Sintaxe Exemplo #define #define #define #define <nome> SETPOINT ENTRADA LED <texto> 32h PORTA PORTB. elas informam ao compilador que <nome> deve ser substituído por <texto> quando o programa for compilado.endereço inicial da RAM geral TESTE MEDIDAS VALOR . A diferença fundamental entre elas é que #DEFINE aceita textos compostos por virgulas. variável . espaços. que é a mesma coisa que declarar uma constante. vamos estabelecer o critério de utilizar EQU para definição de variáveis e #DEFINE para definição de constantes. cada nome recebe Exsto Tecnologia . No exemplo dado. etc. <nome_N> ENDC CBLOCK 20h . que é estabelecer uma substituição de texto. que deve ser incluído no início do programa) ou “bibliotecas”. Esses arquivos podem ser arquivos de definições dos microcontroladores (cada microcontrolador tem seu arquivo de definições. Veremos na próxima diretiva que existe um jeito mais eficiente de declarar variáveis. variável . Ambas as diretivas pode ser utilizadas para declarar variáveis. enquanto EQU aceita apenas uma seqüência simples de caracteres. Como veremos. declarar uma variável nada mais é que dar um nome a um endereço de memória.. Em ambos os casos. A diferença entre constante e variável está somente no tratamento dado no programa.

. o valor contido em MEDIDA é carregado em W. . BANKISEL realiza a alteração de IRP para realizar acesso indireto. No exemplo. variável no banco 1 banco 0 muda para o banco 1 banco 1 retorna ao banco 0 Exemplo Essas duas diretivas são utilizadas quando é necessário realizar mudanças de bancos de RAM de dados. Contudo. __CONFIG Sintaxe Exemplo __CONFIG <opções> __CONFIG INTRC_OSC_NOCLKOUT & _WDT_OFF A diretiva __CONFIG (existem dois ‘_’ (dois caracteres underline) antes de CONFIG) permite estabelecer a configuração dos “fusíveis” utilizada pelo programa. A diretiva BANKSEL realiza essa ação. sua utilização deve ser cuidadosa. realiza a mudança de banco para o banco 1. o que resulta em TESTE = 20h. Como elas geram código para alterar os bits em questão. a diretiva BANKSEL realiza o ajuste de banco para acessar a variável TESTE. o valor inicial é 20h. BANKSEL Sintaxe BANKSEL MEDIDA TESTE . variável no banco 0 . No exemplo dado. Fusíveis ou fuses são como são Exsto Tecnologia . para o banco 0. Considerando a formação de endereços por 7 bits essas duas variáveis correspondem ao mesmo valor de operando na instrução. O bloco é sempre terminado pela diretiva ENDC. . BANKSEL realiza automaticamente a alteração dos valores de RP0 e RP1 para acessar <endereço_de_memória> diretamente.. . o valor contido em W é transferido para TESTE e a diretiva BANKSEL é novamente utilizada. MOVFW BANKSEL MOVWF BANKSEL <endereço_de_memória> EQU EQU MEDIDA TESTE TESTE MEDIDA 20h A0h . apenas que ele não está no banco corrente. A vantagem de se utilizar essas diretivas é que não é preciso saber em qual banco está o registro acessado.Microcontroladores PIC16F877A 60 um valor em ordem crescente a partir do valor inicial. isto é. MEDIDA e TESTE. Essa diretiva é muito útil para a definição de variáveis. No exemplo acima da diretiva BANKSEL são declaradas duas variáveis. Para a manipulação de dados entre elas é necessário o ajuste de banco. pois nos permite estabelecer o endereço onde começa a RAM de uso geral e simplesmente dar o nomes as variáveis.. que é feito atribuído os valores corretos a RP0 e RP1. nos endereços 20h (banco 0) e A0h (banco 1). no entanto se encontram em bancos diferentes. MEDIDAS = 21h e VALOR = 22h. deve-se estar atento para que o número de variáveis não seja tão grande que extrapole os endereços do banco. agora para fazer o ajuste para o banco de MEDIDA. sem preocupação com o endereço individual de cada variável. respectivamente. ou seja.

A outra possibilidade é o tipo lógico.2 Variáveis Os dados a serem manipulados pelo microcontrolador são armazenados na memória RAM de uso geral. É nessa região da memória onde são declaradas as variáveis do programa. O primeiro é o byte. são utilizados individualmente bits de bytes pertencentes a RAM. são associadas pelo símbolo &. Nesse caso. como a variável pode assumir somente dois valores.1 contém as opções de configuração para os PIC 16F628 e 16F628A Opção _BODEN_ON _BODEN_OFF _CP_ALL _CP_OFF _CPD_ON _CPD_OFF _PWRTE_OFF _PWRTE_ON _WDT_ON _WDT_OFF _LVP_ON _LVP_OFF _DEBUG_ON _DEBUG_OFF _RC_OSC _LP_OSC _XT_OSC _HS_OSC _WRT_OFF _WRT_256 _WRT_1FOURTH _WRT_HALF Descrição Brown-out Reset habilitado Brown-out Reset desabilitado Proteção de código total Proteção de código desativada Proteção da memória EEPROM habilitada Proteção da memória EEPROM desabilitada Power-up Timer habilitado Power-up Timer desabilitado Watch-dog ligado Watch-dog desligado Programação em baixa tensão habilitada Programação em baixa tensão desabilitada Depurador ativo Depurador inativo Oscilador externo (Modo EC) Oscilador a cristal/ressonador – modo LP Oscilador a cristal/ressonador – modo XT Oscilador a cristal/ressonador – modo HS Proteção de escrita na FLASH desabilitada Proteção de escrita nos primeiros 256 bytes Proteção de escrita no primeiro quarto Proteção de escrita em metade da memória Tabela 4. A tabela 4. As variáveis a serem usadas em um programa devem ser declaradas.1 – Parâmetros da diretiva CONFIG Padrão x x x x x x x x x 3. que podem ser encontradas no arquivo de definições. As várias opções. verdadeiro (‘1’ ou true) ou falso (‘0’ ou false). que pode ser encarado como o tipo caracter (8 bits). isto é. Exsto Tecnologia . para que lhes seja destinado um espaço de memória.Microcontroladores PIC16F877A 61 chamados os bits de configuração das diversas características especiais. que realiza uma operação E entre os valores dessas constantes. deve-se informar ao sistema que elas existem antes de usá-las. É comum se referir a esses bits como flags (bandeiras). das quais trataremos mais adiante. Byte aceita valores de 0 a 255 se considerarmos valores não sinalizados ou de –128 a 127 se considerarmos valores sinalizados (notação complemento 2). Quando se trabalha em Assembly no PIC somente dois tipos de variável existem diretamente. que na verdade são constantes. Para cada PIC existem várias opções.

Microcontroladores PIC16F877A 62 Declarar bytes é simplesmente atribuir um nome a um determinado endereço de memória. A instrução RETURN é necessária para que o programa retorne ao ponto onde a sub-rotina foi chamada. Em Assembly. Em seguida utiliza-se a diretiva #DEFINE para declarar o flag dentro do byte de flags. o byte de flags ocupa o endereço 20h FLAGS1. assim como uma função matemática. ou flags. Pode-se ainda obedecer a regra de sempre iniciar o nome de variáveis lógicas com “F_”. Entrada: < parâmetros de entrada> . entrada: . Uma sub-rotina é definida como um trecho de código que realiza uma ação específica.1 Por exemplo. . facilitando a compreensão do código. FLAGS1 #define #define . <bit> Sendo que o campo <bit> pode conter valores de 0 a 7. sendo 0 o bit menos significativo do byte e 7 o mais significativo. Saída: < parâmetros de saída > . Descrição da função da sub-rotina . O conceito de sub-rotina admite ainda que ela será “chamada” pelo programa. soma dois números . 0 FLAGS1. Ela pode ou não ter parâmetros de entrada (operandos de uma função matemática) e parâmetros de saída (resultados). <nome da subrotina>: . Para declarar variáveis de tipo lógico. Para a declaração de bytes utiliza-se a diretiva CBLOCK.3 Sub-rotinas Para a implementação de programas modulares é de fundamental importância o conceito de subrotinas. #define <nome_do_flag> <Nome_do_byte_flags> . 1 FLAGS1. #define EQU F_RECEBEU F_ACABOU . conforme a sintaxe abaixo. . conforme já tratado. <aqui vem o código da sub-rotina> RETURN (1) (2) (3) Exemplo 4. uma sub-rotina inicia-se no Label (ou rótulo) que dá lhe o nome pelo qual ela será “chamada” pelo programa e termina sempre com uma instrução RETURN. 3. ADD_FUNCTION: . As sub-rotinas seguirão a forma geral abaixo. o código abaixo soma o valor de duas variáveis e salva esse valor em W. ela será executada e depois retornará ao ponto onde foi chamada. NUMERO_1 NUMERO_2 (1) (2) (2) Exsto Tecnologia . isto é. para indicar que se trata de um flag e não de um byte. primeiramente declara-se um endereço que irá conter os flags. Abaixo pode ser observado um exemplo de declaração de variáveis lógicas. 7 Uma boa dica de programação é usar sempre nomes de variáveis e flags que deixem clara sua função. F_ALARME 20h .

2 Para a implementação da sub-rotina de soma suposta no exemplo anterior podemos utilizar o código abaixo. Isso facilita as operações e reduz o tamanho do código.1 Passagem de Parâmetros A passagem de parâmetros nos algoritmos é feita na própria forma de escrita da sub-rotina. A passagem de parâmetros é feita então simplesmente atribuindo os valores a serem processados nas variáveis que serão utilizadas na função. Simule-o para observar seu funcionamento..3.resultado contido em W . saída: MOVFW ADDWF 0000H 32h NUMERO_1 04h NUMERO_2 ADD_FUNCTION SOMA $ . [Parâmetro N] ) Em um programa em Assembly. . Exemplo 4. SUM <. porém. como destino de grande parte das operações da ALU. [destino] <Nome da função> ( [Parâmetro1].AUX .Microcontroladores PIC16F877A 63 . sendo que o campo [destino] é opcional. [destino] <Nome da função> ( [Parâmetro1].. W NUMERO_1 W + NUMERO_2 NUMERO_1 NUMERO_2. pois a sub-rotina pode não retornar nenhum valor. W <. W <.NUMERO_1 .. esse tipo de construção é impossível.W + NUMERO_2 Exsto Tecnologia . sempre que existir apenas um valor de entrada e/ou de saída da função.W (1) (2) (2) (3) . entrada: . inclusive nenhum. W . chama a função .W RETURN 3.32h . NUMERO_2 <. ele pode ser alterado a qualquer momento.. . Uma boa técnica é. NUMERO_1 <.. CBLOCK 20h NUMERO_1 NUMERO_2 SOMA ENDC ORG MOVLW MOVWF MOVLW MOVWF CALL MOVWF GOTO ADD_FUNCTION: .. Outra boa prática de programação é nunca manter valores importantes em W. utilizar o registro W para o transporte de parâmetros. . MOVFW ADDWF saída: W (3) . [ParâmetroN] ). e os parâmetros podem ser de qualquer quantidade. A forma geral de referência à sub-rotina no português estruturado e em fluxograma será a apresentada abaixo. pois. soma dois números NUMERO_1 NUMERO_2 W NUMERO_1 NUMERO_2.

Uma função em Assembly sempre terminará com uma instrução de retorno (RETURN ou RETLW). Para realizar tudo isso existem dois meios: o desvio e a chamada. fazendo com que o fluxo do programa volte ao ponto onde foi executada a chamada. que no PIC é a instrução RETURN. (2) quais são os parâmetros de entrada e (3) quais são os parâmetros de saída. É extremamente recomendado que se siga esse procedimento para garantir maior facilidade de compreensão e melhor documentação do software. A chamada. É aí que entra a conceito do PC (Program Counter – Contador de programa). Numa estrutura de decisão ele deve ser capaz de executar o bloco verdadeiro ou o bloco falso. executar um código armazenado em outra região da memória e retornar ao ponto onde a seqüência foi interrompida. gravada em uma diferente região da memória. Isso é feito porque o conceito de chamada é de que uma parte do código. porém fundamentalmente diferente. retorna o resultado em W Pode-se notar que abaixo do nome da sub-rotina foram introduzidas algumas linhas de comentários que especificam (1) o que faz a sub-rotina. Exsto Tecnologia . deve ser executada e depois o fluxo retorna o ponto em que a chamada foi originada. Por isso o programa deve ser capaz de mudar seu próprio fluxo. numa estrutura de repetição ele deve ser capaz de realizar a mesma seqüência N vezes. Dessa maneira a seqüência do código é desviada para aquele endereço e de lá segue seqüencialmente. porém antes de realizar essa alteração ela “salva” o valor do PC (próximo endereço depois do CALL). a cada instrução o PC é incrementado. O que o RETURN faz é recuperar o valor salvo na pilha pela última instrução CALL executada e carrega-lo no PC. causando um desvio na seqüência do programa para um determinado endereço. é semelhante ao desvio. O fluxo do programa em um microcontrolador se dá da seguinte maneira: partindo de um endereço inicial as instruções são executadas seqüencialmente.2 Chamada X Desvio (CALL X GOTO) Um problema que atinge praticamente a todos quando começam o estudo de uma linguagem de programação de baixo nível é não ter claro em mente a diferença entre desvio e chamada no fluxo do programa. fazendo com que no próximo ciclo de leitura de instrução o endereço lido seja o imediatamente seguinte ao atual. E ainda. Nas chamadas de sub-rotinas e tratamento de interrupções ele deve ser capaz de interromper sua seqüência normal. O programa seguindo normalmente. até encontrar uma outro desvio ou uma chamada.Microcontroladores PIC16F877A 64 RETURN END . A chamada também altera o valor do PC. Portanto uma instrução de chamada sempre exigirá uma instrução de retorno. que será seu endereço de retorno. dependendo das condições da estrutura.3. que no PIC é realizado pela execução da instrução GOTO. A chamada em Assembly funciona então como a chamada de funções numa linguagem de médio ou alto nível. O desvio. numa região de memória chamada pilha. 3. que no PIC é realizada pela execução da instrução CALL. Porém para a grande maioria das aplicações não é de grande utilidade um programa que seja executado sempre na mesma seqüência. porém temos que nos preocupar com o retorno dessa função. consiste em alterar o valor do PC. fazendo com ele contenha o endereço onde está o código que se deseja executar.

quando temos uma chamada. Em uma analogia com uma pilha de pratos. o nono substitui o primeiro e assim por diante. para realizar um salto a 3 instrução abaixo soma-se 3 ao endereço atual. Para saltar para a instrução anterior.Microcontroladores PIC16F877A 65 A pilha do PIC possui somente oito níveis. Para desvios curtos (poucas instruções acima ou abaixo do ponto atual) é possível utilizar a construção: GOTO $ +/. pode armazenar somente oito endereços de retorno. o retorno da segunda chamada e o retorno da primeira. senão perde-se os endereços de retorno das primeiras chamadas. Sendo assim. isto é. um 0000h CALL A A GOTO B C RETURN B CALL C RETURN desvio. subtrai-se 1 do endereço atual. assim. Esses procedimentos são apresentados abaixo.1 ilustra o a seqüência do programa dentro da memória. A figura 4. Portanto deve-se tomar cuidado para não se fazer mais de 8 chamadas consecutivas (incluindo a interrupção!). Ela trabalha de forma circular. depois mais uma chamada. o nono prato tomará o lugar do primeiro que está em baixo.1 – CALL X GOTO No programa existirão labels com duas finalidades: indicar o início de sub-rotinas e indicar pontos de desvio. Figura 4.k Onde k é um valor constante e $ indica o endereço atual. Exsto Tecnologia . já tendo 8 endereços armazenados. fazendo com que o programa perca completamente sua seqüência lógica.

. Abaixo são apresentados alguns exemplos. Falso. F_ALARME No Assembly do PIC a atribuição é feita pelas seguintes instruções: Orientadas a bytes: MOVLW MOVF MOVF MOVWF CLRF CLRW RETLW k k f. salta para a 3 instrução abaixo . X Soma. volta para a instrução anterior 3. Português Estruturado X Soma. Fluxograma F_ALARME Falso.. Tanto nos fluxogramas como no português estruturado essa operação será caracterizada pelo símbolo “ ”. Exsto Tecnologia . sendo essa uma constante ou uma variável. 0 f f : : : : : : : W f W f f W W k f f W 0 0 k e realiza o retorno (instrução especial MOVFW) Orientadas a bit: BSF BCF f. trata-se de mover o valor de uma origem. b : : f[b] f[b] Verdadeiro Falso Obs.Microcontroladores PIC16F877A 66 GOTO . que nada mais é que o modo pelo qual se atribui valor a uma variável.: f[b] significa bit “b” do registrador “f” Devido ao reduzido número de instrução no Assembly do PIC não existem instruções que permitam mover o conteúdo de uma variável diretamente para outra ou uma constante diretamente para uma variável (exceto quando a constante for zero). b f. 1 f.4 Atribuição A estrutura mais simples existente em algoritmo ou fluxograma é a atribuição. sendo que o destino encontra-se na ponta da seta e a origem na extremidade oposta a ponta. Em outras palavras. para uma variável de destino. Para mover uma constante para uma variável utiliza-se a seqüência abaixo. GOTO $+3 $-1 .

2 – Símbolos de (a) entrada e (b) saída em fluxogramas As representações em português estruturadas são as palavras Escreva para saída de dados e Leia para a entrada de dados. PORTB <-. Exsto Tecnologia . PORTB.W . Assim.Falso . PORTC.PORTA . No caso específico do PIC16F628A existem o PORTA e o PORTB.3 PORTB. sendo essa alteração refletida em um único terminal de saída.0Afh . f <origem> <destino> 3.Microcontroladores PIC16F877A 67 MOVLW MOVWF k f . bit 3 do portal A <-. uma instrução de entrada é uma atribuição que tem como origem o registro de um portal. comandos de entrada e saída resumem-se a simples atribuições envolvendo os registros de portais (PORTA.W Entrada Saída Para saída de dados é possível ainda trabalhar alterando somente um bit de um portal. Esses registros são nomeados como PORTA. PORTB[0] <-. MOVFW MOVWF . Para isso utilizam-se as instruções de atribuição orientadas a bit (BCF e BSF). Do mesmo modo. facilitando o desenvolvimento de software e reduzindo o número de instruções. O PIC tem a particularidade de não possuir instruções de entrada e saída de dados. Também é possível realizar entradas em nível de bit. RX_DTMF <-. Esta característica ocorre de forma a simplificar o set de instruções.5 Entrada e Saída Nos modelos básicos de algoritmos e fluxogramas utilizados existem funções de entrada e saída. W <-. como pode ser visto abaixo. MOVLW MOVWF PORTA RX_DTMF 0AFh PORTB .0 . Uma instrução de saída é uma atribuição que tem como destino o registro de um portal. W . MOVLW MOVWF <origem> <destino> . sendo estas funções realizadas pela escrita e leitura dos registros de cada portal (instruções de atribuição). Elas permitem a comunicação do software com o “mundo exterior”.. (a) (b) Figura 4.2 são apresentados os símbolos de entrada (a) e saída (b) para fluxogramas. PORTB). Exemplos são apresentados abaixo.Verdadeiro Na figura 4. W . procedimento esse que será tratado mais adiante. BCF BSF PORTA. etc.. f k W Para atribuir o valor de uma constante a outra procede-se da seguinte forma. W <-.

6 Estruturas de Decisão Um programa composto apenas por atribuições teria aplicações bastante limitadas. <destino> Decrementa <registro> e salta a próxima instrução se o resultado for ‘0’. Se (SENSOR_1 = Verdadeiro)então . As estruturas de decisão existentes são: • • • • Se Se-Senão Se-Senão-Se Caso No Assembly do PIC. O exemplo abaixo realiza uma decisão a partir de um bit de entrada. INCFSZ <registro>. DECFSZ <registro>. Além disso.. Juntamente com as instruções citadas acima. O exemplo abaixo mostra como isso acontece: LOOP: . <destino> Incrementa <registro> e salta a próxima instrução se o resultado for ‘0’ (255 + 1 = 0 e ‘vai um’ para STATUS. Estruturas permitem que isso seja feito são chamadas estruturas de decisão.C). <bit> Salta a próxima instrução se <bit> de <registro> estiver em ‘0’. Dessa forma consegue-se maior agilidade no software. desvia para LOOP se o contador . BTFSC GOTO SENSOR_1 DISPARA_ALARME .. <bit> Salta a próxima instrução se <bit> de <registro> estiver em ‘1’. BTFSC <registro>. realizando assim decisão e entrada de dados ao mesmo tempo. uma das vantagens do software é que ele pode tomar decisões a partir de informações de entrada. que são: BTFSS <registro>.Microcontroladores PIC16F877A 68 3. DECFSZ GOTO CONTADOR. dispara o alarme Exsto Tecnologia . geralmente se utilizam instruções de desvio para os endereços do código que tratam de cada situação.F LOOP . neste caso o bit em questão foi definido com o nome SENSOR_1. as estruturas de decisão são implementadas através de instruções que realizam teste e desvios. não vale ‘0’ Os procedimentos acima descritos podem ser utilizados para o teste de bits em portais.

Para tanto. deve-se saber como reconhecer essas condições. A e B. Nesse caso o valor da variável é movido para ela mesma. para aqui . para testar se uma variável é igual a zero. temos que: A – B : resultado normal (valor positivo) Exsto Tecnologia . conforme pode ser observado no exemplo abaixo. para aqui E ainda. isso é. novamente subtrai-se um valor pelo outro e então analisa-se o bit de Carry (Transporte) que é o bit C do registro STATUS.Microcontroladores PIC16F877A 69 3. qualquer outro resultado significa que os valores são diferentes. Assim. antes de tratar propriamente das estruturas de decisões. . assumindo valor igual a 1. .W Se (Medida = 25h) então desvia para IGUAIS senão. sendo eles diferentes entre si. definições dos registros do PIC . No set de instruções da linha PIC 16Xxxx não existe nenhuma instrução de comparação. #INCLUDE<P16F877A. diferentes e tais que A > B. A < B. se esses valores são iguais ou não. alterando o valor da variável MEDIDA para 25h e outros valores e observado o que ocorre. tendo como destino o próprio registro. Simule esse exemplo. pode-se utilizar a instrução MOVF. A <= B Pode haver a necessidade de saber qual de dois valores é o maior. qual é o maior. . se a variável for igual a zero o bit Z de STATUS será afetado.MEDIDA . desvia para diferentes .7 Condições As decisões que devem ser tomadas em um programa muitas vezes são baseadas na comparação numérica entre dois valores. se forem iguais. Condições A > B. Condições A = B e A != B Uma forma simples de saber se dois valores são iguais é subtraindo um do outro: se o resultado for zero os dois valores são iguais.25h W <-.Z IGUAIS DIFERENTES $ $ .W STATUS. Em Assembly realiza-se a subtração e estuda-se o bit Z do registro STATUS. Porém. não sofrendo qualquer alteração.INC> CBLOCK 20H MEDIDA ENDC ORG MOVLW SUBWF BTFSC GOTO GOTO IGUAIS: GOTO DIFERENTES: GOTO END 0000H 25h MEDIDA. . Supondo dois valores . A >= B. etc. Então para realizar comparação se faz necessário utilizar instruções de teste associada a manipulações matemáticas. W <-. se forem diferentes.

Microcontroladores PIC16F877A

70

B – A : ocorrência de estouro do acumulador na subtração, chamado de Borrow. (valor negativo) O Borrow pode ser percebido pela análise do bit C do STATUS. É importante notar que na subtração esse bit trabalha com lógica inversa à adição. Assim: C = ‘1’ : resultado normal C = ‘0’ : ocorrência de borrow Resultado normal inclui 0. Dessa forma, se fazendo A – B resulta em C = 1 conclui-se que A >= B (ou que B <= A). O trecho de código abaixo chama a sub-rotina “AJUSTE” se MEDIDA for maior que MAX. Simule seu funcionamento para diferentes valores de MEDIDA e MAX.
#INCLUDE<P16F877A.INC> CBLOCK 20H MAX MEDIDA ENDC ORG REPETE: MOVFW SUBWF BTFSC CALL GOTO ; ... AJUSTE: NOP NOP NOP RETURN END 0000H MAX MEDIDA,W STATUS,C AJUSTE REPETE ; ; ; ; ; W <-- MAX W <-- MEDIDA - W Se (MEDIDA >= MAX) então AJUSTE é chamado senão desvia para REPETE

; \ ; > corpo da sub-rotina ; / ;retorna para o endereço de chamada

Finalmente, para testar se um valor é somente menor ou maior que outro, e não igual, testa-se na mesma operação o bit Z de STATUS. O código abaixo exemplifica essa operação:
#INCLUDE<P16F877A.INC> CBLOCK 20H MEDIDA ENDC ORG MOVLW SUBWF BTFSC GOTO BTFSC GOTO GOTO 0000H 05h ; MEDIDA,W ; STATUS,Z ; IGUAL ; STATUS,C MAIOR ; se MEDIDA > MENOR ; se MEDIDA < W <-- 05h W <-- MEDIDA - W Se (Medida = 05h) então desvia para IGUAIS 05h 05h : C = 1 : C = 0 ; definições dos registros do PIC

Exsto Tecnologia

Microcontroladores PIC16F877A

71

IGUAL: GOTO MENOR: GOTO MAIOR: GOTO END

$ $ $

; se MEDIDA == 05h, para aqui ; se MEDIDA < 05h, para aqui ; se MEDIDA > 05h, para aqui

Resumo das condições Em resumo, havendo dois valores, A e B, e sendo realizada a subtração A – B, temos que: Z 0 0 1 1 C 0 1 0 1 Condição A<B A>B impossível A=B

3.8 Se
A estrutura de decisão Se funciona da seguinte forma: se a condição for verdadeira, o Bloco_verdadeiro é executado; senão, programa continua o fluxo normalmente a partir de Fim_Se. Em outras palavras, o código contido no Bloco_verdadeiro é executado somente se a condição for verdadeira. Se (<condição>) então
<Condição> V

[Bloco_verdadeiro]

F

Bloco

Fim_Se

A implementação dessa estrutura pode ser feita com uma instrução de teste e salto seguida por uma chamada de função. Essa chamada contem o Bloco_verdadeiro. É conveniente a utilização de uma chamada de função, pois o programa retorna ao ponto onde foi chamado e continua o programa da próxima linha, isto é, do mesmo ponto de onde continuaria se a condição fosse falsa. Esse procedimento é exemplificado abaixo.
BTFSS PORTB,2 CALL BL_VERDADE BCF PORTC,0 . . . BL_VERDADE: MOVLW 0Fh MOVWF PORTB RETURN ; se (PORTB[2] = Verdadeiro) então ; executa o bloco verdadeiro e retorna ; senão, segue o programa ; Bloco verdadeiro

Exsto Tecnologia

Microcontroladores PIC16F877A

72

Se por algum motivo não for interessante a utilização de uma chamada, devemos fazer o teste inverso, de forma a desviar quando a condição for falsa. Esse desvio deve ser para o ponto que também será o destino do termino do bloco verdade. O trecho de código abaixo realiza o mesmo que o código anterior, porém sem a utilização de chamada.
BTFSC GOTO MOVLW MOVWF FIM_SE: BCF . . . PORTB,2 FIM_SE 0Fh PORTB PORTC,0 ; se (PORTB[2] != Vedadeiro)então ; segue para END_IF ; se (PORTB[2] = Vedadeiro) então ; executa o bloco verdadeiro ; em qualquer caso, o programa segue

3.9 Se senão
A estrutura Se-Senão é uma derivação da estrutura Se onde, além de um bloco a ser executado somente quando a condição for verdadeira (o Bloco_verdadeiro), existe um bloco a ser executado somente quando a condição for falsa (o Bloco_falso). Sua representação é ilustrada abaixo.

Se (<condição>) então [Bloco_verdadeiro] Senão [Bloco_falso] Fim_Se
Bloco Falso

F

<Condição>

V
Bloco Verdadeiro

Essa estrutura é implementada em Assembly por uma instrução de teste e salto seguida de dois desvios, conforme o trecho abaixo.
CBLOCK 20H CANAL TST1 ENDC ORG MOVFW SUBLW SKPNZ GOTO GOTO BL_VERDADE: MOVLW MOVWF GOTO BL_FALSO: MOVLW MOVWF 0000H CANAL 35h BL_VERDADE BL_FALSO 03h TST1 FIM_SE 08h TST1 ; vai para o “Fim_Se” ; ; ; ; instrução especial = BTFSC se (CHANNEL) = 35h senão Bloco Verdadeiro STATUS,Z

; vai para o “Fim_Se” ; Bloco Falso

Exsto Tecnologia

os dois . possibilitando a verificação de quantas possibilidades forem necessárias no programa. que será executado caso nenhuma das condições seja satisfeitas. dessa forma são economizadas instruções de desvio. Bloco Verdadeiro 03h TST1 . instrução especial = BTFSC . Abaixo é apresentada a forma geral dessa estrutura.10 Se senão se Uma outra possibilidade de construção utilizando-se a estrutura Se-Senão é a chamada estrutura SeSenão-Se. Esse modo é apresentado abaixo. Bloco Falso vem aqui STATUS. vai para Fim_se . para aqui. CBLOCK 20H CANAL TST1 ENDC ORG MOVFW SUBLW SKPNZ GOTO MOVLW MOVWF GOTO BL_VERDADE: MOVLW MOVWF FIM_SE: $ END 0000H CANAL 35h BL_VERDADE 08h TST1 FIM_SE .Z . A diferença entre esses dois códigos é que no segundo. os dois blocos convergem para cá GOTO . vai para o “Fim_Se” . que é simplesmente a implementação onde o bloco falso de uma estrutura Se-Senão é composto por outra estrutura Se-Senão. pode haver ou não um Bloco Falso. E ainda. se (CHANNEL) = 35h . as instruções do bloco falso vêm logo em seguida ao desvio BL_VERDADE sem que seja necessário colocar outro desvio para a as instruções a serem executadas em caso de a condição da estrutura de decisão ser falsa. para aqui. Exsto Tecnologia . 3. Esta forma pode ser utilizada em cascata. blocos convergem para cá GOTO Um modo mais compacto de se implementar um se-senão é fazendo todos os blocos de forma seguida no código. Deve-se notar que todos os “FIM_SE” da estrutura levam na verdade a um mesmo ponto.Microcontroladores PIC16F877A 73 FIM_SE: $ END .

Abaixo é apresentado um exemplo da utilização da estrutura Se-Senão-Se para controle de temperatura e umidade.. para que não se perca a estruturação do código. Exsto Tecnologia ... Se (<condição n>) então [Bloco_verdadeiro n] Senão [Bloco Falso] Fim_Se .Microcontroladores PIC16F877A 74 Se (<condição 1>) então [Bloco_verdadeiro 1] Senão Se (<condição 2>) então [Bloco_verdadeiro 2] Senão Se (<condição 3>) então [Bloco_verdadeiro 3] Senão .. deve-se dar especial atenção para o fato de o destino final de todos os blocos é o mesmo. Fim_Se Fim_Se Fim_se V Bloco Verdadeiro Condição 1 F V Bloco Verdadeiro Condição 2 F V Bloco Verdadeiro Condição 3 F Bloco Falso Uma estrutura Se-Senão-Se em Assembly é implementada facilmente utilizando-se as técnicas já apresentas para a estrutura Se-Senão. Contudo.

repete todos os testes . . Rotina que dispara o alarme . . . teste w <-. . .30 W <-.UMIDADE . 1o.20 UMIDADE DEFAULT MOLHA FIM_SE VENTILAR TESTE_TEMP . .11 Caso A estrutura Caso (Case ou Switch) é uma estrutura de admite múltiplas condições de igualdade. .W TEST_2 ESFRIA FIM_SE . Existe também a possibilidade de um bloco de exceção para tratar os casos que não se enquadram em nenhuma condição. . Rotina que ventila alguma coisa 3. . Dessa forma temos: Exsto Tecnologia . Rotina para esfriar alguma coisa .80 UMIDADE.20 W <-.W Se (UMIDADE < 80) então vai para o próximo teste Se (UMIDADE > 80) então executa a sub-rotina vai para Fim_Se 3o.30 TEMP.W TEST_3 ALARME FIM_SE . . .Microcontroladores PIC16F877A 75 CBLOCK 20h TEMP UMIDADE ENDC ORG TEST_TEMP: MOVLW SUBWF SKPC GOTO CALL GOTO TEST_2: MOVLW SUBWF SKPC GOTO CALL GOTO TEST_3: MOVLW SUBLW SKPNC GOTO CALL GOTO DEFAULT: CALL FIM_SE: GOTO ESFRIA: NOP RETURN ALARME: NOP RETURN MOLHA: NOP RETURN VENTILAR: NOP RETURN END 0000H . . .W Se (TEMP < 30) então vai para o próximo teste Se (TEMP > 30) então executa a sub-rotina vai para Fim_Se 2o. . .UMIDADE . . Rotina que molha alguma coisa . . .W Se (UMIDADE > 20) então vai para a exceção Se (UMIDADE < 20) então executa a sub-rotina vai para Fim_Se tratamento de exceção . teste W <-. todos os blocos convergem para cá .80 W <-. . .TEMP . teste W <-. . . . . com um bloco verdade para cada condição.

. Para construção de tabelas é utilizada a instrução RETLW (Retorna com uma constante em W). (PCL) (PCL) + (W) soma um valor n com o PC.).F .Microcontroladores PIC16F877A 76 Caso <Variável> de <Opção 1>: <Opção 2>: <Opção 3>: . Algumas regras devem ser observadas na construção de tabelas. Primeiramente deve-se estar atento ao banco onde se encontra a tabela. isto é. Além disso. sendo n o valor contido na variável. porém as condições devem ser somente igualdades de uma mesma variável. Dessa forma a próxima instrução a ser executada é a n-ésima instrução após a soma. Dessa forma não se pode fazer tabelas com comprimento maior que 256 itens sem um tratamento especial. Uma tabela de software comporta-se como uma tabela no papel. um overflow em PCL causado por uma instrução de soma não ocasiona automaticamente o incremento de PCH (bits mais significativos do PC). etc. Esse processo é chamado desvio por software. o que limita o tamanho da tabela em 256 valores. A linha ADDWF PCL. 0100h.. pois caso a operação de soma com o PCL der overflow. a instrução a ser executada está no n-ésimo endereço a partir do endereço seguinte a instrução ADDWF. supondo que nesse caso a tabela comece no primeiro endereço de cada bloco de 256 endereços. somando-se o valor de uma variável ao Registro PCL (bits menos significativos do PC (Program Counter)). <Opção n>: [Bloco_n] [Bloco_1] [Bloco_2] [Bloco_3] Senão: [Bloco_exceção] Fim_caso A estrutura Caso apresentada em fluxograma é similar a estrutura Se-Senão-Se. Exsto Tecnologia . Primeiramente é feito um desvio por software. É recomendado que se faça uma tabela no início de um bloco de 256 endereços (0000h. resultar em um valor maior que 256 o PCLATH não será incrementado automaticamente. Elas são de grande ajuda no trabalho com displays de segmentos e na linearização de medidas analógicas provenientes de sensores não lineares. Usando essa estrutura em Assembly pode-se construir tabelas. que são de grande utilidade em muitos casos. Como exemplo podemos implementar uma tabela que retorne uma letra do alfabeto a partir do valor de sua posição ou uma tabela que retorne o quadrado do valor de entrada. 0200h. Ou seja. onde a partir de um valor de entrada obtemos um valor de saída associado a ele. o que resulta em a próxima instrução executada ser n-ésima após a soma.

todo programa tem como “núcleo” uma estrutura de repetição infinita. Como pode ser observado nos programas desenvolvidos até o momento. Admite-se que a variável NUMERO não contém valores maiores que 9. Na grande maioria dos casos.D . Elas são implementadas com instruções de decisão associadas a desvios.5 . O registro PCLATH é carregado com 07h porque esse é o valor da parte mais significativa das linhas tabela (como pode ser observado a direita) e o endereço para onde se desvia é dado pelo par PCLATH e PCL SEGMENTOS: MOVFW GOTO . . desvia para a tabela . o código abaixo começa no endereço 6FDh . os programas para microcontroladores ficam repetindo a mesma seqüência de instruções indefinidamente ou. . move o número a ser convertido para W .6 .F ABCDEFG 1111110 0110000 1101101 1111001 0110011 1011011 1011111 1110000 1111111 1111011 1110111 0011111 1001110 0111101 1001111 1000111 RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW 01110111B 00000110B 10110011B 10010111B 11000110B 11010101B 11110101B 00000111B 11110111B 11010111B 11100111B 11110100B 01110001B 10110110B 11110001B 11100001B (0700h) (0701h) (0702h) (0703h) (0704h) (0705h) (0706h) (0707h) (0708h) (0709h) (070Ah) (070Bh) (070Ch) (070Dh) (070Eh) (070Fh) 3. que converte valores em BCD para a palavra de ativação dos respectivos caracteres e um display de LED´s ligado a um portal.F NUMERO TABELA 06FDH 07H PCLATH . chamado normalmente de laço principal. dentro dela é feito um desvio para o label TABLE e o retorno é realizado por uma das instruções RETLW. loop principal ou main loop.C . .8 .Microcontroladores PIC16F877A 77 A rotina abaixo.A . ORG TABELA: MOVLW MOVWF ADDWF PCL. .3 . Essa estruturas de repetição são implementadas em linguagens de médio e alto nível por comando como While. (PCL) (PCL) + (W) (06FFh) . ajusta os bits mais significativos (06FDh) .4 .12 Estruturas de repetição Estruturas de repetição são estruturas que permitem que trechos do programa sejam repetidos várias vezes.E .7 . DoWhile e For.2 . checando entradas indefinidamente. desvios esses que levam a execução de blocos e depois retornam ao teste que as originou. Existem três tipos de estruturas de descisão: Faça-Enquanto. A sub-rotina chamada é SEGMENTOS.1 . Exsto Tecnologia . Enquanto e Para. de PCH (06FEh) .0 .B .9 . O endereço de TABLE é tal que o primeiro valor da tabela ocupa a posição 700h. respectivamente. pelo menos.

W PORTB MEDIDA MED 40h STATUS. senão retorna ao inicio loop . CONTROL. / . A apresentação da estrutura abaixo deixa clara essa diferença.2 Enquanto Enquanto (While): estrutura de repetição semelhante a condição Faça-Enquanto. > Bloco . (W) 40h – (W) .12. A apresentação dessa estrutura em português estruturado e fluxograma segue abaixo. Essa diferença pode mudar totalmente a lógica do programa.C LOOP .12.. porém difere em um ponto muito importante: enquanto um Faça-Enquanto executa o bloco primeiro e testa a condição depois a estrutura Enquanto testa a condição primeiro e executa o bloco depois. LOOP: INCF MOVWF CALL MOVFW SUBLW BTFSC GOTO . Enquanto (<Condição>) F Cond? Fim_Enquanto V Bloco [Bloco] Exsto Tecnologia . . se((MED) < 40h) então sai do loop . Quando sai do loop segue a partir daqui 3.. Faça [Bloco] Bloco Enquanto (<Condição>) V Cond? F Abaixo é apresentado um trecho de código implementando uma estrutura Faça-enquanto.1 Faça-Enquanto Faça-Enquanto (Do-While): estrutura de repetição que executa um bloco enquanto uma determinada condição é verdadeira.Microcontroladores PIC16F877A 78 3. \ .

12.3 Para Para (For): estrutura de repetição que tem uma característica que a torna diferente da estruturas de repetição até agora estudadas: nas estruturas Enquanto e Faça-Enquanto a condição da estrutura é uma condição aleatória. . > Bloco . Para <contador> = <valor_inicial> até <valor_final> faça [Bloco] Fim_Para <contador> <valor inicial> Bloco Passo V F <contador> = <valor final> ? A estrutura funciona da seguinte maneira: (1) primeiramente a variável contadora recebe o valor inicial.W PORTB MED LOOP . somente pela estrutura de repetição em si. (4) Em seguida é testado se a variável Exsto Tecnologia .C CONTINUA . (2) O programa entra no loop propriamente dito. MEDIDA 40h STATUS. isto é. / . isso significa que o número de vezes que o bloco é repetido não é conhecido a priori. . Deve-se notar então que para essa estrutura a variável contadora não deve ter seu valor alterado pelo bloco de instruções. \ . . a estrutura Para serve para que blocos de código sejam repetidos um número de vezes conhecido. o bloco é executado e (3) a instrução que dará o passo à contagem das vezes que o loop é executada. ela não depende da estrutura de repetição. . . LOOP: CALL SUBLW BTFSS GOTO INCF MOVWF MOVFW GOTO CONTINUA: .Microcontroladores PIC16F877A 79 O trecho de código abaixo exemplifica a utilização de uma estrutura Enquanto. realiza uma medida (W) 40h – (W) só “sai”quando (MED) < 40h sai do loop 3. CONTROL. o que implica na existência de uma variável contadora associada à estrutura. De fato. Na estrutura Para a condição está intimamente ligada a estrutura e seu estado é alterado por esta.

quando for usado decremento. O passo é como a variável contadora varia a cada execução do loop. isto é. Por exemplo.13 Temporização por software – Rotinas de atraso O microcontrolador executa cada instrução em um determinado tempo. quando for usado incremento Para a implementação de uma estrutura Para em Assembly são usadas as instruções DECFSZ e INCFSZ: DECFSZ INCFSZ CONT. Dessa forma.(3)e(4) CONT <-CONT-1. se (CONT = 0) salta a próxima instrução CONT.123 CONT . Apesar de poder assumir qualquer forma (por exemplo. (1) (CONT) 123 . Se INCFSZ for usado. No caso do PIC esse tempo é quatro vezes o período do clock (existem instruções de 2 ciclos. o bloco contido na estrutura será repetido N vezes. . a DECFSZ ou INCFSZ Para o caso de INCFSZ. . CONT CONT + 1 . o valor inicial deve ser 256 . . Exsto Tecnologia . Se o atingiu. .” (ponto) indica que o valor é decimal .12 = 244. com cristal de 4MHz tem-se um período de 250ns e logo cada instrução demora 1µs para ser executada. Quando é usada a instrução DECFSZ o valor final obrigatoriamente será 0. se (CONT = 0) salta a próxima instrução .F . ca não executar a instrução seguinte a .F . senão volta para LOOP 3. a cada execução do loop o contador pode ser elevado ao quadrado) normalmente o passo é ou um incremento (contador contador + 1) ou um decremento (contador contador . CONT CONT – 1 . bloco a ser repetido . (2) o bloco será executado 123 vezes .<valor final> . que demoram o dobro das instruções normais). MOVLW MOVWF LOOP: CALL DECFSZ GOTO . . obs: saltar a próxima instrução signifi . o passo é de decremento. senão o processo é repetido novamente a partir do ponto (2). A contagem nesse caso é regressiva. o “.Microcontroladores PIC16F877A 80 contadora atingiu o valor final. então o valor inicial deve ser calculado subtraindo a quantidade de vezes que o loop deve ser executado de 256. o valor inicial será o número de vezes que o bloco deve se repetir. TX_SERIAL CONT. o programa sai do loop e segue. o valor do contador será igual a zero quando for somado 1 ao valor 255. para N = 12. O código abaixo apresenta um loop que será repetido 123 vezes. Por exemplo. . N dado por: N = <valor final> .<valor inicial> Ou N = <valor inicial> . o valor final obrigatoriamente será 256.F LOOP .1). Pelo exposto acima. se (CONT=0) salta .

Um seria utilizando o Timer incorporado ao microcontrolador. MOVLW MOVWF LOOP1: NOP DECFSZ GOTO n CONT1 . Repetir um bloco de 4 instruções 50 vezes equivale (do ponto de vista do tempo gasto) a executar 200 instruções. podemos concluir que o tempo total de execução desse trecho de código é dado pela equação (1) . Deve-se tomar cuidado. a qual será tratada mais adiante. o tempo total gasto na repetição do bloco é 4 x n. Os comentários em cada linha indicam quantos ciclos de máquina são executados em cada instrução (Devemos lembrar que instruções de desvio e instruções de teste.000. Por exemplo.F LOOP1 . Porém. na maior parte das vezes não podemos criar delays com a simples seqüência do número de instruções necessário. 2 No código acima. não tão rápidos quanto o microcontrolador. Em muitas situações necessitamos de gerar atrasos na execução normal do programa. Outra forma é criando estruturas de repetição nas quais possamos “perder” o tempo necessário. Existem basicamente dois modos de se conseguir “delay”. que é decrementado a cada execução. o bloco será repetido “n” vezes. 1 CONT1. porém. Já o tempo total de execução da rotina do trecho de código deve levar em consideração o tempo gasto para carregar a variável CONT1. O “bloco“ é será repetido até que CONT1. Como a execução do bloco leva 4 ciclos de máquina. que é a temporização por software. aplicando o mesmo raciocínio para um atraso de 3s é necessário repetir a mesma instrução 3. O que se faz é a criar estruturas de repetição que executem um ou algumas instruções o número de vezes necessário para nos dar o atraso desejado.000 vezes. 2 quando CONT1 == 0 | Bloco . em muitos casos onde um usuário interage com o microcontrolador. principalmente quando temos laços de repetição dentro de outros laços de repetição. 1 . como é mais comum chamá-las. Esses atrasos são conseguidos com as chamadas sub-rotinas de atraso. sendo TCY o tempo do ciclo de máquina do microcontrolador (que estamos considerando como sendo de 1µs): Exsto Tecnologia . quanto a condição testada é verdadeira. Ou seja. Ainda considerando o PIC trabalhando a 1 MIPS (1 Milhão de Instruções Por Segundo) quando é necessário um atraso de 10µs basta executarmos 10 vezes uma instrução qualquer. resulte em 0. Portanto. “n” será substituído por uma constante que. que é de 2 ciclos de máquina. é necessário esperar o usuário.000 endereços da memória de programa! Como pode ser notada. ou de delay (atraso. gastam 2 ciclos de máquina). em inglês). 1 . o que ocupa 3. em muitas situações também é preciso respeitar a temporização de outros componentes. dará o tempo de execução do código. com o fato de que a estrutura de repetição também demora um tempo para ser executada. Observemos o trecho de código abaixo. como veremos mais a seguir.000. trabalhando então com temporização por interrupção. 1 normalmente.Microcontroladores PIC16F877A 81 Porém muitas vezes não se deseja que uma instrução seja executada imediatamente após outra. Para atrasos precisos devemos considerar o tempo de execução das estruturas. O núcleo de uma rotina de delay é estrutura de repetição Para responsável por repetir um bloco de instruções um determinado número de vezes.

saída: nulo MOVLW m . 1 MOVWF CONT1 . entrada: nulo . 1 . 1 . lembrando sempre que “n” é um valor inteiro entre 1 e 255.  n = 0. Por exemplo. rotina de atraso .--.--. entrada: nulo . 1 normalmente. Assim.--MOVLW n . --. 2 / RETURN T = ( 4 × n + 6) × TCY (2) Para determinar o valor da constante “n” basta isolá-la na equação (2) e obtemos a equação (3). A primeira é que não é possível obter um valor de n inteiro para qualquer valor de T. Nesse caso. saída: nulo MOVLW n MOVWF CONT1 LOOP1: NOP DECFSZ GOTO . para T = 31µs temos n = 6.--. 1 LOOP2: . se adotarmos n = 6 obtemos um tempo de 30µs.--. poderíamos transformar o trecho de código acima em uma sub-rotina. 1 LOOP1: Exsto Tecnologia . o que nos leva a um tempo máximo de 1. DELAY: . 2 quando CONT1 == 0 | Bloco LOOP1 . Nessa situações. Fazendo isso devemos considerar o tempo gasto pela instrução CALL que chama a sub-rotina (2 ciclos de máquina) e o tempo da instrução RETURN que retorna da sub-rotina (2 ciclos de máquina).F . Para obter tempos maiores que esse o procedimento é considerar todo o código da rotina como sendo um bloco. temos a subrotina abaixo. rotina de atraso para tempos maiores que 1 ms .Microcontroladores PIC16F877A 82 T = ( 4 × n + 2) × TCY (1) Supondo que necessitamos desse atraso em mais de um ponto de um ponto do programa.--. 1 MOVWF CONT2 . porém.25. a diferença entre o valor desejado e o valor obtido será sempre pequena.--.--. DELAY_MAIOR: .--. Observe como isso é feito na sub-rotina baixo. e podemos completar o tempo necessário com a simples adição de um instrução NOP Outra limitação é que o valor máximo de n é 255. e inseri-lo dentro de outro loop. 1 \ CONT1.026 ms.25 T  T − 6  CY  (3) Devemos atentar para duas limitações dessa sub-rotina.--. cujo tempo de execução é dado pela equação (2).

(4) (5) Exsto Tecnologia .F . T = [(4 × n + 5) × m + 6]TCY −6 TCY m= 4n + 5 T Com essa rotina é possível se obter tempos de até 261.--. 2 RETURN / O tempo total gasto para essa rotina é determinado pela equação (4).Microcontroladores PIC16F877A 83 NOP .381 ms.--. 1 normalmente.--. 1 \ DECFSZ CONT1.--. 1 normalmente.--.--. Para tempos ainda maiores. 2 .--. 2 quando CONT1 == 0 | Bloco GOTO LOOP1 . basta usar o mesmo raciocínio: considerar a sub-rotina um bloco e colocá-la dentro de outro loop. 2 quando CONT2 == 0 GOTO LOOP2 .F .--.--DECFSZ CONT2.--. A equação (5) permite calcular o valor de “m” arbitrando-se o valor de “n”. --.

Exsto Tecnologia . Abaixo é apresentada uma tabela resumida de códigos hexadecimais de comandos do LCD. ir para a segunda linha. possuem circuitos que controlam o display propriamente dito.. principalmente quando a quantidade e variedade de informações são grande. isto é. Outro método também muito utilizado e que. LCD’s alfanuméricos tem uma determinada “inteligência”. Embora em muitas aplicações só isso seja suficiente. esses últimos chamados displays alfanuméricos. Para a comunicação com o display são necessários 8 bits como via de dados (podendo também ser configurado para trabalhar com 4 bits). etc.1 Display de cristal Líquido Grande parte das aplicações com microcontroladores necessitam de uma interface homem-máquina. em muitas outras. um bit EN (Enable . porém. esse método se torna insuficiente. Por exemplo. e são indicados por RS = 1. Esses podem ter diferentes quantidades de linha e colunas. O display reconhece dois tipos de informação na via de dados: comandos e dados. Os comandos. que são reconhecidos quando RS = 0. ). são instruções para o display (limpar a tela. um modo bastante simples de se ter informações do sistema é através de um painel com LED´s. Para que informações do sistema sejam passadas ao usuário pode-se utilizar uma serie de recursos. aceita uma grande variedade e quantidade de informações é o Display de Cristal Líquido (LCD – Liquid Cristal Display).Microcontroladores PIC16F877A 84 4 RECURSOS AVANÇADOS 4. os dados são caracteres a serem escritos no display. Existem displays gráficos e displays que aceitam somente caracteres. cada um indicando uma determinada situação. porém muitos deles não são nada maleáveis e alguns pouco amigáveis. para que os usuários possam passar informações ao sistema e/ou receber informações dele. A 4 bits da via de dados são ligados aos bits 4 a 7 do LCD.Habilitação) e um bit RS (seleção entre dados e comandos).. e fazer com que algo seja escrito no LCD é somente o trabalho de comunica-se com esses circuitos. Existe uma grande variedade de LCD’s no mercado. ir para a décima coluna.

Para que um caracter seja escrito em uma determinada posição.Microcontroladores PIC16F877A 85 Descrição do Comando Controle do display Limpeza do Display com retorno do cursor Retorno do cursor à 1a linha e da mensagem à sua posição inicial Controle do Cursor Modo Ativo (sem cusor) Inativo RS 0 0 0 0 R/W 0 0 0 0 Código do Comando (Hexadecimal) 0C 0A.1 apresenta o circuito básico LCD. 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF A figura 7. 08 01 02 Sentido de deslocamento do cursor na entrada de um novo caracter Ativo (ligado.1 – Comandos do LCD Os endereços de cada posição no display são dados pela tabela abaixo. à esquerda Desloc. Exsto Tecnologia . fixo) Inativo Alternado Desloc. envia-se o valor dessa posição como comando e em seguida envia-se o caracter a ser escrito. à direita Retorno Piscante Para esquerda Para direita 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0E 0C 0F 10 14 02 0D 04 06 07 05 18 1C 80 C0 Deslocamento da Para esquerda mensagem com a entrada Para direita de um novo caracter Deslocamento da mensagem sem entrada de novos caracteres Endereço da primeira posição (à esquerda) Para esquerda Para direita 1a Linha 2a Linha Tabela 7.

} // seleciona comando // bits mais significativos primeiro // espera 50 us // espera 50 us // espera 50 us Exsto Tecnologia . Pino 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Símbolo Vss Vdd Vo RS R/W EN D0 D1 D2 D3 D4 D5 D6 D7 Função GND +5V Controle de contraste Seleção de modo Leitura/Escrita Habilitação Ligação com o PIC PORTE.Microcontroladores PIC16F877A 86 Figura 7. PORTD Comando. EN Verdadeiro.apresentados em forma de português estruturado: Comando: LCD_COMANDO (byte Comando) { RS Falso. Atraso de 50 us. 7 Via de Dados Tabela 7. 1 PORTD. 2 PORTD. Atraso de 50 us. 5 PORTD.1 – Esquema Básico do Display A tabela seguinte apresenta a função de cada um dos pinos do display e em como eles estão ligados ao PIC. EN Falso. 1 PORTD. 0 PORTD. 6 PORTD.2 – Conexão do LCD A comunicação com o display é feita conforme os algoritmos descritos baixo. 3 PORTD. 4 PORTD. 0 0 PORTE. Atraso de 50 us.

L1. Atraso de 50 us. // espera 50 us EN Falso.Microcontroladores PIC16F877A 87 Dados: LCD_DADO (byte Dado) { RS Verdadeiro. Enquanto EN estiver em ‘0’ (‘Falso’) qualquer mudança em RS ou na via de dados é ignorada pelo display. Nesses casos. // espera 50 us } Deverá ser criada uma função que gere um atraso de aproximadamente 50 µs. pois esse também necessita ser configurado. Em seguida coloca-se “1” em C0 e C2 e “0” em C1 e lêem-se as linhas. Existem resistores de pull-up nas entradas de forma que enquanto uma tecla não for pressionada. Para essa experiência será feito uso do teclado do kit. e assim Exsto Tecnologia . Além dessas duas sub-rotinas básicas. A varredura funciona da seguinte maneira: o teclado é organizado de forma a ter 4 colunas e 4 linhas. Começando a varredura. “1” nas coluna 1 (C1). Atraso de 50 us. // bits mais significativos primeiro Atraso de 50 us. é forçado “0” na coluna 0 (C0). Comando 0x0C: O display está ativo Comando 0x01: Limpa a tela. • • • • • • Comando 0x33: Configura o LCD para trabalha no modo 8 bits Comando 0x32: Configura o LCD para trabalha no modo 8 bits Comando 0x38: Configura o LCD para trabalha no modo 8 bits Comando 0x06: Deslocamento de cursor na entrada de novos caracteres será para a direita. e cada coluna a uma saída. 4. Cada linha é ligada a uma entrada. num total de 8 terminais. // seleciona dado PORTD Comando. Esse módulo funciona implementando um sistema de varredura que nos permite realizar a leitura de um número de teclas N utilizando menos de N entradas. a entrada ficando em aberto tem nível lógico alto. a leitura dessas teclas simplesmente conectando-as aos terminais do microcontrolador incorre na utilização de muitos terminais. Essa sub-rotina será chamada logo após a inicialização do microcontrolador. Nessa aplicação é apresentado um sistema de varredura que permite fazer um uso otimizado dos terminais do microcontrolador de foram a reduzir o número de terminais utilizados. Para o caso da placa de teclado existem 16 teclas e seus estados são lidos com apenas 4 saídas e 4 entrada. deve-se criar também uma sub-rotina de inicialização do display. Isso é importante quando existe uma grande quantidade de teclas a serem lidas e não se dispõe tanta entrada. 2 (C2) e 3 (C3) e são lidas as quatro linhas (L0. Somente para a inicialização deve-se utilizar um atraso de 5ms na rotina de envio de comando.2 Teclado Uma forma muito comum de usuário de um sistema microcontrolado passar informações ao sistema é através de teclas. // espera 50 us EN Verdadeiro. conforme a figura abaixo. L2 e L3). Uma seqüência de inicialização básica é apresentada abaixo. Em muitas aplicações o número teclas existentes pode ser bastante grande.

Esquema Simplificado do Teclado Exsto Tecnologia . devido aos resistores de pull-up. Nos momentos em que é feita a leitura das linhas podemos determinar se uma tecla está pressionada e qual é essa tecla da seguinte maneira: admitindo que a tecla está ligada a coluna que está em zero no momento a linha ligada a ela estará em também.Microcontroladores PIC16F877A 88 sucessivamente.3 – Funcionamento do LCD O circuito do teclado é apresentado na figura abaixo..2 . As linhas que contém teclas que não estão pressionadas estarão em “1”. Figura 7. Seguindo esse raciocínio podemos gerar a seguinte tabela: C3 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 C2 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 C1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 C0 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 L3 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 L2 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 L1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 L0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 Tecla 1 2 3 A 4 5 6 B 7 8 9 C */F 0 #/E D Tabela 7.

que quando acionado. isto é. seleciona a medida. o vetor de reset (0004h).4 Entrada PORTB.5 Entrada PORTB. executando o código armazenado em uma posição de memória vinculada a interrupção e depois retornam a execução normal do programa.0 Saída PORTB. corre-se o risco de pressionar o botão durante esse processo de forma que o microcontrolador não tome conhecimento deste pressionamento. Uma interrupção faz exatamente isso: interrompe a execução normal do programa para executar tarefas de maior prioridade no momento. o microcontrolador aciona uma rotina para ler o estado de um botão. O ideal é que o processo de leitura fosse contínuo e que pudesse ser interrompido para executar a rotina referente ao acionamento do botão quando o mesmo fosse pressionado.Microcontroladores PIC16F877A 89 No programa que utilizar leitura de teclado deve-se ativar os resistores de pull-up do portal B. parando a execução normal no momento em que ocorre o evento. As interrupções podem ser vistas como chamadas de sub-rotinas realizadas pelo hardware. são executadas as rotinas que se deseja associar ao evento causador da interrupção.6 Entrada PORTB. Observe que a distância entre o vetor de inicialização (0000h) e o vetor de reset (0004h) é de apenas 4 endereços. No intervalo entre o vetor de inicialização e o vetor de reset é colocado um desvio para um endereço após as rotinas de interrupção a partir do qual o programa realmente começa. Desse endereço em diante é feito o tratamento de interrupção. NOT_RBPU O teclado está ligado ao PIC seguindo a tabela 7.4: Teclado C3 C2 C1 C0 L0 L1 L2 L3 PIC I/O PORTB.2 Saída PORTB.7 Entrada Tabela 7.4 –Conexões do teclado 4. Isso é feito zerando o bit NOT_RBPU do registro OPTION_REG. Dessa forma quando as interrupções estão desabilitadas o PC passa por 0004h normalmente durante a execução de um programa. Quando ocorre um pedido de interrupção para a CPU do PIC16F877A. o programa é desviado para um endereço pré-estabelecido. Entre cada processo de leitura de medidas. assim BCF OPTION_REG. Quando se faz necessário o uso de interrupções. as rotinas de tratamento de interrupção são colocadas a partir do vetor de reset 0004h. que permitem desenvolver códigos mais elaborados e profissionais. Caso contrário. Suponhamos uma situação em que o microcontrolador realize medidas para mostrá-las em um display.3 Saída PORTB. Ela pode ser chamada por determinados eventos. Exsto Tecnologia . Se o processo de leitura levar alguns segundos.1 Saída PORTB. o teclado não funcionará corretamente.3 Interrupções Interrupções são poderosos recursos presentes nos sistemas computacionais. garantindo tratamento imediato a eventos de maior prioridade.

Interrupção do timer 2. Interrupção de transmissão serial. Interrupção da porta paralela escrava. e o outro é o flag indicador de interrupção. Interrupção do módulo CCP1.Microcontroladores PIC16F877A 90 O PIC 16F877A possui 15 fontes de interrupções: • • • • • • • • • • • • • • • Interrupção do timer 0. Interrupção de recepção serial. PEIE habilita as interrupções dos periféricos. GIE. que é setado quando ocorre a interrupção em questão. alterado somente pelo programa. por sua vez. A cada interrupção são associados dois bits.9 mostra a lógica como se relacionam as interrupções. Existem mais dois bits envolvidos no trabalho com interrupção. se GIE estiver em ‘1’ as interrupções que estiverem habilitadas gerarão pedidos de interrupção à CPU. PEIE e GIE. Interrupção da comunicação SPI. para seu controle. porém. A Figura 2. Interrupção do módulo comparador analógico. se GIE estiver em ‘0’ todas interrupções estão desabilitadas. Interrupção do timer 1. Interrupção do módulo CCP2. Interrupção externa (RB0/INT). sendo que um é o bit de habilitação. Interrupção por mudança de estado (bits 4 a 7 do portal B). Figura 8.1 – Lógica de Interrupções Exsto Tecnologia . Como pode ser notado. Esse último bit pode. Interrupção por colisão no barramento I2C. realiza a habilitação global. ser alterado também pelo programa. Interrupção do conversor analógico para digital. Interrupção da memória EEPROM.

Isso porque o tratamento de interrupção deve tomar medidas emergenciais. Pela ordem em que esses bits são testados pode-se atribuir a prioridade à interrupção. As demais interrupções são internas. Nada que não seja estritamente necessário deve ser trabalhado na interrupção. depois de tratar uma determinada interrupção deve-se zerar o flag associado a ela. que são causadas diretamente por eventos externos ao microcontrolador. a interrupção é chamada novamente. Quando uma interrupção é chamada. Quando ocorre uma interrupção o endereço chamado é (sempre) o vetor de interrupção (0004h). a rotina de tratamento de interrupção deve obrigatoriamente começar nesse endereço. Esse processo é chamado salvamento de contexto. se for uma interrupção interna. Ao contrário de alguns microcontroladores. Conseqüentemente. Todo esse cuidado é necessário por que uma interrupção pode ocorrer a qualquer momento. e de Exsto Tecnologia . etc). Caso contrário. As interrupções externas. Finalmente. como o desvio para o endereço 0004h. e só se pode tratar uma por vez. por exemplo. quando ocorre uma interrupção nenhum registro é automaticamente salvo. O tempo decorrido entre a ocorrência real do evento que causa interrupção e início de seu tratamento efetivo é chamado de latência da interrupção. pois cada vez que há o retorno de interrupção (instrução RETFIE). Assim. Um outro cuidado que deve ser tomado quando se trabalha com interrupções é não executar rotinas muito grandes. é necessário considerar que na realidade o tratamento de interrupção não ocorre no exato momento em que a interrupção acontece. Outra prática recomendada é de nunca usar dentro de uma rotina de tratamento de interrupção registros que são utilizados em outras partes do programa. Assim é importante salvar os registros W e STATUS antes que seja realizado qualquer tratamento de interrupção. "estouro" de timer. e exatamente quando esse trecho é execuatdo ocorre o pedido de interrupção que altera o valor do registro em questão.Microcontroladores PIC16F877A 91 Atenção: Os flags das interrupções são setados quando ocorre um evento que geraria a interrupção. Para a determinar qual interrupção ocorreu testa-se os bits de flags de todas as interrupções ativas. a checagem dos eventos que causam a interrupção obedece a uma varredura interna. quando retornar a execução do programa normal o valor do registro terá sido alterado. mesmo que essa interrupção não esteja habilitada. Também é recomendável que o registro STATUS seja zerado. Primeiramente. Deve-se notar que o que ativa a chamada de interrupção é a existência de um flag setado de uma interrupção habilitada. bem como qualquer outro SFR que for usado dentro e fora das rotinas de interrupção. causadas pelos periféricos para indicar determinados eventos (chegada de dado pelo portal serial. Se outra interrupção ocorrer nesse intervalo de tempo. a habilitação das demais fica desativada. isto é. e só é reativada após a execução do RETFIE. Assim. É necessário então que existam variáveis criadas para salvar esses registros. são a interrupção INT em RB0 e a interrupção por mudança de estado do portal B. ela é tratada após RETFIE. algumas ações devem ser realizadas. se durante a execução de um trecho do programa um determinado endereço de memória (variável do programa ou SFR) é usado. ou seja. após a real ocorrência de uma interrupção ela só vai começar a ser tratada 3 ciclos de máquina após sua ocorrência. Portanto. e isso principalmente porque podem ocorrer várias interrupções em seguida. E depois de detectado o evento. sendo que as interrupções testadas em primeiro lugar têm prioridade maior. o programa fica travado.

Pode ser lido ou escrito. isto é. na inicialização programa. além de GIE e PEIE encontram-se em quatro registros.75 ciclos de máquina se for uma interrupção externa. Essas rotinas deverão seguir as recomendações dadas acima e deve-se salvar os registros de interesse conforme exposto. visto que quando GIE volta a ‘1’ e existe algum flag de interrupção habilitada também em ‘1’ imediatamente o processo de tratamento de interrupção recomeça e será repetido até que todas as interrupções pendentes sejam tratadas.3. porém que um periférico seja configurado. mudança de estado do portal B e a interrupção externa INT. É importante lembrar que as interrupções habilitadas somente causam chamadas de interrupção se o bit de habilitação global (GIE) estiver habilitado. e isso pode ser feito em dois momentos.1 Utilização das Interrupções Para trabalhar com uma interrupção deve-se primeiramente configurar o periférico associado a ela. Por outro lado. e nesse caso sua habilitação deve ser feita na inicialização. Os pedidos de interrupção que porventura ocorram nesse intervalo não são descartados. apresentados abaixo. o controle de interrupção de periféricos e o controle geral de interrupções. deve-se fazer o “tratamento” de interrupção. 4. para se determinar qual interrupção basta testar os flags das interrupções habilitadas e tratar a que ocorreu. Nessa situação basta habilitar. ou re-configurado. automaticamente GIE é zerado. Os flags indicadores de interrupção devem ser zerados por software. Nada impede. Finalmente. Pode-se determinar que uma interrupção esteja ativa durante toda a execução do programa. Esses tempos devem ser considerados em aplicações onde a precisão de tempo é importante. o que é feito normalmente uma única vez. a interrupção no momento oportuno. só sendo setado novamente pela instrução RETFIE. construir as Rotinas de Tratamento de Interrupção (RTI) que serão chamadas quando ocorrerem as interrupções habilitadas.Microcontroladores PIC16F877A 92 3 a 3. Somente uma interrupção pode ser tratada por vez e enquanto uma interrupção é tratada (intervalo que vai desde sua chamada até o retorno realizado pela interrupção RETFIE) não ocorre outra chamada. O próximo passo é habilitar as interrupções a serem utilizadas. em algumas situações deseja-se que a interrupção seja ativada somente a partir de um dado momento ou ainda que seja ativada e posteriormente desativada. R/W – 0 GIE Bit 7 R/W – 0 PEIE R/W– 0 T0IE R/W – 0 INTE R/W – 0 RBIE R/W – 0 T0IF R/W – 0 INTF R/W – x RBIF Bit 0 INTCON GIE: Habilitação global das interrupções o 1 = interrupções habilitadas Exsto Tecnologia . Isso porque quando uma interrupção é chamada. em qualquer ponto programa. Os bits de habilitação das interrupções e respectivos flags. ou desabilitar. Como para cada interrupção existe um flag que indica sua ocorrência. INTCON (presente em todos os bancos) Contém o controle das interrupções do timer 0.

Microcontroladores PIC16F877A 93 o 0 = interrupções desabilitadas PEIE: Habilitação das interrupções de periféricos o 1 = interrupções de periféricos habilitadas o 0 = interrupções de periféricos desabilitadas T0IE: Interrupção do timer 0 (por overflow) o 1 = interrupção habilitada o 0 = interrupção desabilitada INTE: Interrupção RB0/INT o 1 = interrupção habilitada o 0 = interrupção desabilitada RBIE: Interrupção por mudança de estado no portal B o 1 = interrupção habilitada o 0 = interrupção desabilitada T0IF: flag da interrupção do timer 0 o 1 = ocorreu overflow de timer 0 o 0 = não ocorreu overflow de timer 0 INTF: flag da interrupção INT o 1 = ocorreu interrupção externa o 0 = não ocorreu interrupção externa RBIF: flag da interrupção por mudança de estado no portal B o 1 = pelo menos um dos bits RB4~RB7 mudou o 0 = nenhum dos bits RB4~RB7 mudou PIE1 (Banco 1) Contém bits de habilitação de interrupções de periféricos. R/W – 0 PSPIE Bit 7 R/W – 0 ADIE R/W– 0 RCIE R/W – 0 TXIE R/W – 0 SSPIE R/W – 0 CCP1IE R/W – 0 TMR2IE R/W – 0 TMR1IE Bit 0 PIE1 EEIE: Interrupção de operação de escrita na EEPROM o 1 = interrupção habilitada o 0 = interrupção desabilitada CMIE: Interrupção do módulo comparador analógico o 1 = interrupção habilitada o 0 = interrupção desabilitada RCIE: Interrupção de recepção da USART o 1 = interrupção habilitada o 0 = interrupção desabilitada TXIE: Interrupção de transmissão da USART o 1 = interrupção habilitada o 0 = interrupção desabilitada CCP1IE: Interrupção do CCP1 o 1 = interrupção habilitada o 0 = interrupção desabilitada TMR2IE: Interrupção do Timer 2 o 1 = interrupção habilitada o 0 = interrupção desabilitada TMR1IE: Interrupção do Timer 1 Exsto Tecnologia . Essas interrupções só ocasionam chamada se PEIE estiver em ‘1’.

Essas interrupções só ocasionam chamada se PEIE estiver em ‘1’.Microcontroladores PIC16F877A 94 o o PIR1 (Banco 0) 1 = interrupção habilitada 0 = interrupção desabilitada Contém flags das interrupções de periféricos. R/W – 0 Bit 7 R/W – 0 CMIE R/W– 0 - R/W – 0 EEIE R/W – 0 BCLIE R/W – 0 - R/W – 0 - R/W – 0 CCP2IE Bit 0 PIE1 Exsto Tecnologia . R/W – 0 EEIF Bit 7 R/W – 0 CMIF R/W– 0 RCIF R/W – 0 TXIF U–0 - R/W – 0 CCP1IF R/W – 0 TMR2IF R/W – 0 TMR1IF Bit 0 PIR1 EEIE: Flag de operação de escrita na EEPROM o 1 = operação de escrita completa o 0 = operação de escrita incompleta ou não iniciada CMIF: Flag do módulo comparador analógico o 1 = houve mudança no estado das saída dos comparadores o 0 = não houve mudança no estado das saída dos comparadores RCIF: Interrupção de recepção da USART o 1 = o buffer de recepção está cheio o 0 = o buffer de recepção está vazio TXIF: Interrupção de transmissão da USART o 1 = o buffer de recepção está vazio o 0 = o buffer de recepção está cheio CCPIF Flag do CCP1 o Modo Captura 1 = ocorreu a captura do registro TMR1 0 = não ocorreu a captura do registro TMR1 o Modo Comparador 1 = ocorreu uma comparação de igualdade com TMR1 0 = não ocorreu uma comparação de igualdade com TMR1 o Modo PWM Não utilizado TMR2IF: Flag de igualdade entre PR2 e TMR 2 o 1 = ocorreu igualdade entre PR2 e TMR2 o 0 = interrupção desabilitada TMR1IF : Flag de overflow de Timer 1 o 1 = ocorreu overflow de TMR1 o 0 = não ocorreu overflow de TMR1 PIE2 (Banco 1) Contém bits de habilitação de interrupções de periféricos.

. R/W – 0 Bit 7 R/W – 0 CMIF R/W– 0 - R/W – 0 EEIF U–0 BCLIF R/W – 0 - R/W – 0 - R/W – 0 CCP2IF Bit 0 PIR1 CMIF: Flag do módulo comparador analógico o 1 = houve mudança no estado das saída dos comparadores o 0 = não houve mudança no estado das saída dos comparadores EEIF: Flag de operação de escrita na EEPROM o 1 = operação de escrita completa o 0 = operação de escrita incompleta ou não iniciada BCLIE: Flag de colisão no barramento I2C o 1 = ocorreu uma colisão no barramento I2C (estando o módulo SSP configurado no modo I2C Master) o 0 = não ocorreu uma colisão no barramento I2C CCPIF Flag do CCP1 o Modo Captura 1 = ocorreu a captura do registro TMR1 0 = não ocorreu a captura do registro TMR1 o Modo Comparador 1 = ocorreu uma comparação de igualdade com TMR1 0 = não ocorreu uma comparação de igualdade com TMR1 o Modo PWM Não utilizado O trecho de código abaixo trata salvamento de contextos e pode ser utilizado como base para rotinas de tratamento de interrupção.Microcontroladores PIC16F877A 95 CMIE: Interrupção do módulo comparador analógico o 1 = interrupção habilitada o 0 = interrupção desabilitada EEIE: Interrupção de escrita na EEPROM o 1 = interrupção habilitada o 0 = interrupção desabilitada BCLIE: Interrupção de colisão no barramento I2C o 1 = interrupção habilitada o 0 = interrupção desabilitada CCP2IE: Interrupção do CCP2 o 1 = interrupção habilitada o 0 = interrupção desabilitada PIR2 (Banco 0) Contém flags das interrupções de periféricos. . Definição das variáveis para salvamento CBLOCK 20h INT_W INT_STATUS INT_FSR ENDC . .. Vetor de interrupção Exsto Tecnologia . Tratamento de interrupção org 0004H .

Microcontroladores PIC16F877A

96

MOVWF MOVFW MOVWF CLRF MOVFW MOVWF

INT_W STATUS INT_STATUS STATUS FSR INT_FSR

; ; ; ; ; ;

salva W em INT_W \ > salva STATUS em INT_STATUS zera STATUS \ > salva FSR em INT_FSR

; \ ; > tratamento das interrupções ; / MOVFW MOVWF MOVFW MOVWF MOVFW INT_STATUS STATUS INT_FSR FSR INT_W ; \ ; > recupera STATUS ; \ ; > recupera FSR ; recupera W ; retorno de interrupção

RETFIE

4.3.2 Interrupção externa em RB0
Das duas interrupções que são acionadas diretamente por elementos externos ao microcontrolador, a primeira que será estudada é chamada simplesmente de INT e é multiplexada com o bit 0 do portal B. Essa interrupção destina-se a ser usada para a chamadas de interrupções provenientes das diversas partes do circuito. Quando existem várias fontes de interrupção deve-se montar uma lógica externa, de forma a fazer uma operação OU entre todas as fontes de interrupção com uma única saída ligada a INT. A interrupção ocorre na mudança de estado lógico no terminal PORTB,0. Isto significa que não é um determinado estado lógico (‘0’ ou ‘1’) que causa a chamada da interrupção; o flag que indica a interrupção INT (o bit INTF do registro INTCON) não é uma “cópia” do estado de RB0. A interrupção pode ser configurada para “disparar” na transição de subida (0 para 1) ou decida (1 para 0). Isso é feito configurando o bit INTEDG de OPTION_REG conforme mostrado abaixo. INTEDG = 0 : transição de descida INTEDG = 1 : transição de subida A habilitação da interrupção INT é feita setando o bit INTE de INTCON. O bit de habilitação global das interrupções, GIE de INTCON, também deve ser setado. Da mesma forma que a interrupção por mudança de estado, INT pode tirar o processador do modo SLEEP.

4.3.3 Interrupção por mudança no portal B
Outra interrupção externa existente no microcontrolador é a interrupção por mudança na porta B. Essa interrupção é chamada toda vez que ocorre uma mudança (seja ela qual for) nos bits 4, 5, 6 e 7 do portal B. Essa interrupção pode ser utilizada da mesma maneira que a interrupção INT, com a limitação de que a interrupção irá ocorrer toda vez que acontecer uma transição de alto para baixo ou de baixo para alto em algum pino. Outra possibilidade de uso da interrupção por mudança de estado no portal B é em conjunto com teclados matriciais. O teclado do kit, conforme estudado, tem suas linhas conectadas aos pinos do portal B associados à interrupção. Dessa forma, quando uma tecla é pressionada ocorre uma chamada de interrupção, bastando para isso apenas que as colunas do teclado estejam todas em nível lógico baixo. Dentro da rotina de tratamento de interrupção pode-

Exsto Tecnologia

Microcontroladores PIC16F877A

97

se executar a rotina de leitura do teclado, identificando a tecla lida e retornando as colunas a nível lógico baixo. Esse funcionamento é bastante útil em sistema que ficam muito tempo ociosos. Nesses casos é possível colocar o microcontrolador em modo de baixo consumo e “acorda-lo” somente quando uma tecla for pressionada, num processo parecido ao utilizado em celulares.

Exsto Tecnologia

Microcontroladores PIC16F877A

98

5 PERIFÉRICOS DO PIC16F877A
5.1 Timers
Um dos periféricos mais comuns em qualquer linha de microcontroladores é Timer/Couter – Temporizador/ Contador. Trata-se de nada mais, nada a menos, que um componente contador dentro do microcontrolador. Se atuar fazendo contagem de eventos externos, aleatórios, é dito no modo contador (Counter). Se o evento que causa a contagem for um sinal periódico de freqüência conhecida, gerado dentro ou fora do microcontrolador, é dito no modo temporizador (timer). O PIC16F877A possui três timer´s: timer 0, Timer 1 e Timer 2. A operação dos três é bastante semelhante, bastando estudar apenas um (no caso o Timer 1) para se estar habilitado a trabalhar com os outros dois.

5.1.1 Timer 1
O Timer 1 é um temporizador/contador (timer/counter) de 16 bits. O sinal de clock pode ser selecionado como interno ou externo. Caso seja usada a fonte de clock interna, o sinal será o do clock de periféricos, que corresponde à freqüência do oscilador dividida por 4. No caso kit, que utiliza um cristal de 4MHz, trata-se de um sinal com período de 1 microssegundo. Já no caso de sinal de clock externo, o sinal deve ser aplicado ao terminal RC0. Quando se utiliza fonte de clock externo é possível selecionar em qual transição (subida ou descida) o timer incrementa. Existem ainda uma interrupção no overflow do timer e uma pré-escala programável que permite dividir a freqüência do sinal de clock até por 8. A figura 9.1 apresenta o diagrama elétrico simplificado do timer 1. O contador propriamente dito é composto pelo par de registros TMR1H e TMR1L. Quando ocorre o overflow desse timer o flag TMR1IF é setado, podendo ocasionar uma interrupção. Para economia de energia o timer pode ser desabilitado através do bit TMR1ON, que inibe os pulsos de clock para o timer. O sinal de clock, caso seja externo, pode ser sincronizado ou não com o clock interno; essa escolha é feita através do bit T1SYNC. A pré-escala permite dividir a freqüência do sinal de clock por 1, 2, 4 ou 8. Através do bit TMR1CS seleciona-se se a fonte de clock é interna ou externa. Sendo externo, o clock pode ser gerado por qualquer circuito conectado a RC0 ou por um oscilador próprio do timer, que é ativado por T1OSCEN. Esse oscilador permite colocar um cristal (tipicamente de 32.768 Hz) entre RC0 e RC1, e que pode operar quando o microcontrolador estiver em SLEEP, ou seja, com o oscilador principal desligado. Exsto Tecnologia

Microcontroladores PIC16F877A 99 Figura 9. Valor Taxa de divisão T1CKPS1 T1CKPS0 0 0 1:1 0 1 1:2 1 0 1:4 1 1 1:8 Tabela 9. conforme mostrado na tabela 9.4). através do bits T1CKPS1 e T1CKPS0. detalhado abaixo.1. T1OSCEN: Controle do oscilador do Timer 1 o 1 = oscilador ligado o 0 = oscilador desligado T1SYNC: Controle de sincronismo de sinal de clock externo o Se TMR1CS = 1 1 = modo assíncrono 0 = modo síncrono o Se TMR1CS = 0 Esse bit é irrelevante TMR1CS: seleção de fonte de clock o 1 = Clock externo no terminal RB6/T1CKI (transição de subida) o 0 = Clock de periféricos interno (Fosc/4) TMR1ON: habilitação do Timer 1 o 1 = timer ligado o 0 = timer desligado A pré-escala do timer 1 permite a seleção de 4 fatores de divisão.1 – Pré-escala do timer 1 Exsto Tecnologia . U–0 Bit 7 U–0 - R/W– 0 T1CKPS1 R/W – 0 T1CKPS0 R/W – 0 T1OSCEN R/W – 0 T1SYNC R/W – 0 TMR1CS R/W – 0 TMR1ON Bit 0 T1CON T1CKPS1: T1CKPS0: seleção da taxa de divisão da pré-escala (tabela 18.1 – Diagrama em blocos do Timer 1 O registro para controle do timer é chamado T1CON.

O timer 1 tem três modos de operação: temporizador contador o síncrono o assíncrono No modo temporizador. Podemos trabalhar no modo síncrono ou assíncrono. o sinal de clock utilizado é o clock de periférico (TMR1CS = ‘0’). A tabela 9.4. O timer é incrementado a cada transição de subida nesse pino. além da pré-escala. se o valor da pré-escala for diferente de 1.2 resume os limites de operação do timer 1 nos vários modos. N é 1.Microcontroladores PIC16F877A 100 Há também o bit TMR1ON. reduzindo assim o consumo de energia. Exsto Tecnologia .2 – Requisitos mínimos para o timer 1 Novamente devemos tomar cuidados contra bouncing quando a fonte do sinal de contagem for mecânica. que permite desligar todo o timer 1 quando este não for usado. por sua vez. N é o fator da pré-escala. porém realizando contagens de 0000h á FFFFh (16 bits). Nesse modo. A seleção de modo é feita pelo bit T1SYNC. utiliza como fonte de clock o sinal aplicado ao terminal RB6. inclusive podendo acionar a interrupção. seu funcionamento é bem semelhante ao do timer 0. com ou sem pré escala. Valor mínimo Unidade ns ns ns ns ns 0. Nestas condições. Como o modo síncrono depende do sinal de clock. o contador trabalha de forma completamente independente do clock do microcontrolador. No modo assíncrono. O modo contador. os tempos mínimos em alto e em baixo são de 30ns e o período mínimo é de 60ns. sendo que ‘0’ indica modo síncrono e ‘1’ modo assíncrono. fazendo o microcontrolador sair do modo de baixo consumo. No modo síncrono o sinal de clock é amostrado duas vezes a cada ciclo de instrução. se o microcontrolador for colocado em modo SLEEP (baixo consumo) o timer para de funcionar. conforme é mostrado na tabela 9. Se a taxa de divisão do pré-escala for 1.5TCY + 20 15 30 Período TCY + 40 N Assíncrono 60 Tabela 9. significa que o sinal de entrada é aplicado diretamente ao circuito de sincronismo. Sem pré-escala. Nesse caso. os tempos mínimo de alto e baixo são de 10 ns e o período mínimo depende do fator de divisão. Ele também pode ser utilizado para parar o timer em algumas situações que trataremos mais adiante. Essa configuração pode ser utilizada no modo SLEEP. o sinal aplicado deve ter tempos em alto e em baixo de no mínimo 2 ciclos de instrução mais 20 ns. Por outro lado. Parâmetro Largura de pulso (alto e baixo) Condição Síncrono Sem pré-escala Síncrono Com pré-escala Assíncrono Síncrono.

que nos permite ligar um cristal entre pinos RC0 e RC1. carregando o valor inicial de 32768 (8000h) nos registros do timer ou utilizando o módulo CCP do modo de comparação. Além disso. Valor Modo Exsto Tecnologia . Para ativar o oscilador.2 Módulo CCP No PIC16F877A existem dois módulos CCP. podemos citar como exemplos de sua utilização: geração de sinais de PWM. Para exemplificar a versatilidade desse periférico. para gerar uma base de tempo independente do clock do microcontrolador.Microcontroladores PIC16F877A 101 5.1. 5. existe uma interrupção associada ao módulo CCP. Esse oscilador pode operar durante o modo SLEEP. os pinos RC0 E RC1 deixam de trabalhar como I/O e seus estados no PORTB ficam irrelevantes. Existem três modos de operação: • Captura • Comparação • PWM (Modulação por largura de pulso) Esse periférico é controlado por dois registros que operam conjuntamente como um parâmetro de 16 bits (CCP1H e CCP1L) e um registro de controle (CCP1CON). O módulo CCP (Captura. podendo ser usado para despertar o microcontrolador periodicamente.768 Hz.2 Oscilador do timer 1 O timer 1 foi equipado com um circuito oscilador próprio. A principal função dessa característica é implementar um relógio de tempo real. que é disparada em situações diferentes para cada modo. Quando isso ocorre. O bit indicador de overflow do timer é TMR1IF de PIR1. U–0 Bit 7 U–0 R/W – 0 CCP1Y R/W – 0 CCP1M3 R/W – 0 CCP1M2 R/W – 0 CCP1M1 R/W – 0 CCP1M0 Bit 0 R/W– 0 CCP1X CCP1CON Os bits CCP1X e CCP1Y são utilizados somente no modo PWM.768 Hz são necessários dois capacitores de 15pF dos terminais do cristal a terra.3 Interrupção O bit de habilitação da interrupção do timer é o TMR1IE do registro PIE1. Tanto que esse oscilador foi desenvolvido para trabalhar com um cristal de 32. medida de freqüência. Além do cristal 32. 5. dentre várias. Por fim.1. o bit T1OSCEN deve ser setado. mas todo o raciocínio é válido para CCP2. conforme é apresentado na tabela 10. geração de sinais analógicos. Esse valor é exatamente 215. chamados CCP1 e CCP2. Dessa forma podemos gerar uma interrupção a cada segundo. o módulo CCP fica desativado. Deve-se observar que após o reset. Comparação e PWM) permite realizar uma série de funções por hardware. Os demais bits implementados servem para seleção de modos de operação. nos modos de captura e comparação é usado e no modo PWM o timer 2 fornece a base de tempo.1. Aqui será tratado o CCP1. medida de largura de pulso.

Além disso. Sua contagem só pode ser zerada com a mudança de modo do CCP. Esse procedimento pode ser utilizado para medir velocidade e freqüências (nesse caso temos o período e sabemos que f = 1/T). O modo captura pode ser utilizado para determinar a diferença de tempo entre dois eventos. Essa pré-escala pode ser útil para trabalhar com sinais de freqüências altas. Isso pode ser feito de duas formas.1 apresenta o diagrama em blocos para o modo de captura. o flag CCP1IF é setado. que é configurado conforme a tabela 10.1 Modo captura No modo captura. Os modos onde o evento de captura é a ocorrência de 4 ou 16 transições podem ser vistos como tendo uma pré-escala na entrada.1 pode ser a ocorrência de : • • • • 1 transição de descida no terminal RB3/CCP1 1 transição de subida no terminal RB3/CCP1 4 transições de subida no terminal RB3/CCP1 16 transições de subida no terminal RB3/CCP1 Para operação nesse modo. como será mostrado. Exsto Tecnologia . Outra forma é deixar o timer 1 incrementado livremente e capturar seu valor nos dois eventos. Fazendo uma subtração entre os dois valores capturados.2. temos o tempo entre os eventos. o valor do timer 1(TMR1H:TMR1L) é armazenado nos registros CCP1H:CCP1L quando ocorre um “evento”.1 – Modos de operação do módulo CCP 5. Esse evento. permitindo acionar a interrupção. A figura 10.Microcontroladores PIC16F877A 102 CCP1M3 0 0 0 0 0 1 1 1 1 1 CCP1M2 0 1 1 1 1 0 0 0 0 1 CCP1M1 CCP1M0 0 0 Módulo CCP desligado Transição de descida 0 0 Captura Transição de subida 0 1 4 transições de subida 1 0 16 transições de subida 1 1 0 0 Comparação Pino de saída em ‘1’ na coincidência Pino de saída em ‘0’ na coincidência 0 1 Somente seta flag de interrupção 1 0 Reset timer (Special trigger) 1 1 x x PWM Tabela 10. No primeiro evento. o terminal RB3/CCP1 deve estar configurado como entrada e o timer deve estar no modo temporizador ou no modo contador síncrono. o valor capturado do timer 1 multiplicado pelo período do seu clock corresponde ao tempo transcorrido entre os dois eventos. o timer é resetado e no segundo.

5. o pino deve ser configurado como saída. Nesse caso.3 Modo PWM O módulo PWM permite utilizar sinais modulados em largura de pulso (PWM – Pulse Width Modulation). Quando eles coincidem.2. A figura 10.2. pois o timer 1 (como temporizador ou contador síncrono) não opera durante o SLEEP. que consiste em representar um valor pelo duty-cicle (tempo em alto) de um trem de Exsto Tecnologia . Quando optamos por zerar o timer 1. Figura 10. é setado o flag CCP1IF.Microcontroladores PIC16F877A 103 Figura 10. o par de registros do módulo CCP (CCP1H:CCP1L) é constantemente comparado com o par de registros do timer 1 (TMR1h:TMR1L). zera a pré-escala.2 Modo comparação Nesse modo. o flag é setado. Além disso.2 – Diagrama do modo comparação 5. Quando se seleciona os modos que forçam estados (‘1’ ou ‘0’) no pino RB3/CCP1. se ocorrer um evento. o pino fica no estado oposto ao desejado até que ocorra a coincidência. mas o valor de Timer 1 não é capturado. No reset. podemos zerar o timer 1 ou forçar um estado no pino RB3/CCP1.2 apresenta o diagrama do modo comparação. o funcionamento é muito parecido com o do timer 2 em relação ao registro PR2.1 – Diagrama do modo captura Durante o modo SLEEP.

4. Cada vez que TMR2 coincide com PR2. sua resolução máxima é de 10 bits. Quando há a coincidência. Esse processo pode ser observado na figura 10. Também é necessário que o pino RB3/CCP1 seja configurado como saída. Por exemplo. e assim por diante. controle de motores. Isso pode ser observado no diagrame em blocos do PWM. É chamada de modulação porque permite carregar uma informação (expressa no duty-cicle) em uma portadora (trem de pulsos). O módulo CCP utiliza o Timer 2 para conseguir essa base. Vamos imaginar que um sinal PWM é aplicado a uma lâmpada DC. O duty-cicle é conseguido comparando o CCPR1H concatenado com dois bits de latch com TMR2 concatenado com mais dois bits.3. Esse valor é atualizado em CCPR1H e nos bits de latch a cada período. 1023 corresponde a 100% de duty-cicle. A maior parte das aplicações de PWM para microcontroladores se aproveita da propriedade da energia de um sinal retangular ser proporcional ao seu duty-cicle (a energia de um sinal está relacionada com a área entre o sinal e o eixo do tempo). Exsto Tecnologia . O duty-cicle é configurado através de CCP1L e dos bits 4 e 5 de CCP1CON. 99%. podemos determinar a quanto que corresponde 30%. As concatenações nos dão 10 bits de resolução. Isso permite que geremos desde níveis analógicos fixos até sinais mais complexos. na figura 10. já um sinal com 70% de tempo em alto entrega a lâmpada 70% da potência máxima. também proporcionais ao duty-cicle.Microcontroladores PIC16F877A 104 pulsos de freqüência fixa. podemos obter níveis analógicos. admitindo que estamos trabalhando com o PWM do PIC. etc. O registro CCPR1H não é acessível para leitura no modo PWM. o pino RB3/CCP1 é setado e TMR2 é resetado. o pino RB3/CCP1 é zerado. etc.3 – Diagrama em blocos no modo PWM A geração do sinal PWM se dá da seguinte maneira. se o sinal for filtrado. Um duty-cicle de 100% (sinal sempre em ‘1’) fará a lâmpada acender em sua potência máxima. Usando uma regra de três simples. O PWM precisa de uma base de tempo que dará a freqüência do sinal. como tons DTMF (de telefonia). da pré-escala ou gerados pelos ciclos Q. ou seja. Figura 10. Essa propriedade é utilizada no acionamento de cargas DC. Outra característica importante do PWM é que. 25%. Isso nos dá a freqüência do sinal.

1) Para encontrar o valor de PR2 a partir de um dado valor de período pode ser usada a equação 10. dado um duty-cicle em porcentagem (DC%).Microcontroladores PIC16F877A 105 Figura 10. Geralmente se especifica o duty-cicle em porcentagem do tempo total. o que gerará um pequeno erro entre a freqüência desejada e a real.3 TDC = TPWM × DC % 100 (10.4. podemos calcular os valores em cada registro. Com valores diferentes de pré-escala podemos chegar a valores menores que 256 e a aproximações que levem a um erro menor. TPWM = ( PR 2 + 1) × 4 × TOSC × (TMR 2 PS ) Onde: TPWM : período do PWM TOSC: período do oscilador TMR2PS: fator de pré-escala do timer 2 (10. Logo. De posse desses dois parâmetros. em alguns casos será necessário arredondar esse valor.2) O duty-cicle por sua vez é configurado através de CCPR1L e dos bits 4 e 5 de CCP1CON. O período é o inverso da freqüência e é configurado através de PR2 e da pré-escala do TMR2 e pode ser calculado através da equação 10.1.4 – Sinal PWM Configurar o PWM é estabelecer sua freqüência e seu duty-cicle.2. PR 2 = TPWM −1 4 × TOSC × TMR2 PS (10.3) Esse tempo também pode ser calculado pela equação 10. Assim. Valor de PR2 deve ser inteiro e menor que 256.4) Exsto Tecnologia . TDC = DC[9 : 0] × TOSC × TMR2 PS Onde: (10. o tempo correspondente a ele é encontrado pela equação 10.

5) O período (e conseqüentemente a freqüência) é dado pelo registro PR2. Teremos um PWM de 8 bits. 5. dada em bits. DC[9 : 0] = T DC TOSC × TMR 2 PS (10. O exemplo clássico são os barramentos dos PC´s. 5. o valor de DC[9:0] é dado pela equação 10. Como a informação toda é enviada de uma só vez.2. na verdade trabalhamos com menos de 10 bits. Esse tipo de condução exige pouco ou nenhum preparo para o envio.Microcontroladores PIC16F877A 106 TPWM : período do PWM TOSC: período do oscilador TMR2PS: fator de pré-escala do timer 2 DC[9:0] : é um valor de 10 bits obtido acrescentando os bit 5 e 4 a esquerda de CCP1RL Dispondo do tempo do duty-cicle. A resolução. visto que os dados são tratados dentro do processador de forma paralela. log( RESOLUÇÃO = FOSC ) FPWM log( 2) (10. facilmente reconhecíveis pelas diversas trilhas que correm paralelas na placa de circuito impresso.3 Comunicação Serial A comunicação entre circuitos eletrônicos digitais pode ser feita basicamente de duas maneiras: de forma paralela ou serial.6. Assim a interrupção significa: • Modo Captura: a ocorrência de uma captura • Modo Comparação: coincidência entre TMR1H:TMR1L e CCPR1H:CCP1L Modo PWM: não há interrupção associada a esse modo. Por exemplo.5. Exsto Tecnologia .1 Comunicação Paralela No envio de dados de forma paralela todos os bits que compõe uma palavra são transmitidos ao mesmo tempo e por diferentes condutores. O flag de interrupção é CCP1IF em PIR1.3. se o valor usado para PR2 for 63. isto é.6) 5.4 Interrupção O bit de habilitação de interrupção é CCP1IE em PIE1. para uma dada freqüência de PWM é dada pela equação 10. os dois bits mais significativos são “perdidos” e 100% de duty-cicle corresponderá á 255. Outra característica dessa forma de comunicação é a velocidade. Esse valor deve ser inteiro e menor que 1023. Para freqüências altas (períodos pequenos) existe uma perda da resolução. a transferência de informações ocorre em tempo mínimo. O valor da pré-escala deve ser o mesmo utilizado para a determinação do período. O evento que dispara a interrupção depende do modo de trabalho.

porém.Microcontroladores PIC16F877A 107 As limitações dessa técnica surgem quando as distâncias entre os pontos que se deseja comunicar aumentam. Outro ponto importante é o ruído (interferência) inserido nos condutores e proveniente do onde eles estão. limitando assim a comunicação a pequenas distâncias em alta velocidade (por exemplo.3. ou seja. mas como uma associação de resistências. O principal problema a ser resolvido na comunicação serial. uma vez que a informação que é tratada de forma paralela pelo processador deve ser convertida para o formato paralelo. A comunicação serial também traz vantagens no aumento das taxas e das distâncias de comunicação. a síncrona e assíncrona. Por todas essas razões a quase totalidade das conexões entre equipamentos é feita por comunicação serial. E ainda. Em contrapartida. a comunicação serial demanda um circuito mais complexo. mas o agrava os problemas na comunicação paralela é que cada linha de transmissão é um meio diferente das demais. Isso pode acarretar problemas na comunicação de dados a distâncias longas (o critério para dizer se uma distância é “grande” é sua comparação com o comprimento de onda do sinal que se transmite). Pelo mesmo motivo. a transmissão é mais lenta que a paralela (observando apenas o tempo do envio de uma informação). pelas próprias características do meio. Quanto ao quesito custo essa forma de transmissão é bastante eficiente. ou seja. apresentando os problemas discutidos acima e mantendo sempre uma relação de compromisso entre o comprimento dos cabos e a taxa transmissão máxima. Entre as formas de comunicação serial mais difundida podemos citar o EIA-232. os cabos não deixam de ser guias de ondas. A comunicação serial pode se dar de duas maneiras principais. um para envio de dados e outro de referência. Novamente o maior número de condutores agrava a situação. 5. Em altas taxas de transmissão devemos considerar os condutores a luz da teoria de guias de ondas. pois são tratados separadamente. EIA-485. capacitâncias e indutâncias. que diferem na forma de localizar cada bit em uma “rajada”. um bit de cada vez. Esses fatos são inerentes a qualquer linha de transmissão de sinais elétricos. o USB e mesmo as LAN´s Ethernet. Além do custo dos cabos outro impedimento para a comunicação paralela são os efeitos reativos (capacitivos e indutivos) dos meios de comunicação paralela (sejam eles cabos ou trilhas numa placa). Em primeiro lugar para interconexão de equipamentos em distâncias grandes o uso de comunicação paralela exige conectores de muitos pinos e cabos de várias vias. Em virtude disso os sinais podem se degradas por interferência mútua e também. não há problemas em os bits serem afetados de forma diferente. comunicação entre PC e impressora). o custo dos cabos e conectores é proporcional ao número de vias do cabo. que de forma resumida nos diz que em altas freqüências um fio ou uma trilha não devem ser encarados como um curto-circuito.2 Comunicação serial A forma encontrada para solucionar os problemas apresentados pela comunicação paralela a foi transmitir os bits de forma serial. Exsto Tecnologia . barramentos do PC) ou a distâncias maiores com baixa taxa de transmissão (por exemplo. é saber quando um bit termina e quando começa o próximo. Técnicas para a redução de ruído e degradação do sinal podem ser aplicadas mais facilmente quando a informação transita por um único caminho.Como pode ser intuído. Além disso. cada bit é degradado de forma diferente. porque em sua forma mais simples pode ser implementada com apenas dois condutores.

Entres as formas de comunicação serial síncrona podemos citar o I2C e o SPI. Na prática os dados são enviados em “pacotes” de alguns bits. Para minimizar o risco de erro a leitura é feita na metade da duração do bit ou são feitas algumas amostras durante esse intervalo de tempo. Aparentemente.Microcontroladores PIC16F877A 108 Como o próprio nome diz. chamado start bit ou bit de início e quando esse é lido ele sabe que a cada intervalo de tempo. Para isso é necessário que o receptor saiba a taxa e transmissão. Na verdade. Como uma amostra ocorre tB após a anterior. e que o transmissor indique de alguma forma onde começa e onde termina a transmissão. e portanto a duração de cada bit. isso não ocorre. A solução nesse caso é “adivinhar” o momento certo de ler o bit. dois são de especial interesse por sua ampla utilização nas aplicações de microcontroladores. se esse tempo estiver errado. chamado tempo de bit (tB) um bit novo está presente na via de comunicação. o erro vais se acumulando até que se perca o sincronismo. se o relógio de RX for 5% mais lento ou mais rápido que o de TX a cada 20 bits recebido o sincronismo será perdido. nesse caso entre o sinal transmitido e um clock enviado juntamente. São eles o EIA-232C e o EIA-485 Exsto Tecnologia . na comunicação serial síncrona existe um sincronismo. pois sempre existira uma pequena diferença entre as bases de tempo de TX e RX. Já na comunicação assíncrona nenhuma referencia de onde o bit deve ser lido é enviado com o sinal.1 – Transmissão serial genérica Dos diversos padrões de comunicação serial assíncrona. O formato genérico de um “pacote” de comunicação serial é apresentado na figura abaixo. porém. Tempo ocioso (opcional) 1. Por exemplo. 1 ½ ou 2 stop bits Bit de paridade (opcional) 5 a 9 bits de dados 1 start bit Figura 11. iniciados por um start bit e terminados por um stop bit. se procedermos dessa forma. que não serão tratados aqui. bastaria enviar um start bit e para sincronizar receptor e transmissor e depois poderia vir uma seqüência infinita de bits. O stop bit tem a função de marcar o fim do pacote. evitando assim erros na recepção e a correta montagem do dado na forma paralela. o receptor aguarda a chegada da indicação de início. para que um bit de informação não seja confundido com um novo start bit. O clock permite determinar o exato momento em que o bit do sinal deve ser lido. Dessa maneira.

Exsto Tecnologia . a comunicação serial pode suportar taxas de bit (geralmente chamadas baud rate) de até 20 kbps. o protocolo estabelece os conceitos de DTE (Data Terminal Equipament – Equipamento Terminal de Dados) e DCE (Data Communication Equipament – Equipamento de comunicação de dados). RxD e Terra). cuja revisão C é a mais recente (1969). se o DCE pode receber esses dados CTS é ativado.3. podendo ser usado um cabo com apenas 3 fios (TxD. esse protocolo foi inicialmente desenvolvido para permitir a comunicação entre computadores e modens. nos dois sentidos ao mesmo tempo. Como tipicamente o EIA-232 é utilizado para comunicação entre um computador e o microcontrolador vamos sempre admitir aqui que computador é o DTE e o microcontrolador DTE. As sinalização são ativadas em ‘0’ e desativadas em ‘1’. A distância máxima do cabo de comunicação deve ser inferior a 15 metros (50 pés). As especificações elétricas do EIA-232C podem ser observadas na figura abaixo.1 . para transmissão de dados a longa distância. As funções e direções dos pinos são dadas em função do DTE Pino TxD RxD RTS CTS DSR DTR Função Transmissão do DTE para o DCE Transmissão do DCE para o DTE Sinaliza que o DTE está pronto para receber dados do DCE Sinaliza que o DCE está pronto para receber dados do DTE DCE pronto para operação DTE pronto para operação Tabela 11. DTS e CTS servem para fazer controle de fluxo: Quando o DTE tem dados para transmitir ele informa o DCE através de RTS. ou seja.Microcontroladores PIC16F877A 109 5. O sentido dos pinos de comunicação é dado do ponto de vista do DTE.3 EIA-232C Popularmente conhecido como RS-232. É possível realizar comunicação full-duplex. Segundo a norma. Umas das principais causas da limitação de taxa e distância do EIA-232C é limitação nos tempos de subida e descida do sinal. A norma especifica vários pinos mas na prática os mais utilizados são os apresentados na tabela abaixo. Devido a sua aplicação inicial como protocolo de comunicação entre um terminal de computador e um equipamento de comunicação. A norma que rege o protocolo é a TIA/EIA-232. que deve ser menor que 4% do tempo de bits. Em uma grande maioria dos casos são utilizados apenas os terminais de transmissão e recepção de dados.Pinos de comunicação serial Direção Saída Entrada Saída Entrada Entrada Saída Os pinos DSR e DTR servem para indicar que os equipamentos estão conectados e prontos para comunicação.

respectivamente. Os pinos do microcontrolador associados à USART são RB6 para transmissão (TxD) e RB7 para recepção (RxD). assim como diversos outros microcontrolador. dentre os quais os mais conhecidos são o MAX232 e seus equivalentes. tensões entre +3 e -3 Volts levam a estados ideterminados.2 – Faixas de tensão do EIA-232C No transmissor o nível lógico ‘0’ é representado por uma tensão entre +5 e +15 Volts e o nível lógico ‘1’ é representado por tensões entre -5 e -15 Volts. que nos permitirá implementar uma comunicação sob o protocolo RS-232 com o PC. As tensões máxima mínima que podem ser aplicadas ao receptor sem que haja dano são.3.4 A USART do PIC16F877A O PIC16F877A. a norma especifica que qualquer curto circuito entre quaisquer pinos.Microcontroladores PIC16F877A 110 TX +15V Cabo RX +15V ‘0’ +5V +3V ? -3V -5V -15V ‘1’ -15V Figura 11. A USART pode ser configurada para trabalhar nos seguintes modos: • • • Assíncrono (Full Duplex) Síncrono Mestre (Half Duplex) Síncrono Escravo (Half Duplex) A diferença entre os módos Síncrono Mestre e Escravo é que o Mestre gera o clock para os escravos. Além disso. Como na maioria das aplicações trabalha com circuitos alimentados com +5V são necessários conversores de nível para criar uma interface elétrica com o EIA-232. No receptor tensões entre +3 e +15 Volts são interpretadas como ‘0’ e entre -3 e -15 Volts interpretadas como ‘1’. +25V e -25V. Quando a USART está habilitada esses pinos deixam de operar como entradas e saídas digitais. Ele é conhecido como USART (Universal Synchronous Asynchronous Receiver Transmitter – Receptor e Transmissor Síncrono Assíncrono Universal) ou SCI (Serial Communications Interface). inclusive o pino de terra. A diferença entre os limites de tensão no transmissor (-5V e +5V) e os limites do receptor (-3V e +3V) constitui a margem de segurança. não devem causar dano ao circuito. Abordaremos somente o modo assíncrono. 5. dentro da qual ruídos e eventuas perdas no cabo não degradam os dados. Exsto Tecnologia . possui um módulo de realiza comunicação serial.

clock recebido. o Modo Assíncrono: não tem efeito o Modo síncrono 1 = Modo mestre.Microcontroladores PIC16F877A 111 Para configurar transmissão e recepção são utilizados dois registros TXSTA e RCSTA. clock gerado internamente. quando TXEN for usado R/W – 0 SPEN Bit 7 R/W – 0 RX9 R/W– 0 SREN R/W – 0 CREN R/W – 0 ADDEN R–0 FERR R–0 OERR R –x RX9D Bit 0 RCSTA SPEN: Habilitação da porta serial o 1 = Habilitada (pinos RC6 e RC7 operam como pinos da USART) o 0 = Desabilitada RX9: Habilitação de recepção de 9 bits o 1 = Recepção de 9 bits o 0 = Recepção de 8 bits SREN: Habilitação de recepção única o Modo assíncrono: não tem efeito o Modo síncrono: 1 = Habilita recepção única 0 = Habilita transmissão única CREN: habilitação de recepção contínua o Modo síncrono 1 = habilita recepção contínua 0 = desabilita recepção contínua o Modo assíncrono Exsto Tecnologia . R/W – 0 CSRC Bit 7 R/W – 0 TX9 R/W– 0 TXEN R/W – 0 SYNC U–0 - R/W – 0 BRGH R–1 TRMT R/W – 0 TX9D Bit 0 TXSTA CSRC: Seleção de clock. 0 = Modo escravo. TX9: Habilitação de transmissão de 9 bits o 1 = Transmissão de 9 bits o 0 = Transmissão de 8 bits TXEN: Habilitação de transmissão o 1 = Transmissão ligada o 0 = Transmissão desligada SYNC: seleção de modo da USART o 1 = Modo síncrono o 0 = Modo assíncrono BRGH: Seleção de taxa de transmissão aula o Modo assíncrono 1 = Alta velocidade 0 = Baixa velocidade o Modo síncrono: não tem efeito TRMT: Status do buffer de transmissão ] o 1 = buffer vazio o 0 = buffer cheio TX9D: 9º bit de transmissão.

2) 5. Além das configurações feitas pelos registros acima é importante configurar a taxa de transmissão da comunicação serial.1.3.3 .2 se BRGH está em ‘1’. Isso é feito carregando o valor adequado no registro SPBRG.1) (11. O valor contido em TSR é enviado de forma serial pelo tino RB6/TxD. que configura o gerador de taxa de transmissão do PIC.5 Transmissão Durante o processo de transmissão serial assíncrona entra em operação o circuito apresentado na figura 11. Exsto Tecnologia .Diagrama em blocos do sistema de transmissão O processo de transmissão se inicia quando um dado é escrito no registro TXREG.Microcontroladores PIC16F877A 112 1 = habilita recepção contínua 0 = desabilita recepção contínua ADDEN: Habilitação de detector de endereço o 1 = habilita detecção de endereço o 0 = desabilita detecção de endereço FERR: Erro de enquadramento o 1 = houve erro de enquadramento (dado recebido com taxa diferente da configurada) o 0 = não houve erro de enquadramento OERR: Erro de sobrescrita no buffer de recepção o 1 = houve sobrescrita no buffer de recepção o 0 = não houve sobrescrita no buffer de recepção RX9D: 9 bit recebido.3. se RX9 = 1. se o bit BRGH está ‘0’. e a equação 11. conforme a taxa de transmissão selecionada. Figura 11. Taxa = Taxa = Fosc 64 × ( SPBRG + 1) Fosc 4 × ( SPBRG + 1) (11. Para determinar esse valor é usada a equação 11. Quando isso ocorre o valor de TXREG é transferido para o registro interno TSR (desde que esse esteja vazio) e o flag TXIF é setado.

Microcontroladores PIC16F877A

113

Para realizar um processo de transmissão serial basta seguir os seguintes passos: 1. Carregar SPBRG com o valor correto para a taxa de transmissão desejada. 2. Habilitar comunicação serial síncrona: TXSTA, SYNC 0 e RCSTA, SPEN 1; 3. Habilitar a transmissão: TXSTA, TXEN 1

Feito isso, toda vez que um dado é movido para TXREG o mesmo é automaticamente transmitido de forma serial.

5.3.6 Recepção
Para receber dados de forma serial o circuito interno a USART comporta-se como apresentado na figura 11.4

Figura 11.4 - Diagrama em blocos do sistema de recepção Os dados recebidos pela porta serial são rotacionados e alojados no registro interno RSR. Uma vez verificado a coerência de start bit e stop bit, os dados são transferidos para o buffer de recepção, isto é, o registro RCREG e o flag RCIF é setado. Caso haja alguma incoerência com os bits de start e stop, o indicador de erro de equadramento FERR é setado. O flag RCIF é zerado toda quando o registro RCREG é lido. Podem ser recebidos até dois bytes sem que faça a leitura do registro RCREG, sendo que o primeiro recebido fica armazenado em RCREG e o segundo em RSR, sendo transferido para RCREG assim que este é lido. Caso chegue um terceiro byte RSR é sobrescrito e o bit de erro OERR é setado. Para realizar recepção de dados enviados pela serial é necessário seguir os seguintes passos: 1. Carregar SPBRG com o valor correto para a taxa de transmissão desejada. 2. Habilitar comunicação serial síncrona: TXSTA, SYNC 0 e RCSTA, SPEN 1; 3. Habilitar a transmissão: RCSTA, RXEN 1

Exsto Tecnologia

Microcontroladores PIC16F877A

114

Feito isso, basta monitorar o bit RCIF, que será setado toda vez que existir um dado válido no registro RCREG.

5.4 Conversor Analógico para digital – ADC
Alguns microcontroladores PIC da família 16Fxxx, dentre eles o PIC16F877A possuem módulos para conversão de níveis de tensão DC em valores digitais (ADC). O ADC converte a tensão em palavras de 8 bits ou 10 bits, dependendo do componente. Aqui será tratado especificamente do módulo ADC de 10 bits do PIC16F877A, porém o funcionamento desses módulos é o mesmo para demais componentes com ADCs de 10 bits e muito semelhante para os de 8 bits.

Figura 12.1 - Diagrama em blocos do ADC PIC16F877A possui um ADC com oito canais analógicos. Isso significa que a tensão a ser escolhida dentre a de oito entradas diferentes, porém não somente uma entrada pode ser convertida por vez. Além disso, as tensões de referência para a conversão, tanto superior (Vref+) como inferior (Vref-), podem ser selecionadas por software entre as tensões de alimentação e tensões presentes em determinados terminais do microcontrolador. Esses valores de tensão estipulam a faixa de valore a ser convertida. Por exemplo, sendo Vref+ = Vdd e Vref- = Vss temos uma faixa de 5V, correspondendo o valor 0 a 0V e 1024 a 5V. Para determinar um qual o valor correspondente dentro dessa faixa, basta aplicar uma simples regra de três. Essas considerações podem ser observadas na figura 12.1.

Exsto Tecnologia

Microcontroladores PIC16F877A

115

O módulo ADC realiza todo o processo de “Sample and Hold” (Amostragem e retenção). Esse processo é realizado quando uma determinada entrada é selecionada e inicia-se a carga de um capacitor interno CHOLD . Após o tempo de carga do capacitor (THOLD) a entrada é desconectada e inicia-se o processo de conversão da tensão armazenada no capacitor, que é feito pelo método de aproximações sucessivas. A figura abaixo apresenta o circuito equivalente da entrada da do ADC.

Figura 12.2 - Circuito Equivalente da entrada do ADC Requisitos de funcionamento A resistência da fonte da tensão a ser convertida (Rs no circuito acima) não deve ser superior a 10kΩ, caso contrário o capacitor CHOLD pode não ser completamente carregado quando se iniciar a conversão. Além disso, o processo de conversão só poderá ser iniciado depois de decorrido o tempo de carga do capacitor (THOLD). A ativação do processo de conversão será explicada mais adiante. O tempo total de amostragem, que vai do instante em que o canal a ser amostrado é selecionado ao momento em que o resultado da conversão é armazenado nos registros de resultado do AD, é a soma do tempo de aquisição com o tempo de conversão. O tempo de aquisição varia em função da a temperatura, da tensão de alimentação e da resistência da fonte do sinal a ser amostrado. Para temperaturas inferiores a 25oC, alimentação de 5V o tempo de aquisição encontra-se no intervalo: 11 µs < TAQ < 20µs onde o menor tempo é conseguido para uma Rs = 0Ω e o maior para Rs = 10kΩ. Já o tempo de conversão depende do clock de conversão. Esse clock pode ser selecionado como Fosc/2, Fosc/8, Fosc/32 ou baseado em um oscilador RC interno que varia entre 2 e 6 µs. A seleção do clock de conversão deve ser tal que o período seja de 1,6µs no mínimo. Quando utilizando a fonte de clock proveniente do oscilador RC o processo de conversão pode ocorrer estando o microcontrolador em modo SLEEP. Esse procedimento pode ser utilizado para que o oscilador do microcontrolador não introduza ruídos na tensão a ser medida. Finalmente, após uma conversão ser concluída é necessário aguardar 2 períodos do clock de conversa antes de se reiniciar o processo. Exsto Tecnologia

Já no formato “justificado a direita”.3 .Microcontroladores PIC16F877A 116 5. Figura 12. conforme ilustrado pela figura abaixo. O formato “justificado a esquerda” é aquele em os 8 bits mais significativos são armazenados em ADRESH e os 2 menos significativos em ADRESL. ADCON0 : registro de controle 0. ficando 2 bits em um registro e 8 em outro. os 2 bits mais significativos são armazenados em ADRESH e os 8 menos significativos em ADRESL. ADRESL : registro de resultado do A/D (LSbits). O formato é escolhido pelo valor do bit ADFM do registro ADCON1. A disposição desse registro pode ter dois formatos.1 Configuração e uso Para a utilização do ADC são utilizados 4 registros especiais ADRESH : registro de resultado do A/D (MSbits). Abaixo são apresentadas as funções desse registros.4. ADCON0 Bit 7e 6: ADCS1:ADCS0: Bits de seleção do clock de conversão o 00 = Fosc/2 o 01 = Fosc/8 o 10 = Fosc/32 o 11 = FRC (oscilador RC interno) Bit 5 à 3: CHS2:CHS0: Seleção de canal analógico o 000 = canal 0 (RA0/AN0) Exsto Tecnologia . ADCON1 : registro de controle 1. Como se trata de ADC de 10bits são necessários 2 registros para esse resultado.Formato do resultado do ADC Utilizando a justificação à esquerda e desconsiderando os 2 bits menos significativos temos o comportamento de um ADC de 8 bits. ADRESH e ADRESL São os registros onde são armazenados os valores resultantes da conversão.

1 – Configurações de entradas analógicas Para a utilização do AD são necessários os seguintes procedimentos: 1. Selecionar clock de conversão b. As configurações possíveis são apresentadas pela tabela abaixo. Tabela 12. Configurar o AD na inicialização: a. Definir formato do resultado Exsto Tecnologia .Microcontroladores PIC16F877A 117 o 001 = canal 1 (RA1/AN1) o 010 = canal 2 (RA2/AN2) o 011 = canal 3 (RA3/AN3) o 100 = canal 4 (RA5/AN4) o 101 = canal 5 (RE0/AN5) o 110 = canal 6 (RE1/AN6) o 111 = canal 7 (RE2/AN7) Bit 2: GO/DONE: Status da conversão o 1 = Conversão em progresso o 0 = Conversão concluída Bit 1: Não implementado Bit 0: ADON: habilitação do ADC o 1 = ADC habilitado o 0 = ADC desabilitado (para menor consumo de corrente) ADCON1 Bit 7 ADFM: Seleção de formato de resultado o 1 = justificado direita o 0 = justificado a esquerda Bit 6 à 4: não implementados Bit 3 à 0 PCFG3:PCFG0: Configuração das portas do ADC Esses bits permitem configurar a quais dos terminais que são multiplexados com entradas do ADC serão entradas analógicas e quais serão I/O digitais.

Habilitar o modo AD Selecionar qual canal será lido Aguardar o tempo de aquisição Iniciar o processo de conversão (fazendo ADCON0. 5.). O acesso a esses bytes é feito de forma indireta através dos registros seguintes registros: • EEDATA : contém o dado lido / a ser escrito • EEADR: contém o endereço a ser acessado • EECON1: registro de controle • EECON2: utilizado na seqüência de proteção Existe uma seqüência de proteção para prevenir escritas acidentais da EEPROM que faz uso do EECON2. Seu acesso é feito através de endereçamento indireto e seguindo certas seqüências obrigatórias de comando. A seguir serão apresentados o funcionamento dessa memória e as rotinas para acessos de leitura e escrita. 5. O registro EECON1 apresenta a configuração abaixo. mas porém podem ser alterados. como endereços de RAM. 4. Aguardar que o processo ser concluído (Verificando se ADCON0. como será mostrado mais adiante. U–0 Bit 7 U–0 - U–0 - U–0 - R/W – x WRERR R/W – 0 WREN R/W – 1 WR R/W – 1 RD Bit 0 EECON1 WRERR: Flag indicador de erro o 1 = houve um erro no processo de escrita da EEPROM. as senhas armazenadas em um alarme não podem se perder caso o alarme seja desligado. Os endereços de EEPROM não podem ser acessados diretamente.5 Memórias EEPROM e Flash 5. Definir quais terminais serão utilizado como entradas do AD d. GO/DONE igual a 1). GO/DONE é igual a 0.1 Memória EEPROM A memória EEPROM muitas vezes é necessária para armazenar dados que devem ser mantidos na falta de energia do sistema. c. 6. devido a um reset o 0 = o processo de escrita da EEPROM foi concluído com sucesso WREN: habilitação da escrita da EEPROM o 1 = permite a escrita da EEPROM o 0 = não permite a escrita da EEPROM WR: controle de escrita o 1 = inicia o processo de escrita o 0 = processo de escrita concluído (zerado pelo hardware) RD: controle de leitura o 1 = inicia o processo de leitura o 0 = processo de leitura concluído (zerado pelo hardware) Exsto Tecnologia . Aguardar 2 períodos de clock de conversão. Por exemplo. Existem no PIC16F877A 256 bytes de memória EEPROM. 3. O banco de memórias EEPROM é tratado como periférico porque seu funcionamento se assemelha mais ao de um periférico que as demais memórias.Microcontroladores PIC16F877A 118 2.5.

RD EEDATA E2DATA PORTA de -> -> -> dados endereço a ser lido dado lido dado lido . .5. . entrada: E2ADR . respectivamente. Elas têm como requisito que duas variáveis. W BANKSEL MOVFW MOVWF BSF MOVFW MOVWF BANKSEL RETURN WRITE_EEPROM: . WR também só pode ser setado pelo software. seleciona o banco de EEADR W <.W W <. muda para o banco de EEADR W <. em seguida o bit RD é setado. READ_EEPROM: .E2ADR EEADR <.EEADR retorna ao banco 0 . . Para a escrita da memória.E2ADR EEADR <. Por fim. . inicialmente os registros EEDATA e EEADR são carregados com o dado a ser escrito e o endereço.EEDATA E2DATA <. isto é. o bit WR é setado. indicando que o dado já foi lido e se encontra no registro EEDATA. . E2DATA e E2ADR sejam declaradas no últimos 16 bytes do banco 0. deve ser realizada para permitir a gravação da memória. O bit WREN impede a escrita acidental da EEPROM.WREN INTCON. .GIE 55H .Microcontroladores PIC16F877A 119 O bit WRERR permite que em aplicações de maior segurança sejam tomadas providências caso ocorra uma falha na gravação de algum dado.2 Rotinas de acesso a EEPROM Para acesso à EEPROM podemos usar as duas rotinas apresentadas abaixo. que consiste em carregar os valor 55h e AAh no registro EECON2. . e quando ele se torna ‘0’. saída: E2DATA . E2ADR -> Endereço a ser escrito . o bit RD é zerado pelo hardware. Em seguida. O bit RD só pode ser zerado pelo hardware. Em seguida deve ser habilitada a escrita. . uma seqüência obrigatória. READ_EEPROM realiza a leitura enquanto WRITE_EEPROM é responsável pela escrita. O processo de leitura se dá da seguinte maneira: o endereço a ser lido é carregado no registro EEADR. Quando a leitura foi finalizada. . entrada: E2DATA -> Dado a ser escrito . 5. . dando início ao processo de escrita. Os endereços devem ser estar nessa posição pra minimizar mudança de banco. o processo de gravação foi concluído. Exsto Tecnologia . entre os endereços 70h e 7Fh. realiza a leitura da EEPROM . saída: nulo BANKSEL MOVFW MOVWF MOVFW MOVWF BSF BCF MOVLW EEADR E2ADR EEADR E2DATA EEDATA EECON1. . .W inicia o processo de leitura W <.W habilita gravação desabilita interrupções EEADR E2ADR EEADR EECON1. realiza a escrita da EEPROM de dados . Esse é mais um dispositivo de segurança contra escritas acidentais da EEPROM. . fazendo WREN igual ‘1’. dando início ao processo de leitura.E2DATA EEDATA <.

RP0 EECON1. Isso é útil não só porque permite utilizar todas as regiões de memória FLAHS não ocupadas pelo programa como se fossem EEPROM como também permite que o próprio programa altere seu conteúdo. inicia processo de gravação .RD . sequencia .5. completada . Leitura da FLASH . READ_FLASH: .Microcontroladores PIC16F877A 120 MOVWF MOVLW MOVWF BSF CLRWDT BTFSC GOTO . Acesso a memória FLASH .RP0 .RP1 . desabilita gravação . As rotinas para acesso a memória FLASH são muito semelhantes as utilizadas para memória EEPROM e são apresentadas a seguir. desde que exista uma parte do programa responsável por isso que não seja alterada na atualização. fica em loop até a gravação ser . E2ADRH -> MSByte do endereço a ser gravado(Banco 2) . entrada: E2ADR -> LSByte do endereço a ser gravado(Banco 2) .WR .3 Memória FLASH de programa Da mesma forma que a EEPROM.4 Rotinas de acesso a FLASH.GIE EECON1. saída: E2DATA -> LSByte do contendo o dado lido (Banco 2) . parte menos significativa MOVFW EEADR . Isso permite que aplicações onde exista uma comunicação remota possam ser atualizadas a distância. reabilita as interrupções . do endereço a ser lido MOVFW E2ADRH . Exsto Tecnologia . . E2DATH -> MSByte do contendo o dado lido (Banco 2) BCF STATUS. . obrigatória .5. Banco 2 MOVFW E2ADR . no PIC16F877A é possível ler e escrever dados na memória flash de programa. realiza a leitura da memória FLASH de programa .EEPGD EECON1. retorna ao banco 0 EECON1.WREN PORTA 5. Banco 3 . BSF STATUS. parte mais significativa MOVFW EEADRH . A memória é lida nesses dois ciclos . uma vez que são maiores tanto o dado (14 bits) como endereço (13 bits): • EEDATH : contém a parte mais significativa do dado lido / a ser escrito • EEADRH: contém a parte mais significativa do endereço a ser acessado 5. do endereço a ser lido BSF BSF BSF NOP NOP STATUS.WR $-2 INTCON. BSF BCF BANKSEL RETURN EECON2 0AAH EECON2 EECON1. Além dos registros usados para EEPROM existem mais dois necessários ao trabalho com a memória FLASH.

. Banco 2 parte menos significativa do dado lido parte mais significativa do dado lido Banco 0 RETURN WRITE_FLASH: . . . realiza a escrita da memória FLASH de programa . EECON1 <. . parte mais significativa MOVFW EEADRH . BSF EECON1. . do endereço a ser escrito MOVFW EEDATA .RP0 STATUS. EEADRH -> MSByte do endereço a ser gravado(Banco 2) . Habilita as interrupções Desabilita a escrita BSF BCF BCF BCF INTCON.RP1 . WR . EECON1 <.EEPGD . parte menos significativa MOVFW EEADR .RP1 . . Habilita gravação BCF INTCON. .55h . . entrada: EEADR -> LSByte do endereço a ser gravado(Banco 2) . . parte menos significativa do MOVWF E2DATA . do endereço a ser escrito MOVFW E2ADRH . parte mais significativa do MOVWF E2DATH . saída: nulo BCF STATUS.WREN .RP1 .GIE EECON1. .GIE . BSF STATUS. dado a ser escrito BCF STATUS. Inicia gravação .AAh . aguarda a fim do processo de escrita e continua da terceira instrução. . . Banco 0 RETURN Exsto Tecnologia . EEDATH -> MSByte do dado a ser gravado (Banco 2) . dado a ser escrito MOVFW EEDATH . . Desabilta interrupções MOVLW MOVWF MOVLW MOVWF BSF NOP NOP 55h EECON2 0AAh EECON2 EECON1. Acesso a memória FLASH BSF EECON1.RP0 .Microcontroladores PIC16F877A 121 BCF MOVFW MOVWF MOVFW MOVWF BCF STATUS. . Banco 2 MOVFW E2ADR .RP0 EEDATA E2DATA EEDATH E2DATH STATUS.WREN STATUS. Instruções escritas aqui são ignoradas pois o microcontrolador interrompe a execução do programa. EEDATA -> LSByte do dado a ser gravado (Banco 2) .RP0 .

Microcontroladores PIC16F877A 122 Apêndices Apêndice A – Conjunto de Instruções do PIC16 Exsto Tecnologia .

Microcontroladores PIC16F877A 123 Apêndice B – Mapeamento de memória de dados Exsto Tecnologia .

You're Reading a Free Preview

Descarregar
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->