UEL - DEEL - LONDRINA - PR




   Introdu¸˜o aos Microcontroladores da Fam´
          ca                               ılia
                       PIC




                                            Leonimer Fl´vio de Melo
                                                       a




02/2008




                           1
Sum´rio
   a

1 Introdu¸˜o aos Microcontroladores
           ca                                                                                                                                    4
  1.1 Introdu¸˜o . . . . . . . . . . . . . . . . . . . .
              ca                                            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
  1.2 Hist´ria . . . . . . . . . . . . . . . . . . . . .
            o                                               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    4
  1.3 Microcontroladores versus Microprocessadores          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    5
  1.4 Microcontroladores da fam´ PIC . . . . . .
                                  ılia                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    5
       1.4.1 Unidade de Mem´ria . . . . . . . . . .
                                o                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6
       1.4.2 Unidade Central de Processamento . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    6
       1.4.3 Barramentos - Bus . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
       1.4.4 Unidade de entrada/sa´ (I/O) . . .
                                       ıda                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
       1.4.5 Comunica¸˜o s´rie . . . . . . . . . . .
                        ca e                                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    7
       1.4.6 Unidade de temporiza¸˜o . . . . . . .
                                      ca                    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    8
       1.4.7 Watchdog timer . . . . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
       1.4.8 Conversor anal´gico-digital (A/D) . .
                             o                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
       1.4.9 O microcontrolador . . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
  1.5 Programa . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10

2 O Microcontrolador PIC16F84                                                                                                                   13
  2.1 Componentes b´sicos do PIC . . . . . . . . .
                       a                                    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
  2.2 CISC x RISC . . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
  2.3 Aplica¸˜es . . . . . . . . . . . . . . . . . . . .
             co                                             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  2.4 Rel´gio / ciclo de instru¸˜o . . . . . . . . . .
           o                    ca                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
       2.4.1 Pipelining . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
       2.4.2 Fluxograma das Instru¸˜es no Pipeline
                                       co                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
  2.5 Significado dos pinos . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
  2.6 Gerador de rel´gio – oscilador . . . . . . . . .
                      o                                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   17
       2.6.1 Tipos de osciladores . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   17
       2.6.2 Oscilador XT . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
       2.6.3 Oscilador RC . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
  2.7 Reset . . . . . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
       2.7.1 Brown-out Reset . . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
  2.8 Unidade Central de Processamento . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
       2.8.1 Unidade L´gica Aritm´tica (ALU) . .
                         o             e                    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
  2.9 Registros . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
       2.9.1 Registro STATUS . . . . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
       2.9.2 Registro OPTION . . . . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
  2.10 Portas de I/O . . . . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
       2.10.1 Porta A . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
       2.10.2 Porta B . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
  2.11 Organiza¸˜o da mem´ria . . . . . . . . . . . .
                ca           o                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
       2.11.1 Mem´ria de programa . . . . . . . . .
                   o                                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
       2.11.2 Mem´ria de dados . . . . . . . . . . .
                   o                                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
       2.11.3 Registros SFR . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
       2.11.4 Bancos de Mem´ria . . . . . . . . . .
                               o                            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
       2.11.5 Macro . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
       2.11.6 Contador de Programa . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   29



                                                 2
2.11.7 Pilha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                       .   .   .   .   .   .   .   .   .   29
        2.11.8 Programa¸˜o no Sistema . . . . . . . . . . . . . . . . . . . .
                          ca                                                                             .   .   .   .   .   .   .   .   .   29
        2.11.9 Modos de endere¸amento . . . . . . . . . . . . . . . . . . .
                                  c                                                                      .   .   .   .   .   .   .   .   .   29
   2.12 Interrup¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
                co                                                                                       .   .   .   .   .   .   .   .   .   31
        2.12.1 Registro INTCON . . . . . . . . . . . . . . . . . . . . . . .                             .   .   .   .   .   .   .   .   .   31
        2.12.2 Fontes de interrup¸˜o . . . . . . . . . . . . . . . . . . . . .
                                    ca                                                                   .   .   .   .   .   .   .   .   .   32
        2.12.3 Guardando os conte´dos dos registros importantes . . . . .
                                      u                                                                  .   .   .   .   .   .   .   .   .   33
        2.12.4 Interrup¸˜o externa no pino RB0/INT do microcontrolador
                        ca                                                                               .   .   .   .   .   .   .   .   .   34
        2.12.5 Interrup¸˜o por transbordar (overflow ) o contador TMR0 .
                        ca                                                                               .   .   .   .   .   .   .   .   .   34
        2.12.6 Interrup¸˜o por varia¸ao nos pinos 4, 5, 6 e 7 da porta B .
                        ca              c˜                                                               .   .   .   .   .   .   .   .   .   36
        2.12.7 Interrup¸˜o por fim de escrita na EEPROM . . . . . . . . .
                        ca                                                                               .   .   .   .   .   .   .   .   .   36
        2.12.8 Inicializa¸˜o da interrup¸˜o . . . . . . . . . . . . . . . . . .
                         ca                ca                                                            .   .   .   .   .   .   .   .   .   36
   2.13 Temporizador TMR0 . . . . . . . . . . . . . . . . . . . . . . . . . .                            .   .   .   .   .   .   .   .   .   38
   2.14 Mem´ria de dados EEPROM . . . . . . . . . . . . . . . . . . . . .
             o                                                                                           .   .   .   .   .   .   .   .   .   41
        2.14.1 Registro EECON1 . . . . . . . . . . . . . . . . . . . . . . .                             .   .   .   .   .   .   .   .   .   41
        2.14.2 Lendo a Mem´ria EEPROM . . . . . . . . . . . . . . . . .
                              o                                                                          .   .   .   .   .   .   .   .   .   42
        2.14.3 Escrevendo na Mem´ria EEPROM . . . . . . . . . . . . . .
                                      o                                                                  .   .   .   .   .   .   .   .   .   42

3 Conjunto de Instru¸˜es
                       co                                                                                                                    44
  3.1 Conjunto de Instru¸˜es da Fam´ PIC16Fxxx de
                          co           ılia                      Microcontroladores                              .   .   .   .   .   .   .   44
  3.2 Transferˆncia de dados . . . . . . . . . . . . . . .
               e                                                 . . . . . . . . . . . .                         .   .   .   .   .   .   .   44
  3.3 L´gicas e aritm´ticas . . . . . . . . . . . . . . . .
       o             e                                           . . . . . . . . . . . .                         .   .   .   .   .   .   .   44
  3.4 Opera¸˜es sobre bits . . . . . . . . . . . . . . . .
             co                                                  . . . . . . . . . . . .                         .   .   .   .   .   .   .   45
  3.5 Dire¸˜o de execu¸˜o de um programa . . . . . . .
           ca          ca                                        . . . . . . . . . . . .                         .   .   .   .   .   .   .   45
  3.6 Per´
         ıodo de execu¸˜o da instru¸˜o . . . . . . . . .
                       ca            ca                          . . . . . . . . . . . .                         .   .   .   .   .   .   .   45
  3.7 Conjunto de instru¸˜es . . . . . . . . . . . . . . .
                         co                                      . . . . . . . . . . . .                         .   .   .   .   .   .   .   46

4 Programa¸˜o em Linguagem Assembly
            ca                                                                                                                               48
  4.1 Linguagem Assembly . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   49
      4.1.1 Label . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   49
      4.1.2 Instru¸˜es . . . . . . . . . . . . . . . . .
                   co                                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   49
      4.1.3 Operandos . . . . . . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   50
      4.1.4 Coment´rios . . . . . . . . . . . . . . .
                     a                                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   50
      4.1.5 Diretivas . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   50
      4.1.6 Exemplo de um programa em assembly               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   50
  4.2 Macros . . . . . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   52




                                                   3
Cap´
   ıtulo 1

Introdu¸˜o aos Microcontroladores
       ca

1.1     Introdu¸˜o
               ca
As circunstˆncias que se nos deparam hoje no campo dos microcontroladores tˆm os seus prim´rdios
           a                                                                 e              o
no desenvolvimento da tecnologia dos circuitos integrados. Este desenvolvimento tornou poss´  ıvel
armazenar centenas de milhares de transistores num unico chip. Isso constituiu um pr´-requisito
                                                      ´                                e
para a produ¸˜o de microprocessadores e, os primeiros computadores foram constru´
             ca                                                                       ıdos adicio-
nando perif´ricos externos tais como mem´ria, linhas de entrada e sa´
           e                               o                         ıda, temporizadores e outros.
Um crescente aumento do n´    ıvel de integra¸˜o, permitiu o aparecimento de circuitos integrados
                                             ca
contendo simultaneamente processador e perif´ricos. Foi assim que o primeiro chip contendo um
                                                e
microcomputador e que mais tarde haveria de ser designado por microcontrolador, apareceu.


1.2     Hist´ria
            o
´
E no ano de 1969 que uma equipa de engenheiros japoneses pertencentes ` companhia BUSICOM
                                                                          a
chega aos Estados Unidos com a encomenda de alguns circuitos integrados para calculadoras a
serem implementados segundo os seus projetos. A proposta foi entregue ` INTEL e Marcian Hoff
                                                                          a
foi o respons´vel pela sua concretiza¸˜o. Como ele tinha tido experiˆncia de trabalho com um
               a                      ca                               e
computador (PC) PDP8, lembrou-se de apresentar uma solu¸˜o substancialmente diferente em
                                                                ca
vez da constru¸˜o sugerida. Esta solu¸˜o pressupunha que a fun¸˜o do circuito integrado seria
                 ca                     ca                          ca
determinada por um programa nele armazenado. Isso significava que a configura¸˜o deveria ser
                                                                                  ca
mais simples, mas tamb´m era preciso muito mais mem´ria que no caso do projeto proposto pelos
                            e                           o
engenheiros japoneses. Depois de algum tempo, embora os engenheiros japoneses tenham tentado
encontrar uma solu¸˜o mais f´cil, a id´ia de Marcian venceu e o primeiro microprocessador nasceu.
                      ca         a    e
Ao transformar esta id´ia num produto concreto, Frederico Faggin foi de uma grande utilidade
                           e
para a INTEL. Ele transferiu-se para a INTEL e, em somente 9 meses, teve sucesso na cria¸˜o de
                                                                                           ca
um produto real a partir da sua primeira concep¸˜o. Em 1971, a INTEL adquiriu os direitos sobre
                                                 ca
a venda deste bloco integral. Primeiro eles compraram a licen¸a ` companhia BUSICOM que n˜o
                                                               c a                             a
tinha a m´ ınima percep¸˜o do tesouro que possu´ Neste mesmo ano, apareceu no mercado um
                           ca                     ıa.
microprocessador designado por 4004. Este foi o primeiro microprocessador de 4 bits e tinha a
velocidade de 6 000 opera¸˜es por segundo. N˜o muito tempo depois, a companhia Americana
                              co                 a
CTC pediu ` INTEL e ` Texas Instruments um microprocessador de 8 bits para usar em terminais.
             a             a
Mesmo apesar de a CTC acabar por desistir desta id´ia, tanto a Intel como a Texas Instruments
                                                      e
continuaram a trabalhar no microprocessador e, em Abril de 1972, os primeiros microprocessadores
de 8 bits apareceram no mercado com o nome de 8008. Este podia endere¸ar 16KB de mem´ria,
                                                                            c                o
possu´ 45 instru¸˜es e tinha a velocidade de 300 000 opera¸˜es por segundo. Esse microprocessador
      ıa           co                                     co
foi o pioneiro de todos os microprocessadores atuais. A Intel continuou com o desenvolvimento
do produto e, em Abril de 1974 pˆs c´ fora um processador de 8 bits com o nome de 8080 com a
                                   o a
capacidade de endere¸ar 64KB de mem´ria, com 75 instru¸˜es e com pre¸os a come¸arem em $360.
                        c               o                 co            c         c
    Uma outra companhia Americana, a Motorola, apercebeu-se rapidamente do que estava a
acontecer e, assim, pˆs no mercado um novo microprocessador de 8 bits, o 6800. O construtor
                         o
chefe foi Chuck Peddle e al´m do microprocessador propriamente dito, a Motorola foi a primeira
                               e



                                                4
companhia a fabricar outros perif´ricos como os 6820 e 6850. Nesta altura, muitas companhias
                                     e
j´ se tinham apercebido da enorme importˆncia dos microprocessadores e come¸aram a introduzir
 a                                           a                                     c
os seus pr´prios desenvolvimentos. Chuck Peddle deixa a Motorola para entrar para a MOS
             o
Technology e continua a trabalhar intensivamente no desenvolvimento dos microprocessadores.
    Em 1975, na exposi¸˜o WESCON nos Estados Unidos, ocorreu um acontecimento cr´
                          ca                                                                   ıtico na
hist´ria dos microprocessadores. A MOS Technology anunciou que ia pˆr no mercado micropro-
    o                                                                       o
cessadores 6501 e 6502 ao pre¸o de $25 cada e que podia satisfazer de imediato todas as en-
                                  c
comendas. Isto pareceu t˜o sensacional que muitos pensaram tratar-se de uma esp´cie de vigarice,
                            a                                                         e
considerando que os competidores vendiam o 8080 e o 6800 a $179 cada. Para responder a este
competidor, tanto a Intel como a Motorola baixaram os seus pre¸os por microprocessador para
                                                                      c
$69,95 logo no primeiro dia da exposi¸˜o. Rapidamente a Motorola pˆs uma a¸˜o em tribunal
                                         ca                                 o        ca
contra a MOS Technology e contra Chuck Peddle por viola¸˜o dos direitos de autor por copiarem
                                                              ca
ao copiarem o 6800. A MOS Technology deixou de fabricar o 6501, mas continuou com o 6502. O
6502 ´ um microprocessador de 8 bits com 56 instru¸˜es e uma capacidade de endere¸amento de
      e                                                  co                                c
64KB de mem´ria. Devido ao seu baixo custo, o 6502 torna-se muito popular e, assim, ´ instalado
                 o                                                                          e
em computadores como KIM-1, Apple I, Apple II, Atari, Comodore, Acorn, Oric, Galeb, Orao,
Ultra e muitos outros. Cedo aparecem v´rios fabricantes do 6502 (Rockwell, Sznertek, GTE, NCR,
                                          a
Ricoh e Comodore adquiriram a MOS Technology) que, no auge da sua prosperidade, chegou a
vender microprocessadores ` raz˜o de 15 milh˜es por ano !
                               a   a             o
    Contudo, os outros n˜o baixaram os bra¸os. Frederico Faggin deixa a Intel e funda a Zilog Inc.
                           a                  c
Em 1976, a Zilog anuncia o Z80. Durante a concep¸˜o deste microprocessador, Faggin toma uma
                                                       ca
decis˜o cr´
      a     ıtica. Sabendo que tinha sido j´ desenvolvida uma enorme quantidade de programas
                                             a
para o 8080, Faggin conclui que muitos v˜o permanecer fieis a este microprocessador por causa
                                             a
das grandes despesas que adviriam das altera¸˜es a todos estes programas. Assim, ele decide que
                                                co
o novo microprocessador deve ser compat´     ıvel com o 8080, ou seja, deve ser capaz de executar
todos os programas que j´ tenham sido escritos para o 8080. Al´m destas caracter´
                             a                                      e                   ısticas, outras
caracter´ısticas adicionais foram introduzidas, de tal modo que o Z80 se tornou um microprocessador
muito potente no seu tempo. Ele podia endere¸ar directamente 64KB de mem´ria, tinha 176
                                                     c                                o
instru¸oes, um grande n´mero de registros, uma op¸˜o para refreshing de mem´ria RAM dinˆmica,
       c˜                 u                           ca                         o               a
uma unica alimenta¸˜o, maior velocidade de funcionamento, etc. O Z80 tornou-se um grande
       ´               ca
sucesso e toda a gente se transferiu do 8080 para o Z80. Pode dizer-se que o Z80 se constituiu
sem sombra de d´vida como o microprocessador de 8 bits com maior sucesso no seu tempo. Al´m
                    u                                                                               e
da Zilog, outros novos fabricantes como Mostek, NEC, SHARP e SGS apareceram. O Z80 foi o
cora¸ao de muitos computadores como o Spectrum, Partner, TRS703, Z-3 e Galaxy, que foram
     c˜
aqui usados.
    Em 1976, a Intel apareceu com uma vers˜o melhorada do microprocessador de 8 bits e designada
                                             a
por 8085. Contudo, o Z80 era t˜o superior a este que, bem depressa, a Intel perdeu a batalha. Ainda
                                 a
que mais alguns microprocessadores tenham aparecido no mercado (6809, 2650, SC/MP etc.), j´           a
tudo estava ent˜o decidido. J´ n˜o havia mais grandes melhorias a introduzir pelos fabricantes
                   a             a a
que fundamentassem a troca por um novo microprocessador, assim, o 6502 e o Z80, acompanhados
pelo 6800, mantiveram-se como os mais representativos microprocessadores de 8 bits desse tempo.


1.3     Microcontroladores versus Microprocessadores
Um microcontrolador difere de um microprocessador em v´rios aspectos. Primeiro e o mais impor-
                                                         a
tante, ´ a sua funcionalidade. Para que um microprocessador possa ser usado, outros componentes
       e
devem-lhe ser adicionados, tais como mem´ria e componentes para receber e enviar dados. Em
                                           o
resumo, isso significa que o microprocessador ´ o verdadeiro cora¸˜o do computador. Por outro
                                               e                  ca
lado, o microcontrolador foi projetado para ter tudo num s´. Nenhuns outros componentes exter-
                                                           o
nos s˜o necess´rios nas aplica¸˜es, uma vez que todos os perif´ricos necess´rios j´ est˜o contidos
     a          a              co                             e            a      a    a
nele. Assim, n´s poupamos tempo e espa¸o na constru¸˜o dos dispositivos.
                o                        c            ca


1.4     Microcontroladores da fam´ PIC
                                 ılia
A seguir s˜o apresentas algumas das caracter´
          a                                 ısticas mais importantes a respeito da arquitetura dos
microcontroladores PIC da Microchip.


                                                  5
1.4.1    Unidade de Mem´ria
                       o
A mem´ria ´ a parte do microcontrolador cuja fun¸˜o ´ guardar dados. A maneira mais f´cil de
        o    e                                      ca e                                   a
explicar ´ descrevˆ-la como uma grande prateleira cheia de gavetas. Se supusermos que marcamos
          e        e
as gavetas de modo a elas n˜o se confundirem umas com as outras, ent˜o o seu conte´do ser´
                               a                                          a              u   a
facilmente acess´ıvel. Basta saber a designa¸˜o da gaveta e o seu conte´do ser´ conhecido.
                                            ca                         u      a




                          Figura 1.1: Exemplo de unidade de mem´ria.
                                                               o

    Os componentes de mem´ria s˜o exatamente a mesma coisa. Para um determinado endere¸o,
                             o    a                                                             c
n´s obtemos o conte´do desse endere¸o. Dois novos conceitos foram apresentados: endere¸amento
  o                  u               c                                                     c
e mem´ria. A mem´ria ´ o conjunto de todos os locais de mem´ria (gavetas) e endere¸amento nada
       o            o e                                       o                      c
mais ´ que selecionar um deles. Isto significa que precisamos de selecionar o endere¸o desejado
      e                                                                                 c
(gaveta) e esperar que o conte´do desse endere¸o nos seja apresentado (abrir a gaveta). Al´m de ler
                              u                c                                          e
de um local da mem´ria (ler o conte´do da gaveta), tamb´m ´ poss´ escrever num endere¸o da
                     o               u                     e e      ıvel                     c
mem´ria (introduzir um conte´do na gaveta). Isto ´ feito utilizando uma linha adicional chamada
     o                         u                   e
linha de controle. N´s iremos designar esta linha por R/W (read/write) - ler/escrever. A linha de
                     o
controle ´ usada do seguinte modo: se r/w=1, ´ executada uma opera¸˜o de leitura, caso contr´rio
         e                                     e                      ca                       a
´ executada uma opera¸˜o de escrita no endere¸o de mem´ria.
e                       ca                       c         o
    A mem´ria ´ o primeiro elemento, mas precisamos de mais alguns para que o nosso microcon-
           o    e
trolador possa trabalhar.

1.4.2    Unidade Central de Processamento
Vamos agora adicionar mais 3 locais de mem´ria a um bloco espec´
                                                o                      ıfico para que possamos ter
as capacidades de multiplicar, dividir, subtrair e mover o seus conte´dos de um local de mem´ria
                                                                     u                       o
para outro. A parte que vamos acrescentar ´ chamada “central processing unit” (CPU) ou Unidade
                                            e
Central de Processamento. Os locais de mem´ria nela contidos chamam-se registros.
                                              o




                         Figura 1.2: Unidade Central de Processamento.



                                                6
Os registros s˜o, portanto, locais de mem´ria cujo papel ´ ajudar a executar v´rias opera¸˜es
                  a                           o                e                  a           co
matem´ticas ou quaisquer outras opera¸˜es com dados, quaisquer que sejam os locais em que estes
       a                                co
se encontrem.
    Vamos olhar para a situa¸˜o actual. N´s temos duas entidades independentes (mem´ria e CPU)
                              ca           o                                          o
que est˜o interligadas, deste modo, qualquer troca de dados ´ retardada bem como a funcionalidade
       a                                                    e
do sistema ´ diminu´
            e         ıda. Se, por exemplo, n´s desejarmos adicionar os conte´dos de dois locais
                                              o                               u
de mem´ria e tornar a guardar o resultado na mem´ria, n´s necessitamos de uma liga¸˜o entre
         o                                            o      o                          ca
a mem´ria e o CPU. Dito mais simplesmente, n´s precisamos de obter um ”caminho”atrav´s do
       o                                         o                                          e
qual os dados possam passar de um bloco para outro.

1.4.3    Barramentos - Bus
Este “caminho” designa-se por barramento (bus). Fisicamente ele corresponde a um grupo de 8,
16 ou mais fios.
   Existem dois tipos de bus: bus de dados e de endere¸o. O n´mero de linhas do primeiro
                                                        c        u
depende da quantidade de mem´ria que desejamos endere¸ar e o n´mero de linhas do outro de-
                              o                         c        u
pende da largura da palavra de dados, no nosso caso ´ igual a oito. O primeiro bus serve para
                                                    e
transmitir endere¸os do CPU para a mem´ria e o segundo para ligar todos os blocos dentro do
                 c                      o
microcontrolador.




                          Figura 1.3: Barramentos do microcontrolador.

    Neste momento, a funcionalidade j´ aumentou mas um novo problema apareceu: n´s temos uma
                                     a                                                 o
unidade capaz de trabalhar sozinha, mas que n˜o possui nenhum contato com o mundo exterior,
                                                 a
ou seja, conosco! De modo a remover esta deficiˆncia, vamos adicionar um bloco que cont´m v´rias
                                                e                                          e   a
localiza¸˜es de mem´ria e que, de um lado, est´ ligado ao bus de dados e do outro `s linhas de sa´
        co          o                         a                                   a              ıda
do microcontrolador que coincidem com pinos do circuito integrado e que, portanto, n´s podemos
                                                                                         o
ver com os nossos pr´prios olhos.
                     o

1.4.4    Unidade de entrada/sa´ (I/O)
                              ıda
Estas localiza¸˜es que acabamos de adicionar, chamam-se portas. Existem v´rios tipos de portas:
              co                                                          a
de entrada, de sa´ e de entrada/sa´
                   ıda                ıda. Quando trabalhamos com portas primeiro de tudo ´   e
necess´rio escolher a porta com que queremos trabalhar e, em seguida, enviar ou receber dados
      a
para ou dessa porta.
    Quando se est´ a trabalhar com ele, a porta funciona como um local de mem´ria. Qualquer
                  a                                                             o
coisa de que se est´ a ler ou em que se est´ a escrever e que ´ poss´ identificar facilmente nos
                    a                      a                  e     ıvel
pinos do microcontrolador.

1.4.5    Comunica¸˜o s´rie
                 ca e
Anteriormente, acrescentamos ` unidade j´ existente a possibilidade de comunicar com o mundo
                             a          a
exterior. Contudo, esta maneira de comunicar tem os seus inconvenientes. Um dos inconve-


                                                 7
Figura 1.4: Porta de entrada/sa´ de dados.
                                                         ıda


nientes b´sicos ´ o n´mero de linhas que ´ necess´rio usarmos para transferir dados. E se for
          a       e    u                     e        a
necess´rio transferi-los a uma distˆncia de v´rios quilˆmetros? O n´mero de linhas vezes o n´mero
       a                           a         a         o            u                        u
de quilˆmetros n˜o atesta a economia do projeto. Isto leva-nos a ter que reduzir o n´mero de linhas
       o          a                                                                 u
de modo a que a funcionalidade se mantenha. Suponha que estamos a trabalhar apenas com trˆs       e
linhas e que uma linha ´ usada para enviar dados, outra para os receber e a terceira ´ usada como
                         e                                                            e
linha de referˆncia tanto do lado de entrada como do lado da sa´
               e                                                ıda. Para que isto trabalhe n´s pre-
                                                                                             o
cisamos de definir as regras para a troca de dados. A este conjunto de regras chama-se protocolo.
Este protocolo deve ser definido com antecedˆncia de modo que n˜o haja mal entendidos entre as
                                               e                   a
partes que est˜o a comunicar entre si. Por exemplo, se um homem est´ a falar em francˆs e o outro
                a                                                     a                 e
em inglˆs, ´ altamente improv´vel que efetivamente e rapidamente, ambos se entendam. Vamos
         e e                    a
supor que temos o seguinte protocolo. A unidade l´gica ”1”´ colocada na linha de transmiss˜o at´
                                                    o        e                                a    e
que a transferˆncia se inicie. Assim que isto acontece, a linha passa para n´ l´gico ’0’ durante
                e                                                            ıvel o
um certo per´ ıodo de tempo (que vamos designar por T), assim, do lado da recep¸˜o ficamos a saber
                                                                                 ca
que existem dados para receber e, o mecanismo de recep¸˜o, vai ativar-se. Regressemos agora ao
                                                          ca
lado da emiss˜o e comecemos a pˆr zeros e uns l´gicos na linha de transmiss˜o correspondentes
                a                   o               o                           a
aos bits, primeiro o menos significativo e finalmente o mais significativo. Vamos esperar que cada
bit permane¸a na linha durante um per´
             c                            ıodo de tempo igual a T, e, finalmente, depois do oitavo
bit, vamos pˆr novamente na linha o n´ l´gico ”1”, o que assinala a transmiss˜o de um dado. O
             o                          ıvel o                                    a
protocolo que acabamos de descrever ´ designado na literatura profissional por NRZ (N˜o Retorno
                                       e                                                 a
a Zero).




                                 Figura 1.5: Comunica¸˜o serial.
                                                     ca


1.4.6    Unidade de temporiza¸˜o
                             ca
Agora que j´ temos a unidade de comunica¸˜o s´rie implementada, n´s podemos receber, enviar e
           a                             ca e                       o
processar dados.
    Contudo, para sermos capazes de utilizar isto na ind´stria precisamos ainda de mais alguns
                                                        u
blocos. Um deles ´ o bloco de temporiza¸˜o que nos interessa bastante porque pode dar-nos
                   e                      ca
informa¸˜es acerca da hora, dura¸˜o, protocolo, etc. A unidade b´sica do temporizador ´ um
       co                        ca                                a                     e
contador que ´ na realidade um registro cujo conte´do aumenta de uma unidade num intervalo
              e                                    u
de tempo fixo, assim, anotando o seu valor durante os instantes de tempo T1 e T2 e calculando


                                                 8
Figura 1.6: Temporizador (timer ).


a sua diferen¸a, n´s ficamos a saber a quantidade de tempo decorrida. Esta ´ uma parte muito
             c    o                                                          e
importante do microcontrolador, cujo dom´ınio vai requerer muita da nossa aten¸˜o.
                                                                               ca

1.4.7    Watchdog timer
Uma outra coisa que nos vai interessar ´ a fluˆncia da execu¸˜o do programa pelo microcontro-
                                         e    e             ca
lador durante a sua utiliza¸˜o. Suponha que como resultado de qualquer interferˆncia (que ocorre
                           ca                                                  e
freq¨entemente num ambiente industrial), o nosso microcontrolador para de executar o programa
    u
ou, ainda pior, desata a trabalhar incoerentemente.




                                   Figura 1.7: Watchdog timer.

    Claro que, quando isto acontece com um computador, n´s simplesmente carregamos no bot˜o
                                                              o                                  a
de reset e continuamos a trabalhar. Contudo, no caso do microcontrolador n´s n˜o podemos
                                                                                  o a
resolver o nosso problema deste modo, porque n˜o temos bot˜o. Para ultrapassar este obst´culo,
                                                   a            a                            a
precisamos de introduzir no nosso modelo um novo bloco chamado watchdog (c˜o de guarda). Este
                                                                                a
bloco ´ de facto outro contador que est´ continuamente a contar e que o nosso programa p˜e a zero
      e                                 a                                                 o
sempre que ´ executado corretamente. No caso de o programa encravar, o zero n˜o vai ser escrito
             e                                                                    a
e o contador, por si s´, encarregar-se-´ de fazer o reset do microcontrolador quando alcan¸ar o seu
                      o                a                                                  c
valor m´ximo. Isto vai fazer com que o programa corra de novo e desta vez corretamente. Este ´
        a                                                                                          e
um elemento importante para que qualquer programa se execute confiavelmente, sem precisar da
interven¸˜o do ser humano.
         ca

1.4.8    Conversor anal´gico-digital (A/D)
                       o
Como os sinais dos perif´ricos s˜o substancialmente diferentes daqueles que o microcontrolador
                         e      a
pode entender (zero e um), eles devem ser convertidos num formato que possa ser compreendido
pelo microcontrolador. Esta tarefa ´ executada por interm´dio de um bloco destinado ` convers˜o
                                   e                     e                            a       a
anal´gica-digital ou com um conversor A/D. Este bloco vai ser respons´vel pela convers˜o de uma
    o                                                                 a                 a
informa¸˜o de valor anal´gico para um n´mero bin´rio e pelo seu trajeto atrav´s do bloco do CPU,
        ca              o               u        a                           e
de modo a que este o possa processar de imediato.




                         Figura 1.8: Conversor anal´gico-digital (A/D).
                                                   o




                                                 9
1.4.9    O microcontrolador
Neste momento, a configura¸˜o do microcontrolador est´ j´ terminada, tudo o que falta ´ introduzi-
                           ca                         a a                             e
la dentro de um aparelho eletrˆnico que poder´ acessar aos blocos internos atrav´s dos pinos deste
                              o              a                                  e
componente. A Figura 1.9 ilustra o aspecto interno de um microcontrolador.




               Figura 1.9: Configura¸˜o f´
                                   ca ısica do interior de um microcontrolador.

    As linhas mais finas que partem do centro em dire¸˜o ` periferia do microcontrolador corre-
                                                      ca a
spondem aos fios que interligam os blocos interiores aos pinos do inv´lucro do microcontrolador.
                                                                     o
A Figura 1.10 representa a parte principal de um microcontrolador.
    Numa aplica¸˜o real, um microcontrolador, por si s´, n˜o ´ suficiente. Al´m dele, n´s necessi-
                ca                                    o a e                 e         o
tamos do programa que vai ser executado e de mais alguns elementos que constituir˜o um interface
                                                                                 a
l´gico para outros elementos.
 o


1.5     Programa
Escrever um programa ´ uma parte especial do trabalho com microcontroladores e ´ designado por
                       e                                                       e
programa¸~o . Vamos tentar escrever um pequeno programa numa linguagem que seremos n´s a
          ca                                                                              o
criar e que toda a gente ser´ capaz de compreender.
                            a

INICIO
REGISTRO1=LOCAL_DE_ MEMORIA_A
REGISTRO2=LOCAL_DE_ MEMORIA_B
PORTO_A=REGISTRO1+REGISTRO2
FIM

    O programa adiciona os conte´dos de dois locais de mem´ria e coloca a soma destes conte´dos na
                                 u                         o                               u
porta A. A primeira linha do programa manda mover o conte´do do local de mem´ria ”A”para um
                                                             u                   o
dos registros da unidade central de processamento. Como necessitamos tamb´m de outra parcela,
                                                                             e
vamos colocar o outro conte´do noutro registro da unidade central de processamento (CPU). A
                              u
instru¸ao seguinte pede ao CPU para adicionar os conte´dos dos dois registros e enviar o resultado
      c˜                                                 u
obtido para a porta A, de modo a que o resultado desta adi¸˜o seja vis´ para o mundo exterior.
                                                            ca         ıvel
Para um problema mais complexo, naturalmente o programa que o resolve ser´ maior.
                                                                               a
    A tarefa de programa¸˜o pode ser executada em v´rias linguagens tais como o Assembler, C
                          ca                             a
e Basic que s˜o as linguagens normalmente mais usadas. O Assembler pertence ao grupo das
               a
linguagens de baixo n´ ıvel que implicam um trabalho de programa¸˜o lento, mas que oferece os
                                                                    ca
melhores resultados quando se pretende poupar espa¸o de mem´ria e aumentar a velocidade de
                                                       c          o
execu¸˜o do programa. Como se trata da linguagem mais freq¨entemente usada na programa¸˜o de
      ca                                                     u                               ca
microcontroladores, ela ser´ discutida num cap´
                            a                   ıtulo mais adiantado. Os programas na linguagem
C s˜o mais f´ceis de se escrever e compreender, mas, tamb´m, s˜o mais lentos a serem executados
    a        a                                             e    a
que os programas assembler. Basic ´ a mais f´cil de todas para se aprender e as suas instru¸˜es
                                     e         a                                               co


                                               10
Figura 1.10: Arquitetura do microcontrolador.




                     11
s˜o semelhantes ` maneira de um ser humano se exprimir, mas tal como a linguagem C, ´ tamb´m
 a                a                                                                        e      e
de execu¸˜o mais lenta que o assembler. Em qualquer caso, antes que escolha entre uma destas
         ca
linguagens, precisa de examinar cuidadosamente os requisitos de velocidade de execu¸˜o, de espa¸o
                                                                                      ca           c
de mem´ria a ocupar e o tempo que vai demorar a fazer o programa em assembly.
        o
    Depois de o programa estar escrito, n´s necessitamos de introduzir o microcontrolador num
                                            o
dispositivo e po-lo para trabalhar. Para que isto aconte¸a, n´s precisamos de adicionar mais alguns
                                                         c    o
componentes externos. Primeiro temos que dar vida ao microcontrolador fornecendo-lhe a tens˜o      a
(a tens˜o el´trica ´ necess´ria para que qualquer instrumento eletrˆnico funcione) e o oscilador cujo
       a e         e         a                                     o
papel ´ an´logo ao do cora¸˜o que bate no ser humano. A execu¸˜o das instru¸˜es do programa
      e a                      ca                                   ca            co
´ regulada pelas pulsa¸˜es do oscilador. Logo que lhe ´ aplicada a tens˜o, o microcontrolador
e                         co                               e                a
executa uma verifica¸˜o dele pr´prio, vai para o princ´
                       ca         o                     ıpio do programa e come¸a a execut´-lo. O
                                                                                 c            a
modo como o dispositivo vai trabalhar depende de muitos parˆmetros, os mais importantes dos
                                                                 a
quais s˜o a competˆncia da pessoa que desenvolve o hardware e do programador que, com o seu
       a             e
programa, deve tirar o m´ximo do dispositivo.
                             a




                                                 12
Cap´
   ıtulo 2

O Microcontrolador PIC16F84

O PIC 16F84 pertence a uma classe de microcontroladores de 8 bits, com uma arquitetura RISC .
A estrutura gen´rica ´ a do mapa que se segue, que nos mostra os seus blocos b´sicos.
               e     e                                                        a


2.1     Componentes b´sicos do PIC
                     a
Mem´ria de programa (FLASH) - para armazenar o programa que se escreveu. Como a
      o
mem´ria fabricada com tecnologia FLASH pode ser programa e limpa mais que uma vez. ela
     o
torna-se adequada para o desenvolvimento de dispositivos.

    EEPROM - mem´ria dos dados que necessitam de ser salvaguardados quando a alimenta¸˜o ´
                      o                                                                  ca e
desligada. Normalmente ´ usada para guardar dados importantes que n˜o se podem perder quando
                         e                                          a
a alimenta¸˜o, de repente, “vai abaixo”. Um exemplo deste tipo de dados ´ a temperatura fixada
           ca                                                           e
para os reguladores de temperatura. Se, durante uma quebra de alimenta¸˜o, se perdessem dados,
                                                                      ca
n´s precisar´
 o          ıamos de proceder a um novo ajustamento quando a alimenta¸˜o fosse restabelecida.
                                                                        ca
Assim, o nosso dispositivo, perderia efic´cia.
                                        a

   RAM - mem´ria de dados usada por um programa, durante a sua execu¸˜o. Na RAM, s˜o
                 o                                                            ca           a
guardados todos os resultados interm´dios ou dados tempor´rios durante a execu¸˜o do programa
                                      e                      a                   ca
e que n˜o s˜o cruciais para o dispositivo, depois de ocorrer uma falha na alimenta¸˜o.
       a a                                                                        ca

   PORTA A e PORTA B s˜o liga¸˜es f´
                               a     co ısicas entre o microcontrolador e o mundo exterior. A
porta A tem cinco pinos e a porta B oito pinos.

   CONTADOR/TEMPORIZADOR ´ um registro de 8 bits no interior do microcontrolador
                                           e
que trabalha independentemente do programa. No fim de cada conjunto de quatro ciclos de rel´gio
                                                                                           o
do oscilador, ele incrementa o valor armazenado, at´ atingir o valor m´ximo (255), nesta altura
                                                   e                  a
recome¸a a contagem a partir de zero. Como n´s sabemos o tempo exato entre dois incrementos
       c                                       o
sucessivos do conte´do do temporizador, podemos utilizar este para medir intervalos de tempo, o
                    u
que o torna muito util em v´rios dispositivos.
                    ´       a

    UNIDADE DE PROCESSAMENTO CENTRAL faz a conex˜o com todos os outros a
blocos do microcontrolador. Ele coordena o trabalho dos outros blocos e executa o programa do
utilizador.


2.2     CISC x RISC
J´ foi dito que o PIC16F84 tem uma arquitetura RISC. Este termo ´ encontrado, muitas vezes, na
  a                                                                 e
literatura sobre computadores e necessita de ser explicada aqui, mais detalhadamente. A arquite-
tura de Harvard ´ um conceito mais recente que a de von-Neumann. Ela adveio da necessidade
                  e
de pˆr o microcontrolador a trabalhar mais rapidamente. Na arquitetura de Harvard, a mem´ria
     o                                                                                      o
de dados est´ separada da mem´ria de programa. Assim, ´ poss´ uma maior fluˆncia de dados
             a                 o                          e      ıvel            e


                                              13
Figura 2.1: Esquema do microcontrolador PIC16F84.




                    Figura 2.2: Arquiteturas Harvard versus von Neumann.


atrav´s da unidade central de processamento e, claro, uma maior velocidade de funcionamento. A
      e
separa¸˜o da mem´ria de dados da mem´ria de programa, faz com que as instru¸˜es possam ser
        ca         o                     o                                       co
representadas por palavras de mais que 8 bits. O PIC16F84, usa 14 bits para cada instru¸˜o, o
                                                                                            ca
                                                       o                ca ´
que permite que que todas as instru¸˜es ocupem uma s´ palavra de instru¸˜o. E tamb´m t´
                                   co                                                 e   ıpico da
arquitetura Harvard ter um repert´rio com menos instru¸˜es que a de von-Neumann’s, instru¸˜es
                                  o                      co                                   co
essas, geralmente executadas apenas num unico ciclo de rel´gio.
                                           ´                o
    Os microcontroladores com a arquitetura Harvard, s˜o tamb´m designados por microcontroladores
                                                      a        e
RISC. RISC prov´m de Computador com um Conjunto Reduzido de Instru¸˜es (Reduced Instruc-
                 e                                                        co
tion Set Computer). Os microcontroladores com uma arquitetura von-Neumann s˜o designados
                                                                                    a
por microcontroladores CISC. O nome CISC deriva de Computador com um Conjunto Complexo
de Instru¸oes (Complex Instruction Set Computer).
           c˜
    Como o PIC16F84 ´ um microcontrolador RISC, disso resulta que possui um n´mero reduzido
                       e                                                          u
de instru¸oes, mais precisamente 35 (por exemplo, os microcontroladores da Intel e da Motorola
           c˜
tˆm mais de cem instru¸˜es). Todas estas instru¸˜es s˜o executadas num unico ciclo, exceto no caso
 e                     co                      co a                    ´
de instru¸˜es de salto e de ramifica¸˜o. De acordo com o que o seu fabricante refere, o PIC16F84
           co                      ca
geralmente atinge resultados de 2 para 1 na compress˜o de c´digo e 4 para 1 na velocidade, em
                                                       a       o
rela¸˜o aos outros microcontroladores de 8 bits da sua classe.
    ca


2.3     Aplica¸˜es
              co
O PIC16F84, ´ perfeitamente adequado para muitas variedades de aplica¸˜es, como a ind´stria
               e                                                           co              u
                                              e                               c   ´
autom´vel, sensores remotos, fechaduras el´tricas e dispositivos de seguran¸a. E tamb´m um
       o                                                                                 e
dispositivo ideal para cart˜es inteligentes, bem como para dispositivos alimentados por baterias,
                           o
por causa do seu baixo consumo.
    A mem´ria EEPROM, faz com que se torne mais f´cil usar microcontroladores em dispositivos
           o                                         a
onde o armazenamento permanente de v´rios parˆmetros, seja necess´rio (c´digos para transmis-
                                          a       a                  a      o
sores, velocidade de um motor, freq¨ˆncias de recep¸˜o, etc.). O baixo custo, baixo consumo,
                                       ue            ca
facilidade de manuseamento e flexibilidade fazem com que o PIC16F84 se possa utilizar em ´reas
                                                                                           a
em que os microcontroladores n˜o eram anteriormente empregues (exemplo: fun¸˜es de tempo-
                                 a                                               co


                                               14
riza¸˜o, substitui¸˜o de interfaces em sistemas de grande porte, aplica¸˜es de coprocessamento,
    ca            ca                                                       co
etc.).
    A possibilidade deste chip de ser program´vel no sistema (usando somente dois pinos para a
                                               a
transferˆncia de dados), d˜o flexibilidade do produto, mesmo depois de a sua montagem e teste
        e                  a
estarem completos.
    Esta capacidade, pode ser usada para criar linhas de produ¸˜o e montagem, para armazenar
                                                                  ca
dados de calibragem dispon´ ıveis apenas quando se proceder ao teste final ou, ainda, para aperfei¸oar
                                                                                                 c
os programas presentes em produtos acabados.


2.4     Rel´gio / ciclo de instru¸˜o
           o                     ca
O rel´gio (clock), ´ quem d´ o sinal de partida para o microcontrolador e ´ obtido a partir de
      o              e       a                                                 e
um componente externo chamado oscilador. Se considerasse-mos que um microcontrolador era
um rel´gio de sala, o nosso clock corresponderia ao pˆndulo e emitiria um ru´ correspondente
        o                                               e                        ıdo
ao deslocar do pˆndulo. Tamb´m, a for¸a usada para dar corda ao rel´gio, podia comparar-se `
                  e            e          c                              o                      a
alimenta¸˜o el´trica.
          ca   e
    O clock do oscilador, ´ ligado ao microcontrolador atrav´s do pino OSC1, aqui, o circuito
                           e                                   e
interno do microcontrolador divide o sinal de clock em quatro fases, Q1, Q2, Q3 e Q4 que n˜o   a
se sobrep˜em. Estas quatro pulsa¸˜es perfazem um ciclo de instru¸˜o (tamb´m chamado ciclo de
           o                      co                                ca        e
m´quina) e durante o qual uma instru¸˜o ´ executada. A execu¸˜o de uma instru¸˜o, ´ antecedida
  a                                    ca e                     ca                 ca e
pela extra¸˜o da instru¸˜o que est´ na linha seguinte. O c´digo da instru¸˜o ´ extra´ da mem´ria
            ca         ca         a                       o              ca e        ıdo     o
de programa em Q1 e ´ escrito no registro de instru¸˜o em Q4.
                       e                             ca
    A decodifica¸˜o e execu¸˜o dessa mesma instru¸˜o, faz-se entre as fases Q1 e Q4 seguintes. Na
                 ca         ca                     ca
Figura 2.3 podemos observar a rela¸˜o entre o ciclo de instru¸˜o e o clock do oscilador (OSC1)
                                     ca                         ca
assim como as fases Q1-Q4. O contador de programa (Program Counter ou PC) guarda o endere¸o    c
da pr´xima instru¸˜o a ser executada.
      o             ca




                             Figura 2.3: Ciclo de instru¸˜o e o clock.
                                                        ca


2.4.1    Pipelining
Cada ciclo de instru¸˜o inclui as fases Q1, Q2, Q3 e Q4. A extra¸˜o do c´digo de uma instru¸˜o
                      ca                                            ca      o                     ca
da mem´ria de programa, ´ feita num ciclo de instru¸˜o, enquanto que a sua decodifica¸˜o e
        o                     e                            ca                                   ca
execu¸ao, s˜o feitos no ciclo de instru¸˜o seguinte. Contudo, devido ` sobreposi¸˜o – pipelining (o
     c˜ a                              ca                            a          ca
microcontrolador ao mesmo tempo que executa uma instru¸˜o extrai simultaneamente da mem´ria
                                                              ca                                  o
o c´digo da instru¸˜o seguinte), podemos considerar que, para efeitos pr´ticos, cada instru¸˜o
   o                ca                                                        a                   ca
demora um ciclo de instru¸˜o a ser executada. No entanto, se a instru¸˜o provocar uma mudan¸a
                            ca                                           ca                         c
no conte´do do contador de programa (PC), ou seja, se o PC n˜o tiver que apontar para o endere¸o
        u                                                        a                                  c
seguinte na mem´ria de programa, mas sim para outro (como no caso de saltos ou de chamadas
                  o
de subrotinas), ent˜o dever´ considerar-se que a execu¸˜o desta instru¸˜o demora dois ciclos. Isto
                    a        a                           ca              ca
acontece, porque a instru¸˜o vai ter que ser processada de novo, mas, desta vez, a partir do endere¸o
                          ca                                                                        c


                                                 15
correto. O ciclo de chamada come¸a na fase Q1, escrevendo a instru¸˜o no registro de instru¸˜o
                                   c                                 ca                     ca
(Instruction Register - IR). A decodifica¸˜o e execu¸˜o continua nas fases Q2, Q3 e Q4 do clock.
                                        ca         ca




                                      Figura 2.4: Pipeline.


2.4.2    Fluxograma das Instru¸˜es no Pipeline
                              co
TCY0 ´ lido da mem´ria o c´digo da instru¸˜o MOVLW 55h (n˜o nos interessa a instru¸˜o que
         e             o       o             ca                 a                      ca
foi executada, por isso n˜o est´ representada por retˆngulo).
                         a     a                     a
    TCY1 ´ executada a instru¸˜o MOVLW 55h e ´ lida da mem´ria a instru¸˜o MOVWF PORTB.
             e                  ca                e           o         ca
    TCY2 ´ executada a instru¸˜o MOVWF PORTB e lida a instru¸˜o CALL SUB1.
             e                   ca                               ca
    TCY3 ´ executada a chamada (call) de um subrotina CALL SUB1 e ´ lida a instru¸˜o BSF
             e                                                          e             ca
PORTA,BIT3. Como esta instru¸˜o n˜o ´ a que nos interessa, ou seja, n˜o ´ a primeira instru¸˜o
                                  ca a e                              a e                  ca
da subrotina SUB1, cuja execu¸˜o ´ o que vem a seguir, a leitura de uma instru¸˜o tem que ser
                                 ca e                                          ca
feita de novo. Este ´ um bom exemplo de uma instru¸˜o a precisar de mais que um ciclo.
                    e                                 ca
    TCY4 este ciclo de instru¸˜o ´ totalmente usado para ler a primeira instru¸˜o da subrotina
                                ca e                                          ca
no endere¸o SUB1.
           c
    TCY5 ´ executada a primeira instru¸˜o da subrotina SUB1 e lida a instru¸˜o seguinte.
             e                           ca                                 ca


2.5     Significado dos pinos
                                        ´
O PIC16F84 tem um total de 18 pinos. E mais freq¨entemente encontrado num tipo de encap-
                                                     u
sulamento DIP18, mas, tamb´m pode ser encontrado numa c´psula SMD de menores dimens˜es
                             e                                a                                o
que a DIP. DIP ´ uma abreviatura para Dual In Package (Empacotamento em duas linhas). SMD
                 e
´ uma abreviatura para Surface Mount Devices (Dispositivos de Montagem em Superf´
e                                                                                     ıcie), o que
sugere que os pinos n˜o precisam de passar pelos orif´
                       a                             ıcios da placa em que s˜o inseridos, quando
                                                                            a
se solda este tipo de componente.




                               Figura 2.5: Pinagem do PIC16F84.

   Os pinos no microcontrolador PIC16F84, tˆm o seguinte significado:
                                           e


                                               16
• Pino no 1, RA2 Segundo pino da porta A. N˜o tem nenhuma fun¸˜o adicional.
                                              a                 ca
   • Pino no 2, RA3 Terceiro pino da porta A. N˜o tem nenhuma fun¸˜o adicional.
                                               a                 ca
   • Pino no 3, RA4 Quarto pino da porta A. O TOCK1 que funciona como entrada do tempo-
     rizador, tamb´m utiliza este pino.
                  e
   • Pino no 4, MCLR Entrada de reset e entrada da tens˜o de programa¸˜o Vpp do microcon-
                                                       a             ca
     trolador .
   • Pino no 5, Vss massa da alimenta¸˜o.
                                     ca
   • Pino no 6, RB0, bit 0 da porta B. Tem uma fun¸˜o adicional que ´ a de entrada de interrup¸˜o.
                                                  ca                e                         ca
   • Pino no 7, RB1 bit 1da porta B. N˜o tem nenhuma fun¸˜o adicional.
                                      a                 ca
   • Pino no 8, RB2 bit 2 da porta B. N˜o tem nenhuma fun¸˜o adicional.
                                       a                 ca
   • Pino no 9, RB3 bit 3 da porta B. N˜o tem nenhuma fun¸˜o adicional.
                                       a                 ca
   • Pino no 10, RB4 bit 4 da porta B. N˜o tem nenhuma fun¸˜o adicional.
                                        a                 ca
   • Pino no 11, RB5 bit 5 da porta B. N˜o tem nenhuma fun¸˜o adicional.
                                        a                 ca
   • Pino no 12, RB6 bit 6 da porta B. No modo de programa ´ a linha de clock
                                                           e
   • Pino no 13, RB7 bit 7 da porta B. Linha de dados no modo de programa
   • Pino no 14, Vdd p´lo positivo da tens˜o de alimenta¸˜o.
                      o                   a             ca
   • Pino no 15, OSC2 para ser ligado a um oscilador.
   • Pino no 16, OSC1 para ser ligado a um oscilador.
   • Pino no 17, RA0 bit 0 da porta A. Sem fun¸˜o adicional.
                                              ca
   • Pino no 18, RA1 bit 1 da porta A. Sem fun¸˜o adicional.
                                              ca


2.6     Gerador de rel´gio – oscilador
                      o
O circuito do oscilador ´ usado para fornecer um rel´gio (clock), ao microcontrolador. O clock
                        e                           o
´ necess´rio para que o microcontrolador possa executar um programa ou as instru¸˜es de um
e       a                                                                          co
programa.

2.6.1    Tipos de osciladores
O PIC16F84 pode trabalhar com quatro configura¸˜es de oscilador. Uma vez que as configura¸˜es
                                                   co                                        co
com um oscilador de cristal e resistˆncia-condensador (RC) s˜o aquelas mais freq¨entemente us-
                                     e                         a                  u
adas, elas s˜o as unicas que vamos mencionar aqui.
            a     ´
    Quando o oscilador ´ de cristal, a designa¸˜o da configura¸˜o ´ de XT, se o oscilador for uma
                        e                     ca               ca e
resistˆncia em s´rie com um condensador, tem a designa¸˜o RC. Isto ´ importante, porque h´
      e          e                                          ca           e                      a
necessidade de optar entre os diversos tipos de oscilador, quando se escolhe um microcontrolador.




                 Figura 2.6: Clock de um microcontrolador com um ressonador.



                                               17
2.6.2    Oscilador XT
O oscilador de cristal est´ contido num inv´lucro de metal com dois pinos onde foi escrita a
                           a                   o
freq¨ˆncia a que o cristal oscila. Dois condensadores cerˆmicos devem ligar cada um dos pinos do
    ue                                                   a
cristal ` massa. Casos h´ em que cristal e condensadores est˜o contidos no mesmo encapsulamento,
        a               a                                   a
´ tamb´m o caso do ressonador cerˆmico ao lado representado. Este elemento tem trˆs pinos
e       e                             a                                                  e
com o pino central ligado ` massa e os outros dois pinos ligados aos pinos OSC1 e OSC2 do
                             a
microcontrolador. Quando projetamos um dispositivo, a regra ´ colocar o oscilador t˜o perto
                                                                   e                    a
quanto poss´ do microcontrolador, de modo a evitar qualquer interferˆncia nas linhas que ligam
            ıvel                                                         e
o oscilador ao microcontrolador.




          Figura 2.7: Clock de um microcontrolador a partir de um cristal de quartzo.



2.6.3    Oscilador RC
Em aplica¸˜es em que a precis˜o da temporiza¸˜o n˜o ´ um factor cr´
           co                  a             ca a e               ıtico, o oscilador RC torna-se
mais econˆmico. A freq¨ˆncia de ressonˆncia do oscilador RC depende da tens˜o de alimenta¸˜o,
           o            ue              a                                     a             ca
da resistˆncia R, capacitˆncia C e da temperatura de funcionamento.
         e               a




                                     Figura 2.8: Oscilador RC.

    A Figura 2.8 mostra como um oscilador RC deve ser ligado a um PIC16F84. Com um valor
para a resistˆncia R abaixo de 2,2kΩ, o oscilador pode tornar-se inst´vel ou pode mesmo parar de
             e                                                          a
oscilar. Para um valor muito grande R (1M por exemplo), o oscilador torna-se muito sens´       ıvel `
                                                                                                    a
umidade e ao ru´      ´
                 ıdo. E recomendado que o valor da resistˆncia R esteja compreendido entre 3kΩ e
                                                             e
100kΩ. Apesar de o oscilador poder trabalhar sem condensador externo (C = 0pF), ´ conveniente,
                                                                                      e
ainda assim, usar um condensador acima de 20pF para evitar o ru´ e aumentar a estabilidade.
                                                                       ıdo
Qualquer que seja o oscilador que se est´ a utilizar, a freq¨ˆncia de trabalho do microcontrolador ´
                                        a                    ue                                     e
a do oscilador dividida por 4. A freq¨ˆncia de oscila¸˜o dividida por 4 tamb´m ´ fornecida no pino
                                     ue               ca                      e e
OSC2/CLKOUT e, pode ser usada, para testar ou sincronizar outros circuitos l´gicos pertencentes
                                                                                 o
ao sistema.
    Ao ligar a alimenta¸˜o do circuito, o oscilador come¸a a oscilar. Primeiro com um per´
                        ca                                 c                                ıodo de
oscila¸˜o e uma amplitude inst´veis, mas, depois de algum tempo, tudo estabiliza.
      ca                        a
    Para evitar que esta instabilidade inicial do clock afete o funcionamento do microcontrolador,
n´s necessitamos de manter o microcontrolador no estado de reset enquanto o clock do oscilador
 o
n˜o estabiliza. A Figura 2.10 mostra uma forma t´
 a                                                     ıpica do sinal fornecido por um oscilador de
cristal de quartzo ao microcontrolador quando se liga a alimenta¸˜o.ca



                                                 18
Figura 2.9: Rela¸˜o entre o sinal de clock e os ciclos de instru¸˜o.
                                ca                                              ca




Figura 2.10: Sinal de clock do oscilador do microcontrolador depois de ser ligada a alimenta¸˜o.
                                                                                            ca


2.7     Reset
O reset ´ usado para pˆr o microcontrolador num estado conhecido. Na pr´tica isto significa
          e              o                                                         a
que `s vezes o microcontrolador pode comportar-se de um modo inadequado em determinadas
      a
condi¸˜es indesej´veis. De modo a que o seu funcionamento normal seja restabelecido, ´ preciso
       co         a                                                                           e
fazer o reset do microcontrolador, isto significa que todos os seus registros v˜o conter valores iniciais
                                                                              a
pr´-definidos, correspondentes a uma posi¸˜o inicial. O reset n˜o ´ usado somente quando o micro-
   e                                        ca                    a e
controlador n˜o se comporta da maneira que n´s queremos, mas, tamb´m pode ser usado, quando
                a                                o                         e
ocorre uma interrup¸˜o por parte de outro dispositivo, ou quando se quer que o microcontrolador
                     ca
esteja pronto para executar um programa .
     De modo a prevenir a ocorrˆncia de um zero l´gico acidental no pino MCLR (a linha por cima
                                e                  o
de MCLR significa o sinal de reset ´ ativado por n´
                                      e                ıvel l´gico baixo), o pino MCLR tem que ser
                                                             o
ligado atrav´s de uma resistˆncia ao lado positivo da alimenta¸˜o. Esta resistˆncia deve ter um
              e               e                                    ca               e
valor entre 5kΩ e 10kΩ. Uma resistˆncia como esta, cuja fun¸˜o ´ conservar uma determinada
                                       e                           ca e
linha a n´ l´gico alto, ´ chamada resist^ncia de pull up.
          ıvel o          e                   e




                        Figura 2.11: Utiliza¸˜o do circuito interno de reset.
                                            ca

   O microcontrolador PIC16F84, admite v´rias formas de reset:
                                        a



                                                  19
1. Reset quando se liga a alimenta¸˜o, POR (Power-On Reset)
                                    ca
  2. Reset durante o funcionamento normal, quando se p˜e a n´ l´gico baixo o pino MCLR do
                                                      o     ıvel o
     microcontrolador.
  3. Reset durante o regime de SLEEP (dormir).
  4. Reset quando o temporizador do watchdog (WDT) transborda (passa para 0 depois de atingir
     o valor m´ximo).
              a
  5. Reset quando o temporizador do watchdog (WDT) transborda estando no regime de SLEEP.
    Os reset mais importantes s˜o o primeiro e o segundo. O primeiro, ocorre sempre que ´ ligada
                                a                                                         e
a alimenta¸˜o do microcontrolador e serve para trazer todos os registros para um estado inicial. O
           ca
segundo que resulta da aplica¸˜o de um valor l´gico baixo ao pino MCLR durante o funcionamento
                             ca                o
normal do microcontrolador e, ´ usado muitas vezes, durante o desenvolvimento de um programa.
                               e
    Durante um reset, os locais de mem´ria da RAM (registros) n˜o s˜o alterados. Ou seja, os
                                         o                          a a
conte´dos destes registros, s˜o desconhecidos durante o restabelecimento da alimenta¸˜o, mas
      u                      a                                                          ca
mant´m-se inalterados durante qualquer outro reset. Ao contr´rio dos registros normais, os SFR
      e                                                        a
(registros com fun¸˜es especiais) s˜o reiniciados com um valor inicial pr´-definido. Um dos mais
                   co               a                                    e
importantes efeitos de um reset, ´ introduzir no contador de programa (PC), o valor zero (0000),
                                  e
o que faz com que o programa comece a ser executado a partir da primeira instru¸˜o deste.
                                                                                  ca

2.7.1    Brown-out Reset
Reset quando o valor da alimenta¸˜o desce abaixo do limite permitido ´ chamado de Brown-out
                                   ca                                   e
Reset.
    O impulso que provoca o reset durante o estabelecimento da alimenta¸˜o (power-up), ´ gerado
                                                                         ca              e
pelo pr´prio microcontrolador quando detecta um aumento na tens˜o Vdd (numa faixa entre 1,2V
        o                                                         a
e 1,8V). Esse impulso perdura durante 72ms, o que, em princ´   ıpio, ´ tempo suficiente para que
                                                                     e
o oscilador estabilize. Esse intervalo de tempo de 72ms ´ definido por um temporizador interno
                                                         e
PWRT, com um oscilador RC pr´prio. Enquanto PWRT estiver actio, o microcontrolador mant´m-
                                 o                                                            e
se no estado de reset. Contudo, quando o dispositivo est´ a trabalhar, pode surgir um problema
                                                         a
n˜o resultante de uma queda da tens˜o para 0 volts, mas sim de uma queda de tens˜o para um
 a                                     a                                              a
valor abaixo do limite que garante o correto funcionamento do microcontrolador. Trata-se de
um facto muito prov´vel de ocorrer na pr´tica, especialmente em ambientes industriais onde as
                      a                     a
perturba¸˜es e instabilidade da alimenta¸˜o ocorrem freq¨entemente. Para resolver este problema,
          co                             ca             u
n´s precisamos de estar certos de que o microcontrolador entra no estado de reset de cada vez que
 o
a alimenta¸˜o desce abaixo do limite aprovado.
            ca




               Figura 2.12: Exemplos de quedas na alimenta¸˜o abaixo do limite.
                                                          ca

   Se, de acordo com as especifica¸˜es el´tricas, o circuito interno de reset de um microcontrolador
                                   co    e
n˜o satisfizer as necessidades, ent˜o, dever˜o ser usados componentes electronics especiais, capazes
 a                                a        a

                                                20
de gerarem o sinal de reset desejado.    Al´m desta fun¸˜o, estes componentes, podem tamb´m
                                            e           ca                                 e
cumprir o papel de vigiarem as quedas   de tens˜o para um valor abaixo de um n´ especificado.
                                               a                               ıvel
Quando isto ocorre, aparece um zero     l´gico no pino MCLR, que mant´m o microcontrolador
                                         o                               e
no estado de reset, enquanto a tens˜o
                                   a    n˜o estiver dentro dos limites que garantem um correto
                                          a
funcionamento.


2.8     Unidade Central de Processamento
A unidade central de processamento (CPU) ´ o c´rebro de um microcontrolador. Essa parte ´
                                              e    e                                     e
respons´vel por extrair a instru¸˜o, decodificar essa instru¸˜o e, finalmente, execut´-la.
       a                        ca                         ca                      a




               Figura 2.13: Esquema da unidade central de processamento - CPU.

     A unidade central de processamento, interliga todas as partes do microcontrolador de modo
a que este se comporte como um todo. Uma das sua fun¸˜es mais importante ´, seguramente,
                                                            co                    e
decodificar as instru¸˜es do programa. Quando o programador escreve um programa, as instru¸˜es
                    co                                                                         co
assumem um claro significado como ´ o caso por exemplo de MOVLW 0x20. Contudo, para
                                      e
que um microcontrolador possa entendˆ-las, esta forma escrita de uma instru¸˜o tem que ser
                                        e                                        ca
traduzida numa s´rie de zeros e uns que ´ o opcode (operation code ou c´digo da opera¸˜o).
                  e                         e                                  o              ca
Esta passagem de uma palavra escrita para a forma bin´ria ´ executada por tradutores assembler
                                                         a e
(ou simplesmente assembler). O c´digo da instru¸˜o extra´ da mem´ria de programa, tem
                                    o               ca         ıdo         o
que ser decodificado pela unidade central de processamento (CPU). A cada uma das instru¸˜es     co
do repert´rio do microcontrolador, corresponde um conjunto de a¸˜es para a concretizar. Estas
          o                                                         co
a¸˜es, podem envolver transferˆncias de dados de um local de mem´ria para outro, de um local de
  co                           e                                    o
mem´ria para os portos, e diversos c´lculos, pelo que, se conclui que, o CPU, tem que estar ligado
      o                             a
a todas as partes do microcontrolador. Os bus de de dados e o de endere¸o permitem-nos fazer
                                                                             c
isso.

2.8.1    Unidade L´gica Aritm´tica (ALU)
                  o          e
A unidade l´gica aritm´tica (ALU – Arithmetic Logic Unit), ´ respons´vel pela execu¸˜o de
             o            e                                   e        a               ca
opera¸˜es de adi¸˜o, subtra¸˜o, deslocamento (para a esquerda ou para a direita dentro de um
      co         ca          ca
registro) e opera¸˜es l´gicas. O PIC16F84 cont´m uma unidade l´gica aritm´tica de 8 bits e
                  co    o                      e                 o          e
registros de uso gen´rico tamb´m de 8 bits.
                     e          e


2.9     Registros
Por operando n´s designamos o conte´do sobre o qual uma opera¸˜o incide. Nas instru¸˜es com
                o                   u                           ca                   co
dois operados, geralmente um operando est´ contido no registro de trabalho W (working register)
                                         a
e o outro operando ou ´ uma constante ou ent˜o est´ contido num dos outros registros. Esses
                       e                      a     a

                                               21
Figura 2.14: Unidade l´gica-aritm´tica.
                                       o          e




Figura 2.15: Diagrama bloco mais detalhado do microcontrolador PIC16F84.




                                   22
registros podem ser Registros de Uso Gen´rico (General Purpose Registers – GPR) ou Registros
                                           e
com fun¸oes especiais (Special Function Registers – SFR). Nas instru¸˜es s´ com um operando,
         c˜                                                            co   o
um dos operandos ´ o conte´do do registro W ou o conte´do de um dos outros registros. Quando
                   e        u                            u
s˜o executadas opera¸˜es l´gicas ou aritm´ticas como ´ o caso da adi¸˜o, a ALU controla o estado
 a                   co o                 e          e              ca
dos bits (que constam do registro de estado – STATUS). Dependendo da instru¸˜o a ser executada,
                                                                              ca
a ALU, pode modificar os valores bits do Carry (C), Carry de d´  ıgito (DC) e Z (zero) no registro
de estado – STATUS.

2.9.1    Registro STATUS
O registro de estado (STATUS), cont´m o estado da ALU (C, DC, Z), estado de RESET (TO, PD)
                                     e
e os bits para sele¸˜o do banco de mem´ria (IRP, RP1, RP0). Considerando que a sele¸˜o do banco
                   ca                  o                                           ca
de mem´ria ´ controlada atrav´s deste registro, ele tem que estar presente em todos os bancos.
         o    e                  e
Os bancos de mem´ria ser˜o discutidos com mais detalhe no cap´
                     o      a                                   ıtulo que trata da Organiza¸˜o
                                                                                            ca
da Mem´ria. Se o registro STATUS for o registro de destino para instru¸˜es que afetem os bits Z,
         o                                                            co
DC ou C, ent˜o n˜o ´ poss´ escrever nestes trˆs bits.
               a a e        ıvel                e




                               Figura 2.16: Registrador STATUS.


bit 0 C (Carry) Transporte. Este bit ´ afetado pelas opera¸˜es de adi¸˜o, subtra¸˜o e desloca-
                                       e                   co        ca         ca
     mento. Toma o valor 1 (set), quando um valor mais pequeno ´ subtra´ de um valor maior
                                                                e       ıdo
     e toma o valor 0 (reset) quando um valor maior ´ subtra´ de um menor. 1= Ocorreu um
                                                    e       ıdo
     transporte no bit mais significativo 0= N˜o ocorreu transporte no bit mais significativo O
                                             a
     bit C ´ afetado pelas instru¸˜es ADDWF, ADDLW, SUBLW e SUBWF.
           e                     co
bit 1 DC (Digit Carry) Transporte de d´    ıgito. Este bit ´ afetado pelas opera¸˜es de adi¸˜o,
                                                           e                     co        ca
     subtra¸˜o. Ao contr´rio do anterior, DC assinala um transporte do bit 3 para o bit 4 do
            ca            a
     resultado. Este bit toma o valor 1, quando um valor mais pequeno ´ subtra´ de um valor
                                                                        e       ıdo
     maior e toma o valor 0 quando um valor maior ´ subtra´ de um menor.
                                                    e        ıdo
     1= Ocorreu um transporte no quarto bit mais significativo
     0= N˜o ocorreu transporte nesse bit
           a
     O bit DC ´ afetado pelas instru¸˜es ADDWF, ADDLW, SUBLW e SUBWF.
               e                    co
bit 2 Z (bit Zero) Indica¸˜o de resultado igual a zero. Este bit toma o valor 1 quando o resul-
                           ca
     tado da opera¸˜o l´gica ou aritm´tica executada ´ igual a 0.
                  ca o               e               e
     1= resultado igual a zero
     0= resultado diferente de zero
bit 3 PD (Bit de baixa de tens˜o – Power Down). Este bit ´ posto a 1 quando o microcontro-
                                  a                          e
     lador ´ alimentado e come¸a a trabalhar, depois de um reset normal e depois da execu¸˜o da
           e                    c                                                        ca
     instru¸˜o CLRWDT. A instru¸˜o SLEEP p˜e este bit a 0 ou seja, quando o microcontrolador
           ca                       ca          o
     entra no regime de baixo consumo / pouco trabalho. Este bit pode tamb´m ser posto a 1,
                                                                              e
     no caso de ocorrer um impulso no pino RB0/INT, uma varia¸˜o nos quatro bits mais signi-
                                                                  ca
     ficativos da porta B, ou quando ´ completada uma opera¸˜o de escrita na DATA EEPROM
                                       e                     ca
     ou ainda pelo watchdog.
     1 = depois de ter sido ligada a alimenta¸˜o
                                             ca
     0 = depois da execu¸˜o de uma instru¸˜o SLEEP
                         ca                ca
bit 4 TO Time-out transbordo do Watchdog. Este bit ´ posto a 1, depois de a alimenta¸˜o ser
                                                     e                              ca
     ligada e depois da execu¸˜o das instru¸˜es CLRWDT e SLEEP. O bit ´ posto a 0 quando
                             ca            co                          e


                                               23
o watchdog consegue chegar ao fim da sua contagem (overflow = transbordar), o que indica
     que qualquer coisa n˜o esteve bem.
                         a
     1 = n˜o ocorreu transbordo
          a
     0 = ocorreu transbordo
bits 5 e 6 RP1:RP0 (bits de sele¸˜o de banco de registros). Estes dois bits s˜o a parte mais
                                    ca                                         a
     significativa do endere¸o utilizado para endere¸amento direto. Como as instru¸˜es que en-
                           c                        c                              co
     dere¸am directamente a mem´ria, disp˜em somente de sete bits para este efeito, ´ preciso
         c                         o        o                                         e
     mais um bit para poder endere¸ar todos os 256 registros do PIC16F84. No caso do PIC16F84,
                                    c
     RP1, n˜o ´ usado, mas pode ser necess´rio no caso de outros microcontroladores PIC, de
            a e                              a
     maior capacidade.
     01 = banco de registros 1
     00 = banco de registros 0
bit 7 IRP (Bit de sele¸˜o de banco de registros). Este bit ´ utilizado no endere¸amento indireto
                      ca                                   e                    c
     da RAM interna, como oitavo bit.
     1 = bancos 2 e 3
     0 = bancos 0 e 1 (endere¸os de 00h a FFh)
                             c

2.9.2    Registro OPTION




                              Figura 2.17: Registrador OPTION.


bits 0 a 2 PS0, PS1, PS2 (bits de sele¸˜o do divisor Prescaler). Estes trˆs bits definem o factor
                                       ca                                e
     de divis˜o do prescaler. Aquilo que ´ o prescaler e o modo como o valor destes trˆs bits
             a                           e                                               e
     afectam o funcionamento do microcontrolador ser´ estudado na se¸˜o referente a TMR0.
                                                     a                ca




                                    Figura 2.18: Prescaler.

bit 3 PSA (Bit de Atribui¸˜o do Prescaler). Bit que atribui o prescaler ao TMR0 ou ao watchdog.
                           ca
     1 = prescaler atribu´ ao watchdog
                         ıdo
     0 = prescaler atribu´ ao temporizador TMR0
                         ıdo
bit 4 T0SE (bit de sele¸˜o de bordo actio em TMR0). Se for permitido aplicar impulsos em
                       ca
     TMR0, a partir do pino RA4/TOCK1, este bit determina se os impulsos activos s˜o os
                                                                                    a
     impulsos ascendentes ou os impulsos descendentes.
     1 = bordo descendente
     0 = bordo ascendente
bit 5 TOCS (bit de sele¸˜o de fonte de clock em TMR0). Este pino escolhe a fonte de impulsos
                         ca
     que vai ligar ao temporizador. Esta fonte pode ser o clock do microcontrolador (freq¨ˆncia
                                                                                         ue

                                              24
de clock a dividir por 4) ou impulsos externos no pino RA4/TOCKI.
     1 = impulsos externos
     0 = 1 do clock interno
          4

bit 6 INTEDG (bit de sele¸˜o de bordo de interrup¸˜o). Se esta interrup¸˜o estiver habilitada,
                           ca                      ca                  ca
     ´ poss´ definir o bordo que vai ativar a interrup¸˜o no pino RB0/INT.
     e     ıvel                                      ca
     1 = bordo ascendente
     0 = bordo descendente
bit 7 RBPU (Habilita¸˜o dos pull-up nos bits da porta B). Este bit introduz ou retira as re-
                        ca
     sistˆncias internas de pull-up da porta B.
         e
     1 = resistˆncias de pull-up desligadas
               e
     0 = resistˆncias de pull-up ligadas
               e


2.10      Portas de I/O
Porta, ´ um grupo de pinos num microcontrolador que podem ser acessados simultaneamente,
       e
e, no qual n´s podemos colocar uma combina¸˜o de zeros e uns ou ler dele o estado existente.
             o                                   ca
Fisicamente, porta ´ um registro dentro de um microcontrolador que est´ ligado por fios aos pinos
                    e                                                    a
do microcontrolador. Os portas representam a conex˜o f´
                                                      a ısica da Unidade Central de Processamento
(CPU) com o mundo exterior. O microcontrolador usa-os para observar ou comandar outros
componentes ou dispositivos. Para aumentar a sua funcionalidade, os mesmos pinos podem ter
duas aplica¸˜es distintas, como, por exemplo, RA4/TOCKI, que ´ simultaneamente o bit 4 da
            co                                                      e
porta A e uma entrada externa para o contador/temporizador TMR0. A escolha de uma destas
duas fun¸˜es ´ feita atrav´s dos registros de configura¸˜o. Um exemplo disto ´ o TOCS, quinto bit
         co e             e                            ca                    e
do registro OPTION. Ao selecionar uma das fun¸˜es, a outra ´ automaticamente inibida.
                                                   co           e




                   Figura 2.19: Rela¸˜o entre os registros TRISA e PORTA A.
                                    ca

    Todos os pinos das portas podem ser definidos como de entrada ou de sa´     ıda, de acordo com as
necessidades do dispositivo que se est´ a projetar. Para definir um pino como entrada ou como
                                        a
sa´
  ıda, ´ preciso, em primeiro lugar, escrever no registro TRIS, a combina¸˜o apropriada de zeros e
       e                                                                   ca
uns. Se no local apropriado de um registro TRIS for escrito o valor l´gico 1, ent˜o o correspondente
                                                                     o           a
pino da porta ´ definido como entrada, se suceder o contr´rio, o pino ´ definido como sa´
               e                                           a           e                  ıda. Todos
as portas, tˆm um registro TRIS associado. Assim, para a porta A, existe o registro TRISA no
            e
endere¸o 85h e, para a porta B existe o registro TRISB, no endere¸o 86h.
       c                                                             c

2.10.1     Porta A
A porta A (PORTA) est´ associado a 5 pinos. O registro de dire¸˜o de dados correspondente ´ o
                       a                                       ca                           e
TRISA, no endere¸o 85h. Tal como no caso da porta B, pˆr a 1 um bit do registro TRISA, equivale
                  c                                    o
a definir o correspondente pino da porta A, como entrada e pˆr a 0 um bit do mesmo registro,
                                                             o
equivale a definir o correspondente pino da porta A, como sa´
                                                           ıda.

                                                25
O quinto pino da porta A tem uma fun¸˜o dupla. Nesse pino est´ tamb´m situada a entrada
                                         ca                     a     e
externa do temporizador TMR0. Cada uma destas op¸˜es ´ escolhida pondo a 1 ou pondo a
                                                    co e
0 o bit TOCS (bit de sele¸˜o de fonte de clock de TMR0). Conforme o valor deste bit, assim
                         ca
o temporizador TMR0 incrementa o seu valor por causa de um impulso do oscilador interno ou
devido a um impulso externo aplicado ao pino RA4/TOCKI.




                      Figura 2.20: Exemplo de inicializa¸˜o da PORTA A.
                                                        ca

   O exemplo da Figura 2.20 mostra como os pinos 0, 1, 2, 3 e 4 s˜o declarados como entradas e
                                                                 a
os pinos 5, 6 e 7 como pinos de sa´
                                  ıda.

2.10.2    Porta B
A porta B tem 8 pinos associados a ele. O respectivo registro de dire¸˜o de dados chama-se TRISB
                                                                      ca
e tem o endere¸o 86h. Ao pˆr a 1 um bit do registro TRISB, define-se o correspondente pino da
               c            o
porta como entrada e se pusermos a 0 um bit do registro TRISB, o pino correspondente vai ser
uma sa´ ıda. Cada pino da porta B possui uma pequena resistˆncia de pull-up (resistˆncia que
                                                                 e                      e
define a linha como tendo o valor l´gico 1). As resistˆncias de pull-up s˜o ativadas pondo a 0 o
                                    o                  e                   a
bit RBPU, que ´ o bit 7 do registro OPTION. Estas resistˆncias de pull-up s˜o automaticamente
                e                                           e                   a
desligadas quando os pinos da porta s˜o configurados como sa´
                                         a                         ıdas. Quando a alimenta¸˜o do
                                                                                           ca
microcontrolador ´ ligada, as resistˆncias de pull-up s˜o tamb´m desativadas.
                  e                 e                  a       e
    Quatro pinos da porta B, RB4 a RB7 podem causar uma interrup¸˜o, que ocorre quando
                                                                           ca
qualquer deles varia do valor l´gico zero para valor l´gico um ou o contr´rio. Esta forma de
                                o                        o                     a
interrup¸˜o s´ pode ocorrer se estes pinos forem configurados como entradas (se qualquer um
         ca o
destes 4 pinos for configurado como sa´  ıda, n˜o ser´ gerada uma interrup¸˜o quando h´ varia¸˜o
                                              a     a                      ca          a       ca
de estado). Esta modalidade de interrup¸˜o, acompanhada da existˆncia de resistˆncias de pull-
                                           ca                          e            e
up internas, torna poss´ resolver mais facilmente problemas freq¨entes que podemos encontrar
                       ıvel                                          u
na pr´tica, como por exemplo a liga¸˜o de um teclado matricial. Se as linhas de um teclado
      a                                ca
ficarem ligadas a estes pinos, sempre que se prime uma tecla, ir-se-´ provocar uma interrup¸˜o.
                                                                       a                      ca
Ao processar a interrup¸˜o, o microcontrolador ter´ que identificar a tecla que a produziu. N˜o ´
                        ca                          a                                         a e
recomend´vel utilizar a porta B, ao mesmo tempo que esta interrup¸˜o est´ a ser processada.
          a                                                           ca     a




                      Figura 2.21: Exemplo de inicializa¸˜o da PORTA B.
                                                        ca

    O exemplo da Figura 2.21 mostra como os pinos 0, 1, 2 e 3 s˜o definidos como entradas e 4, 5,
                                                               a
6 e 7 como sa´
             ıdas.


2.11      Organiza¸˜o da mem´ria
                  ca        o
O PIC16F84 tem dois blocos de mem´ria separados, um para dados e o outro para o programa.
                                 o
A mem´ria EEPROM e os registros de uso gen´rico (GPR) na mem´ria RAM constituem o bloco
      o                                   e                  o


                                               26
para dados e a mem´ria FLASH constitui o bloco de programa.
                  o

2.11.1     Mem´ria de programa
              o
A mem´ria de programa ´ implementada usando tecnologia FLASH, o que torna poss´ programar
       o               e                                                          ıvel
o microcontrolador muitas vezes antes de este ser instalado num dispositivo, e, mesmo depois da
sua instala¸˜o, podemos alterar o programa e parˆmetros contidos. O tamanho da mem´ria de
           ca                                     a                                     o
programa ´ de 1024 endere¸os de palavras de 14 bits, destes, os endere¸os zero e quatro est˜o
           e               c                                             c                   a
reservados respectivamente para o reset e para o vector de interrup¸˜o.
                                                                   ca

2.11.2     Mem´ria de dados
              o
A mem´ria de dados compreende mem´ria EEPROM e mem´ria RAM. A mem´ria EEPROM
        o                               o                      o                 o
consiste em 64 posi¸˜es para palavras de oito bits e cujos conte´dos n˜o se perdem durante uma
                     co                                         u     a
falha na alimenta¸˜o. A mem´ria EEPROM n˜o faz parte diretamente do espa¸o de mem´ria mas
                  ca         o                a                               c        o
´ acessada indiretamente atrav´s dos registros EEADR e EEDATA. Como a mem´ria EEPROM
e                               e                                                o
serve usualmente para guardar parˆmetros importantes (por exemplo, de uma dada temperatura
                                   a
em reguladores de temperatura), existe um procedimento estrito para escrever na EEPROM que
tem que ser seguido de modo a evitar uma escrita acidental. A mem´ria RAM para dados, ocupa um
                                                                  o
espa¸o no mapa de mem´ria desde o endere¸o 0x0C at´ 0x4F, o que corresponde a 68 localiza¸˜es.
     c                  o                  c           e                                   co
Os locais da mem´ria RAM s˜o tamb´m chamados registros GPR (General Purpose Registers =
                   o          a       e
Registros de uso gen´rico). Os registros GPR podem ser acessados sem ter em aten¸˜o o banco
                      e                                                             ca
em que nos encontramos de momento.

2.11.3     Registros SFR
Os registros que ocupam as 12 primeiras localiza¸˜es nos bancos 0 e 1 s˜o registros especiais e tˆm
                                                co                     a                         e
a ver com a manipula¸˜o de certos blocos do microcontrolador. Estes registros s˜o os SFR (Special
                     ca                                                         a
Function Registers ou Registros de Fun¸˜es Especiais).
                                       co

2.11.4     Bancos de Mem´ria
                        o
Al´m da divis˜o em comprimento entre registros SFR e GPR, o mapa de mem´ria est´ tamb´m
  e           a                                                           o      a     e
dividido em largura (ver mapa anterior) em duas ´reas chamadas bancos. A sele¸˜o de um dos
                                                 a                           ca
bancos ´ feita por interm´dio dos bits RP0 e RP1 do registro STATUS.
        e                e

   Exemplo: bcf STATUS, RP0

   A instru¸˜o BCF “limpa” o bit RP0 (RP0 = 0) do registro STATUS e, assim, coloca-nos no
           ca
banco 0.

   bsf STATUS, RP0

   A instru¸˜o BSF p˜e a um, o bit RP0 (RP0 = 1) do registro STATUS e, assim, coloca-nos no
           ca       o
banco 1.

2.11.5     Macro
Normalmente, os grupos de instru¸˜es muito usados s˜o ligados numa unica unidade que pode ser
                                  co                   a                ´
facilmente invocada por diversas vezes num programa, uma unidade desse tipo chama-se gener-
icamente Macro e, normalmente, essa unidade ´ designada por um nome especifico facilmente
                                                  e
compreens´ıvel. Com a sua utiliza¸˜o, a sele¸˜o entre os dois bancos torna-se mais clara e o pr´prio
                                 ca         ca                                                 o
programa fica mais leg´ıvel.

BANK0 macro
Bcf STATUS, RP0         ;Selecionar o banco 0 da mem´ria
                                                    o
Endm



                                                27
Figura 2.22: Organiza¸˜o da mem´ria no microcontrolador PIC16F84.
                     ca        o




                               28
BANK1 macro
Bsf STATUS, RP0        ;Selecionar o banco 1 da mem´ria
                                                   o
Endm

   Os locais de mem´ria 0Ch–4Fh s˜o registros de uso gen´rico (GPR) e s˜o usados como mem´ria
                   o              a                     e              a                  o
RAM. Quando os endere¸os 8Ch–CFh s˜o acessados, n´s acessamos tamb´m `s mesmas localiza¸˜es
                       c            a               o                e a                  co
do banco 0. Por outras palavras, quando estamos a trabalhar com os registros de uso gen´rico,
                                                                                        e
n˜o precisamos de nos preocupar com o banco em que nos encontramos!
 a

2.11.6    Contador de Programa
O contador de programa (PC = Program Counter ), ´ um registro de 13 bits que cont´m o endere¸o
                                                 e                               e           c
da instru¸ao que vai ser executada. Ao incrementar ou alterar (por exemplo no caso de saltos) o
         c˜
conte´do do PC, o microcontrolador consegue executar as todas as instru¸˜es do programa, uma
     u                                                                 co
ap´s outra.
  o

2.11.7    Pilha
O PIC16F84 tem uma pilha (stack ) de 13 bits e 8 n´  ıveis de profundidade, o que corresponde a
8 locais de mem´ria com 13 bits de largura. O seu papel b´sico ´ guardar o valor do contador
                 o                                            a   e
de programa quando ocorre um salto do programa principal para o endere¸o de um subrotina a
                                                                           c
ser executado. Depois de ter executado a subrotina, para que o microcontrolador possa continuar
com o programa principal a partir do ponto em que o deixou, ele tem que ir buscar ` pilha esse
                                                                                    a
endere¸o e carreg´-lo no contador de programa. Quando nos movemos de um programa para um
       c          a
subrotina, o conte´do do contador de programa ´ empurrado para o interior da pilha (um exemplo
                   u                            e
disto ´ a instru¸˜o CALL). Quando s˜o executadas instru¸˜es tais como RETURN, RETLW ou
      e         ca                    a                    co
RETFIE no fim de um subrotina, o contador de programa ´ retirado da pilha, de modo a que o
                                                            e
programa possa continuar a partir do ponto em que a seq¨ˆncia foi interrompida. Estas opera¸˜es
                                                         ue                                 co
de colocar e extrair da pilha o contador de programa, s˜o designadas por PUSH (colocar na pilha)
                                                       a
e POP (tirar da pilha), estes dois nomes prov´m de instru¸˜es com estas designa¸˜es, existentes
                                              e            co                    co
nalguns microcontroladores de maior porte.

2.11.8    Programa¸˜o no Sistema
                  ca
Para programar a mem´ria de programa, o microcontrolador tem que entrar num modo especial
                        o
de funcionamento no qual o pino MCLR ´ posto a 13,5V e a tens˜o da alimenta¸˜o Vdd deve
                                          e                        a             ca
permanecer est´vel entre 4,5V e 5,5V. A mem´ria de programa pode ser programada em s´rie,
               a                              o                                           e
usando dois pinos data/clock que devem ser previamente separados do dispositivo em que o micro-
controlador est´ inserido, de modo a que n˜o possam ocorrer erros durante a programa¸˜o.
               a                          a                                          ca

2.11.9    Modos de endere¸amento
                         c
Os locais da mem´ria RAM podem ser acessados direta ou indiretamente.
                o

Endere¸amento Direto
      c
O endere¸amento direto ´ feito atrav´s de um endere¸o de 9 bits. Este endere¸o obt´m-se juntando
          c              e           e               c                       c      e
aos sete bits do endere¸o direto de uma instru¸˜o, mais dois bits (RP1 e RP0) do registro STATUS,
                       c                      ca
como se mostra na figura que se segue. Qualquer acesso aos registros especiais (SFR), pode ser
um exemplo de endere¸amento direto (Fig. 2.23).
                       c

Bsf      STATUS, RP0      ;Banco 1
movlw    0xFF             ;w = 0xFF
movwf    TRISA            ;o endere¸o do registro TRISA ´ tirado
                                    c                   e
                          ;do c´digo da instru¸~o movwf TRISA
                               o              ca




                                               29
Figura 2.23: Endere¸amento Direto.
                                                 c


Endere¸amento Indireto
      c
O endere¸amento indireto, ao contr´rio do direto, n˜o tira um endere¸o do c´digo instru¸˜o, mas
          c                         a               a                 c      o          ca
f´-lo com a ajuda do bit IRP do registro STATUS e do registro FSR. O local endere¸ado ´ acessado
 a                                                                                c   e
atrav´s do registro INDF e coincide com o endere¸o contido em FSR. Por outras palavras, qualquer
      e                                          c
instru¸ao que use INDF como registro, na realidade acessa aos dados apontados pelo registro FSR.
       c˜
Vamos supor, por exemplo, que o registro de uso gen´rico de endere¸o 0Fh cont´m o valor 20.
                                                       e               c           e
Escrevendo o valor de 0Fh no registro FSR, n´s vamos obter um ponteiro para o registro 0Fh e, ao
                                             o
ler o registro INDF, n´s iremos obter o valor 20, o que significa que lemos o conte´do do registro
                      o                                                           u
0Fh, sem o mencionar explicitamente (mas atrav´s de FSR e INDF). Pode parecer que este tipo de
                                                e
endere¸amento n˜o tem quaisquer vantagens sobre o endere¸amento direto, mas existem problemas
        c        a                                         c
que s´ podem ser resolvidos de uma forma simples, atrav´s do endere¸amento indireto (Fig. 2.24).
      o                                                  e           c




                             Figura 2.24: Endere¸amento indireto.
                                                c

   Um exemplo pode ser enviar um conjunto de dados atrav´s de uma comunica¸˜o s´rie, usando
                                                           e                   ca e
buffers e indicadores, outro exemplo ´ limpar os registros da mem´ria RAM (16 endere¸os neste
                                     e                           o                     c
caso) como ser visto na Figura 2.25.
   Quando o conte´do do registro FSR ´ igual a zero, ler dados do registro INDF resulta no valor
                   u                   e

                                               30
Figura 2.25: Exemplo de endere¸amento indireto.
                                                     c


0 e escrever em INDF resulta na instru¸˜o NOP (no operation = nenhuma opera¸˜o).
                                      ca                                   ca


2.12      Interrup¸oes
                  c˜
As interrup¸˜es s˜o um mecanismo que o microcontrolador possui e que torna poss´ responder
            co    a                                                               ıvel
a alguns acontecimentos no momento em que eles ocorrem, qualquer que seja a tarefa que o
microcontrolador esteja a executar no momento. Esta ´ uma parte muito importante, porque
                                                         e
fornece a liga¸˜o entre um microcontrolador e o mundo real que nos rodeia. Geralmente, cada
               ca
interrup¸˜o muda a dire¸ao de execu¸˜o do programa, suspendendo a sua execu¸˜o, enquanto o
        ca              c˜           ca                                         ca
microcontrolador corre um subrotina que ´ a rotina de atendimento de interrup¸˜o. Depois de este
                                        e                                    ca
subrotina ter sido executado, o microcontrolador continua com o programa principal, a partir do
local em que o tinha abandonado.




    Figura 2.26: Uma das poss´
                             ıveis fontes de interrup¸˜o e como afeta o programa principal.
                                                     ca


2.12.1    Registro INTCON
O registro que controla as interrup¸˜es ´ chamado INTCON e tem o endere¸o 0Bh. O papel do
                                   co e                                     c
INTCON ´ permitir ou impedir as interrup¸˜es e, mesmo no caso de elas n˜o serem permitidas,
          e                                  co                            a
ele toma nota de pedidos espec´ıficos, alterando o n´ l´gico de alguns dos seus bits.
                                                   ıvel o

bit 0 RBIF (flag que indica varia¸˜o na porta B). Bit que informa que houve mudan¸a nos n´
                                    ca                                          c       ıveis
     l´gicos nos pinos 4, 5, 6 e 7 da porta B.
      o
     1= pelo menos um destes pinos mudou de n´ l´gico
                                               ıvel o
     0= n˜o ocorreu nenhuma varia¸˜o nestes pinos
          a                           ca
bit 1 INTF (flag de interrup¸˜o externa INT). Ocorrˆncia de uma interrup¸˜o externa.
                            ca                    e                    ca
     1= ocorreu uma interrup¸˜o externa
                            ca


                                              31
Figura 2.27: Registro INTCON.


     0= n˜o ocorreu uma interrup¸˜o externa
          a                        ca
     Se um impulso ascendente ou descendente for detectado no pino RB0/INT, o bit INTF ´ posto
                                                                                        e
     a 1 (o tipo de sensibilidade, ascendente ou descendente ´ definida atrav´s do bit INTEDG
                                                             e              e
     do registro OPTION). A subrotina de atendimento desta interrup¸˜o, deve repor este bit a
                                                                      ca
     0, afim de que a pr´xima interrup¸˜o possa ser detectado.
                        o              ca
bit 2 TOIF (Flag de interrup¸˜o por transbordo de TMR0). O contador TMR0, transbordou.
                              ca
     1= o contador mudou a contagem de FFh para 00h
     0= o contador n˜o transbordou
                     a
     Para que esta interrup¸˜o seja detectado, o programa deve pˆr este bit a 0.
                           ca                                   o
bit 3 RBIE (bit de habilita¸˜o de interrup¸˜o por varia¸˜o na porta B). Permite que a interrup¸˜o
                             ca              ca            ca                                 ca
     por varia¸˜o dos n´
              ca        ıveis l´gicos nos pinos 4, 5, 6 e 7 da porta B, ocorra.
                               o
     1= habilita a interrup¸˜o por varia¸˜o dos n´
                            ca            ca        ıveis l´gicos
                                                           o
     0= inibe a interrup¸ao por varia¸˜o dos n´
                         c˜            ca        ıveis l´gicos
                                                        o
     A interrup¸˜o s´ pode ocorrer se RBIE e RBIF estiverem simultaneamente a 1 l´gico.
               ca o                                                                   o
bit 4 INTE (bit de habilita¸˜o da interrup¸˜o externa INT). bit que permite uma interrup¸˜o
                            ca            ca                                            ca
     externa no bit RB0/INT.
     1= interrup¸˜o externa habilitada
                ca
     0= interrup¸˜o externa impedida
                ca
     A interrup¸˜o s´ pode ocorrer se INTE e INTF estiverem simultaneamente a 1 l´gico.
               ca o                                                              o
bit 5 TOIE (bit de habilita¸˜o de interrup¸˜o por transbordo de TMR0). bit que autoriza a
                            ca             ca
     interrup¸˜o por transbordo do contador TMR0.
             ca
     1= interrup¸˜o autorizada
                 ca
     0= interrup¸˜o impedida
                 ca
     A interrup¸˜o s´ pode ocorrer se TOIE e TOIF estiverem simultaneamente a 1 l´gico.
                ca o                                                             o
bit 6 EEIE (bit de habilita¸˜o de interrup¸˜o por escrita completa, na EEPROM). bit que ha-
                            ca            ca
     bilita uma interrup¸˜o quando uma opera¸˜o de escrita na EEPROM termina.
                        ca                   ca
     1= interrup¸˜o habilitada
                 ca
     0= interrup¸˜o inibida
                 ca
     Se EEIE e EEIF (que pertence ao registro EECON1) estiverem simultaneamente a 1, a
     interrup¸˜o pode ocorrer.
             ca
bit 7 GIE (bit de habilita¸˜o global de interrup¸˜o). bit que permite ou impede todas as inter-
                          ca                    ca
     rup¸˜es.
        co
     1= todas as interrup¸˜es s˜o permitidas
                         co    a
     0= todas as interrup¸˜es impedidas
                         co

2.12.2    Fontes de interrup¸˜o
                            ca
O PIC16F84 possui quatro fontes de interrup¸˜o:
                                           ca
  1. Fim de escrita na EEPROM;
  2. Interrup¸˜o em TMR0 causada por transbordo do temporizador;
             ca
  3. Interrup¸˜o por altera¸˜o nos pinos RB4, RB5, RB6 e RB7 da porta B;
             ca            ca
  4. Interrup¸˜o externa no pino RB0/INT do microcontrolador.
             ca

                                               32
De um modo geral, cada fonte de interrup¸˜o tem dois bits associados. Um habilita a inter-
                                               ca
rup¸ao e o outro assinala quando a interrup¸˜o ocorre. Existe um bit comum a todas as interrup¸˜es
   c˜                                      ca                                                  co
chamado GIE que pode ser usado para impedir ou habilitar todas as interrup¸˜es, simultaneamente.
                                                                           co
Este bit ´ muito util quando se est´ a escrever um programa porque permite que todas as inter-
          e       ´                 a
rup¸oes sejam impedidas durante um per´
   c˜                                      ıodo de tempo, de tal maneira que a execu¸˜o de uma
                                                                                       ca
parte cr´
        ıtica do programa n˜o possa ser interrompida. Quando a instru¸˜o que faz GIE= 0 ´ exe-
                            a                                           ca                   e
cutada (GIE= 0 impede todas as interrup¸˜es), todas os pedidos de interrup¸˜o pendentes, ser˜o
                                           co                                 ca                 a
ignorados.




             Figura 2.28: Esquema das interrup¸˜es no microcontrolador PIC16F84.
                                              co

    As interrup¸˜es que est˜o pendentes e que s˜o ignoradas, s˜o processadas quando o bit GIE
               co          a                      a               a
´ posto a 1 (GIE= 1, todas as interrup¸˜es permitidas). Quando a interrup¸˜o ´ atendida, o bit
e                                       co                                     ca e
GIE ´ posto a 0, de tal modo que, quaisquer interrup¸˜es adicionais sejam inibidas, o endere¸o de
     e                                                co                                       c
retorno ´ guardado na pilha e, no contador de programa, ´ escrito 0004h – somente depois disto,
        e                                                   e
´ que a resposta a uma interrup¸˜o come¸a!
e                                ca      c
    Depois de a interrup¸˜o ser processada, o bit que por ter sido posto a 1 permitiu a interrup¸˜o,
                        ca                                                                       ca
deve agora ser reposto a 0, sen˜o, a rotina de interrup¸˜o ir´ ser automaticamente processada
                                 a                        ca     a
novamente, mal se efetue o regresso ao programa principal.

2.12.3     Guardando os conte´ dos dos registros importantes
                             u
A unica coisa que ´ guardada na pilha durante uma interrup¸˜o ´ o valor de retorno do contador
   ´               e                                          ca e
de programa (por valor de retorno do contador de programa entende-se o endere¸o da instru¸˜o
                                                                                   c            ca
que estava para ser executada, mas que n˜o foi, por causa de ter ocorrido a interrup¸˜o). Guardar
                                          a                                          ca
apenas o valor do contador de programa n˜o ´, muitas vezes, suficiente. Alguns registros que j´
                                            a e                                                   a
foram usados no programa principal, podem tamb´m vir a ser usados na rotina de interrup¸˜o. Se
                                                   e                                       ca
n´s n˜o salvaguardamos os seus valores, quando acontece o regresso da subrotina para o programa
  o a
principal os conte´dos dos registros podem ser inteiramente diferentes, o que causaria um erro no
                  u
programa. Um exemplo para este caso ´ o conte´do do registro de trabalho W (work register ).
                                         e         u
Se supormos que o programa principal estava a usar o registro de trabalho W nalgumas das suas
opera¸˜es e se ele contiver algum valor que seja importante para a instru¸˜o seguinte, ent˜o a
      co                                                                     ca               a
interrup¸˜o que ocorre antes desta instru¸˜o vai alterar o valor do registro de trabalho W, indo
         ca                                ca
influenciar diretamente o programa principal.
    O procedimento para a grava¸˜o de registros importantes antes de ir para a subrotina de inter-
                                 ca
rup¸ao, designa-se por PUSH, enquanto que o procedimento que recupera esses valores, ´ chamado
    c˜                                                                                  e
POP. PUSH e POP s˜o instru¸˜es provenientes de outros microcontroladores (da Intel), agora esses
                  a        co
nomes s˜o aceites para designar estes dois processos de salvaguarda e recupera¸˜o de dados. Como
         a                                                                     ca
o PIC16F84 n˜o possui instru¸˜es compar´veis, elas tˆm que ser programadas.
               a              co           a            e
    Devido ` sua simplicidade e uso freq¨ente, estas partes do programa podem ser implementadas
            a                           u
com macros. O conceito de Macro ´ explicado em Programa¸˜o em linguagem Assembly. No
                                      e                          ca
exemplo que se segue, os conte´dos de W e do registro STATUS s˜o guardados nas vari´veis
                                 u                                     a                      a
W TEMP e STATUS TEMP antes de correr a rotina de interrup¸˜o. No in´ da rotina PUSH, n´s
                                                                ca        ıcio                   o
precisamos de verificar qual o banco que est´ a ser selecionado porque W TEMP e STATUS TEMP
                                            a



                                                33
Figura 2.29: Uma das poss´ıveis causas de erros ´ n˜o salvaguardar dados antes de executar uma
                                                e a
subrotina de interrup¸˜o.
                     ca


est˜o situados no banco 0. Para troca de dados entre estes dois registros, ´ usada a instru¸˜o
   a                                                                       e               ca
SWAPF em vez de MOVF, pois a primeira n˜o afeta os bits do registro STATUS.
                                          a
    O exemplo ´ um programa assembler com os seguintes passos:
               e
  1. Verificar em que banco nos encontramos;
  2. Guardar o registro W qualquer que seja o banco em que nos encontramos;
  3. Guardar o registro STATUS no banco 0;
  4. Executar a rotina de servi¸o de interrup¸˜o ISR (Interrupt Service Routine);
                               c             ca
  5. Recupera¸˜o do registro STATUS;
             ca
  6. Restaurar o valor do registro W.
    Se existirem mais vari´veis ou registros que necessitem de ser salvaguardados, ent˜o, precisamos
                          a                                                           a
de os guardar depois de guardar o registro STATUS (passo 3) e recuper´-los depois de restaurar o
                                                                          a
registro STATUS (passo 5)(Fig. 2.30).
    A mesma opera¸˜o pode ser realizada usando macros, desta maneira obtemos um programa
                    ca
mais leg´ıvel. Os macros que j´ est˜o definidos podem ser usados para escrever novos macros. Os
                               a    a
macros BANK1 e BANK0 que s˜o explicados no cap´
                                 a                     ıtulo Organiza¸˜o da mem´ria s˜o usados nos
                                                                      ca         o     a
macros push e pop (Fig. 2.31).

2.12.4     Interrup¸˜o externa no pino RB0/INT do microcontrolador
                   ca
A interrup¸˜o externa no pino RB0/ INT ´ desencadeada por um impulso ascendente (se o bit
           ca                               e
INTEDG = 1 no registro OPTION 6), ou por um impulso descendente (se INTEDG = 0). Quando
o sinal correto surge no pino INT, o bit INTF do registro INTCON ´ posto a 1. O bit INTF
                                                                      e
(INTCON 1) tem que ser reposto a 0 na rotina de interrup¸˜o, afim de que a interrup¸˜o n˜o
                                                            ca                          ca a
possa voltar a ocorrer de novo, no regresso ao programa principal. Esta ´ uma parte importante
                                                                        e
do programa e que o programador n˜o pode esquecer, caso contr´rio o programa ir´ constantemente
                                   a                          a                a
saltar para a rotina de interrup¸˜o. A interrup¸˜o pode ser inibida, pondo a 0 o bit de controle
                                ca              ca
INTE (INTCON 4).

2.12.5     Interrup¸˜o por transbordar (overflow ) o contador TMR0
                   ca
O transbordar do contador TMR0 (passagem de FFh para 00h) vai pˆr a 1 o bit TOIF (INTCON
                                                                   o
2), Esta ´ uma interrup¸˜o muito importante, uma vez que, muitos problemas da vida real podem
         e              ca
ser resolvidos utilizando esta interrup¸˜o. Um exemplo ´ o da medi¸˜o de tempo. Se soubermos
                                       ca              e          ca
de quanto tempo o contador precisa para completar um ciclo de 00h a FFh, ent˜o, o n´mero de
                                                                              a      u

                                                34
Figura 2.30: Guardando os conte´dos dos registros importantes.
                               u




            Figura 2.31: Subrotinas PUSH e POP.




                             35
interrup¸˜es multiplicado por esse intervalo de tempo, d´-nos o tempo total decorrido. Na rotina
         co                                             a
de interrup¸˜o uma vari´vel guardada na mem´ria RAM vai sendo incrementada, o valor dessa
            ca           a                      o
vari´vel multiplicado pelo tempo que o contador precisa para um ciclo completo de contagem, vai
    a
dar o tempo gasto. Esta interrup¸˜o pode ser habilitada ou inibida, pondo a 1 ou a 0 o bit TOIE
                                 ca
(INTCON 5).

2.12.6     Interrup¸˜o por varia¸˜o nos pinos 4, 5, 6 e 7 da porta B
                   ca           ca
Uma varia¸˜o em 4 bits de entrada da porta B (bits 4 a 7), p˜e a 1 o bit RBIF (INTCON 0).
           ca                                                    o
A interrup¸˜o ocorre, portanto, quando os n´
           ca                                   ıveis l´gicos em RB7, RB6, RB5 e RB4 da porta
                                                       o
B, mudam do valor l´gico 1 para o valor l´gico 0 ou vice-versa. Para que estes pinos detectem
                      o                     o
as varia¸˜es, eles devem ser definidos como entradas. Se qualquer deles for definido como sa´
        co                                                                                   ıda,
nenhuma interrup¸˜o ser´ gerada quando surgir uma varia¸˜o do n´ l´gico. Se estes pinos forem
                   ca    a                                   ca    ıvel o
definidos como entradas, o seu valor actual ´ comparado com o valor anterior, que foi guardado
                                              e
quando se fez a leitura anterior da porta B. Esta interrup¸˜o pode ser habilitada/inibida pondo a
                                                            ca
1 ou a 0, o bit RBIE do registro INTCON.

2.12.7     Interrup¸˜o por fim de escrita na EEPROM
                   ca
Esta interrup¸˜o ´ apenas de natureza pr´tica. Como escrever num endere¸o da EEPROM leva
             ca e                        a                                 c
cerca de 10ms (o que representa muito tempo quando se fala de um microcontrolador), n˜o ´  a e
recomend´vel que se deixe o microcontrolador um grande intervalo de tempo sem fazer nada, `
          a                                                                                    a
espera do fim da opera¸˜o da escrita. Assim, dispomos de um mecanismo de interrup¸˜o que
                       ca                                                              ca
permite ao microcontrolador continuar a executar o programa principal, enquanto, em simultˆneo,
                                                                                          a
procede ` escrita na EEPROM. Quando esta opera¸˜o de escrita se completa, uma interrup¸˜o
         a                                          ca                                      ca
informa o microcontrolador deste facto. O bit EEIF, atrav´s do qual esta informa¸˜o ´ dada,
                                                            e                      ca e
pertence ao registro EECON1. A ocorrˆncia desta interrup¸˜o pode ser impedida, pondo a 0 o bit
                                      e                  ca
EEIE do registro INTCON.

2.12.8     Inicializa¸˜o da interrup¸˜o
                     ca             ca
Para que num microcontrolador se possa usar um mecanismo de interrup¸˜o, ´ preciso proceder
                                                                          ca e
a algumas tarefas preliminares. Estes procedimentos s˜o designados resumidamente por inicial-
                                                        a
iza¸˜o. Na inicializa¸˜o, n´s estabelecemos a que interrup¸˜es deve o microcontrolador responder
   ca                ca    o                              co
e as que deve ignorar. Se n˜o pusermos a 1 o bit que permite uma certa interrup¸˜o, o programa
                            a                                                   ca
vai ignorar a correspondente subrotina de interrup¸˜o. Por este meio, n´s podemos controlar a
                                                    ca                   o
ocorrˆncia das interrup¸˜es, o que ´ muito util.
      e                 co         e       ´




                            Figura 2.32: Inicializa¸˜o da interrup¸˜o.
                                                   ca             ca

    O exemplo da Figura 2.32 mostra a inicializa¸˜o da interrup¸˜o externa no pino RB0 de um
                                                 ca                ca
microcontrolador. No BIT em que vemos 1, isso significa que essa interrup¸˜o est´ habilitada.
                                                                                 ca    a
A ocorrˆncia de outras interrup¸˜es n˜o ´ permitida, e todas as interrup¸˜es em conjunto est˜o
        e                       co      a e                                 co                  a
mascaradas at´ que o bit GIE seja posto a 1.
               e
    O exemplo da Figura 2.33 ilustra uma maneira t´ıpica de lidar com as interrup¸˜es. O PIC16F84
                                                                                   co
tem somente um endere¸o para a rotina de interrup¸˜o. Isto significa que, primeiro, ´ necess´rio
                         c                           ca                                 e     a
identificar qual a origem da interrup¸˜o (se mais que uma fonte de interrup¸˜o estiver habilitada),
                                     ca                                      ca
e a seguir deve executar-se apenas a parte da subrotina que se refere ` interrup¸˜o em causa.
                                                                       a           ca
    O regresso de uma rotina de interrup¸˜o pode efetuar-se com as instru¸˜es RETURN, RETLW
                                         ca                                co
e RETFIE. Recomenda-se que seja usada a instru¸˜o RETFIE porque, essa instru¸˜o ´ a unica
                                                   ca                                 ca e ´
que automaticamente p˜e a 1 o bit GIE, permitindo assim que novas interrup¸˜es possam ocorrer.
                        o                                                       co




                                               36
Figura 2.33: Maneira t´
                      ıpica de se lidar com as interrup¸˜es.
                                                       co




                            37
2.13      Temporizador TMR0
Os temporizadores s˜o normalmente as partes mais complicadas de um microcontrolador, assim, ´
                      a                                                                            e
necess´rio gastar mais tempo a explic´-los. Servindo-nos deles, ´ poss´ relacionar uma dimens˜o
       a                             a                          e     ıvel                       a
real que ´ o tempo, com uma vari´vel que representa o estado de um temporizador dentro de um
          e                      a
microcontrolador. Fisicamente, o temporizador ´ um registro cujo valor est´ continuamente a ser
                                                 e                         a
incrementado at´ 255, chegado a este n´mero, ele come¸a outra vez de novo: 0, 1, 2, 3, 4, ..., 255,
                    e                  u               c
0, 1, 2, 3,..., etc.




                 Figura 2.34: Rela¸˜o entre o temporizador TMR0 e o prescaler.
                                  ca

     O incremento do temporizador ´ feito em simultˆneo com tudo o que o microcontrolador faz.
                                   e                  a
Compete ao programador arranjar maneira de tirar partido desta caracter´  ıstica. Uma das maneiras
´ incrementar uma vari´vel sempre que o microcontrolador transborda (overflow - passa de 255
e                       a
para 0). Se soubermos de quanto tempo um temporizador precisa para perfazer uma contagem
completa (de 0 a 255), ent˜o, se multiplicarmos o valor da vari´vel por esse tempo, n´s obteremos
                           a                                    a                       o
o tempo total decorrido.
     O PIC16F84, possui um temporizador de 8 bits. O n´mero de bits determina a quantidade
                                                            u
de valores diferentes que a contagem pode assumir, antes de voltar novamente para zero. No
caso de um temporizador de 8 bits esse valor ´ 256. Um esquema simplificado da rela¸˜o entre um
                                              e                                         ca
temporizador e um prescaler est´ representado no diagrama anterior. Prescaler ´ a designa¸˜o para
                                a                                                e           ca
a parte do microcontrolador que divide a freq¨ˆncia de oscila¸˜o do clock antes que os respectivos
                                              ue              ca
impulsos possam incrementar o temporizador. O n´mero pelo qual a freq¨ˆncia de clock ´ dividida,
                                                    u                    ue                e
est´ definido nos trˆs primeiros bits do registro OPTION. O maior divisor poss´ ´ 256. Neste
    a               e                                                              ıvel e
caso, significa que s´ ap´s 256 impulsos de clock ´ que o conte´do do temporizador ´ incrementado
                    o o                           e           u                      e
de uma unidade. Isto permite-nos medir grandes intervalos de tempo.
     Quando a contagem ultrapassa 255, o temporizador volta de novo a zero e come¸a um novo
                                                                                         c
ciclo de contagem at´ 255. Sempre que ocorre uma transi¸˜o de 255 para 0, o bit TOIF do
                      e                                        ca
registro INTCON ´ posto a 1. Se as interrup¸˜es estiverem habilitadas, ´ poss´
                   e                            co                          e      ıvel tirar partido
das interrup¸˜es geradas e da rotina de servi¸o de interrup¸˜o. Cabe ao programador voltar a
             co                                 c             ca
pˆr a 0 o bit TOIF na rotina de interrup¸˜o, para que uma nova interrup¸˜o possa ser detetada.
  o                                       ca                                ca
Al´m do oscilador de clock do microcontrolador, o conte´do do temporizador pode tamb´m ser
   e                                                       u                                   e
incrementado atrav´s de um clock externo ligado ao pino RA4/TOCKI. A escolha entre uma destas
                    e
op¸˜es ´ feita no bit TOCS, pertencente ao registro OPTION. Se for selecionado o clock externo,
    co e


                                                 38
Figura 2.35: Diagrama temporal de uma interrup¸˜o causada pelo temporizador TMR0.
                                                  ca


´ poss´ definir o bordo ativo do sinal (ascendente ou descendente), que vai incrementar o valor
e     ıvel
do temporizador.




Figura 2.36: Utiliza¸˜o do temporizador TMR0 na determina¸˜o do n´mero de rota¸˜es completas
                    ca                                   ca      u            co
do eixo de um motor.

    Na pr´tica, um exemplo t´
         a                    ıpico que ´ resolvido atrav´s de um clock externo e um temporizador,
                                         e               e
´ a contagem do n´mero de rota¸˜es completas do eixo de uma m´quina, como por exemplo um
e                  u               co                                a
enrolador de espiras para transformadores (Fig. 2.36). Vamos considerar que o rotor do motor do
enrolador, cont´m quatro polos ou saliˆncias. Vamos colocar o sensor indutivo ` distˆncia de 5mm
                e                        e                                      a    a
do topo da saliˆncia. O sensor indutivo ir´ gerar um impulso descendente sempre que a saliˆncia se
               e                           a                                              e
encontre alinhada com a cabe¸a do sensor. Cada sinal vai representar um quarto de uma rota¸˜o
                               c                                                               ca
completa e, a soma de todas as rota¸˜es completas, ficar´ registado no temporizador TMR0. O
                                       co                   a
programa pode ler facilmente estes dados do temporizador atrav´s do bus de dados.
                                                                   e
    O exemplo da Figura 2.37 mostra como iniciar o temporizador para contar os impulsos descen-
dentes provenientes de uma fonte de clock externa com um prescaler 1:4.
    O mesmo exemplo pode ser implementado atrav´s de uma interrup¸˜o como visto da Figura
                                                       e                  ca
2.38.
    O prescaler tanto pode ser atribu´ ao temporizador TMR0, como ao watchdog. O watchdog
                                       ıdo
´ um mecanismo que o microcontrolador usa para se defender contra estouros do programa. Como
e
qualquer circuito el´trico, tamb´m os microcontroladores podem ter uma falha ou algum percal¸o
                     e           e                                                              c
no seu funcionamento. Infelizmente, o microcontrolador tamb´m pode ter problemas com o seu
                                                                 e
programa. Quando isto acontece, o microcontrolador para de trabalhar e mant´m-se nesse estado
                                                                                 e
at´ que algu´m fa¸a o reset. Por causa disto, foi introduzido o mecanismo de watchdog (c˜o de
  e          e     c                                                                         a
guarda). Depois de um certo per´    ıodo de tempo, o watchdog faz o reset do microcontrolador (o
que realmente acontece, ´ que o microcontrolador executa o reset de si pr´prio). O watchdog
                           e                                                   o

                                               39
Figura 2.37: Programa do temporizador TMR0.




Figura 2.38: Exemplo de utiliza¸˜o de interrup¸˜o.
                               ca             ca




                       40
trabalha na base de um princ´    ıpio simples: se o seu temporizador transbordar, ´ feito o reset do
                                                                                   e
microcontrolador e este come¸a a executar de novo o programa a partir do princ´
                               c                                                  ıpio. Deste modo,
o reset poder´ ocorrer tanto no caso de funcionamento correto como no caso de funcionamento
               a
incorreto. O pr´ximo passo ´ evitar o reset no caso de funcionamento correto, isso ´ feito escrevendo
                 o           e                                                     e
zero no registro WDT (instru¸˜o CLRWDT) sempre que este est´ pr´ximo de transbordar. Assim,
                               ca                                 a o
o programa ir´ evitar um reset enquanto est´ a funcionar corretamente. Se ocorrer o estouro do
               a                                 a
programa, este zero n˜o ser´ escrito, haver´ transbordo do temporizador WDT e ir´ ocorrer um
                       a     a                 a                                        a
reset que vai fazer com que o microcontrolador comece de novo a trabalhar corretamente.
    O prescaler pode ser atribu´ ao temporizador TMR0, ou ao temporizador do watchdog,
                                   ıdo
isso ´ feito atrav´s do bit PSA no registro OPTION. Fazendo o bit PSA igual a 0, o prescaler
     e              e
´ atribu´ ao temporizador TMR0. Quando o prescaler ´ atribu´ ao temporizador TMR0,
e         ıdo                                                 e        ıdo
todas as instru¸˜es de escrita no registro TMR0 (CLRF TMR0, MOVWF TMR0, BSF TMR0,...)
                 co
v˜o limpar o prescaler. Quando o prescaler ´ atribu´ ao temporizador do watchdog, somente
  a                                               e      ıdo
a instru¸ao CLRWDT ir´ limpar o prescaler e o temporizador do watchdog ao mesmo tempo. A
          c˜             a
mudan¸a do prescaler est´ completamente sob o controle do programador e pode ser executada
        c                  a
enquanto o programa est´ sendo executado.
                         a
    Existe apenas um prescaler com o seu temporizador. Dependendo das necessidades, pode ser
atribu´ ao temporizador TMR0 ou ao watchdog, mas nunca aos dois em simultˆneo.
       ıdo                                                                         a


2.14      Mem´ria de dados EEPROM
             o
O PIC16F84 tem 64 bytes de localiza¸˜es de mem´ria EEPROM, correspondentes aos endere¸os
                                         co        o                                         c
de 00h a 63h e onde podemos ler e escrever. A caracter´ıstica mais importante desta mem´ria ´ de
                                                                                       o e
n˜o perder o seu conte´do quando a alimenta¸˜o ´ desligada. Na pr´tica, isso significa que o que
  a                      u                    ca e                   a
l´ foi escrito permanece no microcontrolador, mesmo quando a alimenta¸˜o ´ desligada. Sem ali-
 a                                                                      ca e
menta¸˜o, estes dados permanecem no microcontrolador durante mais de 40 anos (especifica¸˜es do
       ca                                                                                co
fabricante do microcontrolador PIC16F84), al´m disso, esta mem´ria suporta at´ 10000 opera¸˜es
                                              e                  o             e            co
de escrita.
    Na pr´tica, a mem´ria EEPROM ´ usada para guardar dados importantes ou alguns parˆmetros
          a            o               e                                                a
de processamento. Um parˆmetro deste tipo, ´ uma dada temperatura, atribu´ quando ajus-
                             a                  e                               ıda
tamos um regulador de temperatura para um processo. Se esse valor se perder, seria necess´rio
                                                                                            a
reintroduzi-lo sempre que houvesse uma falha na alimenta¸˜o. Como isto ´ impratic´vel (e mesmo
                                                          ca             e         a
perigoso), os fabricantes de microcontroladores come¸aram a instalar nestes uma pequena quanti-
                                                     c
dade de mem´ria EEPROM.
               o
    A mem´ria EEPROM ´ colocada num espa¸o de mem´ria especial e pode ser acessada atrav´s
            o              e                   c          o                                    e
de registros especiais. Estes registros s˜o:
                                          a

   • EEDATA no endere¸o 08h, que cont´m o dado lido ou aquele que se quer escrever.
                     c               e
   • EEADR no endere¸o 09h, que cont´m o endere¸o do local da EEPROM que vai ser acessado.
                    c               e          c
   • EECON1 no endere¸o 88h, que cont´m os bits de controle.
                     c               e
   • EECON2 no endere¸o 89h. Este registro n˜o existe fisicamente e serve para proteger a
                     c                      a
     EEPROM de uma escrita acidental.

    O registro EECON1 ocupa o endere¸o 88h e ´ um registro de controle com cinco bits imple-
                                       c         e
mentados. Os bits 5, 6 e 7 n˜o s˜o usados e, se forem lidos, s˜o sempre iguais a zero. Os bits do
                            a a                               a
registro EECON1, devem ser interpretados do modo que se segue.

2.14.1     Registro EECON1
bit 0 RD (bit de controle de leitura). Ao pˆr este bit a 1, tem in´ a transferˆncia do dado do
                                            o                     ıcio        e
     endere¸o definido em EEADR para o registro EEDATA. Como o tempo n˜o ´ essencial, tanto
            c                                                              a e
     na leitura como na escrita, o dado de EEDATA pode j´ ser usado na instru¸˜o seguinte.
                                                            a                  ca
     1 = inicia a leitura
     0 = n˜o inicia a leitura
           a



                                                 41
Figura 2.39: Registro EECON1.


bit 1 WR (bit de controle de escrita). Pˆr este bit a 1 faz iniciar-se a escrita do dado a partir do
                                        o
     registro EEDATA para o endere¸o especificado no registro EEADR.
                                    c
     1 = inicia a escrita
     0 = n˜o inicia a escrita
           a
bit 2 WREN (bit de habilita¸˜o de escrita na EEPROM). Permite a escrita na EEPROM. Se
                               ca
     este bit n˜o estiver a um, o microcontrolador n˜o permite a escrita na EEPROM.
               a                                    a
     1 = a escrita ´ permitida
                   e
     0 = n˜o se pode escrever
           a
bit 3 WRERR ( Erro de escrita na EEPROM). Erro durante a escrita na EEPROM Este bit ´         e
     posto a 1 s´ em casos em que a escrita na EEPROM tenha sido interrompida por um sinal
                o
     de reset ou por um transbordo no temporizador do watchdog (no caso de este estar actio).
     1 = ocorreu um erro
     0 = n˜o houve erros
           a

bit 4 EEIF (bit de interrup¸˜o por opera¸˜o de escrita na EEPROM completa). Bit usado para
                             ca          ca
     informar que a escrita do dadoo na EEPROM, terminou. Quando a escrita tiver terminado,
     este bit ´ automaticamente posto a 1. O programador tem que repˆr a 0 o bit EEIF no seu
              e                                                     o
     programa, para que possa detectar o fim de uma nova opera¸˜o de escrita.
                                                              ca
     1 = escrita terminada
     0 = a escrita ainda n˜o terminou ou n˜o come¸ou.
                          a                a      c

2.14.2     Lendo a Mem´ria EEPROM
                      o
Pondo a 1 o bit RD inicia-se a transferˆncia do dado do endere¸o guardado no registro EEADR
                                       e                      c
para o registro EEDATA. Como para ler os dados n˜o ´ preciso tanto tempo como a escrevˆ-los,
                                                   a e                                  e
os dados extra´ ıdos do registro EEDATA podem j´ ser usados na instru¸˜o seguinte.
                                                a                    ca
   Uma por¸˜o de um programa que leia um dado da EEPROM, pode ser semelhante ao visto na
             ca
Figura 2.40.




                            Figura 2.40: Lendo a Mem´ria EEPROM.
                                                    o

   Depois da ultima instru¸˜o do programa, o conte´do do endere¸o 0 da EEPROM pode ser
              ´             ca                    u            c
encontrado no registro de trabalho w.

2.14.3     Escrevendo na Mem´ria EEPROM
                            o
Para escrever dados num local da EEPROM, o programador tem primeiro que endere¸ar o registro
                                                                                 c
EEADR e introduzir a palavra de dados no registro EEDATA. A seguir, deve colocar-se o bit WR
a 1, o que faz desencadear o processo. O bit WR dever´ ser posto a 0 e o bit EEIF ser´ posto
                                                       a                              a
a 1 a seguir ` opera¸˜o de escrita, o que pode ser usado no processamento de interrup¸˜es. Os
             a      ca                                                               co


                                                42
valores 55h e AAh s˜o as primeira e segunda chaves que tornam imposs´ que ocorra uma escrita
                    a                                                  ıvel
acidental na EEPROM. Estes dois valores s˜o escritos em EECON2 que serve apenas para isto,
                                              a
ou seja, para receber estes dois valores e assim prevenir contra uma escrita acidental na mem´ria
                                                                                             o
EEPROM. As linhas do programa marcadas como 1, 2, 3 e 4 tˆm que ser executadas por esta
                                                                  e
ordem em intervalos de tempo certos. Portanto, ´ muito importante desativar as interrup¸˜es
                                                     e                                       co
que possam interferir com a temporiza¸˜o necess´ria para executar estas instru¸˜es. Depois da
                                         ca        a                              co
opera¸˜o de escrita, as interrup¸˜es podem, finalmente, ser de novo habilitadas.
      ca                        co
    A Figura 2.41 ilustra um exemplo da por¸˜o de programa que escreve a palavra 0xEE no
                                                ca
primeiro endere¸o da mem´ria EEPROM.
                c          o




                        Figura 2.41: Escrevendo na Mem´ria EEPROM.
                                                      o

   Recomenda-se que WREN esteja sempre inativo, exceto quando se est´ a escrever uma palavra
                                                                    a
de dados na EEPROM, deste modo, a possibilidade de uma escrita acidental ´ m´
                                                                         e ınima. Todas as
opera¸˜es de escrita na EEPROM limpam automaticamente o local de mem´ria, antes de escrever
     co                                                                o
de novo nela!




                                               43
Cap´
   ıtulo 3

Conjunto de Instru¸˜es
                  co

J´ dissemos que um microcontrolador n˜o ´ como qualquer outro circuito integrado. Quando saem
 a                                     a e
da cadeia de produ¸˜o, a maioria dos circuitos integrados, est˜o prontos para serem introduzi-
                    ca                                         a
dos nos dispositivos, o que n˜o ´ o caso dos microcontroladores. Para que um microcontrolador
                             a e
cumpra a sua tarefa, n´s temos que lhe dizer exatamente o que fazer, ou, por outras palavras,
                        o
n´s temos que escrever o programa que o microcontrolador vai executar. Neste cap´
 o                                                                                 ıtulo iremos
descrever as instru¸˜es que constituem o assembler, ou seja, a linguagem de baixo n´
                   co                                                              ıvel para os
microcontroladores PIC.


3.1     Conjunto de Instru¸˜es da Fam´ PIC16Fxxx de Mi-
                          co         ılia
        crocontroladores
O conjunto completo compreende 35 instru¸˜es e mostra-se na tabela que se segue. Uma raz˜o
                                           co                                              a
para este pequeno n´mero de instru¸˜es resulta principalmente do facto de estarmos a falar de
                    u               co
um microcontrolador RISC cujas instru¸˜es foram otimizadas tendo em vista a rapidez de fun-
                                       co
cionamento, simplicidade de arquitetura e compacidade de c´digo. O unico inconveniente, ´ que
                                                          o        ´                    e
o programador tem que dominar a t´cnica desconfort´vel de fazer o programa com apenas 35
                                     e               a
instru¸˜es!
      co


3.2     Transferˆncia de dados
                e
A transferˆncia de dados num microcontrolador, ocorre entre o registro de trabalho (W) e um
           e
registro f que representa um qualquer local de mem´ria na RAM interna (quer se trate de um
                                                      o
registro especial ou de um registro de uso gen´rico).
                                              e
    As primeiras trˆs instru¸˜es (observe a tabela seguinte) referem-se ` escrita de uma constante
                    e       co                                          a
no registro W (MOVLW ´ uma abreviatura para MOVa Literal para W), ` c´pia de um dado do
                          e                                                 a o
registro W na RAM e ` c´pia de um dado de um registro da RAM no registro W (ou nele pr´prio,
                       a o                                                                  o
caso em que apenas a flag do zero ´ afetada). A instru¸˜o CLRF escreve a constante 0 no registro
                                   e                   ca
f e CLRW escreve a constante 0 no registro W. A instru¸˜o SWAPF troca o nibble (conjunto de 4
                                                         ca
bits) mais significativo com o nibble menos significativo de um registro, passando o primeiro a ser
o menos significativo e o outro o mais significativo do registro.


3.3     L´gicas e aritm´ticas
         o             e
De todas as opera¸˜es aritm´ticas poss´
                  co       e          ıveis, os microcontroladores PIC, tal como a grande maioria
dos outros microcontroladores, apenas suportam a subtra¸˜o e a adi¸˜o. Os bits ou flags C, DC
                                                          ca         ca
e Z, s˜o afetados conforme o resultado da adi¸˜o ou da subtra¸˜o, com uma unica exce¸˜o: uma
      a                                        ca              ca             ´         ca
vez que a subtra¸˜o ´ executada como uma adi¸˜o com um n´mero negativo, a flag C (Carry),
                 ca e                             ca           u
comporta-se inversamente no que diz respeito ` subtra¸˜o. Por outras palavras, ´ posta a 1 se a
                                                a      ca                         e
opera¸˜o ´ poss´ e posta a 0 se um n´mero maior tiver que ser subtra´ de outro mais pequeno.
      ca e     ıvel                   u                                ıdo



                                               44
A l´gica dentro do PIC tem a capacidade de executar as opera¸˜es AND, OR, EX-OR, comple-
        o                                                          co
mento (COMF) e rota¸˜es (RLF e RRF). Estas ultimas instru¸˜es, rodam o conte´do do registro
                       co                        ´              co                u
atrav´s desse registro e da flag C de uma casa para a esquerda (na dire¸˜o do bit 7), ou para a
      e                                                                   ca
direita (na dire¸˜o do bit 0). O bit que sai do registro ´ escrito na flag C e o conte´do anterior
                ca                                       e                           u
desta flag, ´ escrito no bit situado do lado oposto no registro.
           e


3.4     Opera¸˜es sobre bits
             co
As instru¸˜es BCF e BSF p˜em a 0 ou a 1 qualquer bit de qualquer s´ da mem´ria. Apesar
         co                  o                                           ıtio       o
de parecer uma opera¸˜o simples, ela ´ executada do seguinte modo, o CPU primeiro lˆ o byte
                      ca                e                                                e
completo, altera o valor de um bit e, a seguir, escreve o byte completo no mesmo registrador.


3.5     Dire¸˜o de execu¸˜o de um programa
            ca          ca
As instru¸˜es GOTO, CALL e RETURN s˜o executadas do mesmo modo que em todos os outros
           co                             a
microcontroladores, a diferen¸a ´ que a pilha ´ independente da RAM interna e ´ limitada a
                              c e                e                                     e
oito n´
      ıveis. A instru¸˜o RETLW k ´ idˆntica ` instru¸˜o RETURN, exceto que, ao regressar de
                     ca             e e        a       ca
um subrotina, ´ escrita no registro W uma constante definida pelo operando da instru¸˜o. Esta
               e                                                                         ca
instru¸ao, permite-nos implementar facilmente listagens (tamb´m chamadas tabelas de lookup). A
      c˜                                                       e
maior parte das vezes, usamo-las determinando a posi¸˜o do dado na nossa tabela adicionando-a ao
                                                     ca
endere¸o em que a tabela come¸a e, ent˜o, ´ lido o dado nesse local (que est´ situado normalmente
       c                       c       a e                                  a
na mem´ria de programa).
         o
    A tabela pode apresentar-se como um subrotina que consiste numa s´rie de instru¸˜es RETLW
                                                                        e             co
k onde as constantes k, s˜o membros da tabela.
                         a




                        Figura 3.1: Dire¸˜o de execu¸˜o de um programa.
                                        ca          ca

    N´s escrevemos a posi¸˜o de um membro da nossa tabela no registro W e, usando a instru¸˜o
      o                    ca                                                                    ca
CALL, n´s chamamos o subrotina que cont´m a tabela. A primeira linha do subrotina ADDWF
           o                                    e
PCL, f, adiciona a posi¸˜o na tabela e que est´ escrita em W, ao endere¸o do in´ da tabela e
                         ca                       a                           c       ıcio
que est´ no registro PCL, assim, n´s obtemos o endere¸o real do dado da tabela na mem´ria de
        a                            o                     c                                   o
programa. Quando regressamos do subrotina, n´s vamos ter no registro W o conte´do do membro
                                                   o                                  u
da tabela endere¸ado. No exemplo anterior, a constante k2 estar´ no registro W, ap´s o retorno
                 c                                                    a                    o
do subrotina.
    RETFIE (RETurn From Interrupt – Interrupt Enable ou regresso da rotina de interrup¸˜o comca
as interrup¸˜es habilitadas) ´ um regresso da rotina de interrup¸˜o e difere de RETURN apenas
             co               e                                     ca
em que, automaticamente, p˜e a 1 o bit GIE (habilita¸˜o global das interrup¸˜es). Quando a
                               o                            ca                      co
interrup¸˜o come¸a, este bit ´ automaticamente reposto a 0. Tamb´m quando a interrup¸˜o tem
         ca       c            e                                        e                    ca
in´
  ıcio, somente o valor do contador de programa ´ posto no cimo da pilha. N˜o ´ fornecida uma
                                                     e                            a e
capacidade autom´tica de armazenamento do registro de estado.
                   a
    Os saltos condicionais est˜o sintetizados em duas instru¸˜es: BTFSC e BTFSS. Consoante o
                               a                                co
estado l´gico do bit do registro f que est´ a ser testado, a instru¸˜o seguinte no programa ´ ou n˜o
         o                                a                        ca                        e    a
executada.


3.6     Per´
           ıodo de execu¸˜o da instru¸˜o
                        ca           ca
Todas as instru¸˜es s˜o executadas num unico ciclo, exceto as instru¸˜es de ramifica¸˜o condicional
                co a                      ´                         co             ca
se a condi¸˜o for verdadeira, ou se o conte´do do contador de programa for alterado pela instru¸˜o.
          ca                                u                                                  ca


                                                45
Nestes casos, a execu¸˜o requer dois ciclos de instru¸˜o e o segundo ciclo ´ executado como sendo
                     ca                               ca                   e
um NOP (Nenhuma Opera¸˜o). Quatro oscila¸˜es de clock perfazem um ciclo de instru¸˜o. Se
                           ca                    co                                       ca
estivermos a usar um oscilador com 4MHz de freq¨ˆncia, o tempo normal de execu¸˜o de uma
                                                      ue                               ca
instru¸ao ser´ de 1ms e, no caso de uma ramifica¸˜o condicional de 2ms.
      c˜     a                                     ca


3.7     Conjunto de instru¸oes
                          c˜
Significado de alguns s´
                      ımbolos:

f qualquer local de mem´ria num microcontrolador
                         o
W registro de trabalho
b posi¸˜o de bit no registro f
       ca
d registro de destino
label grupo de oito caracteres que marca o in´ de uma parte do programa (r´tulo)
                                             ıcio                         o
TOS topo da pilha
[ ] opcional
<> grupo de bits num registro




                                 Figura 3.2: Mnemˆnicos Assembly.
                                                 o

   Resumo das notas da Figura 3.2:
  1. Se a porta de entrada/sa´ for o operando origem, ´ lido o estado dos pinos do microcon-
                             ıda                      e
     trolador.


                                               46
2. Se esta instru¸˜o for executada no registro TMR0 e se d=1, o prescaler atribu´ a esse
                 ca                                                             ıdo
   temporizador ´ automaticamente limpo.
                 e
3. Se o PC for modificado ou se resultado do teste for verdadeiro, a instru¸˜o ´ executada em
                                                                          ca e
   dois ciclos.




                                           47
Cap´
   ıtulo 4

Programa¸˜o em Linguagem
         ca
Assembly

A capacidade de comunicar ´ da maior importˆncia nesta ´rea. Contudo, isso s´ ´ poss´ se ambas
                             e                a          a                    oe     ıvel
as partes usarem a mesma linguagem, ou seja, se seguirem as mesmas regras para comunicarem.
Isto mesmo se aplica ` comunica¸˜o entre os microcontroladores e o homem. A linguagem que o
                       a          ca
microcontrolador e o homem usam para comunicar entre si ´ designada por linguagem assembly.
                                                             e
O pr´prio t´
     o      ıtulo n˜o tem um significado profundo, trata-se de apenas um nome como por exemplo
                   a
inglˆs ou francˆs. Mais precisamente, linguagem assembly ´ apenas uma solu¸˜o transit´ria. Os
    e           e                                           e                  ca         o
programas escritos em linguagem assembly devem ser traduzidos para uma linguagem de zeros e
uns de modo a que um microcontrolador a possa receber. Linguagem assembly e assembler s˜o     a
coisas diferentes. A primeira, representa um conjunto de regras usadas para escrever um programa
para um microcontrolador e a outra, ´ um programa que corre num computador pessoal que traduz
                                      e
a linguagem assembly para uma linguagem de zeros e uns. Um programa escrito em zeros e uns
diz-se que est´ escrito em linguagem de m´quina.
              a                            a




          Figura 4.1: O processo de comunica¸˜o entre o homem e o microcontrolador.
                                            ca

    Fisicamente, “Programa” representa um arquivo num disco de computador (ou na mem´ria    o
se estivermos a ler de um microcontrolador) e ´ escrito de acordo com as regras do assembly ou
                                               e
qualquer outra linguagem de programa¸˜o de microcontroladores. O homem pode entender a lin-
                                       ca
guagem assembly j´ que ela ´ constitu´ por s´
                     a        e         ıda      ımbolos alfab´ticos e palavras. Ao escrever um
                                                              e
programa, certas regras devem ser seguidas para alcan¸ar o efeito desejado. Um Tradutor inter-
                                                       c
preta cada instru¸˜o escrita em linguagem assembly como uma s´rie de zeros e uns com significado
                  ca                                            e
para a l´gica interna do microcontrolador. Consideremos, por exemplo, a instru¸˜o RETURN que
         o                                                                     ca
um microcontrolador utiliza para regressar de uma subrotina. Quando o assembler a traduz, n´s o
obtemos uma s´rie de uns e zeros correspondentes a 14 bits que o microcontrolador sabe como
                e
interpretar.

   Exemplo: RETURN 00 0000 0000 1000



                                              48
Analogamente ao exemplo anterior, cada instru¸˜o assembly ´ interpretada na s´rie de zeros
                                                 ca             e                  e
e uns correspondente. O resultado desta tradu¸˜o da linguagem assembly, ´ designado por um
                                              ca                          e
arquivo de execu¸˜o. Muitas vezes encontramos o nome de arquivo HEX. Este nome prov´m de
                 ca                                                                      e
uma representa¸˜o hexadecimal desse arquivo, bem como o sufixo hex no t´
                ca                                                          ıtulo, por exemplo
correr.hex. Uma vez produzido, o arquivo de execu¸˜o ´ inserido no microcontrolador atrav´s de
                                                 ca e                                      e
um programador.
    Um programa em Linguagem Assembly ´ escrito por interm´dio de um processador de texto
                                          e                   e
(editor) e ´ capaz de produzir um arquivo ASCII no disco de um computador ou em ambientes
           e
pr´prios como o MPLAB1 .
  o


4.1     Linguagem Assembly
Os elementos b´sicos da linguagem assembly s˜o:
              a                             a

   • Labels (r´tulos)
              o
   • Instru¸˜es
           co
   • Operandos
   • Diretivas

   • Coment´rios
           a

4.1.1    Label
Um Label (r´tulo) ´ uma designa¸˜o textual (geralmente de f´cil leitura) de uma linha num pro-
              o      e            ca                         a
grama ou de uma se¸˜o de um programa para onde um microcontrolador deve saltar ou, ainda,
                       ca
o in´ de um conjunto de linhas de um programa. Tamb´m pode ser usado para executar uma
    ıcio                                                  e
ramifica¸˜o de um programa (tal como Goto....), o programa pode ainda conter uma condi¸˜o que
         ca                                                                            ca
                                          ca                        ´
deve ser satisfeita, para que uma instru¸˜o Goto seja executada. E importante que um r´tulo
                                                                                          o
(label) seja iniciado com uma letra do alfabeto ou com um tra¸o baixo “ ”. O comprimento de um
                                                             c
                   e              ´
r´tulo pode ir at´ 32 caracteres. E tamb´m importante que o r´tulo comece na primeira coluna.
 o                                        e                    o




                                      Figura 4.2: Exemplo de labels.


4.1.2    Instru¸˜es
               co
As instru¸˜es s˜o espec´
         co    a       ıficas para cada microcontrolador, assim, se quisermos utilizar a linguagem
assembly temos que estudar as instru¸˜es desse microcontrolador. O modo como se escreve uma
                                      co
instru¸ao ´ designado por sintaxe. No exemplo da Figura 4.3 ´ poss´ reconhecer erros de escrita,
      c˜ e                                                  e     ıvel
dado que as instru¸˜es movlp e gotto n˜o existem no microcontrolador PIC16F84.
                   co                   a
  1 Programa   da Microchip utilizado para editar e programar microcontroladores




                                                       49
Figura 4.3: Exemplo de instru¸˜es.
                                                            co


4.1.3    Operandos
Operandos s˜o os elementos da instru¸˜o necess´rios para que a instru¸˜o possa ser executada.
             a                        ca        a                     ca
Normalmente s˜o registros, vari´veis e constantes. As constantes s˜o designadas por literais. A
                 a               a                                a
palavra literal significa n´mero.
                          u




                              Figura 4.4: Exemplo de Operandos.


4.1.4    Coment´rios
               a
Coment´rio ´ um texto que o programador escreve no programa afim de tornar este mais claro e
         a   e
leg´     ´
   ıvel. E colocado logo a seguir a uma instru¸˜o e deve come¸ar com um ponto-e-v´
                                              ca             c                   ırgula “;”.

4.1.5    Diretivas
Uma diretiva ´ parecida com uma instru¸˜o mas, ao contr´rio desta, ´ independente do tipo
              e                             ca                 a          e
de microcontrolador e ´ uma caracter´
                       e               ıstica inerente ` pr´pria linguagem assembly. As diretivas
                                                       a o
servem-se de vari´veis ou registros para satisfazer determinados prop´sitos. Por exemplo, NIVEL,
                 a                                                    o
pode ser uma designa¸˜o para uma vari´vel localizada no endere¸o 0Dh da mem´ria RAM. Deste
                      ca                 a                         c             o
            a                             c                                          ´
modo, a vari´vel que reside nesse endere¸o, pode ser acessada pela palavra NIVEL. E muito mais
f´cil a um programador recordar a palavra NIVEL, que lembrar-se que o endere¸o 0Dh cont´m
 a                                                                                 c          e
informa¸˜o sobre o n´
        ca           ıvel.




                               Figura 4.5: Exemplo de diretivas.



4.1.6    Exemplo de um programa em assembly
O exemplo da Figura 4.6 mostra como um programa simples pode ser escrito em linguagem as-
sembly, respeitando regras b´sicas.
                            a

                                               50
Quando se escreve um programa, al´m das regras fundamentais, existem princ´
                                        e                                          ıpios que, emb-
ora n˜o obrigat´rios ´ conveniente, serem seguidos. Um deles, ´ escrever no seu in´
     a         o     e                                        e                    ıcio, o nome do
programa, aquilo que o programa faz, a vers˜o deste, a data em que foi escrito, tipo de microcon-
                                             a
trolador para o qual foi escrito e o nome do programador.




                     Figura 4.6: Exemplo de como se escreve um programa

    Uma vez que estes dados n˜o interessam ao tradutor de assembly, s˜o escritos na forma de
                                 a                                         a
coment´rios. Deve ter-se em aten¸˜o que um coment´rio come¸a sempre com ponto e v´
        a                           ca                   a         c                    ırgula e
pode ser colocado na linha seguinte ou logo a seguir ` instru¸˜o. Depois deste coment´rio inicial
                                                        a       ca                   a
ter sido escrito, devem incluir-se as directivas. Isto mostra-se no exemplo de cima.
    Para que o seu funcionamento seja correto, ´ preciso definir v´rios parˆmetros para o micro-
                                                   e                 a       a
controlador, tais como:
   • tipo de oscilador
   • quando o temporizador do watchdog est´ ligado e
                                          a
   • quando o circuito interno de reset est´ habilitado.
                                           a
   Tudo isto ´ definido na diretiva seguinte:
             e


    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

    Logo que todos os elementos de que precisamos tenham sido definidos, podemos come¸ar a     c
escrever o programa. Primeiro, ´ necess´rio definir o endere¸o para que o microcontrolador deve
                                 e       a                   c
                             ca    ´
ir quando se liga a alimenta¸˜o. E esta a finalidade de (org 0x00). O endere¸o para onde um
                                                                                 c
programa salta se ocorrer uma interrup¸˜o ´ (org 0x04). Como este ´ um programa simples, ´
                                         ca e                           e                         e
suficiente dirigir o microcontrolador para o in´ de um programa com uma instru¸˜o goto Main
                                              ıcio                                  ca
(Main = programa principal).
    As instru¸˜es encontradas em Main, selecionam o banco 1 (BANK1) de modo a poder acessar o
              co
registro TRISB, afim de que a porta B seja definido como uma sa´ (movlw 0x00, movwf TRISB).
                                                                ıda
    O pr´ximo passo ´ selecionar o banco de mem´ria 0 e colocar os bits da porta B no estado l´gico
         o           e                           o                                            o
                                                 ´
1 e, assim, o programa principal fica terminado. E preciso, no entanto, um outro ciclo (loop), onde

                                                51
o microcontrolador possa permanecer sem que ocorram erros. Trata-se de um loop infinito que
´ executado continuamente, enquanto a alimenta¸˜o n˜o for desligada. Finalmente, ´ necess´rio
e                                             ca a                               e       a
colocar a palavra end no fim de cada programa, de modo a informar o tradutor de assembly de
que o programa n˜o cont´m mais instru¸˜es.
                 a      e            co


4.2     Macros
As macros s˜o elementos muito uteis em linguagem assembly. Uma macro pode ser descrita em
            a                    ´
poucas palavras como um grupo de instru¸˜es definido pelo utilizador que ´ acrescentado ao pro-
                                         co                              e
                                                        ´
grama pelo assembler, sempre que a macro for invocada. E poss´ ıvel escrever um programa sem
usar macros. Mas, se as utilizarmos, o programa torna-se muito mais leg´  ıvel, especialmente se
estiverem v´rios programadores a trabalhar no mesmo programa. As macros tˆm afinidades com
           a                                                                  e
as fun¸˜es nas linguagens de alto n´
      co                           ıvel.

Como as escrever:

<r´tulo> macro
  o
[<argumento1>,<argumento2>,.....,<argumentoN>]
.........
.........
endm

    Pelo modo como s˜o escritas, vemos que as macros podem aceitar argumentos, o que tamb´m
                     a                                                                   e
´ muito util em programa¸˜o. Quando o argumento ´ invocado no interior de uma macro, ele vai
e        ´               ca                       e
ser substitu´ pelo valor argumentoN.
            ıdo




                              Figura 4.7: Exemplo de uma macro.

    O exemplo da Figura 4.7 mostra uma macro cujo prop´sito ´ enviar para o porto B, o argumento
                                                         o    e
ARG1, definido quando a macro foi invocada. Para a utilizarmos num programa, basta escrever
uma unica linha: ON PORTB 0xFF e, assim, colocamos o valor 0xFF no porto B. Para utilizar uma
     ´
macro no programa, ´ necess´rio incluir o arquivo macro no programa principal, por interm´dio
                     e       a                                                                e
da instru¸˜o include nome da macro.inc. O conte´do da macro ´ automaticamente copiado para
         ca                                        u             e
o local em que esta macro est´ escrita. Isto pode ver-se melhor no arquivo lst visto atr´s, onde a
                             a                                                          a
macro ´ copiada por baixo da linha include bank.inc.
       e




                                               52
Referˆncias Bibliogr´ficas
     e              a

[1] Matic, N. The PIC Microcontroller, Microe, USA, 2002.
[2] Zanco, W. S. Microcontroladores PIC 16F628A/648A. Uma abordagem pr´tica e objetiva. Ed.
                                                                      a
    ´
    Erica. 2005.
[3] Zanco, W. S. Microcontroladores PIC. T´cnicas de software e hardware para projetos de cir-
                                           e
                                                     ´
    cuitos eletrˆnicos. Com base no PIC 16F877A. Ed. Erica. 2006.
                o
                                                                                 ´
[4] Souza, D. J. Desbravando o PIC - Ampliado e Atualizado para PIC 16F628A. Ed. Erica, 2004.
                                                                            ´
[5] Souza, D. J. e LAVINIA, N. C. Conectando o PIC: Recursos Avan¸ados. Ed. Erica. 2005.
                                                                 c
[6] www.microchip.com. Acessado em 02/2008.




                                             53

Microcontroladores pic

  • 1.
    UEL - DEEL- LONDRINA - PR Introdu¸˜o aos Microcontroladores da Fam´ ca ılia PIC Leonimer Fl´vio de Melo a 02/2008 1
  • 2.
    Sum´rio a 1 Introdu¸˜o aos Microcontroladores ca 4 1.1 Introdu¸˜o . . . . . . . . . . . . . . . . . . . . ca . . . . . . . . . . . . . . . . . . . . . 4 1.2 Hist´ria . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . . . . . . . . . . 4 1.3 Microcontroladores versus Microprocessadores . . . . . . . . . . . . . . . . . . . . . 5 1.4 Microcontroladores da fam´ PIC . . . . . . ılia . . . . . . . . . . . . . . . . . . . . . 5 1.4.1 Unidade de Mem´ria . . . . . . . . . . o . . . . . . . . . . . . . . . . . . . . . 6 1.4.2 Unidade Central de Processamento . . . . . . . . . . . . . . . . . . . . . . . 6 1.4.3 Barramentos - Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.4.4 Unidade de entrada/sa´ (I/O) . . . ıda . . . . . . . . . . . . . . . . . . . . . 7 1.4.5 Comunica¸˜o s´rie . . . . . . . . . . . ca e . . . . . . . . . . . . . . . . . . . . . 7 1.4.6 Unidade de temporiza¸˜o . . . . . . . ca . . . . . . . . . . . . . . . . . . . . . 8 1.4.7 Watchdog timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4.8 Conversor anal´gico-digital (A/D) . . o . . . . . . . . . . . . . . . . . . . . . 9 1.4.9 O microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.5 Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2 O Microcontrolador PIC16F84 13 2.1 Componentes b´sicos do PIC . . . . . . . . . a . . . . . . . . . . . . . . . . . . . . . 13 2.2 CISC x RISC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3 Aplica¸˜es . . . . . . . . . . . . . . . . . . . . co . . . . . . . . . . . . . . . . . . . . . 14 2.4 Rel´gio / ciclo de instru¸˜o . . . . . . . . . . o ca . . . . . . . . . . . . . . . . . . . . . 15 2.4.1 Pipelining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.4.2 Fluxograma das Instru¸˜es no Pipeline co . . . . . . . . . . . . . . . . . . . . . 16 2.5 Significado dos pinos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.6 Gerador de rel´gio – oscilador . . . . . . . . . o . . . . . . . . . . . . . . . . . . . . . 17 2.6.1 Tipos de osciladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.6.2 Oscilador XT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.6.3 Oscilador RC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.7 Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.7.1 Brown-out Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.8 Unidade Central de Processamento . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.8.1 Unidade L´gica Aritm´tica (ALU) . . o e . . . . . . . . . . . . . . . . . . . . . 21 2.9 Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.9.1 Registro STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.9.2 Registro OPTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.10 Portas de I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.10.1 Porta A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.10.2 Porta B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.11 Organiza¸˜o da mem´ria . . . . . . . . . . . . ca o . . . . . . . . . . . . . . . . . . . . . 26 2.11.1 Mem´ria de programa . . . . . . . . . o . . . . . . . . . . . . . . . . . . . . . 27 2.11.2 Mem´ria de dados . . . . . . . . . . . o . . . . . . . . . . . . . . . . . . . . . 27 2.11.3 Registros SFR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.11.4 Bancos de Mem´ria . . . . . . . . . . o . . . . . . . . . . . . . . . . . . . . . 27 2.11.5 Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.11.6 Contador de Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2
  • 3.
    2.11.7 Pilha .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.11.8 Programa¸˜o no Sistema . . . . . . . . . . . . . . . . . . . . ca . . . . . . . . . 29 2.11.9 Modos de endere¸amento . . . . . . . . . . . . . . . . . . . c . . . . . . . . . 29 2.12 Interrup¸˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . co . . . . . . . . . 31 2.12.1 Registro INTCON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.12.2 Fontes de interrup¸˜o . . . . . . . . . . . . . . . . . . . . . ca . . . . . . . . . 32 2.12.3 Guardando os conte´dos dos registros importantes . . . . . u . . . . . . . . . 33 2.12.4 Interrup¸˜o externa no pino RB0/INT do microcontrolador ca . . . . . . . . . 34 2.12.5 Interrup¸˜o por transbordar (overflow ) o contador TMR0 . ca . . . . . . . . . 34 2.12.6 Interrup¸˜o por varia¸ao nos pinos 4, 5, 6 e 7 da porta B . ca c˜ . . . . . . . . . 36 2.12.7 Interrup¸˜o por fim de escrita na EEPROM . . . . . . . . . ca . . . . . . . . . 36 2.12.8 Inicializa¸˜o da interrup¸˜o . . . . . . . . . . . . . . . . . . ca ca . . . . . . . . . 36 2.13 Temporizador TMR0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.14 Mem´ria de dados EEPROM . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . 41 2.14.1 Registro EECON1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.14.2 Lendo a Mem´ria EEPROM . . . . . . . . . . . . . . . . . o . . . . . . . . . 42 2.14.3 Escrevendo na Mem´ria EEPROM . . . . . . . . . . . . . . o . . . . . . . . . 42 3 Conjunto de Instru¸˜es co 44 3.1 Conjunto de Instru¸˜es da Fam´ PIC16Fxxx de co ılia Microcontroladores . . . . . . . 44 3.2 Transferˆncia de dados . . . . . . . . . . . . . . . e . . . . . . . . . . . . . . . . . . . 44 3.3 L´gicas e aritm´ticas . . . . . . . . . . . . . . . . o e . . . . . . . . . . . . . . . . . . . 44 3.4 Opera¸˜es sobre bits . . . . . . . . . . . . . . . . co . . . . . . . . . . . . . . . . . . . 45 3.5 Dire¸˜o de execu¸˜o de um programa . . . . . . . ca ca . . . . . . . . . . . . . . . . . . . 45 3.6 Per´ ıodo de execu¸˜o da instru¸˜o . . . . . . . . . ca ca . . . . . . . . . . . . . . . . . . . 45 3.7 Conjunto de instru¸˜es . . . . . . . . . . . . . . . co . . . . . . . . . . . . . . . . . . . 46 4 Programa¸˜o em Linguagem Assembly ca 48 4.1 Linguagem Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.1.1 Label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.1.2 Instru¸˜es . . . . . . . . . . . . . . . . . co . . . . . . . . . . . . . . . . . . . . 49 4.1.3 Operandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.1.4 Coment´rios . . . . . . . . . . . . . . . a . . . . . . . . . . . . . . . . . . . . 50 4.1.5 Diretivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.1.6 Exemplo de um programa em assembly . . . . . . . . . . . . . . . . . . . . 50 4.2 Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3
  • 4.
    Cap´ ıtulo 1 Introdu¸˜o aos Microcontroladores ca 1.1 Introdu¸˜o ca As circunstˆncias que se nos deparam hoje no campo dos microcontroladores tˆm os seus prim´rdios a e o no desenvolvimento da tecnologia dos circuitos integrados. Este desenvolvimento tornou poss´ ıvel armazenar centenas de milhares de transistores num unico chip. Isso constituiu um pr´-requisito ´ e para a produ¸˜o de microprocessadores e, os primeiros computadores foram constru´ ca ıdos adicio- nando perif´ricos externos tais como mem´ria, linhas de entrada e sa´ e o ıda, temporizadores e outros. Um crescente aumento do n´ ıvel de integra¸˜o, permitiu o aparecimento de circuitos integrados ca contendo simultaneamente processador e perif´ricos. Foi assim que o primeiro chip contendo um e microcomputador e que mais tarde haveria de ser designado por microcontrolador, apareceu. 1.2 Hist´ria o ´ E no ano de 1969 que uma equipa de engenheiros japoneses pertencentes ` companhia BUSICOM a chega aos Estados Unidos com a encomenda de alguns circuitos integrados para calculadoras a serem implementados segundo os seus projetos. A proposta foi entregue ` INTEL e Marcian Hoff a foi o respons´vel pela sua concretiza¸˜o. Como ele tinha tido experiˆncia de trabalho com um a ca e computador (PC) PDP8, lembrou-se de apresentar uma solu¸˜o substancialmente diferente em ca vez da constru¸˜o sugerida. Esta solu¸˜o pressupunha que a fun¸˜o do circuito integrado seria ca ca ca determinada por um programa nele armazenado. Isso significava que a configura¸˜o deveria ser ca mais simples, mas tamb´m era preciso muito mais mem´ria que no caso do projeto proposto pelos e o engenheiros japoneses. Depois de algum tempo, embora os engenheiros japoneses tenham tentado encontrar uma solu¸˜o mais f´cil, a id´ia de Marcian venceu e o primeiro microprocessador nasceu. ca a e Ao transformar esta id´ia num produto concreto, Frederico Faggin foi de uma grande utilidade e para a INTEL. Ele transferiu-se para a INTEL e, em somente 9 meses, teve sucesso na cria¸˜o de ca um produto real a partir da sua primeira concep¸˜o. Em 1971, a INTEL adquiriu os direitos sobre ca a venda deste bloco integral. Primeiro eles compraram a licen¸a ` companhia BUSICOM que n˜o c a a tinha a m´ ınima percep¸˜o do tesouro que possu´ Neste mesmo ano, apareceu no mercado um ca ıa. microprocessador designado por 4004. Este foi o primeiro microprocessador de 4 bits e tinha a velocidade de 6 000 opera¸˜es por segundo. N˜o muito tempo depois, a companhia Americana co a CTC pediu ` INTEL e ` Texas Instruments um microprocessador de 8 bits para usar em terminais. a a Mesmo apesar de a CTC acabar por desistir desta id´ia, tanto a Intel como a Texas Instruments e continuaram a trabalhar no microprocessador e, em Abril de 1972, os primeiros microprocessadores de 8 bits apareceram no mercado com o nome de 8008. Este podia endere¸ar 16KB de mem´ria, c o possu´ 45 instru¸˜es e tinha a velocidade de 300 000 opera¸˜es por segundo. Esse microprocessador ıa co co foi o pioneiro de todos os microprocessadores atuais. A Intel continuou com o desenvolvimento do produto e, em Abril de 1974 pˆs c´ fora um processador de 8 bits com o nome de 8080 com a o a capacidade de endere¸ar 64KB de mem´ria, com 75 instru¸˜es e com pre¸os a come¸arem em $360. c o co c c Uma outra companhia Americana, a Motorola, apercebeu-se rapidamente do que estava a acontecer e, assim, pˆs no mercado um novo microprocessador de 8 bits, o 6800. O construtor o chefe foi Chuck Peddle e al´m do microprocessador propriamente dito, a Motorola foi a primeira e 4
  • 5.
    companhia a fabricaroutros perif´ricos como os 6820 e 6850. Nesta altura, muitas companhias e j´ se tinham apercebido da enorme importˆncia dos microprocessadores e come¸aram a introduzir a a c os seus pr´prios desenvolvimentos. Chuck Peddle deixa a Motorola para entrar para a MOS o Technology e continua a trabalhar intensivamente no desenvolvimento dos microprocessadores. Em 1975, na exposi¸˜o WESCON nos Estados Unidos, ocorreu um acontecimento cr´ ca ıtico na hist´ria dos microprocessadores. A MOS Technology anunciou que ia pˆr no mercado micropro- o o cessadores 6501 e 6502 ao pre¸o de $25 cada e que podia satisfazer de imediato todas as en- c comendas. Isto pareceu t˜o sensacional que muitos pensaram tratar-se de uma esp´cie de vigarice, a e considerando que os competidores vendiam o 8080 e o 6800 a $179 cada. Para responder a este competidor, tanto a Intel como a Motorola baixaram os seus pre¸os por microprocessador para c $69,95 logo no primeiro dia da exposi¸˜o. Rapidamente a Motorola pˆs uma a¸˜o em tribunal ca o ca contra a MOS Technology e contra Chuck Peddle por viola¸˜o dos direitos de autor por copiarem ca ao copiarem o 6800. A MOS Technology deixou de fabricar o 6501, mas continuou com o 6502. O 6502 ´ um microprocessador de 8 bits com 56 instru¸˜es e uma capacidade de endere¸amento de e co c 64KB de mem´ria. Devido ao seu baixo custo, o 6502 torna-se muito popular e, assim, ´ instalado o e em computadores como KIM-1, Apple I, Apple II, Atari, Comodore, Acorn, Oric, Galeb, Orao, Ultra e muitos outros. Cedo aparecem v´rios fabricantes do 6502 (Rockwell, Sznertek, GTE, NCR, a Ricoh e Comodore adquiriram a MOS Technology) que, no auge da sua prosperidade, chegou a vender microprocessadores ` raz˜o de 15 milh˜es por ano ! a a o Contudo, os outros n˜o baixaram os bra¸os. Frederico Faggin deixa a Intel e funda a Zilog Inc. a c Em 1976, a Zilog anuncia o Z80. Durante a concep¸˜o deste microprocessador, Faggin toma uma ca decis˜o cr´ a ıtica. Sabendo que tinha sido j´ desenvolvida uma enorme quantidade de programas a para o 8080, Faggin conclui que muitos v˜o permanecer fieis a este microprocessador por causa a das grandes despesas que adviriam das altera¸˜es a todos estes programas. Assim, ele decide que co o novo microprocessador deve ser compat´ ıvel com o 8080, ou seja, deve ser capaz de executar todos os programas que j´ tenham sido escritos para o 8080. Al´m destas caracter´ a e ısticas, outras caracter´ısticas adicionais foram introduzidas, de tal modo que o Z80 se tornou um microprocessador muito potente no seu tempo. Ele podia endere¸ar directamente 64KB de mem´ria, tinha 176 c o instru¸oes, um grande n´mero de registros, uma op¸˜o para refreshing de mem´ria RAM dinˆmica, c˜ u ca o a uma unica alimenta¸˜o, maior velocidade de funcionamento, etc. O Z80 tornou-se um grande ´ ca sucesso e toda a gente se transferiu do 8080 para o Z80. Pode dizer-se que o Z80 se constituiu sem sombra de d´vida como o microprocessador de 8 bits com maior sucesso no seu tempo. Al´m u e da Zilog, outros novos fabricantes como Mostek, NEC, SHARP e SGS apareceram. O Z80 foi o cora¸ao de muitos computadores como o Spectrum, Partner, TRS703, Z-3 e Galaxy, que foram c˜ aqui usados. Em 1976, a Intel apareceu com uma vers˜o melhorada do microprocessador de 8 bits e designada a por 8085. Contudo, o Z80 era t˜o superior a este que, bem depressa, a Intel perdeu a batalha. Ainda a que mais alguns microprocessadores tenham aparecido no mercado (6809, 2650, SC/MP etc.), j´ a tudo estava ent˜o decidido. J´ n˜o havia mais grandes melhorias a introduzir pelos fabricantes a a a que fundamentassem a troca por um novo microprocessador, assim, o 6502 e o Z80, acompanhados pelo 6800, mantiveram-se como os mais representativos microprocessadores de 8 bits desse tempo. 1.3 Microcontroladores versus Microprocessadores Um microcontrolador difere de um microprocessador em v´rios aspectos. Primeiro e o mais impor- a tante, ´ a sua funcionalidade. Para que um microprocessador possa ser usado, outros componentes e devem-lhe ser adicionados, tais como mem´ria e componentes para receber e enviar dados. Em o resumo, isso significa que o microprocessador ´ o verdadeiro cora¸˜o do computador. Por outro e ca lado, o microcontrolador foi projetado para ter tudo num s´. Nenhuns outros componentes exter- o nos s˜o necess´rios nas aplica¸˜es, uma vez que todos os perif´ricos necess´rios j´ est˜o contidos a a co e a a a nele. Assim, n´s poupamos tempo e espa¸o na constru¸˜o dos dispositivos. o c ca 1.4 Microcontroladores da fam´ PIC ılia A seguir s˜o apresentas algumas das caracter´ a ısticas mais importantes a respeito da arquitetura dos microcontroladores PIC da Microchip. 5
  • 6.
    1.4.1 Unidade de Mem´ria o A mem´ria ´ a parte do microcontrolador cuja fun¸˜o ´ guardar dados. A maneira mais f´cil de o e ca e a explicar ´ descrevˆ-la como uma grande prateleira cheia de gavetas. Se supusermos que marcamos e e as gavetas de modo a elas n˜o se confundirem umas com as outras, ent˜o o seu conte´do ser´ a a u a facilmente acess´ıvel. Basta saber a designa¸˜o da gaveta e o seu conte´do ser´ conhecido. ca u a Figura 1.1: Exemplo de unidade de mem´ria. o Os componentes de mem´ria s˜o exatamente a mesma coisa. Para um determinado endere¸o, o a c n´s obtemos o conte´do desse endere¸o. Dois novos conceitos foram apresentados: endere¸amento o u c c e mem´ria. A mem´ria ´ o conjunto de todos os locais de mem´ria (gavetas) e endere¸amento nada o o e o c mais ´ que selecionar um deles. Isto significa que precisamos de selecionar o endere¸o desejado e c (gaveta) e esperar que o conte´do desse endere¸o nos seja apresentado (abrir a gaveta). Al´m de ler u c e de um local da mem´ria (ler o conte´do da gaveta), tamb´m ´ poss´ escrever num endere¸o da o u e e ıvel c mem´ria (introduzir um conte´do na gaveta). Isto ´ feito utilizando uma linha adicional chamada o u e linha de controle. N´s iremos designar esta linha por R/W (read/write) - ler/escrever. A linha de o controle ´ usada do seguinte modo: se r/w=1, ´ executada uma opera¸˜o de leitura, caso contr´rio e e ca a ´ executada uma opera¸˜o de escrita no endere¸o de mem´ria. e ca c o A mem´ria ´ o primeiro elemento, mas precisamos de mais alguns para que o nosso microcon- o e trolador possa trabalhar. 1.4.2 Unidade Central de Processamento Vamos agora adicionar mais 3 locais de mem´ria a um bloco espec´ o ıfico para que possamos ter as capacidades de multiplicar, dividir, subtrair e mover o seus conte´dos de um local de mem´ria u o para outro. A parte que vamos acrescentar ´ chamada “central processing unit” (CPU) ou Unidade e Central de Processamento. Os locais de mem´ria nela contidos chamam-se registros. o Figura 1.2: Unidade Central de Processamento. 6
  • 7.
    Os registros s˜o,portanto, locais de mem´ria cujo papel ´ ajudar a executar v´rias opera¸˜es a o e a co matem´ticas ou quaisquer outras opera¸˜es com dados, quaisquer que sejam os locais em que estes a co se encontrem. Vamos olhar para a situa¸˜o actual. N´s temos duas entidades independentes (mem´ria e CPU) ca o o que est˜o interligadas, deste modo, qualquer troca de dados ´ retardada bem como a funcionalidade a e do sistema ´ diminu´ e ıda. Se, por exemplo, n´s desejarmos adicionar os conte´dos de dois locais o u de mem´ria e tornar a guardar o resultado na mem´ria, n´s necessitamos de uma liga¸˜o entre o o o ca a mem´ria e o CPU. Dito mais simplesmente, n´s precisamos de obter um ”caminho”atrav´s do o o e qual os dados possam passar de um bloco para outro. 1.4.3 Barramentos - Bus Este “caminho” designa-se por barramento (bus). Fisicamente ele corresponde a um grupo de 8, 16 ou mais fios. Existem dois tipos de bus: bus de dados e de endere¸o. O n´mero de linhas do primeiro c u depende da quantidade de mem´ria que desejamos endere¸ar e o n´mero de linhas do outro de- o c u pende da largura da palavra de dados, no nosso caso ´ igual a oito. O primeiro bus serve para e transmitir endere¸os do CPU para a mem´ria e o segundo para ligar todos os blocos dentro do c o microcontrolador. Figura 1.3: Barramentos do microcontrolador. Neste momento, a funcionalidade j´ aumentou mas um novo problema apareceu: n´s temos uma a o unidade capaz de trabalhar sozinha, mas que n˜o possui nenhum contato com o mundo exterior, a ou seja, conosco! De modo a remover esta deficiˆncia, vamos adicionar um bloco que cont´m v´rias e e a localiza¸˜es de mem´ria e que, de um lado, est´ ligado ao bus de dados e do outro `s linhas de sa´ co o a a ıda do microcontrolador que coincidem com pinos do circuito integrado e que, portanto, n´s podemos o ver com os nossos pr´prios olhos. o 1.4.4 Unidade de entrada/sa´ (I/O) ıda Estas localiza¸˜es que acabamos de adicionar, chamam-se portas. Existem v´rios tipos de portas: co a de entrada, de sa´ e de entrada/sa´ ıda ıda. Quando trabalhamos com portas primeiro de tudo ´ e necess´rio escolher a porta com que queremos trabalhar e, em seguida, enviar ou receber dados a para ou dessa porta. Quando se est´ a trabalhar com ele, a porta funciona como um local de mem´ria. Qualquer a o coisa de que se est´ a ler ou em que se est´ a escrever e que ´ poss´ identificar facilmente nos a a e ıvel pinos do microcontrolador. 1.4.5 Comunica¸˜o s´rie ca e Anteriormente, acrescentamos ` unidade j´ existente a possibilidade de comunicar com o mundo a a exterior. Contudo, esta maneira de comunicar tem os seus inconvenientes. Um dos inconve- 7
  • 8.
    Figura 1.4: Portade entrada/sa´ de dados. ıda nientes b´sicos ´ o n´mero de linhas que ´ necess´rio usarmos para transferir dados. E se for a e u e a necess´rio transferi-los a uma distˆncia de v´rios quilˆmetros? O n´mero de linhas vezes o n´mero a a a o u u de quilˆmetros n˜o atesta a economia do projeto. Isto leva-nos a ter que reduzir o n´mero de linhas o a u de modo a que a funcionalidade se mantenha. Suponha que estamos a trabalhar apenas com trˆs e linhas e que uma linha ´ usada para enviar dados, outra para os receber e a terceira ´ usada como e e linha de referˆncia tanto do lado de entrada como do lado da sa´ e ıda. Para que isto trabalhe n´s pre- o cisamos de definir as regras para a troca de dados. A este conjunto de regras chama-se protocolo. Este protocolo deve ser definido com antecedˆncia de modo que n˜o haja mal entendidos entre as e a partes que est˜o a comunicar entre si. Por exemplo, se um homem est´ a falar em francˆs e o outro a a e em inglˆs, ´ altamente improv´vel que efetivamente e rapidamente, ambos se entendam. Vamos e e a supor que temos o seguinte protocolo. A unidade l´gica ”1”´ colocada na linha de transmiss˜o at´ o e a e que a transferˆncia se inicie. Assim que isto acontece, a linha passa para n´ l´gico ’0’ durante e ıvel o um certo per´ ıodo de tempo (que vamos designar por T), assim, do lado da recep¸˜o ficamos a saber ca que existem dados para receber e, o mecanismo de recep¸˜o, vai ativar-se. Regressemos agora ao ca lado da emiss˜o e comecemos a pˆr zeros e uns l´gicos na linha de transmiss˜o correspondentes a o o a aos bits, primeiro o menos significativo e finalmente o mais significativo. Vamos esperar que cada bit permane¸a na linha durante um per´ c ıodo de tempo igual a T, e, finalmente, depois do oitavo bit, vamos pˆr novamente na linha o n´ l´gico ”1”, o que assinala a transmiss˜o de um dado. O o ıvel o a protocolo que acabamos de descrever ´ designado na literatura profissional por NRZ (N˜o Retorno e a a Zero). Figura 1.5: Comunica¸˜o serial. ca 1.4.6 Unidade de temporiza¸˜o ca Agora que j´ temos a unidade de comunica¸˜o s´rie implementada, n´s podemos receber, enviar e a ca e o processar dados. Contudo, para sermos capazes de utilizar isto na ind´stria precisamos ainda de mais alguns u blocos. Um deles ´ o bloco de temporiza¸˜o que nos interessa bastante porque pode dar-nos e ca informa¸˜es acerca da hora, dura¸˜o, protocolo, etc. A unidade b´sica do temporizador ´ um co ca a e contador que ´ na realidade um registro cujo conte´do aumenta de uma unidade num intervalo e u de tempo fixo, assim, anotando o seu valor durante os instantes de tempo T1 e T2 e calculando 8
  • 9.
    Figura 1.6: Temporizador(timer ). a sua diferen¸a, n´s ficamos a saber a quantidade de tempo decorrida. Esta ´ uma parte muito c o e importante do microcontrolador, cujo dom´ınio vai requerer muita da nossa aten¸˜o. ca 1.4.7 Watchdog timer Uma outra coisa que nos vai interessar ´ a fluˆncia da execu¸˜o do programa pelo microcontro- e e ca lador durante a sua utiliza¸˜o. Suponha que como resultado de qualquer interferˆncia (que ocorre ca e freq¨entemente num ambiente industrial), o nosso microcontrolador para de executar o programa u ou, ainda pior, desata a trabalhar incoerentemente. Figura 1.7: Watchdog timer. Claro que, quando isto acontece com um computador, n´s simplesmente carregamos no bot˜o o a de reset e continuamos a trabalhar. Contudo, no caso do microcontrolador n´s n˜o podemos o a resolver o nosso problema deste modo, porque n˜o temos bot˜o. Para ultrapassar este obst´culo, a a a precisamos de introduzir no nosso modelo um novo bloco chamado watchdog (c˜o de guarda). Este a bloco ´ de facto outro contador que est´ continuamente a contar e que o nosso programa p˜e a zero e a o sempre que ´ executado corretamente. No caso de o programa encravar, o zero n˜o vai ser escrito e a e o contador, por si s´, encarregar-se-´ de fazer o reset do microcontrolador quando alcan¸ar o seu o a c valor m´ximo. Isto vai fazer com que o programa corra de novo e desta vez corretamente. Este ´ a e um elemento importante para que qualquer programa se execute confiavelmente, sem precisar da interven¸˜o do ser humano. ca 1.4.8 Conversor anal´gico-digital (A/D) o Como os sinais dos perif´ricos s˜o substancialmente diferentes daqueles que o microcontrolador e a pode entender (zero e um), eles devem ser convertidos num formato que possa ser compreendido pelo microcontrolador. Esta tarefa ´ executada por interm´dio de um bloco destinado ` convers˜o e e a a anal´gica-digital ou com um conversor A/D. Este bloco vai ser respons´vel pela convers˜o de uma o a a informa¸˜o de valor anal´gico para um n´mero bin´rio e pelo seu trajeto atrav´s do bloco do CPU, ca o u a e de modo a que este o possa processar de imediato. Figura 1.8: Conversor anal´gico-digital (A/D). o 9
  • 10.
    1.4.9 O microcontrolador Neste momento, a configura¸˜o do microcontrolador est´ j´ terminada, tudo o que falta ´ introduzi- ca a a e la dentro de um aparelho eletrˆnico que poder´ acessar aos blocos internos atrav´s dos pinos deste o a e componente. A Figura 1.9 ilustra o aspecto interno de um microcontrolador. Figura 1.9: Configura¸˜o f´ ca ısica do interior de um microcontrolador. As linhas mais finas que partem do centro em dire¸˜o ` periferia do microcontrolador corre- ca a spondem aos fios que interligam os blocos interiores aos pinos do inv´lucro do microcontrolador. o A Figura 1.10 representa a parte principal de um microcontrolador. Numa aplica¸˜o real, um microcontrolador, por si s´, n˜o ´ suficiente. Al´m dele, n´s necessi- ca o a e e o tamos do programa que vai ser executado e de mais alguns elementos que constituir˜o um interface a l´gico para outros elementos. o 1.5 Programa Escrever um programa ´ uma parte especial do trabalho com microcontroladores e ´ designado por e e programa¸~o . Vamos tentar escrever um pequeno programa numa linguagem que seremos n´s a ca o criar e que toda a gente ser´ capaz de compreender. a INICIO REGISTRO1=LOCAL_DE_ MEMORIA_A REGISTRO2=LOCAL_DE_ MEMORIA_B PORTO_A=REGISTRO1+REGISTRO2 FIM O programa adiciona os conte´dos de dois locais de mem´ria e coloca a soma destes conte´dos na u o u porta A. A primeira linha do programa manda mover o conte´do do local de mem´ria ”A”para um u o dos registros da unidade central de processamento. Como necessitamos tamb´m de outra parcela, e vamos colocar o outro conte´do noutro registro da unidade central de processamento (CPU). A u instru¸ao seguinte pede ao CPU para adicionar os conte´dos dos dois registros e enviar o resultado c˜ u obtido para a porta A, de modo a que o resultado desta adi¸˜o seja vis´ para o mundo exterior. ca ıvel Para um problema mais complexo, naturalmente o programa que o resolve ser´ maior. a A tarefa de programa¸˜o pode ser executada em v´rias linguagens tais como o Assembler, C ca a e Basic que s˜o as linguagens normalmente mais usadas. O Assembler pertence ao grupo das a linguagens de baixo n´ ıvel que implicam um trabalho de programa¸˜o lento, mas que oferece os ca melhores resultados quando se pretende poupar espa¸o de mem´ria e aumentar a velocidade de c o execu¸˜o do programa. Como se trata da linguagem mais freq¨entemente usada na programa¸˜o de ca u ca microcontroladores, ela ser´ discutida num cap´ a ıtulo mais adiantado. Os programas na linguagem C s˜o mais f´ceis de se escrever e compreender, mas, tamb´m, s˜o mais lentos a serem executados a a e a que os programas assembler. Basic ´ a mais f´cil de todas para se aprender e as suas instru¸˜es e a co 10
  • 11.
    Figura 1.10: Arquiteturado microcontrolador. 11
  • 12.
    s˜o semelhantes `maneira de um ser humano se exprimir, mas tal como a linguagem C, ´ tamb´m a a e e de execu¸˜o mais lenta que o assembler. Em qualquer caso, antes que escolha entre uma destas ca linguagens, precisa de examinar cuidadosamente os requisitos de velocidade de execu¸˜o, de espa¸o ca c de mem´ria a ocupar e o tempo que vai demorar a fazer o programa em assembly. o Depois de o programa estar escrito, n´s necessitamos de introduzir o microcontrolador num o dispositivo e po-lo para trabalhar. Para que isto aconte¸a, n´s precisamos de adicionar mais alguns c o componentes externos. Primeiro temos que dar vida ao microcontrolador fornecendo-lhe a tens˜o a (a tens˜o el´trica ´ necess´ria para que qualquer instrumento eletrˆnico funcione) e o oscilador cujo a e e a o papel ´ an´logo ao do cora¸˜o que bate no ser humano. A execu¸˜o das instru¸˜es do programa e a ca ca co ´ regulada pelas pulsa¸˜es do oscilador. Logo que lhe ´ aplicada a tens˜o, o microcontrolador e co e a executa uma verifica¸˜o dele pr´prio, vai para o princ´ ca o ıpio do programa e come¸a a execut´-lo. O c a modo como o dispositivo vai trabalhar depende de muitos parˆmetros, os mais importantes dos a quais s˜o a competˆncia da pessoa que desenvolve o hardware e do programador que, com o seu a e programa, deve tirar o m´ximo do dispositivo. a 12
  • 13.
    Cap´ ıtulo 2 O Microcontrolador PIC16F84 O PIC 16F84 pertence a uma classe de microcontroladores de 8 bits, com uma arquitetura RISC . A estrutura gen´rica ´ a do mapa que se segue, que nos mostra os seus blocos b´sicos. e e a 2.1 Componentes b´sicos do PIC a Mem´ria de programa (FLASH) - para armazenar o programa que se escreveu. Como a o mem´ria fabricada com tecnologia FLASH pode ser programa e limpa mais que uma vez. ela o torna-se adequada para o desenvolvimento de dispositivos. EEPROM - mem´ria dos dados que necessitam de ser salvaguardados quando a alimenta¸˜o ´ o ca e desligada. Normalmente ´ usada para guardar dados importantes que n˜o se podem perder quando e a a alimenta¸˜o, de repente, “vai abaixo”. Um exemplo deste tipo de dados ´ a temperatura fixada ca e para os reguladores de temperatura. Se, durante uma quebra de alimenta¸˜o, se perdessem dados, ca n´s precisar´ o ıamos de proceder a um novo ajustamento quando a alimenta¸˜o fosse restabelecida. ca Assim, o nosso dispositivo, perderia efic´cia. a RAM - mem´ria de dados usada por um programa, durante a sua execu¸˜o. Na RAM, s˜o o ca a guardados todos os resultados interm´dios ou dados tempor´rios durante a execu¸˜o do programa e a ca e que n˜o s˜o cruciais para o dispositivo, depois de ocorrer uma falha na alimenta¸˜o. a a ca PORTA A e PORTA B s˜o liga¸˜es f´ a co ısicas entre o microcontrolador e o mundo exterior. A porta A tem cinco pinos e a porta B oito pinos. CONTADOR/TEMPORIZADOR ´ um registro de 8 bits no interior do microcontrolador e que trabalha independentemente do programa. No fim de cada conjunto de quatro ciclos de rel´gio o do oscilador, ele incrementa o valor armazenado, at´ atingir o valor m´ximo (255), nesta altura e a recome¸a a contagem a partir de zero. Como n´s sabemos o tempo exato entre dois incrementos c o sucessivos do conte´do do temporizador, podemos utilizar este para medir intervalos de tempo, o u que o torna muito util em v´rios dispositivos. ´ a UNIDADE DE PROCESSAMENTO CENTRAL faz a conex˜o com todos os outros a blocos do microcontrolador. Ele coordena o trabalho dos outros blocos e executa o programa do utilizador. 2.2 CISC x RISC J´ foi dito que o PIC16F84 tem uma arquitetura RISC. Este termo ´ encontrado, muitas vezes, na a e literatura sobre computadores e necessita de ser explicada aqui, mais detalhadamente. A arquite- tura de Harvard ´ um conceito mais recente que a de von-Neumann. Ela adveio da necessidade e de pˆr o microcontrolador a trabalhar mais rapidamente. Na arquitetura de Harvard, a mem´ria o o de dados est´ separada da mem´ria de programa. Assim, ´ poss´ uma maior fluˆncia de dados a o e ıvel e 13
  • 14.
    Figura 2.1: Esquemado microcontrolador PIC16F84. Figura 2.2: Arquiteturas Harvard versus von Neumann. atrav´s da unidade central de processamento e, claro, uma maior velocidade de funcionamento. A e separa¸˜o da mem´ria de dados da mem´ria de programa, faz com que as instru¸˜es possam ser ca o o co representadas por palavras de mais que 8 bits. O PIC16F84, usa 14 bits para cada instru¸˜o, o ca o ca ´ que permite que que todas as instru¸˜es ocupem uma s´ palavra de instru¸˜o. E tamb´m t´ co e ıpico da arquitetura Harvard ter um repert´rio com menos instru¸˜es que a de von-Neumann’s, instru¸˜es o co co essas, geralmente executadas apenas num unico ciclo de rel´gio. ´ o Os microcontroladores com a arquitetura Harvard, s˜o tamb´m designados por microcontroladores a e RISC. RISC prov´m de Computador com um Conjunto Reduzido de Instru¸˜es (Reduced Instruc- e co tion Set Computer). Os microcontroladores com uma arquitetura von-Neumann s˜o designados a por microcontroladores CISC. O nome CISC deriva de Computador com um Conjunto Complexo de Instru¸oes (Complex Instruction Set Computer). c˜ Como o PIC16F84 ´ um microcontrolador RISC, disso resulta que possui um n´mero reduzido e u de instru¸oes, mais precisamente 35 (por exemplo, os microcontroladores da Intel e da Motorola c˜ tˆm mais de cem instru¸˜es). Todas estas instru¸˜es s˜o executadas num unico ciclo, exceto no caso e co co a ´ de instru¸˜es de salto e de ramifica¸˜o. De acordo com o que o seu fabricante refere, o PIC16F84 co ca geralmente atinge resultados de 2 para 1 na compress˜o de c´digo e 4 para 1 na velocidade, em a o rela¸˜o aos outros microcontroladores de 8 bits da sua classe. ca 2.3 Aplica¸˜es co O PIC16F84, ´ perfeitamente adequado para muitas variedades de aplica¸˜es, como a ind´stria e co u e c ´ autom´vel, sensores remotos, fechaduras el´tricas e dispositivos de seguran¸a. E tamb´m um o e dispositivo ideal para cart˜es inteligentes, bem como para dispositivos alimentados por baterias, o por causa do seu baixo consumo. A mem´ria EEPROM, faz com que se torne mais f´cil usar microcontroladores em dispositivos o a onde o armazenamento permanente de v´rios parˆmetros, seja necess´rio (c´digos para transmis- a a a o sores, velocidade de um motor, freq¨ˆncias de recep¸˜o, etc.). O baixo custo, baixo consumo, ue ca facilidade de manuseamento e flexibilidade fazem com que o PIC16F84 se possa utilizar em ´reas a em que os microcontroladores n˜o eram anteriormente empregues (exemplo: fun¸˜es de tempo- a co 14
  • 15.
    riza¸˜o, substitui¸˜o deinterfaces em sistemas de grande porte, aplica¸˜es de coprocessamento, ca ca co etc.). A possibilidade deste chip de ser program´vel no sistema (usando somente dois pinos para a a transferˆncia de dados), d˜o flexibilidade do produto, mesmo depois de a sua montagem e teste e a estarem completos. Esta capacidade, pode ser usada para criar linhas de produ¸˜o e montagem, para armazenar ca dados de calibragem dispon´ ıveis apenas quando se proceder ao teste final ou, ainda, para aperfei¸oar c os programas presentes em produtos acabados. 2.4 Rel´gio / ciclo de instru¸˜o o ca O rel´gio (clock), ´ quem d´ o sinal de partida para o microcontrolador e ´ obtido a partir de o e a e um componente externo chamado oscilador. Se considerasse-mos que um microcontrolador era um rel´gio de sala, o nosso clock corresponderia ao pˆndulo e emitiria um ru´ correspondente o e ıdo ao deslocar do pˆndulo. Tamb´m, a for¸a usada para dar corda ao rel´gio, podia comparar-se ` e e c o a alimenta¸˜o el´trica. ca e O clock do oscilador, ´ ligado ao microcontrolador atrav´s do pino OSC1, aqui, o circuito e e interno do microcontrolador divide o sinal de clock em quatro fases, Q1, Q2, Q3 e Q4 que n˜o a se sobrep˜em. Estas quatro pulsa¸˜es perfazem um ciclo de instru¸˜o (tamb´m chamado ciclo de o co ca e m´quina) e durante o qual uma instru¸˜o ´ executada. A execu¸˜o de uma instru¸˜o, ´ antecedida a ca e ca ca e pela extra¸˜o da instru¸˜o que est´ na linha seguinte. O c´digo da instru¸˜o ´ extra´ da mem´ria ca ca a o ca e ıdo o de programa em Q1 e ´ escrito no registro de instru¸˜o em Q4. e ca A decodifica¸˜o e execu¸˜o dessa mesma instru¸˜o, faz-se entre as fases Q1 e Q4 seguintes. Na ca ca ca Figura 2.3 podemos observar a rela¸˜o entre o ciclo de instru¸˜o e o clock do oscilador (OSC1) ca ca assim como as fases Q1-Q4. O contador de programa (Program Counter ou PC) guarda o endere¸o c da pr´xima instru¸˜o a ser executada. o ca Figura 2.3: Ciclo de instru¸˜o e o clock. ca 2.4.1 Pipelining Cada ciclo de instru¸˜o inclui as fases Q1, Q2, Q3 e Q4. A extra¸˜o do c´digo de uma instru¸˜o ca ca o ca da mem´ria de programa, ´ feita num ciclo de instru¸˜o, enquanto que a sua decodifica¸˜o e o e ca ca execu¸ao, s˜o feitos no ciclo de instru¸˜o seguinte. Contudo, devido ` sobreposi¸˜o – pipelining (o c˜ a ca a ca microcontrolador ao mesmo tempo que executa uma instru¸˜o extrai simultaneamente da mem´ria ca o o c´digo da instru¸˜o seguinte), podemos considerar que, para efeitos pr´ticos, cada instru¸˜o o ca a ca demora um ciclo de instru¸˜o a ser executada. No entanto, se a instru¸˜o provocar uma mudan¸a ca ca c no conte´do do contador de programa (PC), ou seja, se o PC n˜o tiver que apontar para o endere¸o u a c seguinte na mem´ria de programa, mas sim para outro (como no caso de saltos ou de chamadas o de subrotinas), ent˜o dever´ considerar-se que a execu¸˜o desta instru¸˜o demora dois ciclos. Isto a a ca ca acontece, porque a instru¸˜o vai ter que ser processada de novo, mas, desta vez, a partir do endere¸o ca c 15
  • 16.
    correto. O ciclode chamada come¸a na fase Q1, escrevendo a instru¸˜o no registro de instru¸˜o c ca ca (Instruction Register - IR). A decodifica¸˜o e execu¸˜o continua nas fases Q2, Q3 e Q4 do clock. ca ca Figura 2.4: Pipeline. 2.4.2 Fluxograma das Instru¸˜es no Pipeline co TCY0 ´ lido da mem´ria o c´digo da instru¸˜o MOVLW 55h (n˜o nos interessa a instru¸˜o que e o o ca a ca foi executada, por isso n˜o est´ representada por retˆngulo). a a a TCY1 ´ executada a instru¸˜o MOVLW 55h e ´ lida da mem´ria a instru¸˜o MOVWF PORTB. e ca e o ca TCY2 ´ executada a instru¸˜o MOVWF PORTB e lida a instru¸˜o CALL SUB1. e ca ca TCY3 ´ executada a chamada (call) de um subrotina CALL SUB1 e ´ lida a instru¸˜o BSF e e ca PORTA,BIT3. Como esta instru¸˜o n˜o ´ a que nos interessa, ou seja, n˜o ´ a primeira instru¸˜o ca a e a e ca da subrotina SUB1, cuja execu¸˜o ´ o que vem a seguir, a leitura de uma instru¸˜o tem que ser ca e ca feita de novo. Este ´ um bom exemplo de uma instru¸˜o a precisar de mais que um ciclo. e ca TCY4 este ciclo de instru¸˜o ´ totalmente usado para ler a primeira instru¸˜o da subrotina ca e ca no endere¸o SUB1. c TCY5 ´ executada a primeira instru¸˜o da subrotina SUB1 e lida a instru¸˜o seguinte. e ca ca 2.5 Significado dos pinos ´ O PIC16F84 tem um total de 18 pinos. E mais freq¨entemente encontrado num tipo de encap- u sulamento DIP18, mas, tamb´m pode ser encontrado numa c´psula SMD de menores dimens˜es e a o que a DIP. DIP ´ uma abreviatura para Dual In Package (Empacotamento em duas linhas). SMD e ´ uma abreviatura para Surface Mount Devices (Dispositivos de Montagem em Superf´ e ıcie), o que sugere que os pinos n˜o precisam de passar pelos orif´ a ıcios da placa em que s˜o inseridos, quando a se solda este tipo de componente. Figura 2.5: Pinagem do PIC16F84. Os pinos no microcontrolador PIC16F84, tˆm o seguinte significado: e 16
  • 17.
    • Pino no1, RA2 Segundo pino da porta A. N˜o tem nenhuma fun¸˜o adicional. a ca • Pino no 2, RA3 Terceiro pino da porta A. N˜o tem nenhuma fun¸˜o adicional. a ca • Pino no 3, RA4 Quarto pino da porta A. O TOCK1 que funciona como entrada do tempo- rizador, tamb´m utiliza este pino. e • Pino no 4, MCLR Entrada de reset e entrada da tens˜o de programa¸˜o Vpp do microcon- a ca trolador . • Pino no 5, Vss massa da alimenta¸˜o. ca • Pino no 6, RB0, bit 0 da porta B. Tem uma fun¸˜o adicional que ´ a de entrada de interrup¸˜o. ca e ca • Pino no 7, RB1 bit 1da porta B. N˜o tem nenhuma fun¸˜o adicional. a ca • Pino no 8, RB2 bit 2 da porta B. N˜o tem nenhuma fun¸˜o adicional. a ca • Pino no 9, RB3 bit 3 da porta B. N˜o tem nenhuma fun¸˜o adicional. a ca • Pino no 10, RB4 bit 4 da porta B. N˜o tem nenhuma fun¸˜o adicional. a ca • Pino no 11, RB5 bit 5 da porta B. N˜o tem nenhuma fun¸˜o adicional. a ca • Pino no 12, RB6 bit 6 da porta B. No modo de programa ´ a linha de clock e • Pino no 13, RB7 bit 7 da porta B. Linha de dados no modo de programa • Pino no 14, Vdd p´lo positivo da tens˜o de alimenta¸˜o. o a ca • Pino no 15, OSC2 para ser ligado a um oscilador. • Pino no 16, OSC1 para ser ligado a um oscilador. • Pino no 17, RA0 bit 0 da porta A. Sem fun¸˜o adicional. ca • Pino no 18, RA1 bit 1 da porta A. Sem fun¸˜o adicional. ca 2.6 Gerador de rel´gio – oscilador o O circuito do oscilador ´ usado para fornecer um rel´gio (clock), ao microcontrolador. O clock e o ´ necess´rio para que o microcontrolador possa executar um programa ou as instru¸˜es de um e a co programa. 2.6.1 Tipos de osciladores O PIC16F84 pode trabalhar com quatro configura¸˜es de oscilador. Uma vez que as configura¸˜es co co com um oscilador de cristal e resistˆncia-condensador (RC) s˜o aquelas mais freq¨entemente us- e a u adas, elas s˜o as unicas que vamos mencionar aqui. a ´ Quando o oscilador ´ de cristal, a designa¸˜o da configura¸˜o ´ de XT, se o oscilador for uma e ca ca e resistˆncia em s´rie com um condensador, tem a designa¸˜o RC. Isto ´ importante, porque h´ e e ca e a necessidade de optar entre os diversos tipos de oscilador, quando se escolhe um microcontrolador. Figura 2.6: Clock de um microcontrolador com um ressonador. 17
  • 18.
    2.6.2 Oscilador XT O oscilador de cristal est´ contido num inv´lucro de metal com dois pinos onde foi escrita a a o freq¨ˆncia a que o cristal oscila. Dois condensadores cerˆmicos devem ligar cada um dos pinos do ue a cristal ` massa. Casos h´ em que cristal e condensadores est˜o contidos no mesmo encapsulamento, a a a ´ tamb´m o caso do ressonador cerˆmico ao lado representado. Este elemento tem trˆs pinos e e a e com o pino central ligado ` massa e os outros dois pinos ligados aos pinos OSC1 e OSC2 do a microcontrolador. Quando projetamos um dispositivo, a regra ´ colocar o oscilador t˜o perto e a quanto poss´ do microcontrolador, de modo a evitar qualquer interferˆncia nas linhas que ligam ıvel e o oscilador ao microcontrolador. Figura 2.7: Clock de um microcontrolador a partir de um cristal de quartzo. 2.6.3 Oscilador RC Em aplica¸˜es em que a precis˜o da temporiza¸˜o n˜o ´ um factor cr´ co a ca a e ıtico, o oscilador RC torna-se mais econˆmico. A freq¨ˆncia de ressonˆncia do oscilador RC depende da tens˜o de alimenta¸˜o, o ue a a ca da resistˆncia R, capacitˆncia C e da temperatura de funcionamento. e a Figura 2.8: Oscilador RC. A Figura 2.8 mostra como um oscilador RC deve ser ligado a um PIC16F84. Com um valor para a resistˆncia R abaixo de 2,2kΩ, o oscilador pode tornar-se inst´vel ou pode mesmo parar de e a oscilar. Para um valor muito grande R (1M por exemplo), o oscilador torna-se muito sens´ ıvel ` a umidade e ao ru´ ´ ıdo. E recomendado que o valor da resistˆncia R esteja compreendido entre 3kΩ e e 100kΩ. Apesar de o oscilador poder trabalhar sem condensador externo (C = 0pF), ´ conveniente, e ainda assim, usar um condensador acima de 20pF para evitar o ru´ e aumentar a estabilidade. ıdo Qualquer que seja o oscilador que se est´ a utilizar, a freq¨ˆncia de trabalho do microcontrolador ´ a ue e a do oscilador dividida por 4. A freq¨ˆncia de oscila¸˜o dividida por 4 tamb´m ´ fornecida no pino ue ca e e OSC2/CLKOUT e, pode ser usada, para testar ou sincronizar outros circuitos l´gicos pertencentes o ao sistema. Ao ligar a alimenta¸˜o do circuito, o oscilador come¸a a oscilar. Primeiro com um per´ ca c ıodo de oscila¸˜o e uma amplitude inst´veis, mas, depois de algum tempo, tudo estabiliza. ca a Para evitar que esta instabilidade inicial do clock afete o funcionamento do microcontrolador, n´s necessitamos de manter o microcontrolador no estado de reset enquanto o clock do oscilador o n˜o estabiliza. A Figura 2.10 mostra uma forma t´ a ıpica do sinal fornecido por um oscilador de cristal de quartzo ao microcontrolador quando se liga a alimenta¸˜o.ca 18
  • 19.
    Figura 2.9: Rela¸˜oentre o sinal de clock e os ciclos de instru¸˜o. ca ca Figura 2.10: Sinal de clock do oscilador do microcontrolador depois de ser ligada a alimenta¸˜o. ca 2.7 Reset O reset ´ usado para pˆr o microcontrolador num estado conhecido. Na pr´tica isto significa e o a que `s vezes o microcontrolador pode comportar-se de um modo inadequado em determinadas a condi¸˜es indesej´veis. De modo a que o seu funcionamento normal seja restabelecido, ´ preciso co a e fazer o reset do microcontrolador, isto significa que todos os seus registros v˜o conter valores iniciais a pr´-definidos, correspondentes a uma posi¸˜o inicial. O reset n˜o ´ usado somente quando o micro- e ca a e controlador n˜o se comporta da maneira que n´s queremos, mas, tamb´m pode ser usado, quando a o e ocorre uma interrup¸˜o por parte de outro dispositivo, ou quando se quer que o microcontrolador ca esteja pronto para executar um programa . De modo a prevenir a ocorrˆncia de um zero l´gico acidental no pino MCLR (a linha por cima e o de MCLR significa o sinal de reset ´ ativado por n´ e ıvel l´gico baixo), o pino MCLR tem que ser o ligado atrav´s de uma resistˆncia ao lado positivo da alimenta¸˜o. Esta resistˆncia deve ter um e e ca e valor entre 5kΩ e 10kΩ. Uma resistˆncia como esta, cuja fun¸˜o ´ conservar uma determinada e ca e linha a n´ l´gico alto, ´ chamada resist^ncia de pull up. ıvel o e e Figura 2.11: Utiliza¸˜o do circuito interno de reset. ca O microcontrolador PIC16F84, admite v´rias formas de reset: a 19
  • 20.
    1. Reset quandose liga a alimenta¸˜o, POR (Power-On Reset) ca 2. Reset durante o funcionamento normal, quando se p˜e a n´ l´gico baixo o pino MCLR do o ıvel o microcontrolador. 3. Reset durante o regime de SLEEP (dormir). 4. Reset quando o temporizador do watchdog (WDT) transborda (passa para 0 depois de atingir o valor m´ximo). a 5. Reset quando o temporizador do watchdog (WDT) transborda estando no regime de SLEEP. Os reset mais importantes s˜o o primeiro e o segundo. O primeiro, ocorre sempre que ´ ligada a e a alimenta¸˜o do microcontrolador e serve para trazer todos os registros para um estado inicial. O ca segundo que resulta da aplica¸˜o de um valor l´gico baixo ao pino MCLR durante o funcionamento ca o normal do microcontrolador e, ´ usado muitas vezes, durante o desenvolvimento de um programa. e Durante um reset, os locais de mem´ria da RAM (registros) n˜o s˜o alterados. Ou seja, os o a a conte´dos destes registros, s˜o desconhecidos durante o restabelecimento da alimenta¸˜o, mas u a ca mant´m-se inalterados durante qualquer outro reset. Ao contr´rio dos registros normais, os SFR e a (registros com fun¸˜es especiais) s˜o reiniciados com um valor inicial pr´-definido. Um dos mais co a e importantes efeitos de um reset, ´ introduzir no contador de programa (PC), o valor zero (0000), e o que faz com que o programa comece a ser executado a partir da primeira instru¸˜o deste. ca 2.7.1 Brown-out Reset Reset quando o valor da alimenta¸˜o desce abaixo do limite permitido ´ chamado de Brown-out ca e Reset. O impulso que provoca o reset durante o estabelecimento da alimenta¸˜o (power-up), ´ gerado ca e pelo pr´prio microcontrolador quando detecta um aumento na tens˜o Vdd (numa faixa entre 1,2V o a e 1,8V). Esse impulso perdura durante 72ms, o que, em princ´ ıpio, ´ tempo suficiente para que e o oscilador estabilize. Esse intervalo de tempo de 72ms ´ definido por um temporizador interno e PWRT, com um oscilador RC pr´prio. Enquanto PWRT estiver actio, o microcontrolador mant´m- o e se no estado de reset. Contudo, quando o dispositivo est´ a trabalhar, pode surgir um problema a n˜o resultante de uma queda da tens˜o para 0 volts, mas sim de uma queda de tens˜o para um a a a valor abaixo do limite que garante o correto funcionamento do microcontrolador. Trata-se de um facto muito prov´vel de ocorrer na pr´tica, especialmente em ambientes industriais onde as a a perturba¸˜es e instabilidade da alimenta¸˜o ocorrem freq¨entemente. Para resolver este problema, co ca u n´s precisamos de estar certos de que o microcontrolador entra no estado de reset de cada vez que o a alimenta¸˜o desce abaixo do limite aprovado. ca Figura 2.12: Exemplos de quedas na alimenta¸˜o abaixo do limite. ca Se, de acordo com as especifica¸˜es el´tricas, o circuito interno de reset de um microcontrolador co e n˜o satisfizer as necessidades, ent˜o, dever˜o ser usados componentes electronics especiais, capazes a a a 20
  • 21.
    de gerarem osinal de reset desejado. Al´m desta fun¸˜o, estes componentes, podem tamb´m e ca e cumprir o papel de vigiarem as quedas de tens˜o para um valor abaixo de um n´ especificado. a ıvel Quando isto ocorre, aparece um zero l´gico no pino MCLR, que mant´m o microcontrolador o e no estado de reset, enquanto a tens˜o a n˜o estiver dentro dos limites que garantem um correto a funcionamento. 2.8 Unidade Central de Processamento A unidade central de processamento (CPU) ´ o c´rebro de um microcontrolador. Essa parte ´ e e e respons´vel por extrair a instru¸˜o, decodificar essa instru¸˜o e, finalmente, execut´-la. a ca ca a Figura 2.13: Esquema da unidade central de processamento - CPU. A unidade central de processamento, interliga todas as partes do microcontrolador de modo a que este se comporte como um todo. Uma das sua fun¸˜es mais importante ´, seguramente, co e decodificar as instru¸˜es do programa. Quando o programador escreve um programa, as instru¸˜es co co assumem um claro significado como ´ o caso por exemplo de MOVLW 0x20. Contudo, para e que um microcontrolador possa entendˆ-las, esta forma escrita de uma instru¸˜o tem que ser e ca traduzida numa s´rie de zeros e uns que ´ o opcode (operation code ou c´digo da opera¸˜o). e e o ca Esta passagem de uma palavra escrita para a forma bin´ria ´ executada por tradutores assembler a e (ou simplesmente assembler). O c´digo da instru¸˜o extra´ da mem´ria de programa, tem o ca ıdo o que ser decodificado pela unidade central de processamento (CPU). A cada uma das instru¸˜es co do repert´rio do microcontrolador, corresponde um conjunto de a¸˜es para a concretizar. Estas o co a¸˜es, podem envolver transferˆncias de dados de um local de mem´ria para outro, de um local de co e o mem´ria para os portos, e diversos c´lculos, pelo que, se conclui que, o CPU, tem que estar ligado o a a todas as partes do microcontrolador. Os bus de de dados e o de endere¸o permitem-nos fazer c isso. 2.8.1 Unidade L´gica Aritm´tica (ALU) o e A unidade l´gica aritm´tica (ALU – Arithmetic Logic Unit), ´ respons´vel pela execu¸˜o de o e e a ca opera¸˜es de adi¸˜o, subtra¸˜o, deslocamento (para a esquerda ou para a direita dentro de um co ca ca registro) e opera¸˜es l´gicas. O PIC16F84 cont´m uma unidade l´gica aritm´tica de 8 bits e co o e o e registros de uso gen´rico tamb´m de 8 bits. e e 2.9 Registros Por operando n´s designamos o conte´do sobre o qual uma opera¸˜o incide. Nas instru¸˜es com o u ca co dois operados, geralmente um operando est´ contido no registro de trabalho W (working register) a e o outro operando ou ´ uma constante ou ent˜o est´ contido num dos outros registros. Esses e a a 21
  • 22.
    Figura 2.14: Unidadel´gica-aritm´tica. o e Figura 2.15: Diagrama bloco mais detalhado do microcontrolador PIC16F84. 22
  • 23.
    registros podem serRegistros de Uso Gen´rico (General Purpose Registers – GPR) ou Registros e com fun¸oes especiais (Special Function Registers – SFR). Nas instru¸˜es s´ com um operando, c˜ co o um dos operandos ´ o conte´do do registro W ou o conte´do de um dos outros registros. Quando e u u s˜o executadas opera¸˜es l´gicas ou aritm´ticas como ´ o caso da adi¸˜o, a ALU controla o estado a co o e e ca dos bits (que constam do registro de estado – STATUS). Dependendo da instru¸˜o a ser executada, ca a ALU, pode modificar os valores bits do Carry (C), Carry de d´ ıgito (DC) e Z (zero) no registro de estado – STATUS. 2.9.1 Registro STATUS O registro de estado (STATUS), cont´m o estado da ALU (C, DC, Z), estado de RESET (TO, PD) e e os bits para sele¸˜o do banco de mem´ria (IRP, RP1, RP0). Considerando que a sele¸˜o do banco ca o ca de mem´ria ´ controlada atrav´s deste registro, ele tem que estar presente em todos os bancos. o e e Os bancos de mem´ria ser˜o discutidos com mais detalhe no cap´ o a ıtulo que trata da Organiza¸˜o ca da Mem´ria. Se o registro STATUS for o registro de destino para instru¸˜es que afetem os bits Z, o co DC ou C, ent˜o n˜o ´ poss´ escrever nestes trˆs bits. a a e ıvel e Figura 2.16: Registrador STATUS. bit 0 C (Carry) Transporte. Este bit ´ afetado pelas opera¸˜es de adi¸˜o, subtra¸˜o e desloca- e co ca ca mento. Toma o valor 1 (set), quando um valor mais pequeno ´ subtra´ de um valor maior e ıdo e toma o valor 0 (reset) quando um valor maior ´ subtra´ de um menor. 1= Ocorreu um e ıdo transporte no bit mais significativo 0= N˜o ocorreu transporte no bit mais significativo O a bit C ´ afetado pelas instru¸˜es ADDWF, ADDLW, SUBLW e SUBWF. e co bit 1 DC (Digit Carry) Transporte de d´ ıgito. Este bit ´ afetado pelas opera¸˜es de adi¸˜o, e co ca subtra¸˜o. Ao contr´rio do anterior, DC assinala um transporte do bit 3 para o bit 4 do ca a resultado. Este bit toma o valor 1, quando um valor mais pequeno ´ subtra´ de um valor e ıdo maior e toma o valor 0 quando um valor maior ´ subtra´ de um menor. e ıdo 1= Ocorreu um transporte no quarto bit mais significativo 0= N˜o ocorreu transporte nesse bit a O bit DC ´ afetado pelas instru¸˜es ADDWF, ADDLW, SUBLW e SUBWF. e co bit 2 Z (bit Zero) Indica¸˜o de resultado igual a zero. Este bit toma o valor 1 quando o resul- ca tado da opera¸˜o l´gica ou aritm´tica executada ´ igual a 0. ca o e e 1= resultado igual a zero 0= resultado diferente de zero bit 3 PD (Bit de baixa de tens˜o – Power Down). Este bit ´ posto a 1 quando o microcontro- a e lador ´ alimentado e come¸a a trabalhar, depois de um reset normal e depois da execu¸˜o da e c ca instru¸˜o CLRWDT. A instru¸˜o SLEEP p˜e este bit a 0 ou seja, quando o microcontrolador ca ca o entra no regime de baixo consumo / pouco trabalho. Este bit pode tamb´m ser posto a 1, e no caso de ocorrer um impulso no pino RB0/INT, uma varia¸˜o nos quatro bits mais signi- ca ficativos da porta B, ou quando ´ completada uma opera¸˜o de escrita na DATA EEPROM e ca ou ainda pelo watchdog. 1 = depois de ter sido ligada a alimenta¸˜o ca 0 = depois da execu¸˜o de uma instru¸˜o SLEEP ca ca bit 4 TO Time-out transbordo do Watchdog. Este bit ´ posto a 1, depois de a alimenta¸˜o ser e ca ligada e depois da execu¸˜o das instru¸˜es CLRWDT e SLEEP. O bit ´ posto a 0 quando ca co e 23
  • 24.
    o watchdog conseguechegar ao fim da sua contagem (overflow = transbordar), o que indica que qualquer coisa n˜o esteve bem. a 1 = n˜o ocorreu transbordo a 0 = ocorreu transbordo bits 5 e 6 RP1:RP0 (bits de sele¸˜o de banco de registros). Estes dois bits s˜o a parte mais ca a significativa do endere¸o utilizado para endere¸amento direto. Como as instru¸˜es que en- c c co dere¸am directamente a mem´ria, disp˜em somente de sete bits para este efeito, ´ preciso c o o e mais um bit para poder endere¸ar todos os 256 registros do PIC16F84. No caso do PIC16F84, c RP1, n˜o ´ usado, mas pode ser necess´rio no caso de outros microcontroladores PIC, de a e a maior capacidade. 01 = banco de registros 1 00 = banco de registros 0 bit 7 IRP (Bit de sele¸˜o de banco de registros). Este bit ´ utilizado no endere¸amento indireto ca e c da RAM interna, como oitavo bit. 1 = bancos 2 e 3 0 = bancos 0 e 1 (endere¸os de 00h a FFh) c 2.9.2 Registro OPTION Figura 2.17: Registrador OPTION. bits 0 a 2 PS0, PS1, PS2 (bits de sele¸˜o do divisor Prescaler). Estes trˆs bits definem o factor ca e de divis˜o do prescaler. Aquilo que ´ o prescaler e o modo como o valor destes trˆs bits a e e afectam o funcionamento do microcontrolador ser´ estudado na se¸˜o referente a TMR0. a ca Figura 2.18: Prescaler. bit 3 PSA (Bit de Atribui¸˜o do Prescaler). Bit que atribui o prescaler ao TMR0 ou ao watchdog. ca 1 = prescaler atribu´ ao watchdog ıdo 0 = prescaler atribu´ ao temporizador TMR0 ıdo bit 4 T0SE (bit de sele¸˜o de bordo actio em TMR0). Se for permitido aplicar impulsos em ca TMR0, a partir do pino RA4/TOCK1, este bit determina se os impulsos activos s˜o os a impulsos ascendentes ou os impulsos descendentes. 1 = bordo descendente 0 = bordo ascendente bit 5 TOCS (bit de sele¸˜o de fonte de clock em TMR0). Este pino escolhe a fonte de impulsos ca que vai ligar ao temporizador. Esta fonte pode ser o clock do microcontrolador (freq¨ˆncia ue 24
  • 25.
    de clock adividir por 4) ou impulsos externos no pino RA4/TOCKI. 1 = impulsos externos 0 = 1 do clock interno 4 bit 6 INTEDG (bit de sele¸˜o de bordo de interrup¸˜o). Se esta interrup¸˜o estiver habilitada, ca ca ca ´ poss´ definir o bordo que vai ativar a interrup¸˜o no pino RB0/INT. e ıvel ca 1 = bordo ascendente 0 = bordo descendente bit 7 RBPU (Habilita¸˜o dos pull-up nos bits da porta B). Este bit introduz ou retira as re- ca sistˆncias internas de pull-up da porta B. e 1 = resistˆncias de pull-up desligadas e 0 = resistˆncias de pull-up ligadas e 2.10 Portas de I/O Porta, ´ um grupo de pinos num microcontrolador que podem ser acessados simultaneamente, e e, no qual n´s podemos colocar uma combina¸˜o de zeros e uns ou ler dele o estado existente. o ca Fisicamente, porta ´ um registro dentro de um microcontrolador que est´ ligado por fios aos pinos e a do microcontrolador. Os portas representam a conex˜o f´ a ısica da Unidade Central de Processamento (CPU) com o mundo exterior. O microcontrolador usa-os para observar ou comandar outros componentes ou dispositivos. Para aumentar a sua funcionalidade, os mesmos pinos podem ter duas aplica¸˜es distintas, como, por exemplo, RA4/TOCKI, que ´ simultaneamente o bit 4 da co e porta A e uma entrada externa para o contador/temporizador TMR0. A escolha de uma destas duas fun¸˜es ´ feita atrav´s dos registros de configura¸˜o. Um exemplo disto ´ o TOCS, quinto bit co e e ca e do registro OPTION. Ao selecionar uma das fun¸˜es, a outra ´ automaticamente inibida. co e Figura 2.19: Rela¸˜o entre os registros TRISA e PORTA A. ca Todos os pinos das portas podem ser definidos como de entrada ou de sa´ ıda, de acordo com as necessidades do dispositivo que se est´ a projetar. Para definir um pino como entrada ou como a sa´ ıda, ´ preciso, em primeiro lugar, escrever no registro TRIS, a combina¸˜o apropriada de zeros e e ca uns. Se no local apropriado de um registro TRIS for escrito o valor l´gico 1, ent˜o o correspondente o a pino da porta ´ definido como entrada, se suceder o contr´rio, o pino ´ definido como sa´ e a e ıda. Todos as portas, tˆm um registro TRIS associado. Assim, para a porta A, existe o registro TRISA no e endere¸o 85h e, para a porta B existe o registro TRISB, no endere¸o 86h. c c 2.10.1 Porta A A porta A (PORTA) est´ associado a 5 pinos. O registro de dire¸˜o de dados correspondente ´ o a ca e TRISA, no endere¸o 85h. Tal como no caso da porta B, pˆr a 1 um bit do registro TRISA, equivale c o a definir o correspondente pino da porta A, como entrada e pˆr a 0 um bit do mesmo registro, o equivale a definir o correspondente pino da porta A, como sa´ ıda. 25
  • 26.
    O quinto pinoda porta A tem uma fun¸˜o dupla. Nesse pino est´ tamb´m situada a entrada ca a e externa do temporizador TMR0. Cada uma destas op¸˜es ´ escolhida pondo a 1 ou pondo a co e 0 o bit TOCS (bit de sele¸˜o de fonte de clock de TMR0). Conforme o valor deste bit, assim ca o temporizador TMR0 incrementa o seu valor por causa de um impulso do oscilador interno ou devido a um impulso externo aplicado ao pino RA4/TOCKI. Figura 2.20: Exemplo de inicializa¸˜o da PORTA A. ca O exemplo da Figura 2.20 mostra como os pinos 0, 1, 2, 3 e 4 s˜o declarados como entradas e a os pinos 5, 6 e 7 como pinos de sa´ ıda. 2.10.2 Porta B A porta B tem 8 pinos associados a ele. O respectivo registro de dire¸˜o de dados chama-se TRISB ca e tem o endere¸o 86h. Ao pˆr a 1 um bit do registro TRISB, define-se o correspondente pino da c o porta como entrada e se pusermos a 0 um bit do registro TRISB, o pino correspondente vai ser uma sa´ ıda. Cada pino da porta B possui uma pequena resistˆncia de pull-up (resistˆncia que e e define a linha como tendo o valor l´gico 1). As resistˆncias de pull-up s˜o ativadas pondo a 0 o o e a bit RBPU, que ´ o bit 7 do registro OPTION. Estas resistˆncias de pull-up s˜o automaticamente e e a desligadas quando os pinos da porta s˜o configurados como sa´ a ıdas. Quando a alimenta¸˜o do ca microcontrolador ´ ligada, as resistˆncias de pull-up s˜o tamb´m desativadas. e e a e Quatro pinos da porta B, RB4 a RB7 podem causar uma interrup¸˜o, que ocorre quando ca qualquer deles varia do valor l´gico zero para valor l´gico um ou o contr´rio. Esta forma de o o a interrup¸˜o s´ pode ocorrer se estes pinos forem configurados como entradas (se qualquer um ca o destes 4 pinos for configurado como sa´ ıda, n˜o ser´ gerada uma interrup¸˜o quando h´ varia¸˜o a a ca a ca de estado). Esta modalidade de interrup¸˜o, acompanhada da existˆncia de resistˆncias de pull- ca e e up internas, torna poss´ resolver mais facilmente problemas freq¨entes que podemos encontrar ıvel u na pr´tica, como por exemplo a liga¸˜o de um teclado matricial. Se as linhas de um teclado a ca ficarem ligadas a estes pinos, sempre que se prime uma tecla, ir-se-´ provocar uma interrup¸˜o. a ca Ao processar a interrup¸˜o, o microcontrolador ter´ que identificar a tecla que a produziu. N˜o ´ ca a a e recomend´vel utilizar a porta B, ao mesmo tempo que esta interrup¸˜o est´ a ser processada. a ca a Figura 2.21: Exemplo de inicializa¸˜o da PORTA B. ca O exemplo da Figura 2.21 mostra como os pinos 0, 1, 2 e 3 s˜o definidos como entradas e 4, 5, a 6 e 7 como sa´ ıdas. 2.11 Organiza¸˜o da mem´ria ca o O PIC16F84 tem dois blocos de mem´ria separados, um para dados e o outro para o programa. o A mem´ria EEPROM e os registros de uso gen´rico (GPR) na mem´ria RAM constituem o bloco o e o 26
  • 27.
    para dados ea mem´ria FLASH constitui o bloco de programa. o 2.11.1 Mem´ria de programa o A mem´ria de programa ´ implementada usando tecnologia FLASH, o que torna poss´ programar o e ıvel o microcontrolador muitas vezes antes de este ser instalado num dispositivo, e, mesmo depois da sua instala¸˜o, podemos alterar o programa e parˆmetros contidos. O tamanho da mem´ria de ca a o programa ´ de 1024 endere¸os de palavras de 14 bits, destes, os endere¸os zero e quatro est˜o e c c a reservados respectivamente para o reset e para o vector de interrup¸˜o. ca 2.11.2 Mem´ria de dados o A mem´ria de dados compreende mem´ria EEPROM e mem´ria RAM. A mem´ria EEPROM o o o o consiste em 64 posi¸˜es para palavras de oito bits e cujos conte´dos n˜o se perdem durante uma co u a falha na alimenta¸˜o. A mem´ria EEPROM n˜o faz parte diretamente do espa¸o de mem´ria mas ca o a c o ´ acessada indiretamente atrav´s dos registros EEADR e EEDATA. Como a mem´ria EEPROM e e o serve usualmente para guardar parˆmetros importantes (por exemplo, de uma dada temperatura a em reguladores de temperatura), existe um procedimento estrito para escrever na EEPROM que tem que ser seguido de modo a evitar uma escrita acidental. A mem´ria RAM para dados, ocupa um o espa¸o no mapa de mem´ria desde o endere¸o 0x0C at´ 0x4F, o que corresponde a 68 localiza¸˜es. c o c e co Os locais da mem´ria RAM s˜o tamb´m chamados registros GPR (General Purpose Registers = o a e Registros de uso gen´rico). Os registros GPR podem ser acessados sem ter em aten¸˜o o banco e ca em que nos encontramos de momento. 2.11.3 Registros SFR Os registros que ocupam as 12 primeiras localiza¸˜es nos bancos 0 e 1 s˜o registros especiais e tˆm co a e a ver com a manipula¸˜o de certos blocos do microcontrolador. Estes registros s˜o os SFR (Special ca a Function Registers ou Registros de Fun¸˜es Especiais). co 2.11.4 Bancos de Mem´ria o Al´m da divis˜o em comprimento entre registros SFR e GPR, o mapa de mem´ria est´ tamb´m e a o a e dividido em largura (ver mapa anterior) em duas ´reas chamadas bancos. A sele¸˜o de um dos a ca bancos ´ feita por interm´dio dos bits RP0 e RP1 do registro STATUS. e e Exemplo: bcf STATUS, RP0 A instru¸˜o BCF “limpa” o bit RP0 (RP0 = 0) do registro STATUS e, assim, coloca-nos no ca banco 0. bsf STATUS, RP0 A instru¸˜o BSF p˜e a um, o bit RP0 (RP0 = 1) do registro STATUS e, assim, coloca-nos no ca o banco 1. 2.11.5 Macro Normalmente, os grupos de instru¸˜es muito usados s˜o ligados numa unica unidade que pode ser co a ´ facilmente invocada por diversas vezes num programa, uma unidade desse tipo chama-se gener- icamente Macro e, normalmente, essa unidade ´ designada por um nome especifico facilmente e compreens´ıvel. Com a sua utiliza¸˜o, a sele¸˜o entre os dois bancos torna-se mais clara e o pr´prio ca ca o programa fica mais leg´ıvel. BANK0 macro Bcf STATUS, RP0 ;Selecionar o banco 0 da mem´ria o Endm 27
  • 28.
    Figura 2.22: Organiza¸˜oda mem´ria no microcontrolador PIC16F84. ca o 28
  • 29.
    BANK1 macro Bsf STATUS,RP0 ;Selecionar o banco 1 da mem´ria o Endm Os locais de mem´ria 0Ch–4Fh s˜o registros de uso gen´rico (GPR) e s˜o usados como mem´ria o a e a o RAM. Quando os endere¸os 8Ch–CFh s˜o acessados, n´s acessamos tamb´m `s mesmas localiza¸˜es c a o e a co do banco 0. Por outras palavras, quando estamos a trabalhar com os registros de uso gen´rico, e n˜o precisamos de nos preocupar com o banco em que nos encontramos! a 2.11.6 Contador de Programa O contador de programa (PC = Program Counter ), ´ um registro de 13 bits que cont´m o endere¸o e e c da instru¸ao que vai ser executada. Ao incrementar ou alterar (por exemplo no caso de saltos) o c˜ conte´do do PC, o microcontrolador consegue executar as todas as instru¸˜es do programa, uma u co ap´s outra. o 2.11.7 Pilha O PIC16F84 tem uma pilha (stack ) de 13 bits e 8 n´ ıveis de profundidade, o que corresponde a 8 locais de mem´ria com 13 bits de largura. O seu papel b´sico ´ guardar o valor do contador o a e de programa quando ocorre um salto do programa principal para o endere¸o de um subrotina a c ser executado. Depois de ter executado a subrotina, para que o microcontrolador possa continuar com o programa principal a partir do ponto em que o deixou, ele tem que ir buscar ` pilha esse a endere¸o e carreg´-lo no contador de programa. Quando nos movemos de um programa para um c a subrotina, o conte´do do contador de programa ´ empurrado para o interior da pilha (um exemplo u e disto ´ a instru¸˜o CALL). Quando s˜o executadas instru¸˜es tais como RETURN, RETLW ou e ca a co RETFIE no fim de um subrotina, o contador de programa ´ retirado da pilha, de modo a que o e programa possa continuar a partir do ponto em que a seq¨ˆncia foi interrompida. Estas opera¸˜es ue co de colocar e extrair da pilha o contador de programa, s˜o designadas por PUSH (colocar na pilha) a e POP (tirar da pilha), estes dois nomes prov´m de instru¸˜es com estas designa¸˜es, existentes e co co nalguns microcontroladores de maior porte. 2.11.8 Programa¸˜o no Sistema ca Para programar a mem´ria de programa, o microcontrolador tem que entrar num modo especial o de funcionamento no qual o pino MCLR ´ posto a 13,5V e a tens˜o da alimenta¸˜o Vdd deve e a ca permanecer est´vel entre 4,5V e 5,5V. A mem´ria de programa pode ser programada em s´rie, a o e usando dois pinos data/clock que devem ser previamente separados do dispositivo em que o micro- controlador est´ inserido, de modo a que n˜o possam ocorrer erros durante a programa¸˜o. a a ca 2.11.9 Modos de endere¸amento c Os locais da mem´ria RAM podem ser acessados direta ou indiretamente. o Endere¸amento Direto c O endere¸amento direto ´ feito atrav´s de um endere¸o de 9 bits. Este endere¸o obt´m-se juntando c e e c c e aos sete bits do endere¸o direto de uma instru¸˜o, mais dois bits (RP1 e RP0) do registro STATUS, c ca como se mostra na figura que se segue. Qualquer acesso aos registros especiais (SFR), pode ser um exemplo de endere¸amento direto (Fig. 2.23). c Bsf STATUS, RP0 ;Banco 1 movlw 0xFF ;w = 0xFF movwf TRISA ;o endere¸o do registro TRISA ´ tirado c e ;do c´digo da instru¸~o movwf TRISA o ca 29
  • 30.
    Figura 2.23: Endere¸amentoDireto. c Endere¸amento Indireto c O endere¸amento indireto, ao contr´rio do direto, n˜o tira um endere¸o do c´digo instru¸˜o, mas c a a c o ca f´-lo com a ajuda do bit IRP do registro STATUS e do registro FSR. O local endere¸ado ´ acessado a c e atrav´s do registro INDF e coincide com o endere¸o contido em FSR. Por outras palavras, qualquer e c instru¸ao que use INDF como registro, na realidade acessa aos dados apontados pelo registro FSR. c˜ Vamos supor, por exemplo, que o registro de uso gen´rico de endere¸o 0Fh cont´m o valor 20. e c e Escrevendo o valor de 0Fh no registro FSR, n´s vamos obter um ponteiro para o registro 0Fh e, ao o ler o registro INDF, n´s iremos obter o valor 20, o que significa que lemos o conte´do do registro o u 0Fh, sem o mencionar explicitamente (mas atrav´s de FSR e INDF). Pode parecer que este tipo de e endere¸amento n˜o tem quaisquer vantagens sobre o endere¸amento direto, mas existem problemas c a c que s´ podem ser resolvidos de uma forma simples, atrav´s do endere¸amento indireto (Fig. 2.24). o e c Figura 2.24: Endere¸amento indireto. c Um exemplo pode ser enviar um conjunto de dados atrav´s de uma comunica¸˜o s´rie, usando e ca e buffers e indicadores, outro exemplo ´ limpar os registros da mem´ria RAM (16 endere¸os neste e o c caso) como ser visto na Figura 2.25. Quando o conte´do do registro FSR ´ igual a zero, ler dados do registro INDF resulta no valor u e 30
  • 31.
    Figura 2.25: Exemplode endere¸amento indireto. c 0 e escrever em INDF resulta na instru¸˜o NOP (no operation = nenhuma opera¸˜o). ca ca 2.12 Interrup¸oes c˜ As interrup¸˜es s˜o um mecanismo que o microcontrolador possui e que torna poss´ responder co a ıvel a alguns acontecimentos no momento em que eles ocorrem, qualquer que seja a tarefa que o microcontrolador esteja a executar no momento. Esta ´ uma parte muito importante, porque e fornece a liga¸˜o entre um microcontrolador e o mundo real que nos rodeia. Geralmente, cada ca interrup¸˜o muda a dire¸ao de execu¸˜o do programa, suspendendo a sua execu¸˜o, enquanto o ca c˜ ca ca microcontrolador corre um subrotina que ´ a rotina de atendimento de interrup¸˜o. Depois de este e ca subrotina ter sido executado, o microcontrolador continua com o programa principal, a partir do local em que o tinha abandonado. Figura 2.26: Uma das poss´ ıveis fontes de interrup¸˜o e como afeta o programa principal. ca 2.12.1 Registro INTCON O registro que controla as interrup¸˜es ´ chamado INTCON e tem o endere¸o 0Bh. O papel do co e c INTCON ´ permitir ou impedir as interrup¸˜es e, mesmo no caso de elas n˜o serem permitidas, e co a ele toma nota de pedidos espec´ıficos, alterando o n´ l´gico de alguns dos seus bits. ıvel o bit 0 RBIF (flag que indica varia¸˜o na porta B). Bit que informa que houve mudan¸a nos n´ ca c ıveis l´gicos nos pinos 4, 5, 6 e 7 da porta B. o 1= pelo menos um destes pinos mudou de n´ l´gico ıvel o 0= n˜o ocorreu nenhuma varia¸˜o nestes pinos a ca bit 1 INTF (flag de interrup¸˜o externa INT). Ocorrˆncia de uma interrup¸˜o externa. ca e ca 1= ocorreu uma interrup¸˜o externa ca 31
  • 32.
    Figura 2.27: RegistroINTCON. 0= n˜o ocorreu uma interrup¸˜o externa a ca Se um impulso ascendente ou descendente for detectado no pino RB0/INT, o bit INTF ´ posto e a 1 (o tipo de sensibilidade, ascendente ou descendente ´ definida atrav´s do bit INTEDG e e do registro OPTION). A subrotina de atendimento desta interrup¸˜o, deve repor este bit a ca 0, afim de que a pr´xima interrup¸˜o possa ser detectado. o ca bit 2 TOIF (Flag de interrup¸˜o por transbordo de TMR0). O contador TMR0, transbordou. ca 1= o contador mudou a contagem de FFh para 00h 0= o contador n˜o transbordou a Para que esta interrup¸˜o seja detectado, o programa deve pˆr este bit a 0. ca o bit 3 RBIE (bit de habilita¸˜o de interrup¸˜o por varia¸˜o na porta B). Permite que a interrup¸˜o ca ca ca ca por varia¸˜o dos n´ ca ıveis l´gicos nos pinos 4, 5, 6 e 7 da porta B, ocorra. o 1= habilita a interrup¸˜o por varia¸˜o dos n´ ca ca ıveis l´gicos o 0= inibe a interrup¸ao por varia¸˜o dos n´ c˜ ca ıveis l´gicos o A interrup¸˜o s´ pode ocorrer se RBIE e RBIF estiverem simultaneamente a 1 l´gico. ca o o bit 4 INTE (bit de habilita¸˜o da interrup¸˜o externa INT). bit que permite uma interrup¸˜o ca ca ca externa no bit RB0/INT. 1= interrup¸˜o externa habilitada ca 0= interrup¸˜o externa impedida ca A interrup¸˜o s´ pode ocorrer se INTE e INTF estiverem simultaneamente a 1 l´gico. ca o o bit 5 TOIE (bit de habilita¸˜o de interrup¸˜o por transbordo de TMR0). bit que autoriza a ca ca interrup¸˜o por transbordo do contador TMR0. ca 1= interrup¸˜o autorizada ca 0= interrup¸˜o impedida ca A interrup¸˜o s´ pode ocorrer se TOIE e TOIF estiverem simultaneamente a 1 l´gico. ca o o bit 6 EEIE (bit de habilita¸˜o de interrup¸˜o por escrita completa, na EEPROM). bit que ha- ca ca bilita uma interrup¸˜o quando uma opera¸˜o de escrita na EEPROM termina. ca ca 1= interrup¸˜o habilitada ca 0= interrup¸˜o inibida ca Se EEIE e EEIF (que pertence ao registro EECON1) estiverem simultaneamente a 1, a interrup¸˜o pode ocorrer. ca bit 7 GIE (bit de habilita¸˜o global de interrup¸˜o). bit que permite ou impede todas as inter- ca ca rup¸˜es. co 1= todas as interrup¸˜es s˜o permitidas co a 0= todas as interrup¸˜es impedidas co 2.12.2 Fontes de interrup¸˜o ca O PIC16F84 possui quatro fontes de interrup¸˜o: ca 1. Fim de escrita na EEPROM; 2. Interrup¸˜o em TMR0 causada por transbordo do temporizador; ca 3. Interrup¸˜o por altera¸˜o nos pinos RB4, RB5, RB6 e RB7 da porta B; ca ca 4. Interrup¸˜o externa no pino RB0/INT do microcontrolador. ca 32
  • 33.
    De um modogeral, cada fonte de interrup¸˜o tem dois bits associados. Um habilita a inter- ca rup¸ao e o outro assinala quando a interrup¸˜o ocorre. Existe um bit comum a todas as interrup¸˜es c˜ ca co chamado GIE que pode ser usado para impedir ou habilitar todas as interrup¸˜es, simultaneamente. co Este bit ´ muito util quando se est´ a escrever um programa porque permite que todas as inter- e ´ a rup¸oes sejam impedidas durante um per´ c˜ ıodo de tempo, de tal maneira que a execu¸˜o de uma ca parte cr´ ıtica do programa n˜o possa ser interrompida. Quando a instru¸˜o que faz GIE= 0 ´ exe- a ca e cutada (GIE= 0 impede todas as interrup¸˜es), todas os pedidos de interrup¸˜o pendentes, ser˜o co ca a ignorados. Figura 2.28: Esquema das interrup¸˜es no microcontrolador PIC16F84. co As interrup¸˜es que est˜o pendentes e que s˜o ignoradas, s˜o processadas quando o bit GIE co a a a ´ posto a 1 (GIE= 1, todas as interrup¸˜es permitidas). Quando a interrup¸˜o ´ atendida, o bit e co ca e GIE ´ posto a 0, de tal modo que, quaisquer interrup¸˜es adicionais sejam inibidas, o endere¸o de e co c retorno ´ guardado na pilha e, no contador de programa, ´ escrito 0004h – somente depois disto, e e ´ que a resposta a uma interrup¸˜o come¸a! e ca c Depois de a interrup¸˜o ser processada, o bit que por ter sido posto a 1 permitiu a interrup¸˜o, ca ca deve agora ser reposto a 0, sen˜o, a rotina de interrup¸˜o ir´ ser automaticamente processada a ca a novamente, mal se efetue o regresso ao programa principal. 2.12.3 Guardando os conte´ dos dos registros importantes u A unica coisa que ´ guardada na pilha durante uma interrup¸˜o ´ o valor de retorno do contador ´ e ca e de programa (por valor de retorno do contador de programa entende-se o endere¸o da instru¸˜o c ca que estava para ser executada, mas que n˜o foi, por causa de ter ocorrido a interrup¸˜o). Guardar a ca apenas o valor do contador de programa n˜o ´, muitas vezes, suficiente. Alguns registros que j´ a e a foram usados no programa principal, podem tamb´m vir a ser usados na rotina de interrup¸˜o. Se e ca n´s n˜o salvaguardamos os seus valores, quando acontece o regresso da subrotina para o programa o a principal os conte´dos dos registros podem ser inteiramente diferentes, o que causaria um erro no u programa. Um exemplo para este caso ´ o conte´do do registro de trabalho W (work register ). e u Se supormos que o programa principal estava a usar o registro de trabalho W nalgumas das suas opera¸˜es e se ele contiver algum valor que seja importante para a instru¸˜o seguinte, ent˜o a co ca a interrup¸˜o que ocorre antes desta instru¸˜o vai alterar o valor do registro de trabalho W, indo ca ca influenciar diretamente o programa principal. O procedimento para a grava¸˜o de registros importantes antes de ir para a subrotina de inter- ca rup¸ao, designa-se por PUSH, enquanto que o procedimento que recupera esses valores, ´ chamado c˜ e POP. PUSH e POP s˜o instru¸˜es provenientes de outros microcontroladores (da Intel), agora esses a co nomes s˜o aceites para designar estes dois processos de salvaguarda e recupera¸˜o de dados. Como a ca o PIC16F84 n˜o possui instru¸˜es compar´veis, elas tˆm que ser programadas. a co a e Devido ` sua simplicidade e uso freq¨ente, estas partes do programa podem ser implementadas a u com macros. O conceito de Macro ´ explicado em Programa¸˜o em linguagem Assembly. No e ca exemplo que se segue, os conte´dos de W e do registro STATUS s˜o guardados nas vari´veis u a a W TEMP e STATUS TEMP antes de correr a rotina de interrup¸˜o. No in´ da rotina PUSH, n´s ca ıcio o precisamos de verificar qual o banco que est´ a ser selecionado porque W TEMP e STATUS TEMP a 33
  • 34.
    Figura 2.29: Umadas poss´ıveis causas de erros ´ n˜o salvaguardar dados antes de executar uma e a subrotina de interrup¸˜o. ca est˜o situados no banco 0. Para troca de dados entre estes dois registros, ´ usada a instru¸˜o a e ca SWAPF em vez de MOVF, pois a primeira n˜o afeta os bits do registro STATUS. a O exemplo ´ um programa assembler com os seguintes passos: e 1. Verificar em que banco nos encontramos; 2. Guardar o registro W qualquer que seja o banco em que nos encontramos; 3. Guardar o registro STATUS no banco 0; 4. Executar a rotina de servi¸o de interrup¸˜o ISR (Interrupt Service Routine); c ca 5. Recupera¸˜o do registro STATUS; ca 6. Restaurar o valor do registro W. Se existirem mais vari´veis ou registros que necessitem de ser salvaguardados, ent˜o, precisamos a a de os guardar depois de guardar o registro STATUS (passo 3) e recuper´-los depois de restaurar o a registro STATUS (passo 5)(Fig. 2.30). A mesma opera¸˜o pode ser realizada usando macros, desta maneira obtemos um programa ca mais leg´ıvel. Os macros que j´ est˜o definidos podem ser usados para escrever novos macros. Os a a macros BANK1 e BANK0 que s˜o explicados no cap´ a ıtulo Organiza¸˜o da mem´ria s˜o usados nos ca o a macros push e pop (Fig. 2.31). 2.12.4 Interrup¸˜o externa no pino RB0/INT do microcontrolador ca A interrup¸˜o externa no pino RB0/ INT ´ desencadeada por um impulso ascendente (se o bit ca e INTEDG = 1 no registro OPTION 6), ou por um impulso descendente (se INTEDG = 0). Quando o sinal correto surge no pino INT, o bit INTF do registro INTCON ´ posto a 1. O bit INTF e (INTCON 1) tem que ser reposto a 0 na rotina de interrup¸˜o, afim de que a interrup¸˜o n˜o ca ca a possa voltar a ocorrer de novo, no regresso ao programa principal. Esta ´ uma parte importante e do programa e que o programador n˜o pode esquecer, caso contr´rio o programa ir´ constantemente a a a saltar para a rotina de interrup¸˜o. A interrup¸˜o pode ser inibida, pondo a 0 o bit de controle ca ca INTE (INTCON 4). 2.12.5 Interrup¸˜o por transbordar (overflow ) o contador TMR0 ca O transbordar do contador TMR0 (passagem de FFh para 00h) vai pˆr a 1 o bit TOIF (INTCON o 2), Esta ´ uma interrup¸˜o muito importante, uma vez que, muitos problemas da vida real podem e ca ser resolvidos utilizando esta interrup¸˜o. Um exemplo ´ o da medi¸˜o de tempo. Se soubermos ca e ca de quanto tempo o contador precisa para completar um ciclo de 00h a FFh, ent˜o, o n´mero de a u 34
  • 35.
    Figura 2.30: Guardandoos conte´dos dos registros importantes. u Figura 2.31: Subrotinas PUSH e POP. 35
  • 36.
    interrup¸˜es multiplicado poresse intervalo de tempo, d´-nos o tempo total decorrido. Na rotina co a de interrup¸˜o uma vari´vel guardada na mem´ria RAM vai sendo incrementada, o valor dessa ca a o vari´vel multiplicado pelo tempo que o contador precisa para um ciclo completo de contagem, vai a dar o tempo gasto. Esta interrup¸˜o pode ser habilitada ou inibida, pondo a 1 ou a 0 o bit TOIE ca (INTCON 5). 2.12.6 Interrup¸˜o por varia¸˜o nos pinos 4, 5, 6 e 7 da porta B ca ca Uma varia¸˜o em 4 bits de entrada da porta B (bits 4 a 7), p˜e a 1 o bit RBIF (INTCON 0). ca o A interrup¸˜o ocorre, portanto, quando os n´ ca ıveis l´gicos em RB7, RB6, RB5 e RB4 da porta o B, mudam do valor l´gico 1 para o valor l´gico 0 ou vice-versa. Para que estes pinos detectem o o as varia¸˜es, eles devem ser definidos como entradas. Se qualquer deles for definido como sa´ co ıda, nenhuma interrup¸˜o ser´ gerada quando surgir uma varia¸˜o do n´ l´gico. Se estes pinos forem ca a ca ıvel o definidos como entradas, o seu valor actual ´ comparado com o valor anterior, que foi guardado e quando se fez a leitura anterior da porta B. Esta interrup¸˜o pode ser habilitada/inibida pondo a ca 1 ou a 0, o bit RBIE do registro INTCON. 2.12.7 Interrup¸˜o por fim de escrita na EEPROM ca Esta interrup¸˜o ´ apenas de natureza pr´tica. Como escrever num endere¸o da EEPROM leva ca e a c cerca de 10ms (o que representa muito tempo quando se fala de um microcontrolador), n˜o ´ a e recomend´vel que se deixe o microcontrolador um grande intervalo de tempo sem fazer nada, ` a a espera do fim da opera¸˜o da escrita. Assim, dispomos de um mecanismo de interrup¸˜o que ca ca permite ao microcontrolador continuar a executar o programa principal, enquanto, em simultˆneo, a procede ` escrita na EEPROM. Quando esta opera¸˜o de escrita se completa, uma interrup¸˜o a ca ca informa o microcontrolador deste facto. O bit EEIF, atrav´s do qual esta informa¸˜o ´ dada, e ca e pertence ao registro EECON1. A ocorrˆncia desta interrup¸˜o pode ser impedida, pondo a 0 o bit e ca EEIE do registro INTCON. 2.12.8 Inicializa¸˜o da interrup¸˜o ca ca Para que num microcontrolador se possa usar um mecanismo de interrup¸˜o, ´ preciso proceder ca e a algumas tarefas preliminares. Estes procedimentos s˜o designados resumidamente por inicial- a iza¸˜o. Na inicializa¸˜o, n´s estabelecemos a que interrup¸˜es deve o microcontrolador responder ca ca o co e as que deve ignorar. Se n˜o pusermos a 1 o bit que permite uma certa interrup¸˜o, o programa a ca vai ignorar a correspondente subrotina de interrup¸˜o. Por este meio, n´s podemos controlar a ca o ocorrˆncia das interrup¸˜es, o que ´ muito util. e co e ´ Figura 2.32: Inicializa¸˜o da interrup¸˜o. ca ca O exemplo da Figura 2.32 mostra a inicializa¸˜o da interrup¸˜o externa no pino RB0 de um ca ca microcontrolador. No BIT em que vemos 1, isso significa que essa interrup¸˜o est´ habilitada. ca a A ocorrˆncia de outras interrup¸˜es n˜o ´ permitida, e todas as interrup¸˜es em conjunto est˜o e co a e co a mascaradas at´ que o bit GIE seja posto a 1. e O exemplo da Figura 2.33 ilustra uma maneira t´ıpica de lidar com as interrup¸˜es. O PIC16F84 co tem somente um endere¸o para a rotina de interrup¸˜o. Isto significa que, primeiro, ´ necess´rio c ca e a identificar qual a origem da interrup¸˜o (se mais que uma fonte de interrup¸˜o estiver habilitada), ca ca e a seguir deve executar-se apenas a parte da subrotina que se refere ` interrup¸˜o em causa. a ca O regresso de uma rotina de interrup¸˜o pode efetuar-se com as instru¸˜es RETURN, RETLW ca co e RETFIE. Recomenda-se que seja usada a instru¸˜o RETFIE porque, essa instru¸˜o ´ a unica ca ca e ´ que automaticamente p˜e a 1 o bit GIE, permitindo assim que novas interrup¸˜es possam ocorrer. o co 36
  • 37.
    Figura 2.33: Maneirat´ ıpica de se lidar com as interrup¸˜es. co 37
  • 38.
    2.13 Temporizador TMR0 Os temporizadores s˜o normalmente as partes mais complicadas de um microcontrolador, assim, ´ a e necess´rio gastar mais tempo a explic´-los. Servindo-nos deles, ´ poss´ relacionar uma dimens˜o a a e ıvel a real que ´ o tempo, com uma vari´vel que representa o estado de um temporizador dentro de um e a microcontrolador. Fisicamente, o temporizador ´ um registro cujo valor est´ continuamente a ser e a incrementado at´ 255, chegado a este n´mero, ele come¸a outra vez de novo: 0, 1, 2, 3, 4, ..., 255, e u c 0, 1, 2, 3,..., etc. Figura 2.34: Rela¸˜o entre o temporizador TMR0 e o prescaler. ca O incremento do temporizador ´ feito em simultˆneo com tudo o que o microcontrolador faz. e a Compete ao programador arranjar maneira de tirar partido desta caracter´ ıstica. Uma das maneiras ´ incrementar uma vari´vel sempre que o microcontrolador transborda (overflow - passa de 255 e a para 0). Se soubermos de quanto tempo um temporizador precisa para perfazer uma contagem completa (de 0 a 255), ent˜o, se multiplicarmos o valor da vari´vel por esse tempo, n´s obteremos a a o o tempo total decorrido. O PIC16F84, possui um temporizador de 8 bits. O n´mero de bits determina a quantidade u de valores diferentes que a contagem pode assumir, antes de voltar novamente para zero. No caso de um temporizador de 8 bits esse valor ´ 256. Um esquema simplificado da rela¸˜o entre um e ca temporizador e um prescaler est´ representado no diagrama anterior. Prescaler ´ a designa¸˜o para a e ca a parte do microcontrolador que divide a freq¨ˆncia de oscila¸˜o do clock antes que os respectivos ue ca impulsos possam incrementar o temporizador. O n´mero pelo qual a freq¨ˆncia de clock ´ dividida, u ue e est´ definido nos trˆs primeiros bits do registro OPTION. O maior divisor poss´ ´ 256. Neste a e ıvel e caso, significa que s´ ap´s 256 impulsos de clock ´ que o conte´do do temporizador ´ incrementado o o e u e de uma unidade. Isto permite-nos medir grandes intervalos de tempo. Quando a contagem ultrapassa 255, o temporizador volta de novo a zero e come¸a um novo c ciclo de contagem at´ 255. Sempre que ocorre uma transi¸˜o de 255 para 0, o bit TOIF do e ca registro INTCON ´ posto a 1. Se as interrup¸˜es estiverem habilitadas, ´ poss´ e co e ıvel tirar partido das interrup¸˜es geradas e da rotina de servi¸o de interrup¸˜o. Cabe ao programador voltar a co c ca pˆr a 0 o bit TOIF na rotina de interrup¸˜o, para que uma nova interrup¸˜o possa ser detetada. o ca ca Al´m do oscilador de clock do microcontrolador, o conte´do do temporizador pode tamb´m ser e u e incrementado atrav´s de um clock externo ligado ao pino RA4/TOCKI. A escolha entre uma destas e op¸˜es ´ feita no bit TOCS, pertencente ao registro OPTION. Se for selecionado o clock externo, co e 38
  • 39.
    Figura 2.35: Diagramatemporal de uma interrup¸˜o causada pelo temporizador TMR0. ca ´ poss´ definir o bordo ativo do sinal (ascendente ou descendente), que vai incrementar o valor e ıvel do temporizador. Figura 2.36: Utiliza¸˜o do temporizador TMR0 na determina¸˜o do n´mero de rota¸˜es completas ca ca u co do eixo de um motor. Na pr´tica, um exemplo t´ a ıpico que ´ resolvido atrav´s de um clock externo e um temporizador, e e ´ a contagem do n´mero de rota¸˜es completas do eixo de uma m´quina, como por exemplo um e u co a enrolador de espiras para transformadores (Fig. 2.36). Vamos considerar que o rotor do motor do enrolador, cont´m quatro polos ou saliˆncias. Vamos colocar o sensor indutivo ` distˆncia de 5mm e e a a do topo da saliˆncia. O sensor indutivo ir´ gerar um impulso descendente sempre que a saliˆncia se e a e encontre alinhada com a cabe¸a do sensor. Cada sinal vai representar um quarto de uma rota¸˜o c ca completa e, a soma de todas as rota¸˜es completas, ficar´ registado no temporizador TMR0. O co a programa pode ler facilmente estes dados do temporizador atrav´s do bus de dados. e O exemplo da Figura 2.37 mostra como iniciar o temporizador para contar os impulsos descen- dentes provenientes de uma fonte de clock externa com um prescaler 1:4. O mesmo exemplo pode ser implementado atrav´s de uma interrup¸˜o como visto da Figura e ca 2.38. O prescaler tanto pode ser atribu´ ao temporizador TMR0, como ao watchdog. O watchdog ıdo ´ um mecanismo que o microcontrolador usa para se defender contra estouros do programa. Como e qualquer circuito el´trico, tamb´m os microcontroladores podem ter uma falha ou algum percal¸o e e c no seu funcionamento. Infelizmente, o microcontrolador tamb´m pode ter problemas com o seu e programa. Quando isto acontece, o microcontrolador para de trabalhar e mant´m-se nesse estado e at´ que algu´m fa¸a o reset. Por causa disto, foi introduzido o mecanismo de watchdog (c˜o de e e c a guarda). Depois de um certo per´ ıodo de tempo, o watchdog faz o reset do microcontrolador (o que realmente acontece, ´ que o microcontrolador executa o reset de si pr´prio). O watchdog e o 39
  • 40.
    Figura 2.37: Programado temporizador TMR0. Figura 2.38: Exemplo de utiliza¸˜o de interrup¸˜o. ca ca 40
  • 41.
    trabalha na basede um princ´ ıpio simples: se o seu temporizador transbordar, ´ feito o reset do e microcontrolador e este come¸a a executar de novo o programa a partir do princ´ c ıpio. Deste modo, o reset poder´ ocorrer tanto no caso de funcionamento correto como no caso de funcionamento a incorreto. O pr´ximo passo ´ evitar o reset no caso de funcionamento correto, isso ´ feito escrevendo o e e zero no registro WDT (instru¸˜o CLRWDT) sempre que este est´ pr´ximo de transbordar. Assim, ca a o o programa ir´ evitar um reset enquanto est´ a funcionar corretamente. Se ocorrer o estouro do a a programa, este zero n˜o ser´ escrito, haver´ transbordo do temporizador WDT e ir´ ocorrer um a a a a reset que vai fazer com que o microcontrolador comece de novo a trabalhar corretamente. O prescaler pode ser atribu´ ao temporizador TMR0, ou ao temporizador do watchdog, ıdo isso ´ feito atrav´s do bit PSA no registro OPTION. Fazendo o bit PSA igual a 0, o prescaler e e ´ atribu´ ao temporizador TMR0. Quando o prescaler ´ atribu´ ao temporizador TMR0, e ıdo e ıdo todas as instru¸˜es de escrita no registro TMR0 (CLRF TMR0, MOVWF TMR0, BSF TMR0,...) co v˜o limpar o prescaler. Quando o prescaler ´ atribu´ ao temporizador do watchdog, somente a e ıdo a instru¸ao CLRWDT ir´ limpar o prescaler e o temporizador do watchdog ao mesmo tempo. A c˜ a mudan¸a do prescaler est´ completamente sob o controle do programador e pode ser executada c a enquanto o programa est´ sendo executado. a Existe apenas um prescaler com o seu temporizador. Dependendo das necessidades, pode ser atribu´ ao temporizador TMR0 ou ao watchdog, mas nunca aos dois em simultˆneo. ıdo a 2.14 Mem´ria de dados EEPROM o O PIC16F84 tem 64 bytes de localiza¸˜es de mem´ria EEPROM, correspondentes aos endere¸os co o c de 00h a 63h e onde podemos ler e escrever. A caracter´ıstica mais importante desta mem´ria ´ de o e n˜o perder o seu conte´do quando a alimenta¸˜o ´ desligada. Na pr´tica, isso significa que o que a u ca e a l´ foi escrito permanece no microcontrolador, mesmo quando a alimenta¸˜o ´ desligada. Sem ali- a ca e menta¸˜o, estes dados permanecem no microcontrolador durante mais de 40 anos (especifica¸˜es do ca co fabricante do microcontrolador PIC16F84), al´m disso, esta mem´ria suporta at´ 10000 opera¸˜es e o e co de escrita. Na pr´tica, a mem´ria EEPROM ´ usada para guardar dados importantes ou alguns parˆmetros a o e a de processamento. Um parˆmetro deste tipo, ´ uma dada temperatura, atribu´ quando ajus- a e ıda tamos um regulador de temperatura para um processo. Se esse valor se perder, seria necess´rio a reintroduzi-lo sempre que houvesse uma falha na alimenta¸˜o. Como isto ´ impratic´vel (e mesmo ca e a perigoso), os fabricantes de microcontroladores come¸aram a instalar nestes uma pequena quanti- c dade de mem´ria EEPROM. o A mem´ria EEPROM ´ colocada num espa¸o de mem´ria especial e pode ser acessada atrav´s o e c o e de registros especiais. Estes registros s˜o: a • EEDATA no endere¸o 08h, que cont´m o dado lido ou aquele que se quer escrever. c e • EEADR no endere¸o 09h, que cont´m o endere¸o do local da EEPROM que vai ser acessado. c e c • EECON1 no endere¸o 88h, que cont´m os bits de controle. c e • EECON2 no endere¸o 89h. Este registro n˜o existe fisicamente e serve para proteger a c a EEPROM de uma escrita acidental. O registro EECON1 ocupa o endere¸o 88h e ´ um registro de controle com cinco bits imple- c e mentados. Os bits 5, 6 e 7 n˜o s˜o usados e, se forem lidos, s˜o sempre iguais a zero. Os bits do a a a registro EECON1, devem ser interpretados do modo que se segue. 2.14.1 Registro EECON1 bit 0 RD (bit de controle de leitura). Ao pˆr este bit a 1, tem in´ a transferˆncia do dado do o ıcio e endere¸o definido em EEADR para o registro EEDATA. Como o tempo n˜o ´ essencial, tanto c a e na leitura como na escrita, o dado de EEDATA pode j´ ser usado na instru¸˜o seguinte. a ca 1 = inicia a leitura 0 = n˜o inicia a leitura a 41
  • 42.
    Figura 2.39: RegistroEECON1. bit 1 WR (bit de controle de escrita). Pˆr este bit a 1 faz iniciar-se a escrita do dado a partir do o registro EEDATA para o endere¸o especificado no registro EEADR. c 1 = inicia a escrita 0 = n˜o inicia a escrita a bit 2 WREN (bit de habilita¸˜o de escrita na EEPROM). Permite a escrita na EEPROM. Se ca este bit n˜o estiver a um, o microcontrolador n˜o permite a escrita na EEPROM. a a 1 = a escrita ´ permitida e 0 = n˜o se pode escrever a bit 3 WRERR ( Erro de escrita na EEPROM). Erro durante a escrita na EEPROM Este bit ´ e posto a 1 s´ em casos em que a escrita na EEPROM tenha sido interrompida por um sinal o de reset ou por um transbordo no temporizador do watchdog (no caso de este estar actio). 1 = ocorreu um erro 0 = n˜o houve erros a bit 4 EEIF (bit de interrup¸˜o por opera¸˜o de escrita na EEPROM completa). Bit usado para ca ca informar que a escrita do dadoo na EEPROM, terminou. Quando a escrita tiver terminado, este bit ´ automaticamente posto a 1. O programador tem que repˆr a 0 o bit EEIF no seu e o programa, para que possa detectar o fim de uma nova opera¸˜o de escrita. ca 1 = escrita terminada 0 = a escrita ainda n˜o terminou ou n˜o come¸ou. a a c 2.14.2 Lendo a Mem´ria EEPROM o Pondo a 1 o bit RD inicia-se a transferˆncia do dado do endere¸o guardado no registro EEADR e c para o registro EEDATA. Como para ler os dados n˜o ´ preciso tanto tempo como a escrevˆ-los, a e e os dados extra´ ıdos do registro EEDATA podem j´ ser usados na instru¸˜o seguinte. a ca Uma por¸˜o de um programa que leia um dado da EEPROM, pode ser semelhante ao visto na ca Figura 2.40. Figura 2.40: Lendo a Mem´ria EEPROM. o Depois da ultima instru¸˜o do programa, o conte´do do endere¸o 0 da EEPROM pode ser ´ ca u c encontrado no registro de trabalho w. 2.14.3 Escrevendo na Mem´ria EEPROM o Para escrever dados num local da EEPROM, o programador tem primeiro que endere¸ar o registro c EEADR e introduzir a palavra de dados no registro EEDATA. A seguir, deve colocar-se o bit WR a 1, o que faz desencadear o processo. O bit WR dever´ ser posto a 0 e o bit EEIF ser´ posto a a a 1 a seguir ` opera¸˜o de escrita, o que pode ser usado no processamento de interrup¸˜es. Os a ca co 42
  • 43.
    valores 55h eAAh s˜o as primeira e segunda chaves que tornam imposs´ que ocorra uma escrita a ıvel acidental na EEPROM. Estes dois valores s˜o escritos em EECON2 que serve apenas para isto, a ou seja, para receber estes dois valores e assim prevenir contra uma escrita acidental na mem´ria o EEPROM. As linhas do programa marcadas como 1, 2, 3 e 4 tˆm que ser executadas por esta e ordem em intervalos de tempo certos. Portanto, ´ muito importante desativar as interrup¸˜es e co que possam interferir com a temporiza¸˜o necess´ria para executar estas instru¸˜es. Depois da ca a co opera¸˜o de escrita, as interrup¸˜es podem, finalmente, ser de novo habilitadas. ca co A Figura 2.41 ilustra um exemplo da por¸˜o de programa que escreve a palavra 0xEE no ca primeiro endere¸o da mem´ria EEPROM. c o Figura 2.41: Escrevendo na Mem´ria EEPROM. o Recomenda-se que WREN esteja sempre inativo, exceto quando se est´ a escrever uma palavra a de dados na EEPROM, deste modo, a possibilidade de uma escrita acidental ´ m´ e ınima. Todas as opera¸˜es de escrita na EEPROM limpam automaticamente o local de mem´ria, antes de escrever co o de novo nela! 43
  • 44.
    Cap´ ıtulo 3 Conjunto de Instru¸˜es co J´ dissemos que um microcontrolador n˜o ´ como qualquer outro circuito integrado. Quando saem a a e da cadeia de produ¸˜o, a maioria dos circuitos integrados, est˜o prontos para serem introduzi- ca a dos nos dispositivos, o que n˜o ´ o caso dos microcontroladores. Para que um microcontrolador a e cumpra a sua tarefa, n´s temos que lhe dizer exatamente o que fazer, ou, por outras palavras, o n´s temos que escrever o programa que o microcontrolador vai executar. Neste cap´ o ıtulo iremos descrever as instru¸˜es que constituem o assembler, ou seja, a linguagem de baixo n´ co ıvel para os microcontroladores PIC. 3.1 Conjunto de Instru¸˜es da Fam´ PIC16Fxxx de Mi- co ılia crocontroladores O conjunto completo compreende 35 instru¸˜es e mostra-se na tabela que se segue. Uma raz˜o co a para este pequeno n´mero de instru¸˜es resulta principalmente do facto de estarmos a falar de u co um microcontrolador RISC cujas instru¸˜es foram otimizadas tendo em vista a rapidez de fun- co cionamento, simplicidade de arquitetura e compacidade de c´digo. O unico inconveniente, ´ que o ´ e o programador tem que dominar a t´cnica desconfort´vel de fazer o programa com apenas 35 e a instru¸˜es! co 3.2 Transferˆncia de dados e A transferˆncia de dados num microcontrolador, ocorre entre o registro de trabalho (W) e um e registro f que representa um qualquer local de mem´ria na RAM interna (quer se trate de um o registro especial ou de um registro de uso gen´rico). e As primeiras trˆs instru¸˜es (observe a tabela seguinte) referem-se ` escrita de uma constante e co a no registro W (MOVLW ´ uma abreviatura para MOVa Literal para W), ` c´pia de um dado do e a o registro W na RAM e ` c´pia de um dado de um registro da RAM no registro W (ou nele pr´prio, a o o caso em que apenas a flag do zero ´ afetada). A instru¸˜o CLRF escreve a constante 0 no registro e ca f e CLRW escreve a constante 0 no registro W. A instru¸˜o SWAPF troca o nibble (conjunto de 4 ca bits) mais significativo com o nibble menos significativo de um registro, passando o primeiro a ser o menos significativo e o outro o mais significativo do registro. 3.3 L´gicas e aritm´ticas o e De todas as opera¸˜es aritm´ticas poss´ co e ıveis, os microcontroladores PIC, tal como a grande maioria dos outros microcontroladores, apenas suportam a subtra¸˜o e a adi¸˜o. Os bits ou flags C, DC ca ca e Z, s˜o afetados conforme o resultado da adi¸˜o ou da subtra¸˜o, com uma unica exce¸˜o: uma a ca ca ´ ca vez que a subtra¸˜o ´ executada como uma adi¸˜o com um n´mero negativo, a flag C (Carry), ca e ca u comporta-se inversamente no que diz respeito ` subtra¸˜o. Por outras palavras, ´ posta a 1 se a a ca e opera¸˜o ´ poss´ e posta a 0 se um n´mero maior tiver que ser subtra´ de outro mais pequeno. ca e ıvel u ıdo 44
  • 45.
    A l´gica dentrodo PIC tem a capacidade de executar as opera¸˜es AND, OR, EX-OR, comple- o co mento (COMF) e rota¸˜es (RLF e RRF). Estas ultimas instru¸˜es, rodam o conte´do do registro co ´ co u atrav´s desse registro e da flag C de uma casa para a esquerda (na dire¸˜o do bit 7), ou para a e ca direita (na dire¸˜o do bit 0). O bit que sai do registro ´ escrito na flag C e o conte´do anterior ca e u desta flag, ´ escrito no bit situado do lado oposto no registro. e 3.4 Opera¸˜es sobre bits co As instru¸˜es BCF e BSF p˜em a 0 ou a 1 qualquer bit de qualquer s´ da mem´ria. Apesar co o ıtio o de parecer uma opera¸˜o simples, ela ´ executada do seguinte modo, o CPU primeiro lˆ o byte ca e e completo, altera o valor de um bit e, a seguir, escreve o byte completo no mesmo registrador. 3.5 Dire¸˜o de execu¸˜o de um programa ca ca As instru¸˜es GOTO, CALL e RETURN s˜o executadas do mesmo modo que em todos os outros co a microcontroladores, a diferen¸a ´ que a pilha ´ independente da RAM interna e ´ limitada a c e e e oito n´ ıveis. A instru¸˜o RETLW k ´ idˆntica ` instru¸˜o RETURN, exceto que, ao regressar de ca e e a ca um subrotina, ´ escrita no registro W uma constante definida pelo operando da instru¸˜o. Esta e ca instru¸ao, permite-nos implementar facilmente listagens (tamb´m chamadas tabelas de lookup). A c˜ e maior parte das vezes, usamo-las determinando a posi¸˜o do dado na nossa tabela adicionando-a ao ca endere¸o em que a tabela come¸a e, ent˜o, ´ lido o dado nesse local (que est´ situado normalmente c c a e a na mem´ria de programa). o A tabela pode apresentar-se como um subrotina que consiste numa s´rie de instru¸˜es RETLW e co k onde as constantes k, s˜o membros da tabela. a Figura 3.1: Dire¸˜o de execu¸˜o de um programa. ca ca N´s escrevemos a posi¸˜o de um membro da nossa tabela no registro W e, usando a instru¸˜o o ca ca CALL, n´s chamamos o subrotina que cont´m a tabela. A primeira linha do subrotina ADDWF o e PCL, f, adiciona a posi¸˜o na tabela e que est´ escrita em W, ao endere¸o do in´ da tabela e ca a c ıcio que est´ no registro PCL, assim, n´s obtemos o endere¸o real do dado da tabela na mem´ria de a o c o programa. Quando regressamos do subrotina, n´s vamos ter no registro W o conte´do do membro o u da tabela endere¸ado. No exemplo anterior, a constante k2 estar´ no registro W, ap´s o retorno c a o do subrotina. RETFIE (RETurn From Interrupt – Interrupt Enable ou regresso da rotina de interrup¸˜o comca as interrup¸˜es habilitadas) ´ um regresso da rotina de interrup¸˜o e difere de RETURN apenas co e ca em que, automaticamente, p˜e a 1 o bit GIE (habilita¸˜o global das interrup¸˜es). Quando a o ca co interrup¸˜o come¸a, este bit ´ automaticamente reposto a 0. Tamb´m quando a interrup¸˜o tem ca c e e ca in´ ıcio, somente o valor do contador de programa ´ posto no cimo da pilha. N˜o ´ fornecida uma e a e capacidade autom´tica de armazenamento do registro de estado. a Os saltos condicionais est˜o sintetizados em duas instru¸˜es: BTFSC e BTFSS. Consoante o a co estado l´gico do bit do registro f que est´ a ser testado, a instru¸˜o seguinte no programa ´ ou n˜o o a ca e a executada. 3.6 Per´ ıodo de execu¸˜o da instru¸˜o ca ca Todas as instru¸˜es s˜o executadas num unico ciclo, exceto as instru¸˜es de ramifica¸˜o condicional co a ´ co ca se a condi¸˜o for verdadeira, ou se o conte´do do contador de programa for alterado pela instru¸˜o. ca u ca 45
  • 46.
    Nestes casos, aexecu¸˜o requer dois ciclos de instru¸˜o e o segundo ciclo ´ executado como sendo ca ca e um NOP (Nenhuma Opera¸˜o). Quatro oscila¸˜es de clock perfazem um ciclo de instru¸˜o. Se ca co ca estivermos a usar um oscilador com 4MHz de freq¨ˆncia, o tempo normal de execu¸˜o de uma ue ca instru¸ao ser´ de 1ms e, no caso de uma ramifica¸˜o condicional de 2ms. c˜ a ca 3.7 Conjunto de instru¸oes c˜ Significado de alguns s´ ımbolos: f qualquer local de mem´ria num microcontrolador o W registro de trabalho b posi¸˜o de bit no registro f ca d registro de destino label grupo de oito caracteres que marca o in´ de uma parte do programa (r´tulo) ıcio o TOS topo da pilha [ ] opcional <> grupo de bits num registro Figura 3.2: Mnemˆnicos Assembly. o Resumo das notas da Figura 3.2: 1. Se a porta de entrada/sa´ for o operando origem, ´ lido o estado dos pinos do microcon- ıda e trolador. 46
  • 47.
    2. Se estainstru¸˜o for executada no registro TMR0 e se d=1, o prescaler atribu´ a esse ca ıdo temporizador ´ automaticamente limpo. e 3. Se o PC for modificado ou se resultado do teste for verdadeiro, a instru¸˜o ´ executada em ca e dois ciclos. 47
  • 48.
    Cap´ ıtulo 4 Programa¸˜o em Linguagem ca Assembly A capacidade de comunicar ´ da maior importˆncia nesta ´rea. Contudo, isso s´ ´ poss´ se ambas e a a oe ıvel as partes usarem a mesma linguagem, ou seja, se seguirem as mesmas regras para comunicarem. Isto mesmo se aplica ` comunica¸˜o entre os microcontroladores e o homem. A linguagem que o a ca microcontrolador e o homem usam para comunicar entre si ´ designada por linguagem assembly. e O pr´prio t´ o ıtulo n˜o tem um significado profundo, trata-se de apenas um nome como por exemplo a inglˆs ou francˆs. Mais precisamente, linguagem assembly ´ apenas uma solu¸˜o transit´ria. Os e e e ca o programas escritos em linguagem assembly devem ser traduzidos para uma linguagem de zeros e uns de modo a que um microcontrolador a possa receber. Linguagem assembly e assembler s˜o a coisas diferentes. A primeira, representa um conjunto de regras usadas para escrever um programa para um microcontrolador e a outra, ´ um programa que corre num computador pessoal que traduz e a linguagem assembly para uma linguagem de zeros e uns. Um programa escrito em zeros e uns diz-se que est´ escrito em linguagem de m´quina. a a Figura 4.1: O processo de comunica¸˜o entre o homem e o microcontrolador. ca Fisicamente, “Programa” representa um arquivo num disco de computador (ou na mem´ria o se estivermos a ler de um microcontrolador) e ´ escrito de acordo com as regras do assembly ou e qualquer outra linguagem de programa¸˜o de microcontroladores. O homem pode entender a lin- ca guagem assembly j´ que ela ´ constitu´ por s´ a e ıda ımbolos alfab´ticos e palavras. Ao escrever um e programa, certas regras devem ser seguidas para alcan¸ar o efeito desejado. Um Tradutor inter- c preta cada instru¸˜o escrita em linguagem assembly como uma s´rie de zeros e uns com significado ca e para a l´gica interna do microcontrolador. Consideremos, por exemplo, a instru¸˜o RETURN que o ca um microcontrolador utiliza para regressar de uma subrotina. Quando o assembler a traduz, n´s o obtemos uma s´rie de uns e zeros correspondentes a 14 bits que o microcontrolador sabe como e interpretar. Exemplo: RETURN 00 0000 0000 1000 48
  • 49.
    Analogamente ao exemploanterior, cada instru¸˜o assembly ´ interpretada na s´rie de zeros ca e e e uns correspondente. O resultado desta tradu¸˜o da linguagem assembly, ´ designado por um ca e arquivo de execu¸˜o. Muitas vezes encontramos o nome de arquivo HEX. Este nome prov´m de ca e uma representa¸˜o hexadecimal desse arquivo, bem como o sufixo hex no t´ ca ıtulo, por exemplo correr.hex. Uma vez produzido, o arquivo de execu¸˜o ´ inserido no microcontrolador atrav´s de ca e e um programador. Um programa em Linguagem Assembly ´ escrito por interm´dio de um processador de texto e e (editor) e ´ capaz de produzir um arquivo ASCII no disco de um computador ou em ambientes e pr´prios como o MPLAB1 . o 4.1 Linguagem Assembly Os elementos b´sicos da linguagem assembly s˜o: a a • Labels (r´tulos) o • Instru¸˜es co • Operandos • Diretivas • Coment´rios a 4.1.1 Label Um Label (r´tulo) ´ uma designa¸˜o textual (geralmente de f´cil leitura) de uma linha num pro- o e ca a grama ou de uma se¸˜o de um programa para onde um microcontrolador deve saltar ou, ainda, ca o in´ de um conjunto de linhas de um programa. Tamb´m pode ser usado para executar uma ıcio e ramifica¸˜o de um programa (tal como Goto....), o programa pode ainda conter uma condi¸˜o que ca ca ca ´ deve ser satisfeita, para que uma instru¸˜o Goto seja executada. E importante que um r´tulo o (label) seja iniciado com uma letra do alfabeto ou com um tra¸o baixo “ ”. O comprimento de um c e ´ r´tulo pode ir at´ 32 caracteres. E tamb´m importante que o r´tulo comece na primeira coluna. o e o Figura 4.2: Exemplo de labels. 4.1.2 Instru¸˜es co As instru¸˜es s˜o espec´ co a ıficas para cada microcontrolador, assim, se quisermos utilizar a linguagem assembly temos que estudar as instru¸˜es desse microcontrolador. O modo como se escreve uma co instru¸ao ´ designado por sintaxe. No exemplo da Figura 4.3 ´ poss´ reconhecer erros de escrita, c˜ e e ıvel dado que as instru¸˜es movlp e gotto n˜o existem no microcontrolador PIC16F84. co a 1 Programa da Microchip utilizado para editar e programar microcontroladores 49
  • 50.
    Figura 4.3: Exemplode instru¸˜es. co 4.1.3 Operandos Operandos s˜o os elementos da instru¸˜o necess´rios para que a instru¸˜o possa ser executada. a ca a ca Normalmente s˜o registros, vari´veis e constantes. As constantes s˜o designadas por literais. A a a a palavra literal significa n´mero. u Figura 4.4: Exemplo de Operandos. 4.1.4 Coment´rios a Coment´rio ´ um texto que o programador escreve no programa afim de tornar este mais claro e a e leg´ ´ ıvel. E colocado logo a seguir a uma instru¸˜o e deve come¸ar com um ponto-e-v´ ca c ırgula “;”. 4.1.5 Diretivas Uma diretiva ´ parecida com uma instru¸˜o mas, ao contr´rio desta, ´ independente do tipo e ca a e de microcontrolador e ´ uma caracter´ e ıstica inerente ` pr´pria linguagem assembly. As diretivas a o servem-se de vari´veis ou registros para satisfazer determinados prop´sitos. Por exemplo, NIVEL, a o pode ser uma designa¸˜o para uma vari´vel localizada no endere¸o 0Dh da mem´ria RAM. Deste ca a c o a c ´ modo, a vari´vel que reside nesse endere¸o, pode ser acessada pela palavra NIVEL. E muito mais f´cil a um programador recordar a palavra NIVEL, que lembrar-se que o endere¸o 0Dh cont´m a c e informa¸˜o sobre o n´ ca ıvel. Figura 4.5: Exemplo de diretivas. 4.1.6 Exemplo de um programa em assembly O exemplo da Figura 4.6 mostra como um programa simples pode ser escrito em linguagem as- sembly, respeitando regras b´sicas. a 50
  • 51.
    Quando se escreveum programa, al´m das regras fundamentais, existem princ´ e ıpios que, emb- ora n˜o obrigat´rios ´ conveniente, serem seguidos. Um deles, ´ escrever no seu in´ a o e e ıcio, o nome do programa, aquilo que o programa faz, a vers˜o deste, a data em que foi escrito, tipo de microcon- a trolador para o qual foi escrito e o nome do programador. Figura 4.6: Exemplo de como se escreve um programa Uma vez que estes dados n˜o interessam ao tradutor de assembly, s˜o escritos na forma de a a coment´rios. Deve ter-se em aten¸˜o que um coment´rio come¸a sempre com ponto e v´ a ca a c ırgula e pode ser colocado na linha seguinte ou logo a seguir ` instru¸˜o. Depois deste coment´rio inicial a ca a ter sido escrito, devem incluir-se as directivas. Isto mostra-se no exemplo de cima. Para que o seu funcionamento seja correto, ´ preciso definir v´rios parˆmetros para o micro- e a a controlador, tais como: • tipo de oscilador • quando o temporizador do watchdog est´ ligado e a • quando o circuito interno de reset est´ habilitado. a Tudo isto ´ definido na diretiva seguinte: e __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC Logo que todos os elementos de que precisamos tenham sido definidos, podemos come¸ar a c escrever o programa. Primeiro, ´ necess´rio definir o endere¸o para que o microcontrolador deve e a c ca ´ ir quando se liga a alimenta¸˜o. E esta a finalidade de (org 0x00). O endere¸o para onde um c programa salta se ocorrer uma interrup¸˜o ´ (org 0x04). Como este ´ um programa simples, ´ ca e e e suficiente dirigir o microcontrolador para o in´ de um programa com uma instru¸˜o goto Main ıcio ca (Main = programa principal). As instru¸˜es encontradas em Main, selecionam o banco 1 (BANK1) de modo a poder acessar o co registro TRISB, afim de que a porta B seja definido como uma sa´ (movlw 0x00, movwf TRISB). ıda O pr´ximo passo ´ selecionar o banco de mem´ria 0 e colocar os bits da porta B no estado l´gico o e o o ´ 1 e, assim, o programa principal fica terminado. E preciso, no entanto, um outro ciclo (loop), onde 51
  • 52.
    o microcontrolador possapermanecer sem que ocorram erros. Trata-se de um loop infinito que ´ executado continuamente, enquanto a alimenta¸˜o n˜o for desligada. Finalmente, ´ necess´rio e ca a e a colocar a palavra end no fim de cada programa, de modo a informar o tradutor de assembly de que o programa n˜o cont´m mais instru¸˜es. a e co 4.2 Macros As macros s˜o elementos muito uteis em linguagem assembly. Uma macro pode ser descrita em a ´ poucas palavras como um grupo de instru¸˜es definido pelo utilizador que ´ acrescentado ao pro- co e ´ grama pelo assembler, sempre que a macro for invocada. E poss´ ıvel escrever um programa sem usar macros. Mas, se as utilizarmos, o programa torna-se muito mais leg´ ıvel, especialmente se estiverem v´rios programadores a trabalhar no mesmo programa. As macros tˆm afinidades com a e as fun¸˜es nas linguagens de alto n´ co ıvel. Como as escrever: <r´tulo> macro o [<argumento1>,<argumento2>,.....,<argumentoN>] ......... ......... endm Pelo modo como s˜o escritas, vemos que as macros podem aceitar argumentos, o que tamb´m a e ´ muito util em programa¸˜o. Quando o argumento ´ invocado no interior de uma macro, ele vai e ´ ca e ser substitu´ pelo valor argumentoN. ıdo Figura 4.7: Exemplo de uma macro. O exemplo da Figura 4.7 mostra uma macro cujo prop´sito ´ enviar para o porto B, o argumento o e ARG1, definido quando a macro foi invocada. Para a utilizarmos num programa, basta escrever uma unica linha: ON PORTB 0xFF e, assim, colocamos o valor 0xFF no porto B. Para utilizar uma ´ macro no programa, ´ necess´rio incluir o arquivo macro no programa principal, por interm´dio e a e da instru¸˜o include nome da macro.inc. O conte´do da macro ´ automaticamente copiado para ca u e o local em que esta macro est´ escrita. Isto pode ver-se melhor no arquivo lst visto atr´s, onde a a a macro ´ copiada por baixo da linha include bank.inc. e 52
  • 53.
    Referˆncias Bibliogr´ficas e a [1] Matic, N. The PIC Microcontroller, Microe, USA, 2002. [2] Zanco, W. S. Microcontroladores PIC 16F628A/648A. Uma abordagem pr´tica e objetiva. Ed. a ´ Erica. 2005. [3] Zanco, W. S. Microcontroladores PIC. T´cnicas de software e hardware para projetos de cir- e ´ cuitos eletrˆnicos. Com base no PIC 16F877A. Ed. Erica. 2006. o ´ [4] Souza, D. J. Desbravando o PIC - Ampliado e Atualizado para PIC 16F628A. Ed. Erica, 2004. ´ [5] Souza, D. J. e LAVINIA, N. C. Conectando o PIC: Recursos Avan¸ados. Ed. Erica. 2005. c [6] www.microchip.com. Acessado em 02/2008. 53