apostilapic

Upload: joao-honorato

Post on 05-Oct-2015

57 views

Category:

Documents


0 download

DESCRIPTION

eletrônica sistemas microprocessados

TRANSCRIPT

  • Sistemas Microprocessados baseados no PIC16F877A

    4 de novembro de 2014

  • Sumrio

    1 Introduo 1

    2 Reviso de Linguagem C 32.1 Literais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.3 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.4 Estruturas de Controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.5 Laos de Repetio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.6 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.7 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    3 Ambiente de Desenvolvimento MPLAB X 53.1 Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    3.1.1 Compilador XC8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.1.2 Ambiente MPLAB X IDE . . . . . . . . . . . . . . . . . . . . . . . . 8

    3.2 Criando um Novo Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    4 Portas de Entrada e Sada 174.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.2 Configurao e Manipulao das Portas . . . . . . . . . . . . . . . . . . . . . 18

    4.2.1 Codificao do Primeiro Programa . . . . . . . . . . . . . . . . . . . 184.3 Caractersticas Eltricas dos Pinos de E/S . . . . . . . . . . . . . . . . . . . . 21

    4.3.1 Classificao dos Pinos de E/S . . . . . . . . . . . . . . . . . . . . . 214.3.2 Faixas de Tenso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.3.3 Schmitt Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.3.4 Resistores de pull-up internos . . . . . . . . . . . . . . . . . . . . . . 234.3.5 Sadas CMOS em dreno aberto . . . . . . . . . . . . . . . . . . . . . 23

    4.4 Displays de 7 Segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.4.1 Circuitos com displays . . . . . . . . . . . . . . . . . . . . . . . . . . 254.4.2 Interface com o PIC16F877A . . . . . . . . . . . . . . . . . . . . . . 26

    iii

  • 5 Sistema de Interrupes 295.1 Interrupes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295.2 Tratamento de Eventos sem Interrupes . . . . . . . . . . . . . . . . . . . . 305.3 Tratamento de Eventos com Interrupes . . . . . . . . . . . . . . . . . . . . 32

    5.3.1 Atividade Principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325.3.2 Evento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325.3.3 Desvio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.3.4 Identificao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.3.5 Tratamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.3.6 Retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

    5.4 Interrupo Externa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365.5 Interrupo por mudana de estado . . . . . . . . . . . . . . . . . . . . . . . 38

    6 Contadores e Temporizadores 396.1 Parmetros dos Timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

    6.1.1 Origem do Sinal de Clock . . . . . . . . . . . . . . . . . . . . . . . . 396.1.2 Estouro (overflow) do Timer . . . . . . . . . . . . . . . . . . . . . . . 406.1.3 Nmero de Eventos de Contagem e Recarga . . . . . . . . . . . . . . 406.1.4 Prescaler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406.1.5 Tempo da Volta e Tempo Total . . . . . . . . . . . . . . . . . . . . . 41

    6.2 Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416.3 Projeto 1: Cronmetro com LCD . . . . . . . . . . . . . . . . . . . . . . . . 446.4 Timer 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.5 Projeto 2: Controle de Servomotor . . . . . . . . . . . . . . . . . . . . . . . 48

    6.5.1 Configurao dos Pinos de E/S . . . . . . . . . . . . . . . . . . . . . 496.5.2 Configurao do Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . 496.5.3 Configurao do Timer 1 . . . . . . . . . . . . . . . . . . . . . . . . 506.5.4 Configurao das interrupes . . . . . . . . . . . . . . . . . . . . . . 506.5.5 Rotina de Servio a Interrupes . . . . . . . . . . . . . . . . . . . . 516.5.6 Lao de repetio principal . . . . . . . . . . . . . . . . . . . . . . . 51

    6.6 Timer 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    7 Converso Analgico-Digital 557.1 Configurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557.2 Exemplo: Voltmetro Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    8 Comunicao Serial (USART) 57

    9 Interfaces SPI e I2C 599.1 Serial Peripheral Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599.2 Inter-Integrated Circuit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

  • 10 Mdulo CCP 6110.1 Modo Captura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6110.2 Modo Comparao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6110.3 Modo PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    A Placa de Desenvolvimento 63

    B Registradores do PIC16F877A 65

  • Lista de Tabelas

    2.1 Literais na Linguagem C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.2 Principais operadores da Linguagem C . . . . . . . . . . . . . . . . . . . . . 4

    4.1 Caractersticas Eltricas dos Pinos de E/S do PIC16F877A . . . . . . . . . . . 224.2 Nveis de Tenso TTL e CMOS . . . . . . . . . . . . . . . . . . . . . . . . . 224.3 Cdigos para exibio de dgitos em displays de 7 segmentos . . . . . . . . . . 27

    5.1 Flags de Interrupo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    6.1 Configuraes de prescaler para o Timer 0 . . . . . . . . . . . . . . . . . . . 426.2 Configuraes de prescaler para o Timer 1 . . . . . . . . . . . . . . . . . . . 476.3 Seleo de capacitores para o oscilador do Timer 1 . . . . . . . . . . . . . . . 486.4 Parmetros para posio angular . . . . . . . . . . . . . . . . . . . . . . . . 506.5 Configuraes de prescaler para o Timer 2 . . . . . . . . . . . . . . . . . . . 53

    vii

  • Lista de Figuras

    4.1 Entradas e sadas digitais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.2 Uso de teclas e LEDs nos pinos de E/S . . . . . . . . . . . . . . . . . . . . . 194.3 Schmitt Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234.4 Pino com Resistor de Pull-Up interno . . . . . . . . . . . . . . . . . . . . . . 234.5 Alternativas para a conexo de teclas . . . . . . . . . . . . . . . . . . . . . . 244.7 Configurao em barramento com pinos dreno aberto (mostrando apenas sadas) 244.8 Display de 7 segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.9 Configuraes e pinagem de displays de 7 segmentos . . . . . . . . . . . . . . 254.10 Lgicas de Ativao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.11 Interface com um nico display de 7 segmentos . . . . . . . . . . . . . . . . . 274.12 Interface com displays de 7 segmentos por meio de registradores de deslocamento 284.13 Interface com displays de 7 segmentos multiplexados no tempo . . . . . . . . 28

    5.1 Desvio e retorno causados por uma interrupo . . . . . . . . . . . . . . . . . 305.2 Polling (alternativa s interrupes) . . . . . . . . . . . . . . . . . . . . . . . 315.3 Analogia para o sistema de interrupes . . . . . . . . . . . . . . . . . . . . . 325.4 Sistema microprocessado baseado em interrupes . . . . . . . . . . . . . . . 355.5 Desvios provocados por uma interrupo . . . . . . . . . . . . . . . . . . . . 365.6 Circuito referente ao programa 5.1 . . . . . . . . . . . . . . . . . . . . . . . 37

    6.1 Comportamento do timer (analogia) . . . . . . . . . . . . . . . . . . . . . . . 406.2 Arquitetura do Projeto Cronmetro . . . . . . . . . . . . . . . . . . . . . . . 446.3 Arquitetura do sistema de controle de servomotor . . . . . . . . . . . . . . . 486.4 Registrador de Perodo PR2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    ix

  • Captulo1Introduo

  • CAPTULO 1. INTRODUO

    2

  • Captulo2Reviso de Linguagem C

    2.1 Literais

    Sabemos que os dados com os quais um computador opera so armazenados, internamente,como sequncias de bits. Em programao, chamamos de literais as diferentes representaesdesses dados. Felizmente, o sistema binrio no a nica representao possvel. Os literaisda linguagem C so apresentados na Tabela 2.1.

    Tipo Variantes Matemtica / C Matemtica / C

    Inteiros

    Decimal 30 30 200 -200 Hexadecimal AF16 0xAF F16 -0xF (prefixo 0x)Octal 768 076 178 -017 (zero esquerda)Binrio 111010102 0b11101010 1012 -0b101 (prefixo 0b)Caractere1 a X (aspas simples)

    ReaisPreciso simples 3, 14 103 3.14e-3f 0, 25 0.25f (sufixo f)Preciso dupla 3, 14 103 3.14e-3 0.25 0.25 (sem sufixo)

    Lista {97, 98, 99} { 97 , 98 , 99} {a, b, c} abc (ou { a , b, c })

    Tabela 2.1: Literais na Linguagem C

    2.2 Tipos de Dados

    2.3 Operadores

    A Tabela 2.2 resume os principais operadores da linguagem C.Para operaes onde um dos operandos tambm o destino do resultado, como em a = a + 5,a linguagem oferece operadores especiais. A expresso supracitada, por exemplo, pode sersubstituda por a += 5, um atalho para a operao de somar 5 ao valor de a e armazenar oresultado no prprio a. Isso pode ser usado para todos operadores aritmticos e bit a bitque trabalham com 2 operandos. A precedncia dos operadores pode ser consultada emhttp://pt.wikipedia.org/wiki/Operadores_em_C_e_C++. Os parnteses (mas no colche-tes ou chaves, como no caso da matemtica) so usados para alterar a precedncia por padro.

  • 2.4. ESTRUTURAS DE CONTROLE CAPTULO 2. LINGUAGEM C

    Categoria Descrio Sintaxe Descrio Sintaxe

    Aritmticos

    Atribuio a = 5 Resto da diviso inteira a % 5Soma a + 5 Incremento pr-fixado ++aSubtrao a 5 Decremento pr-fixado aMultiplicao a 5 Incremento ps-fixado a++Diviso a / 5 Decremento ps-fixado a

    Comparao

    Maior a > 2 Igual a == 2Menor a < 2 Diferente a != 1Maior ou igual a >= 2 E lgico c1 && c2Menor ou igual a 5

    Vetores, Estruturas Indexador a[2] Membro p. cpfe Ponteiros Objeto apontado a Membro via ponteiro p>cpf

    Endereo &a

    Tabela 2.2: Principais operadores da Linguagem C

    2.4 Estruturas de Controle

    2.5 Laos de Repetio

    2.6 Listas

    2.7 Funes

    4

  • Captulo3Ambiente de Desenvolvimento MPLAB X

    3.1 Instalao

    3.1.1 Compilador XC8

    1. Obtenha o instalador do MPLAB XC8 a partir do endereo:https://www.microchip.com/mplabxc8windows. A tela 1 apresentada ao iniciar ainstalao. Utilize os botes Back e Next para navegar pelas telas do wizard.

    2. Leia e aceite o termo de compromisso para proceder com a instalao.

    3. Na prxima tela do wizard, selecione a opo Install compiler.

  • 3.1. INSTALAO CAPTULO 3. MPLAB X

    4. Na tela Installation type, deixe a opo Configure MPLAB XC8 C Compiler asa network client desmarcada.

    5. O Setup ir solicitar o diretrio de instalao. Mantenha o padro e prossiga para aprxima etapa.

    6. Na prxima tela, deixe as duas primeiras opes marcadas. Elas so: Apply settingsto all users of this machine e Add xc8 to the PATH environment variable

    6

  • CAPTULO 3. MPLAB X 3.1. INSTALAO

    7. O instalador solicitar confirmao para prosseguir.

    8. Aguarde o final da instalao.

    9. Uma vez instalado, prossiga para selecionar a verso gratuita do XC8. Esta verso suficiente para os propsitos do nosso curso.

    7

  • 3.1. INSTALAO CAPTULO 3. MPLAB X

    10. Clique em Finish para encerrar o instalador. O compilador uma aplicao em linhade comando, e seu instalador no criar um cone lanador.

    3.1.2 Ambiente MPLAB X IDE

    1. Obtenha o instalador do MPLAB XC8 a partir do endereo:https://www.microchip.com/mplabx-ide-windows-installer. A tela 1 apresentada aoiniciar a instalao. Utilize os botes Back e Next para navegar pelas telas do wizard.

    2. Leia e aceite o termo de compromisso para proceder com a instalao.

    3. O Setup ir solicitar o diretrio de instalao. Mantenha o padro e prossiga para aprxima etapa.

    8

  • CAPTULO 3. MPLAB X 3.1. INSTALAO

    4. O instalador solicitar confirmao para prosseguir.

    5. O instalador iniciar a cpia dos arquivos.

    6. Durante a instalao, pode ser necessrio responder a um dilogo de confirmao deinstalao de drivers no assinados. Se o download foi feito pelo link deste tutorial,clique em Instalar esse software de driver mesmo assim.

    9

  • 3.2. CRIANDO UM NOVO PROJETO CAPTULO 3. MPLAB X

    7. Desmarque a opo referente aos compiladores XC e encerre o instalador.

    3.2 Criando um Novo Projeto

    Uma vez que o compilador XC8 e o ambiente MPLAB X foram instalados com sucesso, sigaos seguintes passos para a criao de um novo projeto.

    1. Abra o MPLAB X IDE (ateno para no confund-lo com o MPLAB IPE).

    2. Crie um projeto novo File New Project... . O dilogo abaixo dever ser exibido. SelecioneStandalone Project, da categoria Microchip Embedded.

    10

  • CAPTULO 3. MPLAB X 3.2. CRIANDO UM NOVO PROJETO

    3. Selecione o dispositivo PIC16F877A.

    4. Selecione o simulador por software: Simulator.

    11

  • 3.2. CRIANDO UM NOVO PROJETO CAPTULO 3. MPLAB X

    5. Selecione o compilador MPLAB XC 8.

    6. Fornea um nome para o projeto. No nosso exemplo ele se chamar projetoTeste.Ateno para o diretrio onde o mesmo ser salvo. No recomendado o uso de pastascom caracteres acentuados ou espaos. Certifique-se de que a opo Set as MainProject esteja marcada.

    12

  • CAPTULO 3. MPLAB X 3.2. CRIANDO UM NOVO PROJETO

    7. Aps a criao do projeto, sua estrutura de arquivos ser apresentada na barra lateralProject. Caso esta barra no esteja visvel, ative-a pela opo: Window Projects ( Ctrl+ 1 ). Assim como para as outras janelas e vises desse ambiente, pode-se posicionara janela de projeto nos cantos da tela clicando na sua barra de ttulos e arrastando parao local desejado. Recomenda-se que a janela de projeto fique localizada na barra lateralesquerda. Se o nome do projeto no estiver em negrito, clique com o boto direito nomesmo e ative a opo Set as Main Project.

    8. Clique com o boto direito em Source Files e ento selecione a opo New C Source File...

    13

  • 3.2. CRIANDO UM NOVO PROJETO CAPTULO 3. MPLAB X

    9. D um nome ao arquivo que ser criado. No nosso exemplo, ele se chamar main.c .

    10. Entre com o seguinte contedo:

    14

  • CAPTULO 3. MPLAB X 3.2. CRIANDO UM NOVO PROJETO

    11. Clique na boto Build da barra de ferramentas, representado por um martelo.

    12. Caso o programa digitado no contenha erros, a barra inferior ter um contedo seme-lhante ao da figura abaixo.

    Caso as etapas previamente descritas tenham sido executadas com sucesso, o cdigo de m-quina, representado por um arquivo em hexadecimal, ser disponibilizado na pasta dist default production. Esse arquivo ser usado para tanto para assimulaes como para a gravao do PIC16F877A.

    15

  • 3.2. CRIANDO UM NOVO PROJETO CAPTULO 3. MPLAB X

    16

  • Captulo4Portas de Entrada e Sada

    4.1 Introduo

    Dentre os perifricos do PIC16F877A, pode-se dizer que os pinos de entrada e sada estoentre os mais usados. Por meio deles, sinais digitais externos podem ser lidos e gerados peloprograma gravado no microcontrolador. Tarefas como a leitura de uma tecla digital ou dasada de um circuito lgico e a exibio de um dado smbolo em um display de 7 segmentos sofacilmente realizveis dispondo dos mecanismos de configurao e manipulao desses pinos.Antes de analisarmos especificamente o caso do PIC16F877A, no entanto, considere o circuitointegrado 7408, que contm quatro portas lgicas AND padro TTL (Figura 4.1a). Algunsdos seus pinos, como por exemplo os pinos 1 e 2, so destinados entrada de dados digitais.Para o uso tpico de uma porta AND, espera-se que um elemento externo se encarregue deimpor os estados lgicos alto ou baixo nesses pinos. Outros pinos do CI, como o pino 3,oferecem sadas digitais. Normalmente os circuitos externos porta AND devem monitorar oestado da sada e reagir apropriadamente. Finalmente, a sada de um circuito pode ser usadacomo entrada de outro, desde que os limites nas especificaes das folhas de dados sejamrespeitados1.Aps a anlise do componente 7408, fica claro que no esperado que o projetista usuriodeste circuito integrado ligue, por exemplo, uma fonte de sinal digital no pino 3. O caso dosmicrocontroladores PIC da Microchip um pouco diferente: os pinos no so definidos comoentradas ou sadas no momento de fabricao do CI. Todos os pinos de E/S do PIC16F877Apodem servir como entradas ou sadas, mediante configurao (Figura 4.1b).O microcontrolador pode substituir um circuito combinacional qualquer caso seu programadefina o estado das sadas somente em funo de entradas. Para esta aplicao, o programainicialmente configuraria a direo de todos os pinos de E/S envolvidos e ento entraria emum lao infinito onde o estado das entradas constantemente avaliado e os estado das sadasimposto segundo a lgica a ser atingida. Vale ressaltar, no entanto, que o tempo de respostade uma soluo como esta normalmente pior do que o de um circuito dedicado. Enquantoum circuito lgico responde a um estmulo em poucos nanossegundos, uma nica instruono PIC16F877A com um cristal oscilador de 20MHz leva 200 ns! Ainda assim, diversasaplicaes no necessitam de respostas to rpidas. A fisiologia da viso humana tal queno percebemos diferena se um display de 7 segmentos for atualizado aps 20 ns ou 20 s.

    1O parmetro fan out se refere quantidade de entradas digitais que uma dada sada pode alimentar semque seu nvel lgico seja comprometido.

  • 4.2. CONFIGURAO E MANIPULAO DAS PORTAS CAPTULO 4. PORTAS E/S

    (a) 7408 (b) PIC16F877A

    Figura 4.1: Entradas e sadas digitais

    A configurao e o uso das portas de entrada e sada, tanto para emular circuitos combinaci-onais como para outras aplicaes, ser explorada ao longo desse captulo.

    4.2 Configurao e Manipulao das Portas

    Os pinos de entrada e sada so agrupados em PORTAS. A cada porta so associados doisregistradores:

    1. um registrador com o prefixo PORT, contendo o estado dos pinos e

    2. um registrador com o prefixo TRIS, contendo a configurao da direo dos pinos (en-trada ou sada).

    A partir do registrador PORTB, pode-se manipular o estado das sadas digitais e observaro estado das entradas digitais da porta B. J o registrador TRISB destina-se definio dadireo de cada pino da porta B, seguindo a seguinte conveno (tambm vlida para os outrosregistradores TRIS):

    1 = entrada digital (1 lembra o I de Input) e 0 = sada digital (0 lembra o O de Output).

    4.2.1 Codificao do Primeiro Programa

    O exemplo ilustrado pela Figura 4.2 e pelo Programa ?? configura os 4 primeiros pinos daporta B como entradas (teclas digitais) e os 4 ltimos como sadas (LEDs). Em seguida, umlao de repetio infinito atrela o estado de cada LED (aceso ou apagado) ao estado da teclaassociada. O cdigo sugerido, bem como caractersticas pertinentes do PIC e do compiladorutilizado, so explicados com mais detalhes nos tpicos a seguir.

    18

  • CAPTULO 4. PORTAS E/S 4.2. CONFIGURAO E MANIPULAO DAS PORTAS

    Exemplo 4.1

    Aplicao bsica envolvendo pinos de E/S

    Figura 4.2: Uso de teclas eLEDs nos pinos de E/S

    1 # include 2

    3 void main ( ) {4 TRISB = 0 x0F ;5 OPTION_REGbits . nRBPU = 0 ;6 while ( 1 ) {7 PORTBbits . RB4 = PORTBbits . RB0 ;8 PORTBbits . RB5 = PORTBbits . RB1 ;9 PORTBbits . RB6 = PORTBbits . RB2 ;

    10 PORTBbits . RB7 = PORTBbits . RB3 ;11 }12 }

    Arquivo de Cabealho

    A incluso do arquivo de cabealho xc.h traz como smbolos de escopo global todos osregistradores do PIC16F877A. Diretivas do pr-processador do XC8 presentes nesse arquivoidentificam o microcontrolador utilizado e incluem automaticamente o arquivo cabealho apro-priado, no nosso caso o pic16f877a.h . Assim sendo, para todos os projetos a incluso doxc.h suficiente para acesso aos registradores e algumas funes de base.Da mesma forma que em vrios outros pr-processadores para linguagem C, arquivos de ca-bealho delimitados por < > so buscados nos diretrios definidos na varivel de compilaoInclude Path. J os arquivos de cabealhos delimitados por so buscados usando:

    caminho absoluto, como em #include "C:/Users/Nome/Documents/Proj1/joystick.h"

    caminho relativo, como em #include " lcd .h", #include " ../ lcd .h" e #include "header/ lcd .h".

    Para os caminhos relativos, temos, no primeiro caso, a incluso de um arquivo na pasta raiz doprojeto. No segundo caso, o arquivo ser buscado na pasta que est um nvel acima da pastado projeto. Finalmente, no terceiro caso, o cabealho ser buscado dentro da pasta header,a qual se encontra na raiz do projeto.

    Ponto de Entrada: Funo main()

    O padro para a linguagem C especifica duas assinaturas para ambientes dotados de sistemasoperacionais: int main(void) e int main(int argc , char argv []) .Entretanto, no que concerne os sistemas embarcados, a assinatura da funo principal fica acritrio da implementao. Como no vamos instalar um sistema operacional no PIC16F877A,usaremos neste livro apenas a assinatura void main().

    19

  • 4.2. CONFIGURAO E MANIPULAO DAS PORTAS CAPTULO 4. PORTAS E/S

    Manipulao dos Registradores

    O exemplo apresentado manipula o contedo dos registradores TRISB, PORTB e OPTION_REG.Para armazenar um byte completo em qualquer registrador do PIC, basta recorrer ao operadoratribuio padro da linguagem C, como em REGISTRADOR = 0xAB. Nos registradores para osquais faz sentido a manipulao individual de bits, o XC8 prov estruturas e unies acessveissimplesmente pelo sufixo bits. Com isso, pode-se ler ou atribuir o valor de um dado bit, comoem REGISTRADORbits.NOMEBIT = 1. O recurso autocompletar da IDE auxilia na identificaodo nome do bit. Os bits de controle ativados com lgica negativa (habilitados com nvel lgico0) tero o nome prefixado por n, como o caso do bit nRBPU. Haver tambm a definiode REGISTRADORbits_t, o qual representa apenas o tipo estrutura, e no ser usadonos projetos desenvolvidos. Detalhes sobre a definio de qualquer smbolo podem ser obtidoscom Ctrl + sobre o mesmo.

    Configurao da Direo dos Pinos de E/S

    A linha 4 responsvel pela configurao da direo dos pinos da porta B. O literal 0x0F equivalente ao literal 0b00001111 ou ainda 15. Os 4 bits mais significativos da porta soconfigurados como sadas (0) e os 4 bits menos significativos como entradas (1). No se deveconfundir a configurao da direo do pino (0 ou 1 em algum bit do registrador TRIS) como estado lgico do pino (0 ou 1 em algum bit do registrador PORT associado).

    Resistores de Pull-Up

    O PORTB conta com resistores internos de pull-up para todas as entradas digitais. Esserecurso simplifica a conexo de teclas ao sistema, fazendo com que teclas no pressionadasresultem automaticamente em nvel lgico alto nos pinos de entrada associados. O pull-upinterno vem desativado por padro, mas pode ser habilitado por meio do bit de configuraoRBPU do registrador OPTION_REG. Isto foi feito na linha 5 do programa. Devido ao pull-updas teclas, os LEDs foram conectados de modo a acender com nvel lgico baixo. Desta forma,os LEDs acendero quando as teclas correspondentes forem pressionadas.

    Estado dos Pinos de E/S

    A linha 7 funcionalmente equivalente a:

    if (PORTBbits.RB0)PORTBbits.RB4 = 1; else PORTBbits.RB4 = 0; .

    No entanto, a manipulao feita pelo exemplo levemente mais eficiente, por envolver atribui-o direta no lugar de desvios condicionais. Por estar no lado direito do operador atribuio,o bit PORTBbits.RB0 ser lido. Analogamente, por estar no lado esquerdo da atribuio, obit PORTBbits.RB4 ser manipulado. Buscando melhorar ainda mais a eficincia do cdigogerado (no otimizado pela verso gratuita do XC8), poderamos ainda substituir as quatroatribuies por uma nica:

    PORTB = PORTB

  • CAPTULO 4. PORTAS E/S 4.3. CARACTERSTICAS ELTRICAS DOS PINOS DE E/S

    reposicionar os 4 bits configurados como entradas no nibble mais significativo da palavraresultado.

    Importante

    Quando se trata de sistemas embarcados, limites de memria eotimizao de cdigo ganham um papel especial e, por vezes,vital, para o sucesso do projeto.

    Conforme visto pela Figura 4.1b, nem todas as portas possuem 8 pinos associados. No entanto,como todos os registradores esto em uma memria organizada em bytes, nada impede aatribuio do literal 0xA7 (0b10100111) ao registrador PORTE. Os 5 bits mais significativossero ignorados, j que a porta E conta apenas com 3 pinos de entrada e sada.

    Funes Multiplexadas

    Finalmente, importante ressaltar que o uso de outros perifricos compromete um ou maispinos de E/S. Por exemplo, o canal 0 do conversor A/D, quando habilitado, no permite ouso do pino 2 como porta de entrada e sada. Para facilitar o entendimento desses conflitosno uso dos perifricos, a cada pino so atribudos vrios nomes. O pino referente ao bit menossignificativo da porta A (RA0), tambm recebe o nome de AN0, simbolizando o canal 0 doconversor A/D. No se pode usar as 2 funes simultaneamente. Cabe ao projetista configuraradequadamente todos os perifricos envolvidos na aplicao.Normalmente, as portas digitais so ativadas e os outros perifricos desativados por padro.No entanto, o conversor A/D representa uma importante exceo: todos os canais analgicosesto ativos aps o RESET, comprometendo o PORTA e o PORTE por completo.

    Alm dos resistores internos de pull-up da porta B, outras especificidades sero das portas deE/S sero brevemente descritas na prxima seo. Uma viso mais detalhada pode ser obtidano Captulo 4 I/O Ports do Datasheet.

    4.3 Caractersticas Eltricas dos Pinos de E/S

    Nesta seo abordaremos os nveis de tenso dos pinos de entrada e sada digital do PIC16F877A.Maiores detalhes e outros parmetros eltricos e trmicos podem ser obtidos no Captulo 17 Electrical Characteristics do Datasheet.

    4.3.1 Classificao dos Pinos de E/S

    O PIC16F877A trabalha simultaneamente com as tecnologias TTL, CMOS e Schmitt Trigger.As sadas digitais so todas CMOS, enquanto as entradas so TTL ou Schmitt Trigger. ATabela 4.1 classifica os pinos de E/S do PIC16F877A quanto ao padro digital utilizado ecaractersticas especiais (resistores internos de pull-up, sadas em dreno aberto).A porta B possui as seguintes particularidades:

    o pino RB0 se torna uma entrada Schmitt Trigger quando usado como pino para inter-rupo externa (Captulo 5);

    21

  • 4.3. CARACTERSTICAS ELTRICAS DOS PINOS DE E/S CAPTULO 4. PORTAS E/S

    Tabela 4.1: Caractersticas Eltricas dos Pinos de E/S do PIC16F877A

    Pino Entrada Sada

    RA0. . . RA3 TTL CMOSRA4 Schmitt Trigger CMOS (Dreno Aberto)RA5 TTL CMOSRB0 TTL (Pull-Up programvel) / Schmitt Trigger CMOSRB1. . . RB5 TTL (Pull-Up programvel) CMOSRB6 e RB7 TTL (Pull-Up programvel) / Schmitt Trigger CMOSRC0. . . RC7 Schmitt Trigger CMOSRD0. . . RD7 TTL / Schmitt Trigger CMOSRE0. . . RE3 TTL / Schmitt Trigger CMOS

    os pinos RB6 e RB7 so entradas Schmitt Trigger durante a gravao ou depuraoin-circuit;

    quando o recurso Low Voltage Programming estiver habilitado (padro de fbrica),o pino RB3 no poder ser usado como pino de E/S.

    J as portas D e E so dotadas de entradas TTL quando a porta paralela escrava estiverhabilitada. Alguns bits de TRISE so utilizadas para configurar a porta paralela, desabilitadapor padro.

    4.3.2 Faixas de Tenso

    A Tabela 4.2 contm os tenses referentes aos nveis lgicos baixo e alto, para as tecnologiasTTL e CMOS.

    Tabela 4.2: Nveis de Tenso TTL e CMOS

    Nvel Lgico Baixo Nvel Lgico Alto Alimentao

    EntradaTTL 0 vLOW 0.8V 2V vHIGH VDD 4.5V VDD 5.5VSchmitt Trigger2 0 vLOW 0.2 VDD 0.8 VDD vHIGH VDD 4.0V VDD 5.5V

    Sada CMOS 0 vLOW 0.6V vHIGH VDD 0.7V VDD = 4.5V

    4.3.3 Schmitt Trigger

    A regio indefinida de entradas TTL, 0.8V < v < 2V, possui um limiar de tenso, vTHRESHOLD,abaixo do qual o sinal valer 0 e acima do qual o sinal valer 1. Com isso, sinais comtransies lentas e que venham a oscilar em torno de vTHRESHOLD podem comprometer algica da aplicao.Para tratar melhor sinais ruidosos e prevenir chaveamentos indesejveis, comuns em chavesmecnicas, as entradas Schmitt Trigger contam com histerese (Figura 4.3). Nesse caso temosdois limiares: um para transio positiva (v ) e outro para transio negativa (v!).

    22

  • CAPTULO 4. PORTAS E/S 4.3. CARACTERSTICAS ELTRICAS DOS PINOS DE E/S

    (a) Smbolo (b) Histerese

    Figura 4.3: Schmitt Trigger

    4.3.4 Resistores de pull-up internos

    Os resistores internos de pull-up, vistos em 4.2.1, podem ser entendidos analisando a Figura4.4, que fornece uma viso simplificada de um pino de entrada da porta B quando o recursoest habilitado.Observa-se que, quando o pino est em

    Figura 4.4: Pino com Resistor de Pull-Up interno

    aberto, a tenso que chega CPU VDD, o que significa nvel lgico alto.Quando o pino conectado ao poten-cial zero, por exemplo por meio de umatecla tal como na Figura 4.2, haveruma queda de tenso no resistor depull-up, o que acarretar em nvel l-gico 0 na CPU. Um dos benefcios depinos com pull-up interno a reduodas conexes necessrias para a conexo de teclas (Figura 4.5).Os resistores de pull-up da famlia de mdio porte de microcontroladores PIC so ditos fracos.Isso significa que eles possuem valores de resistncia altos. Com isso, o circuito responsvelpela gerao do sinal digital no pino no precisa drenar um valor elevado de corrente.

    4.3.5 Sadas CMOS em dreno aberto

    O pino RA4 possui sada em dreno aberto, conforme ilustrado na Figura ??. Isso faz com queo pino seja capaz de drenar corrente, quando em nvel lgico baixo, mas tenha alta impednciapara nvel lgico alto, exigindo um resistor externo de pull-up.Dentre as principais consequncias desta configurao, destacamos:

    23

  • 4.3. CARACTERSTICAS ELTRICAS DOS PINOS DE E/S CAPTULO 4. PORTAS E/S

    (a) Chaves SPDT (b) Pull-up externo (c) Pull-up interno

    Figura 4.5: Alternativas para a conexo de teclas

    a possibilidade de interfacear outras famlias lgicas, desde que a tenso entre RA4 eVSS seja inferior a 8.5V (parmetro obtido do Datasheet, no Captulo 17);

    a ligao como uma via de dados de um barramento qualquer n pode impor nvellgico baixo mas o nvel lgico alto somente atingido quando nenhum deles tenta impor0 na via (Figura 4.7).

    Figura 4.7: Configurao em barramento com pinos dreno aberto (mostrando apenas sadas)

    24

  • CAPTULO 4. PORTAS E/S 4.4. DISPLAYS DE 7 SEGMENTOS

    4.4 Displays de 7 Segmentos

    Os displays de 7 segmentos so dispositivos simples de

    Figura 4.8: Display de 7 segmentos

    exibio, compostos geralmente por diodos emissores deluz (LED) ou outros elementos luminosos que so dis-postos de forma a permitir a representao de numeraisindo-arbicos e algumas letras. Com a chegada dos dis-plays de cristal lquido (LCD), os displays de 7 segmentosvm se tornando obsoletos. No entanto, para fins acad-micos, eles ainda constituem uma boa ferramenta parao treinamento de tcnicas elementares de programao e uso de pinos de E/S.

    Por ser usado em diversos aparelhos eletrnicos das ltimas dcadas, trata-se de um dispositivobem familiar. fcil reconhec-lo se olharmos sua representao na figura 4.8, que mostrauma conveno de nomenclatura para os 7 segmentos (a . . . g) e o ponto decimal (h).

    4.4.1 Circuitos com displays

    Os LEDs em displays de 7 segmentos so conectados seja na configurao anodo comum(figura 4.9a), seja na configurao catodo comum (figura 4.9b). Em ambas configuraes, apinagem aquela mostrada na figura 4.9c. As duas configuraes possuem lgicas de ativaodistintas, conforme mostra a figura 4.10. Considerando que na configurao anodo comum,este seja ligado a VCC , os LEDs acendero com nvel lgico baixo (que corresponde a umatenso entre 0V e 0,8V). J na configurao catodo comum, se o catodo est conectado aoterra, os LEDs acendero com nvel lgico alto (que corresponde a uma tenso entre 2V e5V).

    Alm disso, deve-se limitar a corrente de cada ramo, e por isso no podemos conectar osterminais de um LED entre VCC e GND. O uso de apenas uma resistncia adicionada noterminal comum no recomendado. Ao invs disso, uma boa soluo consiste em conectaruma resistncia em srie com cada segmento, formando ento ramos independentes limitadosapenas pela capacidade da fonte de tenso. Se essas resistncias forem do tipo trimpot,pode-se compensar a diferena de luminosidade dos LEDs com a calibrao de cada segmentosegundo uma referncia visual.

    (a) Configurao anodo comum

    (b) Configurao catodo comum (c) Pinagem

    Figura 4.9: Configuraes e pinagem de displays de 7 segmentos

    25

  • 4.4. DISPLAYS DE 7 SEGMENTOS CAPTULO 4. PORTAS E/S

    (a) Anodo Comum (b) Catodo comum

    Figura 4.10: Lgicas de Ativao

    A princpio, as resistncias so dimensionadas para que cada ramo fornea ao LED sua correntetpica de operao, que normalmente de aproximadamente 20mA. Para maiores detalhes sobrea queda de tenso nos LEDs e a corrente tpica, consulte a folha de dados do fabricante.

    4.4.2 Interface com o PIC16F877A

    Os pinos de E/S do microcontrolador faro o papel das chaves da figura 4.10. A tabela 4.3fornece a representao padro de displays de 7 segmentos para os dgitos de 0 a 9 e letras deA a F, deixando o ponto decimal h apagado.Um contador em hexadecimal que mostra o valor atual da contagem num display de 7 seg-mentos (circuito da Figura 4.11) pode ser implementado com o cdigo ??.Neste programa exemplo, todos os pinos da porta D so configurados como sadas digitais(linha 13). O sistema ento entra num lao infinito onde, graas ao clculo do resto dadiviso (operador %), uma varivel i fica eternamente limitada entre 0 e 15. A ao a serexecutada em cada iterao do lao consiste em exibir o smbolo correspondente a i no displayde 7 segmentos e ento pausar a execuo por 1 segundo. A funo __delay_ms dependeda definio da constante _XTAL_FREQ, que corresponde frequncia do cristal em Hz.O compilador XC8 precisa saber a frequncia de operao para computar apropriadamenteo nmero de ciclos de mquina despendidos na temporizao por espera ocupada, ou seja,sem o uso de perifricos especiais de temporizao. A decodificao para 7 segmentos feitasimplesmente por um vetor, cujo ndice representa a palavra de entrada (BCD) e o contedorepresenta a palavra de sada (7 segmentos). Este mesmo recurso pode ser usado para incluirtabelas verdade de outros circuitos combinacionais.

    26

  • CAPTULO 4. PORTAS E/S 4.4. DISPLAYS DE 7 SEGMENTOS

    Exemplo 4.2

    Interface com display de 7 segmentos

    Figura 4.11: Interface comum nico display de 7 seg-mentos

    1 #define _XTAL_FREQ 40000002 # include 3

    4 char d i s p 7 s e g _ d i g i t o s [ ] = {5 0x3F , 0 x06 , 0x5B , 0 x4F ,6 0 x66 , 0x6D , 0x7D , 0 x07 ,7 0x7F , 0 x6F , 0 x77 , 0x7C ,8 0 x39 , 0x5E , 0 x79 , 0 x719 } ;

    10

    11 void main ( ) {12 char i ;13 TRISD = 0 ;14 for ( i = 0 ; i < 1 6 ; i = ( i + 1 ) % 1 6 ) {15 PORTD = d i s p 7 s e g _ d i g i t o s [ i ] ;16 __delay_ms ( 1 0 0 0 ) ;17 }18 }

    Tabela 4.3: Cdigos para exibio de dgitos em displays de 7 segmentos

    Smbolo Segmentos Anodo Comum Catodo Comuma b c d e f g h MSb=a MSb=h MSb=a MSb=h0x03 0xC0 0xFC 0x3F0x9F 0xF9 0x60 0x060x25 0xA4 0xDA 0x5B0x0D 0xB0 0xF2 0x4F0x99 0x99 0x66 0x660x49 0x92 0xB6 0x6D0x41 0x82 0xBE 0x7D0x1F 0xF8 0xE0 0x070x01 0x80 0xFE 0x7F0x09 0x9F 0xF6 0x6F0x11 0x88 0xEE 0x770xC1 0x83 0x3E 0x7C0x63 0x36 0x9C 0x390x85 0xA1 0x7A 0x5E0x61 0x86 0x9E 0x790x71 0x8E 0x8E 0x71

    27

  • 4.4. DISPLAYS DE 7 SEGMENTOS CAPTULO 4. PORTAS E/S

    O uso de 8 pinos de E/S exclusivos para a interface com um nico display de 7 segmen-tos um exagero aceitvel para um primeiro exemplo de programao. No entanto, duasimplementaes alternativas se apresentam como possveis solues ao problema:

    1. transmisso serial e conversores srie-paralelo, conforme exibido na Figura 4.12;

    2. multiplexao dos displays no tempo (Figura 4.13).

    Figura 4.12: Interface com displays de 7 segmentos por meio de registradores de deslocamento

    Figura 4.13: Interface com displays de 7 segmentos multiplexados no tempo

    28

  • Captulo5Sistema de Interrupes

    Sistemas eletrnicos microprocessados muito frequentemente so projetados para reagir a cer-tos eventos, internos ou externos, que representam a alterao no estado de algum perifrico.Dentre as fontes de evento disponveis no PIC16F877A, podemos citar:

    a mudana do estado de um ou mais pinos de E/S digital; a recepo de uma palavra de dados por alguma interface de comunicao; o trmino de uma converso analgico-digital; o estouro de uma contagem de tempo; a alterao do valor de sada do comparador analgico e trmino de uma operao de escrita na memria EEPROM.

    Neste captulo estudaremos a implementao do PIC16F877A para o valioso mecanismo dasinterrupes, bem como o caso especfico de eventos provenientes de 2 perifricos. Nos captu-los posteriores, outros perifricos sero analisados, juntamente com as informaes necessriaspara usar o sistema de interrupes com os eventos provocados por eles. Alm de detalharesse recurso, uma soluo alternativa ser avaliada, revelando quais limitaes podem sercontornadas por projetos com interrupes.

    5.1 Interrupes

    Um sistema de interrupes engloba recursos de hardware e software necessrios para proverorganizao no atendimento dos eventos. Desde que devidamente habilitada por meio deregistradores de configurao, uma interrupo de hardware capaz de desviar automa-ticamente o fluxo de execuo do programa para uma regio de memria especfica.Considerando o uso do compilador XC8, esta regio se referente a uma nica funo em lin-guagem C com o modificador interrupt. Em outras palavras, a interrupo implica no softwarepoder ser notificado da ocorrncia de alteraes nos estados dos seus perifricos.Nos programas estudados at ento, vimos que a nica funo chamada automaticamente afuno main(), que corresponde ao ponto de entrada da execuo e, portanto, avaliada logoaps o RESET da mquina. Caso existam interrupes habilitadas, um loop infinito introdu-zido na funo main(), por exemplo pela expresso while(1){}, pode parar temporariamentede ser executado em razo da necessidade do tratamento de eventos.Outra caracterstica chave desse recurso que, uma vez que o evento foi devidamente tratado,o fluxo de execuo retorna ao ponto onde estava imediatamente antes da interrupo. Se

  • 5.1. EVENTOS SEM INTERRUPES CAPTULO 5. INTERRUPES

    o desvio ocorreu durante a execuo de uma iterao de um lao infinito vazio, o sistemavoltar ao loop aguardando uma nova interrupo. Uma analogia a este tipo de estrutura o caso de um atendente de loja, completamente desocupado, aguardando um cliente, cujoatendimento representa o tratamento da interrupo. Se o tratamento no for demasiadamentelongo (poucas instrues no corpo da funo), o sistema pode executar tarefas longas e/ouperidicas dentro do loop infinito, como os processos de varredura de teclado matricial e deatualizao de displays de 7 segmentos multiplexados no tempo, apresentados no Captulo 4.Seguindo a analogia anterior, teramos agora um modelo no qual o atendente pode realizaroutras atividades nos momentos ociosos da loja, ser interrompido para atender um cliente e,em seguida, retomar tais atividades normalmente. A figura 5.1 ilustra essa nova estrutura.

    Figura 5.1: Desvio e retorno causados por uma interrupo

    Antes de aprofundarmos no estudo das interrupes, no entanto, vamos verificar como tratareventos sem usar esse mecanismo. Tal anlise ilustrar quais so as dificuldades no tratamentode eventos quando no se usa um sistema de interrupes.

    5.2 Tratamento de Eventos sem Interrupes

    Os eventos mencionados previamente ocorrem independentemente da existncia e da ativaode um sistema de interrupes e podem at ser tratados de outras maneiras. Um mtodosimples monitorar ativamente o estado da mquina, aguardando por mudanas, tcnica maisconhecida como polling.Como exemplo, uma forma de esperar por nvel lgico 0 no pino RB0 e reagir escrevendo 1no pino RD7 apresentada na figura 5.2a. Se o programa no necessitar realizar nenhumaatividade enquanto aguarda a condio RB0 = 1, a soluo se mostra eficaz e apropriada.No entanto, vamos considerar o caso de um sistema que no pode se dar ao luxo de per-manecer ocioso. Ele deve realizar um algoritmo de varredura de um teclado matricial 8x8,exibir informaes num display LCD e realizar um clculo complexo, continuamente. Um laoinfinito estar presente, e cada iterao desse lao efetuar uma nica execuo dessas tarefas,despendendo 200 ms no total. Nesse caso, o evento RB0 = 1 ser monitorado numa taxapotencialmente insatisfatria (figura 5.2b). Uma possvel soluo seria testar a condio maisde uma vez. Poderamos realizar, por exemplo, 3 testes, um aps cada etapa da atividadeprincipal. Isso melhoraria a taxa de monitoramento mas tornaria o programa maior, mais com-plexo e mais susceptvel a falhas. Se mltiplos eventos devem ser monitorados (figura 5.2c),o problema se torna ainda desafiador.Portanto, a tcnica polling de aplicao limitada a casos onde o programa no deve reali-zar nenhuma atividade enquanto aguarda por eventos e poucas fontes de eventos devem sermonitoradas.

    30

  • CAPTULO 5. INTERRUPES 5.2. EVENTOS SEM INTERRUPES

    (a) Espera ocupada por evento nico (b) Tarefas concomitantes espera por evento

    (c) Mltiplos eventos

    Figura 5.2: Polling (alternativa s interrupes)

    31

  • 5.2. TRATAMENTO COM INTERRUPES CAPTULO 5. INTERRUPES

    5.3 Tratamento de Eventos com Interrupes

    Aplicaes que desfrutam das interrupes possuem geralmente uma estrutura comum: oprograma comea configurando os diversos perifricos e suas interrupes e em seguida entranum lao infinito esperando por interrupes. Chamaremos as aes executadas dentro dolao de atividade principal. Convm lembrar, entretanto, que o lao infinito no precisa realizartarefas. De fato, muitas aplicaes que veremos apenas respondem a interrupes, sem realizarnenhuma outra tarefa.Para melhor entendermos as etapas de uma interrupo, vamos considerar a analogia apresen-tada na figura 5.3.

    Atividade Principal

    Evento

    Desvio

    QUEM? Origem

    bla... bla Tratamento

    Retorno

    1

    2

    3

    4

    5

    6

    Figura 5.3: Analogia para o sistema de interrupes

    5.3.1 Atividade Principal

    Na etapa , temos uma pessoa assistindo TV. Para chegar a esse ponto, foi necessrioligar o aparelho, ajustar o volume e escolher o canal. Da mesma forma, um programa de umsistema microprocessado baseado no PIC16F877A entra na atividade principal aps a etapade configurao dos perifricos e das interrupes.

    5.3.2 Evento

    Em algum momento da execuo do programa principal, teremos a ocorrncia de algum evento,relacionado mudana do estado de algum perifrico. A etapa representa tal evento comuma analogia a uma ligao telefnica. Vale lembrar que no existe nada que impea umapessoa de tentar ligar para o nmero da linha telefnica associada a esse aparelho, ainda queo mesmo desconectado. Voltando para o PIC16F877A, dizemos que os eventos simplesmenteocorrem.

    32

  • CAPTULO 5. INTERRUPES 5.3. TRATAMENTO COM INTERRUPES

    5.3.3 Desvio

    Caso um sistema de interrupes esteja devidamente configurado, o evento provocar umdesvio. Voltando para a analogia da figura 5.3, na etapa , vamos considerar trs condiespara que o desvio ocorra:

    1. o morador da residncia deve ser assinante de uma linha telefnica;

    2. o aparelho telefnico deve estar numa sala acessvel (se o telefone se encontrar numasala trancada no poderemos desviar para atend-lo) e

    3. o aparelho telefnico deve estar conectado linha telefnica.

    No PIC16F877A tambm temos trs nveis de ativao de interrupes, os quais chamamosde chaves ou mscaras. Contamos com a chave global, sem a qual nenhum evento podeprovocar desvios. Vamos entend-la como sendo o elemento que corresponde assinatura dalinha telefnica. Alm disso, existem chaves individuais para cada perifrico que pode disparareventos. As chaves individuais desempenham o mesmo papel que os cabo de comunicaopresente em cada aparelho da residncia. Basta considerarmos vrios ramais telefnicos naresidncia, cada um associado a um perifrico do microcontrolador. No entanto, no caso doPIC16F877A o desvio sempre direciona o fluxo de execuo para a mesma regio: a funoespecificado com o modificador interrupt. Isso justifica a etapa de identificao, apresentadana seo posterior. Finalmente, os perifricos por vezes so organizados em grupos, o queequivale ao caso da sala acessvel. Vamos supor, nesse caso, que os grupos de perifricos soas salas e em cada sala temos vrios ramais. Ao longo deste captulo e dos prximos vamosexplorar mais detalhadamente essa questo das chaves de interrupo.Um evento pode sensibilizar o sistema de interrupes de modo a provocar um desvio. Issopode remeter o leitor a um questionamento relevante: o que ocorre se um evento ocorrerexatamente no meio da execuo de uma instruo? Ainda que o evento possa ocorer aqualquer momento, o sistema de interrupes opera segundo os ciclos de mquina. Nessecaso, a instruo em execuo devidamente finalizada e a interrupo agendada para oprximo ciclo de mquina.

    5.3.4 Identificao

    Quando mltiplas fontes de evento so configuradas no sistema de interrupes, faz-se neces-srio, na ocorrncia de uma interrupo, identificar exatamente qual evento a provocou. Emalguns microcontroladores, cada evento desvia o fluxo de execuo para uma regio especficada memria de programa, referente ao tratamento daquele perifrico particular. Para essessistemas, dizemos que a o sistema de interrupes vetorado. Isso significa que no cabe aosoftware descobrir qual perifrico disparou a interrupo. O PIC16F877A, no entanto, dispede um sistema de interrupes no vetorado, no qual todos eventos levam o contador deprograma ao mesmo endereo (precisamente a posio 0x04 da memria). Portanto, aps odesvio provocado pela interrupo, o software da aplicao deve descobrir qual perifrico estassociado com a mesma. Esse processo de identificao ser detalhado nesta seo.Quando um perifrico apresenta uma mudana relevante de estado, um bit especial denomi-nado flag de interrupo levado automaticamente para nvel alto indicando a situao. Valeressaltar que este comportamento est relacionado ocorrncia do evento e no necessaria-mente da interrupo. Isso significa que at mesmo a tcnica de monitoramento descrita na

    33

  • 5.3. TRATAMENTO COM INTERRUPES CAPTULO 5. INTERRUPES

    Tabela 5.1: Flags de Interrupo

    Registrador Bit Descrio

    INTCON RBIF Mudana de estado nos pinos RB

    INTCON INTF Transio no pino RB0/INT

    INTCON TMR0IF Estouro de contagem do Timer 0

    PIR1 TMR1IF Estouro de contagem do Timer 1

    PIR1 TMR2IF Estouro de contagem do Timer 2

    PIR1 CCP1IF Flag do mdulo Capture/Compare/PWM 1

    PIR1 SSPIF Atividades das interfaces SPI e I2C

    PIR1 TXIF Incio de uma transmisso serial USART

    PIR1 RCIF Recepo pela porta USART concluda

    PIR1 ADIF Final de uma converso A/D

    PIR1 PSPIF Leitura/escrita na porta paralela concluda

    PIR2 CCP2IF Flag do mdulo Capture/Compare/PWM 2

    PIR2 BCLIF Coliso no barramento SPI ou I2C

    PIR2 EEIF Escrita na EEPROM

    PIR2 CMIF Mudana na entrada do comparador

    seo 5.2 pode usufruir dos flags de interrupo, consultando periodicamente seus estadospara detectar a ocorrncia de um evento. O uso de interrupes facilita o tratamento deeventos, limitando a consulta aos estados dos perifricos apenas na certeza de ocorrncia deum evento. O processo de identificao se assemelha s verificaes efetuadas no fluxogramada figura 5.2c, exceto que estas no so executadas dentro de um lao de repetio, e simaps algum desvio provocado por alguma interrupo. O conjunto de flags avaliado umanica vez por interrupo. A tabela 5.1 enumera os flags do PIC16F877A. Os diferentes pe-rifricos e as interrupes a eles associadas sero detalhados nas sees 5.4 e 5.5, bem comonos captulos posteriores.Se apenas um tipo de evento foi configurado, essa etapa pode ser seguramente ignorada,pois j se sabe no momento do tratamento da interrupo qual perifrico responsvel pelamesma. No caso de dois perifricos, a verificao do flag de um deles suficiente para fins deidentificao. Isso decorre do fato de que as interrupes so mutuamente exclusivas: paraapenas dois perifricos X e Y com interrupes habilitadas, ao identificar que o evento novem de X, conclumos que Y o responsvel pelo desvio.

    5.3.5 Tratamento

    Aps ter-se identificado a origem da interrupo, deve-se reagir ao evento com a lgica daaplicao. Imaginemos um sistema destinado ao enchimento de caixas de parafusos, ilustradona figura 5.4. Cada caixa comporta 100 unidades. A queda de um objeto representa uma bar-reira no fluxo de luz do par LEDFototransistor, gerando uma borda de subida no sistema.

    34

  • CAPTULO 5. INTERRUPES 5.3. TRATAMENTO COM INTERRUPES

    Figura 5.4: Sistema microprocessado baseado em interrupes

    Portanto, o sistema deve contar 100 bordas de subida e, em seguida, desligar o lanador depregos, deslocar a esteira para o alinhamento de uma nova caixa, reiniciar a contagem e religaro lanador. Se cada borda de descida provoca uma interrupo, o tratamento similar aoapresentado no algoritmo 5.1.O sistema de interrupes do PIC16F877A exige, para a maioria dos perifricos, que o flag deidentificao seja zerado dentro da rotina de servio interrupo. Esse fato, aliado ao quevimos previamente a respeito dos flags, nos remete a trs caractersticas bsicas dos mesmos:

    1. os flags indicam a ocorrncia de um evento, ainda que o mesmo no provoque um desvio(interrupo);

    2. os flags so usados para identificar qual perifrico originou a interrupo e

    Algoritmo 5.1 Tratamento de interrupo para um sistema fictcioOBS: Varivel global nParafusos inicializada com 0

    1: procedimento Tratamento2: nParafusos nParafusos+ 13: se nParafusos 100 ento4: desligarLanador()5: deslocarEsteira()6: nParafusos 07: ligarLanador()8: fim se9: fim procedimento

    35

  • 5.4. INTERRUPO EXTERNA CAPTULO 5. INTERRUPES

    3. um evento associado a uma dada interrupo deve ter seu flag zerado durante o trata-mento desta.

    5.3.6 Retorno

    Uma viso mais detalhada dessa etapa se faz possvel se considerarmos as manipulaes efe-tuadas no contador de programa (PC), a palavra que aponta para a prxima instruo a serexecutada1. Na ocorrncia de uma interrupo, faz-se uma cpia (backup) do contedo docontador de programa. Em seguida a palavra 0x4 escrita nesse registrador, o que desvia oprograma para este endereo. As instrues presentes nessa regio de memria so executadasat que uma instruo especial (RETFIE) devolva ao contador de programa seu valor original.Esse processo ilustrado na figura 5.5.

    Figura 5.5: Desvios provocados por uma interrupo

    5.4 Interrupo Externa

    A interrupo externa decorre de uma transio no pino RB0/INT. Ainda que outros eventos,como a recepo de uma palavra pela porta serial, possam ser considerados externos, o termointerrupo externa se restringe ao caso do pino RB0/INT. O bit INTEDG do registradorOPTION_REG configura qual mudana deve ser observada:

    OPTION_REGbits.INTEDG = 1; = evento acontece em bordas de subida ( )

    OPTION_REGbits.INTEDG = 0; = evento acontece em bordas de descida ( )

    Quando uma transio vlida detectada, o flag INTF do registrador INTCON vai para 1indicando sua ocorrncia. Caso as chaves global (GIE) e individual (INTE) estejam ativas,

    1Na famlia PIC 16, o contador de programa se subdivide em 2 registradores, PCLATH e PCL, contendorespectivamente a parte alta (mais significativa) e a parte baixa (menos significativa) da palavra PC.

    36

  • CAPTULO 5. INTERRUPES 5.4. INTERRUPO EXTERNA

    o evento provocar interrupo. Ambas as chaves se encontram no registrador INTCON. Oservio de interrupo deve zerar o flag INTF, para evitar interrupes recursivas2.

    O programa 5.1 usa a interrupo externa para inverter o sentido de rotao do contador emanel produzido na porta D (Figura 5.6). Diodos LED so ligados nesses pinos para representarvisualmente a sada do contador.

    O valor inicial 1 atribudo ao registrador PORTD na funo main(). A funo rotateLEDs() ,por meio dos operadores Shift Left (), desloca a posio do bit que estem nvel lgico alto, mudando assim o LED aceso. No entanto, um deslocamento esquerdaaplicado palavra 0b10000000 ou um deslocamento direita aplicado palavra 0b00000001resultam em 0 (rotao sem carry). As linhas 15, 16, 20 e 21 corrigem este comportamento,indesejvel no contador em anel. A rotao com carry est disponvel no dialeto Assembly doPIC.

    Figura 5.6: Circuito referenteao programa 5.1

    Listagem 5.1: Uso da Interrupo Externa (pinoRB0/INT)

    1 #define _XTAL_FREQ 40000002 # include 3 # include < s t d b o o l . h>4

    5 boo l r e v e r s o = f a l s e ;6

    7 void i n t e r r u p t i s r ( ) {8 INTCONbits . INTF = 0 ;9 r e v e r s o = ! r e v e r s o ;

    10 }11

    12 void ro t a t eLEDs ( ) {13 PORTD = r e v e r s o ? PORTD >> 1 : PORTD

  • 5.5. INTERRUPO POR MUDANA DE ESTADO CAPTULO 5. INTERRUPES

    5.5 Interrupo por mudana de estado de PORTB

    Qualquer transio em qualquer um dos pinos RB4, RB5, RB6 e RB7, exceto os que foremconfigurados como sadas, constitui um evento o qual chamaremos de Mudana de Estadodo PORTB. Este evento provoca interrupes mediante o estado ativo das chaves global(INTCONbits.GIE) e individual (INTCONbits.RBIE). Nenhum bit de configurao adicional sefaz necessrio para o uso desta fonte de interrupes.

    38

  • Captulo6Contadores e Temporizadores

    Dentre os perifricos mais importantes em sistemas embarcados, esto os contadores. Elespodem ser usados para contar eventos externos ao microprocessador, produzir sinais para ocontrole de velocidade de motores, controlar a frequncia e a durao na gerao de som etc.De um modo simplificado, pode-se considerar um contador como um perifrico que possui umregistrador cujo valor alterado a cada estmulo da via de controle Clock, seguindo uma ordembem definida. A contagem pode ser progressiva ou regressiva e os incrementos ou decremen-tos efetuados podem ser de uma ou mais unidades. Pode-se, ainda, conceber contadoresde sequncias arbitrrias, como: {0, 3, 1, 2}. Apesar de todas essas possibilidades, consi-deraremos aqui apenas contadores com incrementos de 1 unidade. Quando o sinal de Clockcontm pulsos uniformemente espaados no tempo, o contador atua como um temporizador,pois, nesse caso, contar pulsos uma forma indireta de contar tempo. Independentementede estarem sendo usados como contadores ou como temporizadores, para os propsitos dessecaptulo, podemos nos referir a esses perifricos simplesmente como timers.O PIC16F877A conta com trs timers, enumerados de 0 a 2, com diferentes caractersticas eopes de configurao. Antes de lidarmos com as particularidades de cada um, entretanto,algumas definies comuns sero apresentadas na prxima seo.

    6.1 Parmetros dos Timers

    6.1.1 Origem do Sinal de Clock

    Alguns timers possuem o clock multiplexado. Um bit de configurao permite a escolhaentre clock externo ou clock interno. No modo clock externo, a via de clock do contador conectada a um certo pino do chip, fixado em tempo de fabricao. Esta configurao usadanormalmente quando se deseja realizar a contagem de eventos externos, como por exemplo, nosistema da Figura 5.4. A outra opo, clock interno, far com que o perifrico conte ciclos demquina. Se o sistema dotado de um cristal externo de frequncia fOSC = 4MHz, tem-se:

    fPROC =fOSC

    4= 1MHz

    TC.M. =1

    fPROC= 1s

    39

  • 6.1. PARMETROS DOS TIMERS CAPTULO 6. TIMERS

    em que fPROC a frequncia de execuo das instrues e TC.M. a durao do ciclo demquina. Nesse caso, a contagem alterada a cada microssegundo e o perifrico atua comotemporizador.

    6.1.2 Estouro (overflow) do Timer

    Quando o registrador de contagem assume seu valor mximo e, devido ao incremento de 1unidade, volta para 0, temos um evento chamado estouro. Esses eventos so fontes vlidasde interrupo, conforme visto na seo 5.3.4. A figura 1 ilustra o estouro em um timer de 8bits:

    1 1 1 1 1 1 1 1+ 11 0 0 0 0 0 0 0 0

    O 9 bit da soma indica, justamente, o estouro do timer.

    6.1.3 Nmero de Eventos de Contagem e Recarga

    O registrador que contm o valor atual da con-

    Figura 6.1: Comportamento do timer(analogia)

    tagem pode ser lido ou escrito. Aqui usaremos aanalogia de um carro se movimentando numa pistacircular (Figura 6.1).O caso representado se refere a um contador de8 bits. O ltimo marco da pista 28 1 = 255,aps o qual haver o estouro do timer. Portanto,o timer far, naturalmente, uma contagem de 256eventos. Observe que, como no se trata de con-tagem regressiva, para que o timer realize a con-tagem de 100 eventos, ele dever comear da posio 156. Aps 99 incrementos ele estar naposio 255 e, finalmente, contar um ltimo evento, provocando o estouro. O valor inicialpara que o timer efetue um certo nmero de eventos chamado de recarga. Para um timerde 8 bits com a contagem de pelo menos um evento, temos:

    Recarga = 256 EventosContagem | 1 EventosContagem 256

    Para um timer de N bits, teremos:

    Recarga = 2N EventosContagem 1 EventosContagem 2N6.1.4 Prescaler

    Imagine o projeto de um relgio digital baseado no PIC16F877A que usa um temporizador de8 bits. Se o ciclo de mquina for TC.M. = 1s, cada volta corresponder a TV OLTA = 256s.Pode-se utilizar uma recarga de 6, para que reduzir esse nmero para TV OLTA = 250s. Aindaassim, seria necessrio esperar por 4000 voltas para o evento de 1s. Apesar de factvel, existeum recurso que pode simplificar esses casos. O prescaler um divisor de frequncia configurvel

    40

  • CAPTULO 6. TIMERS 6.2. TIMER 0

    que reduz a velocidade do temporizador, de forma que cada incremento na contagem precisede mais de um ciclo de mquina (temporizador) ou evento externo (contador de eventos).Por exemplo, se for usado um prescaler 1:16, cada incremento do registrador de contagemdemandar 16 ciclos de mquina e, portanto o tempo mximo possvel para cada volta serTV OLTA = 256s 16 = 4096s.

    6.1.5 Tempo da Volta e Tempo Total

    Combinando o que foi visto previamente, podemos definir o tempo para a volta e o tempototal:

    TV OLTA = TC.M. EventosContagem fPRESCALERTTOTAL = TV OLTA NV OLTAS

    em que fPRESCALER o denominador da razo de prescaler.

    6.2 Timer 0

    Contagens e Recarga O Timer 0 um contador/temporizador de 8 bits. O valor atual dacontagem pode ser lido ou manipulado por meio do registrador TMR0. Caso se queira voltasde 100 incrementos, deve-se levar esse registrador para o valor 156 no comeo de cada volta.

    Flag de Identificao Na ocorrncia de um estouro do timer 0, o bit TMR0IF do registradorINTCON (tambm acessvel pelo smbolo INTCONbits.T0IF), vai automaticamente para 1,indicando o evento. Este bit no volta automaticamente para 0, cabendo ao programador estaao. Este flag pode ser consultado para saber se houve estouro do timer, mesmo quando osistema de interrupes estiver desabilitado.

    Origem do Clock O bit OPTION_REGbits.T0CS permite configurar o perifrico para acontagem de ciclos de mquina (T0CS=0) ou de pulsos externos (T0CS=1; pulsos no pinoT0CKI). Este pino tambm o quinto pino de E/S da porta A: o pino RA4. Se o timer fordestinado contagem de eventos externos, deve-se configurar esse pino como entrada digital.Alm disso, o tipo de transio (bordas de subida ou bordas de descida ) a ser monitorada definido por meio do bit OPTION_REGbits.T0SE, seguindo a definio abaixo:

    OPTION_REGbits.T0SE = 0; = bordas de subida OPTION_REGbits.T0SE = 1; = bordas de descida

    Exemplo 6.1

    O cdigo abaixo mostra uma forma de gerar uma onda quadrada em todosos pinos da porta D. A frequncia do oscilador externo fOSC = 4MHz, oque significa que o ciclo de mquina de 1s frequncia da onda gerada serf = 2, 5kHz.

    1 # include

    P

    41

  • 6.2. TIMER 0 CAPTULO 6. TIMERS

    2 void main ( ) {3 TRISD = 0 ;4 PORTD = 0 ;5 TMR0 = 5 6 ;6 OPTION_REGbits . T0CS = 0 ;7 while ( 1 ) {8 i f ( INTCONbits . TMR0IF ) {9 PORTD = ~PORTD ;

    10 TMR0 = 5 6 ;11 INTCONbits . TMR0IF = 0 ;12 }13 }14 }

    Prescaler O prescaler do Timer 0 multiplexado com outro perifrico, o Watch Dog Timer.O bit PSA do registrador OPTION_REG escolhe em qual perifrico o prescaler dever seraplicado:

    OPTION_REGbits.PSA = 0; = prescaler aplicado ao Timer 0 OPTION_REGbits.PSA = 1; = prescaler aplicado ao Watch Dog Timer

    A razo do prescaler definida pelos bits PS2, PS1 e PS0 do mesmo registrador OP-TION_REG. O compilador XC8 prov um smbolo chamado PS, de largura 3 bits, que podeser usado no lugar dos dos trs bits previamente citados. A tabela 6.1 mostra as possveisconfiguraes de prescaler, tanto para o timer 0 (TMR0) como para o Watch Dog Timer(WDT).

    PS PS2 PS1 PS0 TMR0 WDT

    0 0 0 0 1:2 1:11 0 0 1 1:4 1:22 0 1 0 1:8 1:43 0 1 1 1:16 1:84 1 0 0 1:32 1:165 1 0 1 1:64 1:326 1 1 0 1:128 1:647 1 1 1 1:256 1:128

    Tabela 6.1: Configuraes de prescaler para o Timer 0

    Exemplo 6.2

    O cdigo abaixo uma modificao do Exemplo 6.1, com o uso do prescaler,para a gerao de uma onda quadrada com f = 60Hz. O tempo para a voltaser:

    TV OLTA = TC.M. EventosContagem fPS = 1s 130 64 = 8, 333ms

    P

    42

  • CAPTULO 6. TIMERS 6.2. TIMER 0

    Observe que cada volta representa um semiperodo da onda gerada. Por isso,se queremos f = 60Hz, o que implica em T = 16, 666ms, devemos preparar oTimer 0 para obter uma base de tempo de 8, 333ms.Nesse exemplo, uma constante RECARGA foi definida de modo que o Timer 0realize 130 eventos de contagem:

    RECARGA = 256 130 = 126

    1 # include 2 #define RECARGA 1263 void main ( ) {4 TRISD = 0 ;5 PORTD = 0 ;6 OPTION_REGbits . T0CS = 0 ;7 OPTION_REGbits . PSA = 0 ;8 OPTION_REGbits . PS = 5 ; / / PS = 1 : 6 49 TMR0 = RECARGA ;

    10 while ( 1 ) {11 i f ( INTCONbits . TMR0IF ) {12 TMR0 = RECARGA ;13 INTCONbits . TMR0IF = 0 ;14 PORTD = ~PORTD ;15 }16 }17 }

    Interrupo O estouro do Timer 0 pode provocar uma interrupo, desde que a mscaraindividual referente a esse perifrico e o sistema de interrupes como um todo estejam habi-litados. A mscara individual do Timer 0 o bit TMR0IE, do registrador INTCON (tambmacessvel pelo smbolo INTCONbits.T0IE). Esse timer no pertence a nenhum grupo de peri-fricos, portanto no existe nenhuma mscara de grupo associada. Finalmente, o sistema deinterrupes deve ser ativado por meio da via GIE, tambm do registrador INTCON. O flagpara identificao, conforme mencionado previamente, acessado via INTCONbits.TMR0IF,e deve ser zerado pelo programador durante o tratamento da interrupo.

    Exemplo 6.3

    O cdigo abaixo apresenta o software de um pequeno pisca-pisca com frequnciaf = 0, 5Hz, com o uso de interrupes. O sistema conta 125 voltas de 8ms:

    TV OLTA = TC.M. EventosContagem fPSTV OLTA = 1s 250 32 = 8msTTOTAL = TV OLTA NV OLTASTTOTAL = 8ms 125 = 1s

    A varivel nVoltas definida no escopo global para preservar seu valor entre as

    P

    43

  • 6.3. PROJETO 1: CRONMETRO COM LCD CAPTULO 6. TIMERS

    interrupes. Alternativamente, ela poderia ser declarada dentro da funo isr ()com o modificador static .

    1 # include 2 #define RECARGA 63

    4 char nVo l t a s = 0 ;5

    6 void i n t e r r u p t i s r ( ) {7 INTCONbits . TMR0IF = 0 ;8 TMR0 = RECARGA ;9 nVo l t a s ++ ;

    10 i f ( nVo l t a s == 125 ) {11 nVo l t a s = 0 ;12 PORTD = ~PORTD ;13 }14 }15

    16 void main ( ) {17 TRISD = 0 ;18 PORTD = 0xAA ;19 OPTION_REGbits . T0CS = 0 ;20 OPTION_REGbits . PSA = 0 ;21 OPTION_REGbits . PS = 4 ; / / PS = 1 : 3 222 TMR0 = RECARGA ;23 INTCONbits . TMR0IE = 1 ;24 INTCONbits . GIE = 1 ;25 while ( 1 ) ;26 }

    6.3 Projeto 1: Cronmetro com LCD

    Nesta seo desenvolveremos um simples cronmetro com o PIC16F877A. A arquitetura dosistema mostrada na Figura 6.2. As teclas beneficiam do recurso de pull-up interno da portaB. Alm disso, a tecla Start/Pause, crtica no processo, est ligada no pino associado interrupo externa (RB0/INT), tratada previamente na seo 5.4. O LCD est sendo usadocom interface paralela de 8 bits.

    Figura 6.2: Arquitetura do Projeto Cronmetro

    44

  • CAPTULO 6. TIMERS 6.3. PROJETO 1: CRONMETRO COM LCD

    Os arquivos de cabealho usados so:

    1 # include " c on f i g 8 7 7 a . h " / / f r e q u n c i a do c r i s t a l e f u s e s2 # include / / a c e s s o ao s r e g i s t r a d o r e s3 # include " l c d . h " / / b i b l i o t e c a p r e v i amen t e c o n c e b i d a4 # include < s t d i o . h> / / i n c l u i f un o para f o rma ta o de s t r i n g s

    O Timer 0 ser configurado para gerar uma base de tempo de 10ms, cuja contagem correspondeao ltimo dgito impresso no LCD. O sistema possui um ciclo de mquina com TC.M = 1s.Aplicando um prescaler de 1:64 e contando 156 eventos, teremos:

    TV OLTA = 1s 156 64 = 9, 984msA recarga, nesse caso, ser:

    Recarga = 256 EventosContagem = 256 156 = 100Podemos defin-la como uma constante:

    5 #define RECARGA 100

    As variveis globais msegs, segs e mins so definidas no escopo global:7 char msegs =0 , s eg s =0 , mins =0 ;

    A funo main() deve configurar a direo dos pinos de E/S1, ativar o recurso de pull-upinterno, configurar todos os parmetros do Timer 0 e as mscaras de interrupo. Parafacilitar a compreenso, todas as linhas referentes a essas configuraes foram comentadas:

    29 void main ( ) {30 char msg [ 1 6 ] ; / / mensagem a ser exibida no LCD31 OPTION_REGbits . nRBPU = 0 ; / / pull-up interno ativado32 OPTION_REGbits . T0CS = 0 ; / / contagem de ciclos de mquina33 OPTION_REGbits . PSA = 0 ; / / prescaler aplicado ao Timer 034 OPTION_REGbits . PS = 5 ; / / fator de prescaler 1:6435 OPTION_REGbits . INTEDG = 1 ; / / bordas de descida para interrupo externa36 ADCON1 = 1 4 ; / / desativa canais analgicos em RE0 e RE137 l c d _ i n i t ( ) ; / / inicializa o LCD38 INTCONbits . TMR0IE = 0 ; / / cronmetro inicia parado39 INTCONbits . INTE = 1 ; / / interrupo para a tecla Start/Pause40 INTCONbits . GIE = 1 ; / / sistema de interrupes ativado41 TMR0 = RECARGA ; / / preparando para 156 contagens

    A linha 36 tem o objetivo de permitir que os pinos RE0 e RE1 sejam usados como E/S digital.Normalmente esses pinos esto associados a canais do Conversor A/D, abordado no Captulo7. As linhas de 31 a 35 poderiam ser substitudas pela linha OPTION_REG = 0x45; ou entoOPTION_REG = 0b01000101;, mas isso requer que o programador saiba a ordem dos bits noregistrador.

    OPTION_REGR/W (1) R/W (1) R/W (1) R/W (1) R/W (1) R/W (1) R/W (1) R/W (1)RBPU INTEDG TMR0CS T0SE PSA PS2 PS1 PS0

    1A biblioteca usada para o LCD j configura apropriadamente a direo dos pinos das portas D e E. Almdisso, todos os pinos da porta B vm configurados inicialmente como entradas digitais.

    45

  • 6.3. PROJETO 1: CRONMETRO COM LCD CAPTULO 6. TIMERS

    Uma vez que todos os perifricos foram devidamente configurados, o programa entra na suaatividade principal: um lao de repetio infinito que atualiza a exibio do tempo decorridoe monitora a tecla Reset (a outra tecla tratada no servio de interrupo).

    42 while ( 1 ) {43 s p r i n t f ( msg , " %02u :%02 u :%02 u " , mins , segs , msegs ) ;44 lcd_home ( ) ;45 l c d _ p r i n t ( msg ) ;46 / / Reset47 i f ( ! PORTBbits . RB1 ) {48 mins = s eg s = msegs = 0 ;49 INTCONbits . TMR0IE = 0 ;50 }51 }52 }

    Qualquer valor diferente de 0 entendido como verdadeiro, quando usado dentro de umacondio. Se precedermos a condio pelo operador lgico de negao (operador !), teremosjustamente o contrrio. Quando a tecla Reset pressionada, o pino RB1 assume nvel lgicobaixo, tornando a condio da linha 47 verdadeira. Nesse momento, todas as variveis paracontagem de tempo so zeradas e a mscara de interrupo do Timer 0 desativada.Desta vez, temos duas fontes de interrupo: Timer 0 e interrupo externa. Portanto, narotina de tratamento de interrupo, ser necessrio diferenci-las. Aps 100 eventos de 10ms,incrementamos a varivel referente aos segundos e zeramos a ltima casa. O comportamento similar para os segundos e minutos, mas com o limite de 60 ao invs de 100. Na decorrnciado comando Start, o Timer 0 deve ser preparado para a contagem de 10ms, por meio darecarga. Ainda que o comando Pause no necessite disso (pois nesse caso basta desativar amscara do Timer 0), por economia de expresso efetuamos a recarga em qualquer evento deinterrupo: estouro do Timer 0, contagem pausada, contagem iniciada/reiniciada.

    9 void i n t e r r u p t i s r ( ) {10 TMR0 = RECARGA ;11 i f ( INTCONbits . TMR0IF ) { / / interrupo do Timer 012 msegs ++ ;13 i f ( msegs == 100 ) {14 s eg s ++ ;15 msegs = 0 ;16 }17 i f ( s e g s == 60 ) {18 mins ++ ;19 s eg s = 0 ;20 }21 INTCONbits . TMR0IF = 0 ;22 }23 e l se { / / interrupo externa24 INTCONbits . TMR0IE = ~ INTCONbits . TMR0IE ; / / pausa / reinicia25 INTCONbits . INTF = 0 ;26 }27 }

    O projeto completo pode ser obtido em: http://www.leandromattioli.com/static/cefet/timer0_crono.X.zip

    46

  • CAPTULO 6. TIMERS 6.4. TIMER 1

    6.4 Timer 1

    Contagens e Recarga O Timer 1 prov a contagem em 16 bits, o que significa a contagemde at 65536 eventos. Como a memria RAM do PIC16F877A organizada em bytes, acontagem separada em dois registradores: TMR1H e TMR1L (respectivamente, byte maissignificativo e byte menos significativo). No entanto, o compilador XC8 prov um smbolo de16 bits chamado TMR1, que afeta diretamente os dois registradores envolvidos. A recarga feita simplesmente por uma atribuio a TMR1.

    Recarga = 65536 EventosContagem | 1 EventosContagem 65536

    O Timer 1 possui uma chave de ativao acessvel pelo bit TMR1ON do registrador T1CON.Isto confere ao Timer 1 uma caracterstica ausente no Timer 0: a capacidade de ser pausado.

    Flag de Identificao O estouro do Timer 1 indicado pelo bit TMR1IF, do registradorPIR1. Aps o devido tratamento do overflow desse perifrico, seu flag deve ser zerado pelosoftware.

    Origem do Clock Para a contagem de ciclos de mquina (operao como temporizador),o bit TMR1CS do registrador T1CON deve ser zerado. Quando este bit se encontra em nvelalto, o Timer 1 configurado seja como contador de eventos externos, seja para a operaocom cristal externo, dependendo do valor do bit T1OSCEN:

    T1CONbitsbits.T1OSCEN = 1; = contagem de bordas de subida no pino T1OSI(cristal externo)

    T1CONbitsbits.T1OSCEN = 0; = contagem de bordas de subida no pino T1CKI(contador de eventos)

    A operao com cristal externo ser abordada posteriormente.

    Prescaler O fator de prescaler do Timer 1 tambm definido por bits do registrador T1CON,especificamente os bits T1CKPS1 e T1CKPS0. A Tabela 6.2 mostra as possveis configuraes:

    T1CKPS T1CKPS1 T1CKPS0 Prescaler

    0 0 0 1:11 0 1 1:22 1 0 1:43 1 1 1:8

    Tabela 6.2: Configuraes de prescaler para o Timer 1

    47

  • 6.5. PROJETO 2: CONTROLE DE SERVOMOTOR CAPTULO 6. TIMERS

    Interrupo Para que o estouro do Timer 1 provoque uma interrupo, a chave individualassociada, PIE1bits.TMR1IE, deve estar ativada. O Timer 1 pertence ao grupo de perifricos1, e portanto necessita da ativao da chave de grupo INTCONbits.PEIE. Finalmente, a chaveglobal INTCONbits.GIE deve estar habilitada para que o sistema de interrupes como umtodo passe a operar. O flag para identificao TMR1IF (registrador PIR1) deve ser zerado nosoftware na ocasio do tratamento da interrupo.

    Operao com Cristal Externo Pode-se usar um cristal de quartzo externo com frequnciade at 200kHz para a operao do Timer 1. O cristal conectado entre os pinos T1OSI eT1OSO com os devidos capacitores de acoplamento, conforme a Tabela 6.3. Mesmo no modoSLEEP, o circuito oscilador do Timer 1 permanece habilitado, caso o bit T1OSCEN esteja emnvel alto. O projeto foi feito pensando na aplicao do Timer 1 como um relgio em temporeal (RTC), facilmente atingido por um cristal de 32768Hz.

    Oscilador Freq. C1 C2

    LP32 kHz 33 pF 33 pF100 kHz 15 pF 15 pF200 kHz 15 pF 15 pF

    Tabela 6.3: Seleo de capacitores para o oscilador do Timer 1

    Sincronismo de Fase dos ClocksO sincronismo de fase um recurso ativado pelo bit T1SYNC (ativo em nvel baixo) doregistrador T1CON. Tal recurso permite que se tenha uma sequncia peridica de ngulos defase relativos entre os clocks do processador e do Timer 1. Quando o sincronismo de faseest ativado, os registradores do Timer 1 (TMR1H e TMR1L) no so incrementados se amquina estiver no modo SLEEP. Ambos recursos (sincronismo de fase e modo sleep) fogemao escopo desse texto.

    6.5 Projeto 2: Controle de Servomotor

    Nesse segundo projeto veremos uma forma de criar um sinal PWM para o controle de umservomotor, utilizando os timers 0 e 1. A arquitetura do sistema apresentada na Figura 6.3.

    Figura 6.3: Arquitetura do sistema de controle de servomotor

    48

  • CAPTULO 6. TIMERS 6.5. PROJETO 2: CONTROLE DE SERVOMOTOR

    A tecla Min responsvel por levar o mecanismo para a sua posio mnima, que definiremosaqui como = 0. Analogamente, a tecla Max leva o mecanismo para a posio mxima,que algo em torno de = 180 para vrios modelos de servomotores. As teclas Inc e Decincrementam e decrementam, respectivamente, a posio do motor. Isso equivale a aumentose diminuies em TON , que sero feitos em passos de 50 unidades , propiciando a atribuiode 20 posies diferentes ao mecanismo: conjunto S = {1000, 1050, 1100, , 2000}. Issoficar mais claro aps o detalhamento da configurao dos timers para esta aplicao.O Timer 0 responsvel pela base de tempo de aproximadamente 20ms (perodo). Apscada interrupo do Timer 0, a sada levada para nvel lgico alto e o Timer 1 ligadopara temporizar TON . Aps o estouro do Timer 1, a sada volta para nvel lgico baixo eo perifrico pausado. Como nos outros exemplos, o sistema opera com um oscilador defrequncia fOSC = 4MHz.Os arquivos de cabealho e as constantes definidas so:

    1 # include " c on f i g 8 7 7 a . h "2 # include 3 # include < s t d i n t . h>4

    5 #define BTN_MIN PORTBbits . RB06 #define BTN_DEC PORTBbits . RB17 #define BTN_INC PORTBbits . RB28 #define BTN_MAX PORTBbits . RB39 #define RECARGA_T0 100

    6.5.1 Configurao dos Pinos de E/S

    Com exceo do nibble superior do registrador TRISE, todos os bits dos registradores TRIS, nociclo de RESET, vo para nvel alto. Isso significa que, por padro, todos os pinos do PORTBj so configurados como entradas digitais. Portanto, no necessrio configurar a direodos pinos do PORTB para as teclas. No entanto, os resistores de pull-up interno devero serativados, garantindo que os pinos que estiverem em circuito aberto sejam interpretados comonvel lgico alto. Alm disso, o pino RD0 deve ser configurado como sada digital. A rotinade configurao listada abaixo:

    14 PORTD = 0 ; / / l a t c h de s a d a para 0000 000015 TRISDb i t s . TRISD0 = 0 ; / / s a d a d i g i t a l16 OPTION_REGbits . nRBPU = 0 ; / / p u l lup i n t e r n o

    6.5.2 Configurao do Timer 0

    Para se obter a base de tempo de 20ms os seguintes parmetros foram utilizados:

    TC.M. = 1sPrescalerTIMER0 = 1 : 128

    EventosContagemTIMER0 = 156

    TTIMER0 = 1s 156 128 = 19, 968ms

    49

  • 6.5. PROJETO 2: CONTROLE DE SERVOMOTOR CAPTULO 6. TIMERS

    TON ton TMR1

    0 1000s 0 6453690 1500s 500 64036180 2000s 1000 63536

    Tabela 6.4: Parmetros para posio angular

    A configurao completa do Timer 0, exceto as chaves de interrupo, pode ser vista abaixo:

    17 OPTION_REGbits . T0CS = 0 ; / / T imer 0 : contagem de c i c l o s de mquina18 OPTION_REGbits . PSA = 0 ; / / p r e s c a l e r a p l i c a d o ao Timer 019 OPTION_REGbits . PS = 6 ; / / p r e s c a l e r 1 : 1 2 820 TMR0 = RECARGA_T0 ; / / 156 c o n t a g e n s

    6.5.3 Configurao do Timer 1

    TTIMER1 = TON

    1000s TTIMER1 2000s

    63536 RecargaTIMER1 64536

    Uma varivel global do tipo inteiro de 16 bits sem sinal ton definida para armazenar TON 1000, ou seja, a varivel est limitada entre 0 e 1000 enquanto TON est limitado entre 1000se 2000s.

    11 u i n t 1 6 _ t ton = 0 ;

    A Tabela 6.4 resume os parmetros associados posio angular:

    O Timer 1 deve comear pausado, ficando cargo do tratamento da interrupo do Timer 0 aativao daquele. Como no ser usado um prescaler ao Timer 1, sua configurao (excetuandoas chaves para interrupo) se resume opo por contagem de ciclos de mquina:

    21 T1CONbits . TMR1CS = 0 ; / / T imer 1 : contagem de c i c l o s de mquina

    6.5.4 Configurao das interrupes

    O estado das chaves individual, global e de grupo definido na rotina abaixo:

    22 INTCONbits . GIE = 1 ; / / chave g l o b a l23 INTCONbits . PEIE = 1 ; / / chave de grupo24 INTCONbits . TMR0IE = 1 ; / / chave i n d i v i d u a l do Timer 025 P I E 1 b i t s . TMR1IE = 1 ; / / chave i n d i v i d u a l do Timer 1

    50

  • CAPTULO 6. TIMERS 6.5. PROJETO 2: CONTROLE DE SERVOMOTOR

    6.5.5 Rotina de Servio a Interrupes

    Na funo associada s interrupes, primeiro identificamos o perifrico responsvel pela in-terrupo. Nesse caso, se a interrupo no for provocada pelo Timer 0 (linha 48), sabemosque se trata do Timer 1 (linha 57). Aps a identificao pelo flag, este deve ser zerado (linhas49 e 59). As aes para as interrupes do Timer 0 so:

    promover a recarga do Timer 0 (linha 50);

    promover a recarga do Timer 1 (linhas 5053);

    ativar da contagem do Timer 1 (linha 54);

    provocar uma borda de subida no pino RD0 (linha 55).

    No caso da interrupo do Timer 1, que indica TON j foi temporizado, as aes so:

    provocar uma borda de descida no pino RD0 (linha 58) e

    interromper a contagem do Timer 1 (linha 60).

    47 void i n t e r r u p t i s r ( ) {48 i f ( INTCONbits . TMR0IF ) {49 INTCONbits . TMR0IF = 0 ; / / p r e p a r a para a prx ima i n t e r r u p o50 TMR0 = RECARGA_T0 ; / / mais 156 c o n t a g e n s51 i f ( ton > 1000 ) / / l im i t a n d o Ton52 ton = 1 0 0 0 ;53 TMR1 = 64536 ton ; / / r e c a r g a e n t r e 6 3536 e 6453654 T1CONbits . TMR1ON = 1 ; / / l i g a Timer 155 PORTDbits . RD0 = 1 ; / / bo rda de s u b i d a56 }57 e l se {58 PORTDbits . RD0 = 0 ; / / bo rda de d e s c i d a59 P I R 1 b i t s . TMR1IF = 0 ; / / p r e p a r a para a prx ima i n t e r r u p o60 T1CONbits . TMR1ON = 0 ; / / d e s l i g a Timer 161 }62 }

    6.5.6 Lao de repetio principal

    Na forma proposta, o cdigo responsvel pela gerao da onda quadrada propriamente ditafica inteiramente no servio de tratamento a interrupes. O loop principal do programa devemonitorar eventos do teclado e reagir afetando o valor da varivel ton. A ao das teclasMin e Max , simplesmente, atribuir certos valores fixos para ton, 0 e 1000. A tecla Decdever reduzir 50 unidades de ton (linha 35). No entanto, se ton < 50, a subtrao provocarum underflow. Por exemplo, se ton for 0, a subtrao de 1 unidade o levaria para 65535! Acondio foi tratada para contornar esse problema. No caso da tecla Inc, basta incrementara varivel em 50 unidades e, em seguida, verificar se ela ultrapassou o mximo: 1000.

    51

  • 6.6. TIMER 2 CAPTULO 6. TIMERS

    Tempo de Varredura vs. Tempo de Evento de Tecla

    Ainda resta um problema a ser tratado, cuja soluo se encontra nas linhas 36 e 42. Imagineque a tecla fique pressionada durante um certo tempo tTECLA, da ordem de milissegundos.O lao de repetio poderia verificar a presena de teclas pressionadas durante um tempotV ARREDURA na ordem de microssegundos, ou seja: tV ARREDURA tTECLA. Isso significaque quando um usurio pressiona uma tecla, o evento pode ser tratado vrias vezes. No casodas teclasMax eMin, isso no gera nenhum problema, assim que a tecla for liberada, o valorde ton passa responder s outras teclas. No entanto, no caso das teclas Inc e Dec, razovelque a alterao no valor de ton ocorra uma vez s; no queremos que o usurio pressione e liberea tecla rapidamente e isso culmine no incremento de 350 unidades. Portanto, adicionamosuma espera usando um lao while no tratamento do evento dessas teclas, aguardando que orespectivo pino volte a nvel lgico alto antes de prosseguir com a prxima varedura.

    26 while ( 1 ) {27 i f ( ! BTN_MIN )28 ton = 0 ;29 e l se i f ( ! BTN_MAX)30 ton = 1 0 0 0 ;31 e l se i f ( ! BTN_DEC ) {32 i f ( ton < 50 ) / / e v i t a r und e r f l ow33 ton = 0 ;34 e l se35 ton = 5 0 ; / / d e c r emen t o em p a s s o s de 5036 while ( ! BTN_DEC ) ; / / e s p e r a t e c l a s e r l i b e r a d a37 }38 e l se i f ( ! BTN_INC ) {39 ton += 5 0 ; / / i n c r emen t o em p a s s o s de 5040 i f ( ton > 1000 )41 ton = 1 0 0 0 ; / / l i m i t e : Ton = 100042 while ( ! BTN_INC ) ; / / e s p e r a t e c l a s e r l i b e r a d a43 }44 }

    Debouncing

    Neste projeto, pressupomos o uso de teclas com baixo rudo mecnico, de forma que a prpriacaracterstica Schmitt Trigger dos pinos da porta B bloqueiem falsos eventos.

    6.6 Timer 2

    Contagens e Recarga O Timer 2 um temporizador de 8 bits. Ele se destina exclusiva-mente contagem de ciclos de mquina, no dispondo, assim, da configurao como contadorde eventos. O registrador TMR2 armazena o valor atual da contagem. No entanto, o estourodo Timer 2 possui uma lgica diferente. A contagem vai de 0 at o valor do registradorPR2 e ento volta para 0, provocando o overflow. O registrador PR2 , convenientemente,inicializado com valor 0xFF aps o RESET da mquina. Isso significa que, por padro, o com-portamento similar ao Timer 0. No entanto, ao usar o registrador PR2, a configurao do

    52

  • nmero de eventos de contagem consideravelmente simplificada, como pode ser observadona Figura 6.4.

    Figura 6.4: Registrador de Perodo PR2

    EventosContagemTIMER2 = PR2 + 1 | 1 PR2 255

    Flag de Identificao O estouro do Timer 2 indicado pelo bit TMR2IF, do registradorPIR1. Assim como nos outros timers, o flag do Timer 2 no volta automaticamente para 0,cabendo ao software esta operao.

    Prescaler Os bits T2CKPS1 e T2CKPS0 do registrador T2CON, tambm acessveis comoum valor de 2 bits pelo smbolo T2CONbits.T2CKPS, configuram a razo de prescaler, segundoa Tabela 6.5.

    T2CKPS T2CKPS1 T2CKPS0 Prescaler

    0 0 0 1:11 0 1 1:42,3 1 X 1:16

    Tabela 6.5: Configuraes de prescaler para o Timer 2

    Postscaler O Timer 2 dotado de um postscaler, recurso que permite a contagem de voltasantes da ocorrncia de uma interrupo. Se for necessrio contar at 16 voltas do Timer 2, opostscaler elimina a necessidade da varivel nVoltas vista nos exemplos anteriores. O valor dopostscaler definido pelo smbolo T2CONbits.TOUTPS, conforme a equao abaixo:

    fPOSTSCALER = TOUTPS + 1

    Com isso, podemos escrever:

    TINTERRUPCAO = TC.M. (PR2 + 1) fPRESCALER fPOSTSCALER

    Interrupo As interrupes provocadas pelo Timer 2 esto condicionadas habilitaoda chave individual PIE1bits.TMR2IE, chave de grupo INTCONbits.PEIE e chave globalINTCONbits.GIE.

  • 6.6. TIMER 2 CAPTULO 6. TIMERS

    54

  • Captulo7Converso Analgico-Digital

    7.1 Configurao

    7.2 Exemplo: Voltmetro Digital

  • 7.2. EXEMPLO: VOLTMETRO CAPTULO 7. CONVERSO A/D

    56

  • Captulo8Comunicao Serial (USART)

  • CAPTULO 8. SERIAL (USART)

    58

  • Captulo9Interfaces SPI e I2C

    9.1 Serial Peripheral Interface

    9.2 Inter-Integrated Circuit

  • 9.2. INTER-INTEGRATED CIRCUIT CAPTULO 9. SPI E I2C

    60

  • Captulo10Mdulo CCP

    10.1 Modo Captura

    10.2 Modo Comparao

    10.3 Modo PWM

  • 10.3. MODO PWM CAPTULO 10. MDULO CCP

    62

  • ApendiceAPlaca de Desenvolvimento

  • APNDICE A. PLACA DE DESENVOLVIMENTO

    64

  • ApendiceBRegistradores do PIC16F877A

    INTCONR/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (X)

    GIE PEIE TMR0IE INTE RBIE TMR0IF INTF RBIF

    bit 7 GIE: Chave global de interrupesbit 6 PEIE: Chave do grupo de perifricosbit 5 TMR0IE: Chave individual do timer 0bit 4 INTE: Chave individual da interrupo externa no pino RB0/INTbit 3 RBIE: Chave global da interrupo por mudana de estadobit 2 TMR0IF: Flag da interrupo por estouro do Timer 0bit 1 INTF: Flag da interrupo externabit 0 RBIF: Flag de interrupo por mudana de estado

    OPTION_REGR/W (1) R/W (1) R/W (1) R/W (1) R/W (1) R/W (1) R/W (1) R/W (1)RBPU INTEDG TMR0CS T0SE PSA PS2 PS1 PS0

    bit 7 RBPU: Ativao dos pull-ups do PORTB (1: desativados; 0: ativados)bit 6 INTEDG: Seleo do tipo de borda para interrupo externa

    1 Interrupo para borda de subida no pino RB0/INT0 Interrupo para borda de descida no pino RB0/INT

    bit 5 T0CS: Origem do sinal de relgio do TMR01 Transio no pino T0CKI (eventos externos)0 Contagem de ciclos de mquina

    bit 4 T0SE: Tipo de transio para o TMR0 (apenas para eventos externos)1 Borda de descida no pino T0CKI0 Borda de subida no pino T0CKI

    bit 3 PSA: Atribuio do Prescaler1 Prescaler atribudo ao Watch Dog Timer0 Prescaler atribudo ao timer 0

    bits 2-0 PS: Taxa de prescalerPS TMR0 WDT000 1:2 1:1001 1:4 1:2010 1:8 1:4011 1:16 1:8

    PS TMR0 WDT100 1:32 1:16101 1:64 1:32110 1:128 1:64111 1:256 1:128

  • APNDICE B. REGISTRADORES DO PIC16F877A

    T1CONR/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0)

    T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

    bits 5-4 T1CKPS: Taxa do prescaler do Timer 100 1:101 1:210 1:411 1:8

    bit 3 T1OSCEN: Oscilador do Timer 1 (1: ligado ; 2: desligado)bit 2 T1SYNC: Bit de controle de sincronizao (apenas para clock externo)bit 1 TMR1CS: Origem do sinal de relgio do Timer 1

    1 Clock externo em bordas de subida dos pinos T1OSO/T1CKI0 Clock interno (contagem de ciclos de mquina)

    bit 0 TMR1ON: Liga/desliga do Timer 1 (1: contagem ativada ; 0: contagem pausada)

    PIE1R/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0)PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

    bit 7 PSPIE: Chave individual da porta paralela escravabit 6 ADIE: Chave individual do conversor A/Dbit 5 RCIE: Chave individual da recepo pela USARTbit 4 TXIE: Chave individual da transmisso pela USARTbit 3 SSPIE: Chave individual da porta serial sncrona (SPI, I2C)bit 2 CCP1IE: Chave individual do mdulo Capture-Compare-PWM 1bit 1 TMR2IE: Chave individual do Timer 2bit 0 TMR1IE: Chave individual do Timer 1

    PIR1R/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R/W (0)PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

    bit 7 PSPIF: Flag da porta paralela escravabit 6 ADIF: Flag do conversor A/Dbit 5 RCIF: Flag da recepo pela USARTbit 4 TXIF: Flag da transmisso pela USARTbit 3 SSPIF: Flag da porta serial sncrona (SPI, I2C)bit 2 CCP1IF: Flag do mdulo Capture-Compare-PWM 1bit 1 TMR2IF: Flag do Timer 2bit 0 TMR1IF: Flag do Timer 1

    66

  • APNDICE B. REGISTRADORES DO PIC16F877A

    TXSTA TRANSMIT STATUS AND CONTROL REGISTERR/W (0) R/W (0) R/W (0) R/W (0) U (0) R/W (0) R (1) R/W (0)CSRC TX9 TXEN SYNC BRGH TRMT TX9D

    bit 7 CSRC: Bit de seleo da origem do clockAssncrono No importaSncrono 1 Modo mestre (clock gerado internamente)

    0 Modo escravobit 6 TX9: Bit de ativao da transmisso de 9 bits

    1 Transmisso de 9 bits0 Transmisso de 8 bits

    bit 5 TXEN: BIt de ativao da transmisso (ativo em nvel alto)bit 4 SYNC: Bit de seleo do modo USART

    1 Modo sncrono0 Modo assncrono

    bit 3 No implementado (lido como 0)bit 2 BRGH: Bit de seleo de Baud Rate

    Assncrono 1 Alta velocidade0 Baixa velocidade

    Sncrono No usado nesse modobit 1 TRMT: Bit de status do registrador de deslocamento de transmisso

    1 TSR vazio0 TSR cheio

    bit 0 TX9D: Nono bit a ser transmitido

    RCSTA RECEIVE STATUS AND CONTROL REGISTERR/W (0) R/W (0) R/W (0) R/W (0) R/W (0) R (0) R (0) R/W (X)SPEN RX9 SREN CREN ADEN FERR OERR RX9D

    bit 7 SPEN: Bit de ativao da porta serial (bits TRISB devem estar ligados)1 Porta serial ativada0Porta serial desativada

    bit 6 RX9: Bit de ativao da recepo de 9 bits1 Recepo de 9 bits0 Recepo de 8 bits

    bit 5 SREN: Bit de ativao de recepo simplesAssncrono No importaSncrono 1 Habilita recepo simples

    0 Desabilita recepo simplesbit 4 CREN: Bit de ativao de recepo contnua

    1 Ativa recepo contnua0 Desativa recepo contnua

    bit 3 ADEN: Bit de ativao de deteco de endereo (no usado)bit 2 FERR: Bit de erro de janela (no usado)bit 1 OERR: Bit de erro de overrun

    1 Houve erro de overrun (f