Está en la página 1de 120

Curso de Microcontroladores

Microchip PIC
Índice

(1) História dos Microcontroladores............................................................................. 8


1.1. História dos Microcontroladores........................................................................ 9
1.2. Arquitectura de um microcontrolador.............................................................. 13
1.3. Características dos microcontroladores PIC .................................................... 15
1.3.1. Famílias dos microcontroladores PIC....................................................... 15
1.3.2. Core de 12 bits .......................................................................................... 15
1.3.3. Core de 14 bits .......................................................................................... 16
1.3.4. Core de 16 bits .......................................................................................... 17
1.3.5. Core de 16 bits avançado.......................................................................... 17
1.3.6. Tipos de Memória de programa................................................................ 18
1.3.6.1. OTP .................................................................................................... 18
1.3.6.2. EPROM.............................................................................................. 19
1.3.6.3. FLASH............................................................................................... 19
1.3.7. Vantagens do PIC16F628A sobre o PIC16F84 ........................................ 19
1.3.7.1. Pinos multiuso.................................................................................... 20
1.3.7.2. Bancos de memória............................................................................ 20
1.3.7.3. Vantagens do PIC16F628A ............................................................... 20
(2) Começar com os PIC’s.......................................................................................... 22
2.1. A arquitectura PICMicro.................................................................................. 23
2.2. Periféricos ........................................................................................................ 25
(3) Família 16F6xxA................................................................................................... 26
3.1. A arquitectura interna ...................................................................................... 27
3.2. Organização da memória ................................................................................. 27
3.2.1. Memória de programa............................................................................... 27
3.2.2. Memória de dados..................................................................................... 29
3.2.2.1. Memória de uso geral – RAM ........................................................... 32
3.2.2.2. Registos com funções especiais ......................................................... 32
3.2.2.2.1. Registo STATUS ........................................................................ 35
3.2.2.2.2. Registo OPTION......................................................................... 37
3.2.2.2.3. Registo INTCON ........................................................................ 38

-1- © 2005 Primetec – Engenharia de Sistemas, Lda.


3.2.2.2.4. Registo PIE1 ............................................................................... 39
3.2.2.2.5. Registo PIR1 ............................................................................... 40
3.2.2.2.6. Registo PCON............................................................................. 41
3.3. Contador de programa...................................................................................... 41
3.4. Stack................................................................................................................. 43
3.5. Modos de endereçamento ................................................................................ 45
3.5.1 Inerente ...................................................................................................... 45
3.5.2. Registo Directo ......................................................................................... 45
(4) Assembler PIC16................................................................................................... 48
4.1. Definições de assembler PIC16 ....................................................................... 49
4.1.1. Movimento de dados................................................................................. 51
4.1.2. Modificação do conteúdo de registos ....................................................... 52
4.1.3. Controlo do fluxo de programa................................................................. 52
4.1.4. Nenhuma operação.................................................................................... 53
(5) MPLab IDE da Microchip..................................................................................... 55
5.1. Projecto em MPLab ......................................................................................... 56
5.2. Compilação do código fonte ............................................................................ 59
5.3. Simulador ( Debugger ) ................................................................................... 60
5.4. Programação do circuito-integrado.................................................................. 61
(6) Funções e registos internos ................................................................................... 62
6.1. Temporizadores e divisores temporais............................................................. 63
6.1.1. Timer 0...................................................................................................... 63
6.1.2. Divisores ....................................................................................................... 64
6.1.3. Timer 1.......................................................................................................... 65
6.1.4. Timer1 em modo de Temporizador............................................................... 67
6.1.5. Timer1 em modo de Contador ...................................................................... 67
6.1.6. Timer2 ........................................................................................................... 68
6.2. Módulo de captura/comparadores/PWM ......................................................... 71
6.2.1. Módulo de Captura ................................................................................... 72
6.2.2. Módulo de Comparação............................................................................ 73
6.2.3. Módulo de PWM....................................................................................... 78
6.2.3.1. Duty Cycle do PWM.......................................................................... 79
6.3. Módulo de comunicações USART .................................................................. 82
6.3.1. USART em modo assíncrono ................................................................... 88

-2- © 2005 Primetec – Engenharia de Sistemas, Lda.


6.4. Memória de dados EEPROM........................................................................... 91
6.4.1. Ler a EEPROM ......................................................................................... 92
6.4.2. Escrever na EEPROM............................................................................... 92
(7) Funções especiais .................................................................................................. 93
7.1. Bits de configuração ........................................................................................ 94
7.2. Configurações do Oscilador............................................................................. 95
7.2.1. Oscilador a Cristal/Ressoador................................................................... 96
7.2.2. Entrada de relógio externo ........................................................................ 96
7.2.3. Oscilador RC - versões 16F6xxA ............................................................ 97
7.2.4. Oscilador ER - versões 16F62x ............................................................... 97
7.2.5. Modo de Dupla Velocidade de oscilador.................................................. 98
7.3. Reset................................................................................................................. 98
7.4. Interrupções.................................................................................................... 100
7.5. Temporizador Watchdog - WDT ................................................................... 101
7.6. Modo SLEEP – Power Down ........................................................................ 102
7.6.1. Acordar do modo SLEEP........................................................................ 102
(8) Utilização das portas ........................................................................................... 103
8.1. Direcção das portas ........................................................................................ 104
8.2. Escrita/leitura das portas ................................................................................ 104
8.3. FLAGS........................................................................................................... 105
8.4. Transferências de dados................................................................................. 105
(9) Comparação, manipulação de bits e sequências.................................................. 107
9.1. Comparações.................................................................................................. 108
9.2. Manipulação de bits usando instruções de manipulação de bit ..................... 110
9.2.1. BIT Set/Clear .......................................................................................... 110
9.2.2. Teste de BIT............................................................................................ 110
9.3. Manipulação de bits, usando instruções lógicas ............................................ 110
9.3.1. Mudar bit específico para ‘1’.................................................................. 111
9.3.2. Mudar bit específico para ‘0’.................................................................. 111
9.3.3. Mudar bit específico para o seu complemento ....................................... 111
9.3.4. Comparação – testa para byte específico ................................................ 111
9.3.5. Testa para ‘0’ .......................................................................................... 111
9.4. Sequências...................................................................................................... 112
(10) Tabelas .............................................................................................................. 113

-3- © 2005 Primetec – Engenharia de Sistemas, Lda.


(11) Interrupções....................................................................................................... 115
11.1. Interrupção RB0/INT ................................................................................... 116
11.2. Interrupção TMR0 ....................................................................................... 117
11.3. Interrupção PORTB ..................................................................................... 117
11.4. GIE – Bit de activação geral de interrupções............................................... 117
11.5. Gravação de valores de registos, quando das interrupções.......................... 118
11.6. Atraso de interrupção................................................................................... 118

-4- © 2005 Primetec – Engenharia de Sistemas, Lda.


Índice de figuras

Fig. 1 - Transístor antigo................................................................................................9


Fig. 2 – Vista interna do Intel 4004 ...............................................................................9
Fig. 3 – Diagrama de acesso às memórias ...................................................................10
Fig. 4 – Microcontrolador PIC 16F84A.......................................................................10
Fig. 5 – Arquitectura do PIC 16F628A........................................................................11
Fig. 6 – Encapsulamento do PIC da família 16F62x ...................................................12
Fig. 7 – Arquitectura de um computador .....................................................................13
Fig. 8 – Arquitectura Von Neumann............................................................................13
Fig. 9 – Arquitectura Harvard......................................................................................14
Fig. 10 – Microcontrolador da família 12Fxxx com core de 12 bits ...........................16
Fig. 11 – Microcontrolador da família 16F6xxA com core de 14 bits ........................16
Fig. 12 – Microcontrolador da família 17C4xA com core de 16 bits..........................17
Fig. 13 – Microcontrolador da família 18Fxx2 com core de 16 bits melhorado .........18
Fig. 14 – Registos ........................................................................................................23
Fig. 15 - Opcode ..........................................................................................................24
Fig. 16 – Exemplo de Pipelining .................................................................................24
Fig. 17 – Oscilador.......................................................................................................24
Fig. 18 - Mapa da memória de Programa e da Stack ...................................................28
Fig. 19 - Distribuição da RAM pelos Bancos de memoria ..........................................29
Fig. 20 - Acesso aos Bancos de Memória....................................................................29
Fig. 21 – Mapa de memória de dados do PIC16F628A...............................................30
Fig. 22 - Mapa da memória de Dados do PIC16F648A ..............................................31
Fig. 23 - Registos de Função Especial, Banco 0..........................................................32
Fig. 24 - Registos de Função Especial, Banco 1..........................................................33
Fig. 25 - Registos de Função Especial, Banco 2..........................................................34
Fig. 26 - Registos de Função Especial, Banco 3..........................................................35
Fig. 27 – Registo STATUS (endereço: 03h, 83h, 103h, 183h)....................................36
Fig. 28 - Registo OPTION (endereço: 81h, 181h).......................................................37
Fig. 29 - Registo INTCON (endereço: 0Bh, 8Bh, 10Bh, 181h) ..................................38
Fig. 30 - Registo PIE1 (endereço: 8Ch).......................................................................39
Fig. 31 - Registo PIR1 (endereço: 0Ch).......................................................................40

-5- © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 32 - Registo PCON (endereço: 8Eh) ....................................................................41
Fig. 33 - Carregamento do Contador de programa em diferentes situações ................43
Fig. 34 - Utilização da Stack para guardar os endereços de retorno............................44
Fig. 35 - Comportamento da Stack quando de execução de Subrotinas ......................45
Fig. 36 - Mapa de memória de armazenamento de dados............................................47
Fig. 37 – Lista de configurações do microcontrolador PIC16F628A ..........................50
Fig. 38 – Lista de instruções Assembler.......................................................................54
Fig. 39 – Criação de um novo projecto........................................................................56
Fig. 40 – Janela de ficheiros agregados ao projecto ....................................................56
Fig. 41 – Introdução do nome do ficheiro principal de código fonte ..........................57
Fig. 42 – Ficheiro principal adicionado ao projecto ....................................................58
Fig. 43 – Escolha do micro-controlador ......................................................................58
Fig. 44 – Janela de Bits de Configuração do microcontrolador 16F628A...................59
Fig. 45 – Janela de Output da compilação ..................................................................60
Fig. 46 – Janela de observação de variáveis ................................................................60
Fig. 47 – Janela do Simulator Trace ............................................................................61
Fig. 48 – Módulo Timer 0 ............................................................................................63
Fig. 49 – Tabela de valores e correspondências do prescaler .....................................64
Fig. 50 - Programação do valor do divisor (prescaler)................................................64
Fig. 51 – Registos associados ao módulo Timer0........................................................65
Fig. 52 – Módulo Timer1.............................................................................................65
Fig. 53 – Registo TCON1 do módulo Timer1 .............................................................66
Fig. 54 – Utilização do Timer1 em modo de temporizador .........................................67
Fig. 55 – Registos associados ao módulo Timer1........................................................68
Fig. 56 – Módulo Timer2 .............................................................................................68
Fig. 57 – Registos associados ao módulo Timer2........................................................69
Fig. 58 - Registo CCP1 de temporizadores..................................................................71
Fig. 59 – Registo CCP1CON .......................................................................................71
Fig. 60 – Modo de Captura ..........................................................................................72
Fig. 61 – Registo CMCON ..........................................................................................73
Fig. 62 – Modos de operação do módulo de comparação............................................74
Fig. 63 – Esquema de ligação de circuitos externos ao módulo de comparação .........76
Fig. 64 – Registos associados ao módulo de comparação ...........................................76
Fig. 65 – Diagrama de blocos do módulo comparador................................................77
Fig. 66 – Registos associados aos módulos de captura/comparação e Timer1............77

-6- © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 67 – Esquema de blocos do módulo de PWM......................................................78
Fig. 68 – Forma de onde de saída do gerador PWM ....................................................79
Fig. 69 – Registos associados ao módulo de PWM e Timer2 .....................................81
Fig. 70 – Registo TXSTA ............................................................................................83
Fig. 71 – Registo RCSTA ............................................................................................84
Fig. 72 – Cálculo do valor SPBRG..............................................................................85
Fig. 73 – Valores de SPBRG possíveis, para diferentes baud rates, em modo síncrono
..........................................................................................................................86
Fig. 74 - Valores de SPBRG possíveis, para diferentes baud rates, em modo
assíncrono ........................................................................................................87
Fig. 75 – Módulo de emissão da USART ....................................................................88
Fig. 76 – Módulo de recepção da USART...................................................................89
Fig. 77 – Registos associados ao módulo de comunicações USART..........................91
Fig. 78 – Registo EEDATA .........................................................................................91
Fig. 79 – Lista de Bits de configuração do microcontrolador PIC16F628A ...............94
Fig. 80 - Registo de Configuração ...............................................................................95
Fig. 81 – Oscilador a cristal .........................................................................................96
Fig. 82 – Oscilador por relógio externo .......................................................................96
Fig. 83 – Oscilador com malha Resistência/condensador ...........................................97
Fig. 84 – Oscilador interno ..........................................................................................97
Fig. 85 – Diagrama de blocos simplificado dos circuitos de reset internos.................99
Fig. 86 – Bits de estado e seu significado....................................................................99
Fig. 87 – Registos associados ao Reset......................................................................100
Fig. 88 – Diagrama de blocos do temporizador Watchdog........................................101
Fig. 89 – Registos associados ao temporizador Watchdog ........................................101
Fig. 90 - Inicialização da porta A...............................................................................104
Fig. 91 – Exemplo de flags ........................................................................................105
Fig. 92 - Sequência com RLF e RRF.........................................................................112
Fig. 93 – Lógica dos circuitos de interrupções ..........................................................116
Fig. 94 – Registos associados às interrupções ...........................................................117

-7- © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 1
(1) História dos Microcontroladores

-8- © 2005 Primetec – Engenharia de Sistemas, Lda.


1.1. História dos Microcontroladores

Muitas coisas houve já, às quais as pessoas chamaram computadores. Por isso
mesmo, não existe uma definição concreta para o que de facto é um computador.
Os computadores têm, desde o seu aparecimento, ajudado o homem, na
resolução de operações matemáticas. Apesar da história nos contar e mostrar
inúmeros dispositivos de computação matemática, baseados em processos puramente
mecânicos, hoje em dia as pessoas pensam em computadores, como dispositivos
electrónicos.
Um computador pode definir-se como uma máquina que aceita dados, excuta
operações lógicas e devolve resultados. Esta da definição é válida para qualquer
dispositivo que funcione mediante um programa gravado em memória.
Por volta de 1940, foi desenvolvido em Inglaterra o Colossus. Uma poderosa
máquina que seria capaz de descodificar a cifra (Enigma) utilizada pelas tropas
alemãs. Esta cifra era produzida por uma máquina de escrever electromecânica, que
estava ligada a um computador composto por cerca de 1500 válvulas. A base de
codificação era assente em algoritmos de estatística.
Só em 1950 é que os computadores ficaram disponíveis para aplicações
comerciais. Exemplo disso foi o Manchester Mk I (desenvolvido na universidade de
Manchester). Estes computadores eram enormes, ocupando a superfície de um
edifício por completo. As operações executadas eram muito específicas e, por isso
mesmo, associadas directamente ao hardware desenvolvido. Os programas tinham
entre 100 a 1000 operações.
Em 1956, a invenção do transístor por John Bardeen, William Shockley, e
Walter Brattain, valeu-lhes a conquista do prémio Nobel Física. Com esta invenção
foi dado um grande passo no sentido da sucessiva redução do tamanho e eficiência
dos dispositivos electrónicos semicondutores.

Fig. 1 - Transístor antigo Fig. 2 – Vista interna do Intel 4004

Em 1969 a Hewlett Packard já comercializava imensas calculadoras de bolso,


enquanto que a Fairchild e a Motorola são nessa altura dois grandes fabricantes de
semicondutores. Também neste ano, um grupo de engenheiros Japoneses recém
chegados aos Estados Unidos da América, traziam a premissa de construir circuitos
para calculadoras, baseados nos seus projectos.
Em 1971 a Intel lança o 4004, um processador de 4 bits com 2300 transístores.
Já em Abril de 1972 a Intel lança o primeiro microcontrolador de 8 bits, com o nome
de 8008. Tinha 16kb de memória e 45 instruções, com uma velocidade de 300000
operações por segundo.

-9- © 2005 Primetec – Engenharia de Sistemas, Lda.


Em 1976 a Intel apresenta ao mundo o microcontrolador de 8 bits, o MCS-48 e
também o famoso microprocessador 8085. No mesmo ano a Zilog lança o famoso
microprocessador Z80 que deu origem aos computadores ZX Spectrum.
É nesta altura que surge então a distinção entre microprocessador e
microcontrolador. A diferença reside essencialmente no facto de um microcontrolador
ter memória EEPROM e RAM internas.

Barramento de Endereçamento

Memória
Barramento de Dados

RAM
ROM
(Random
(Read Only
Access
Memory)
Memory)

Fig. 3 – Diagrama de acesso às memórias

Em 1980 a Intel lança o 8051, um microcontrolador que se tornou muito


famoso. Actualmente existem imensos fabricantes, com soluções de
microcontroladores muito variadas, baseados nesta arquitectura.
Mais tarde, no início dos anos 90, é fundada a Microchip que desenvolve o
PIC (Peripheral Interface Controller). Tratava-se de conseguir um microcontrolador
barato, pequeno e prático. A grande vantagem do PIC era o seu baixo consumo
energético. O facto de não precisar de mais do que um oscilador RC externo ao
microcontrolador, entre as outras características, levaram este microcontrolador ao
sucesso a que hoje se assiste.
Actualmente a Microchip tem várias famílias de microcontroladores com
diversas características.

Fig. 4 – Microcontrolador PIC 16F84A

A família mais utilizada por todo o mundo é a família 16xxx com o popular
16F84. Um microcontrolador que tem sido utilizado nas mais diversas aplicações
electrónicas.

- 10 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Os PIC’s têm uma arquitectura de 8 bits, com memória FLASH e EEPROM
internas, porta de I/O, módulos de comunicação com o exterior, como mostra a
seguinte figura:

Fig. 5 – Arquitectura do PIC 16F628A

O PIC tem diversos temporizadores para contagem temporal e interrupções


internas e externas que permitem interromper a execução do programa principal,
quando um qualquer evento ocorre, com carácter prioritário.
A sua arquitectura de 35 instruções Assembler permite uma rápida
aprendizagem, e tem-se revelado bastante adequada à maioria das aplicações para as
quais, esta família de microcontroladores foi desenhada. A figura seguinte mostra
como actualmente é constituído uma cápsula de um microcontrolador PIC, neste caso,
qualquer um da família 16F62x.

- 11 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 6 – Encapsulamento do PIC da família 16F62x

- 12 - © 2005 Primetec – Engenharia de Sistemas, Lda.


1.2. Arquitectura de um microcontrolador

A arquitectura da maioria dos computadores e microprocessadores da


actualidade, que foi desenvolvida por Von Neumann, revolucionou a computação de
dados, reconhecendo que o programa podia ser armazenado a par com os dados. Este
método oferece uma grande flexibilidade pois, para alterar o programa, basta carregar
a área de memória com os valores respectivos.

Entradas Saídas
Unidade Central
de
Processamento Armazenamento
Entradas auxiliar

Memória

Fig. 7 – Arquitectura de um computador

Essencialmente, este tipo de arquitectura engloba um CPU1, memória e um


barramento onde ambos vão ligar. Como o CPU deverá poder comunicar com o
exterior, interfaces de entrada e saída estão, também, ligados neste barramento.

Memória

Dados
Código de
programa

Entradas Saídas

Unidade
Central de
Processamento
ALU

Fig. 8 – Arquitectura Von Neumann

Unidade Central de Processamento - A CPU consiste na ALU2, em conjunto com a


lógica digital de controlo. As instruções do programa são puxadas da memória,

1
Central Processing Unit - Unidade Central de Processamento
2
Arithmetic Logic Unit - Unidade Lógica e Aritmética

- 13 - © 2005 Primetec – Engenharia de Sistemas, Lda.


descodificadas e executadas. Dados resultantes destas operações, são, também,
acedidos da mesma memória.

Memória - A memória contém o programa a ser executado pelo CPU, e o mesmo é


vulgarmente conhecido por Software. Esta memória, também, contém os dados
processados pelo programa.

Interfaces - Para ser de algum uso, o computador deverá poder interagir com o
ambiente circundante. Qualquer tipo de dispositivo físico poderá ser controlado, para
além do teclado e monitor.

Barramento - BUS - Todos os elementos de uma arquitectura Von Neumann estão


interligados pelo BUS. Tendo o CPU como controlador principal de todo os sistema,
toda a informação circula neste BUS. Podendo ser eficiente, apenas uma operação
poderá ocorrer de cada vez. Este fenómeno é conhecido por Von Neumann bottleneck,
ou por Estrangulamento de Von Neumann.

A arquitectura Harvard, é uma adaptação da Von Neumann, separando a


memória de programa, da de dados. A figura mostra dois BUS distintos: um
transportando o programa, e outro transportando os dados. Como tal, não existem
interacção entre ambos.

Memória

Dados

Entradas Saídas

Memória
Unidade
Central de Código de
Processamento Programa
ALU

Fig. 9 – Arquitectura Harvard

- 14 - © 2005 Primetec – Engenharia de Sistemas, Lda.


1.3. Características dos microcontroladores PIC

Os microcontroladores PIC estão disponíveis em muitos e variados modelos e,


a princípio, a quantidade disponível pode parecer bastante confusa. Mas existe uma
certa lógica nesta escolha pois, o mesmo CPU está disponível com diversas opções
internas diferentes.

1.3.1. Famílias dos microcontroladores PIC

A Microchip divide os PICs em famílias, às quais chama Cores. Estas


diferentes famílias representam mudanças significativas na arquitectura interna do
PIC, e o lançamento no mercado foi cronológico, assim como aparece nesta lista:

• Core de 12 bits
• Core de 14 bits
• Core de 16 bits
• Core de 16 bit avançado

Um pouco confuso a princípio mas, o número de bits não se refere ao


barramento. O barramento é sempre de 8 bits, que é o número de bits que uma posição
de memória pode armazenar. Refere-se, sim, ao tamanho da memória de programa,
onde cada instrução pode ter 12, 14 ou 16 bits de tamanho. Quanto maior o número de
bits, maior a memória endereçável.

• Core de 12 bits - PIC12x


• Core de 14 bits - PIC16x
• Core de 16 bits - PIC17x
• Core de 16 bit avançado - PIC18x

Em todas as famílias, o x representa o tipo de tecnologia utilizada na memória


de programa.

1.3.2. Core de 12 bits

Os chips com core de 12 bits, foram os primeiros a ser lançados no mercado e


são, provavelmente, os mais populares.
Podem endereçar 1Kbyte de memória de programa, e disponibilizam um
máximo de 128 bytes de RAM. Este tipo de arquitectura suporta 35 instruções de
programa, além de, também, estarem disponíveis em encapsulamentos de 8 pinos.

Poderá parecer limitativo um chip com tão poucos pinos mas, para a maioria
das aplicações em que o mesmo é proposto, a sua versatilidade, e o seu baixo preço,
tornaram-no muito popular. A maioria das famílias de 12 bits foi apresentada com

- 15 - © 2005 Primetec – Engenharia de Sistemas, Lda.


memória OTP 3 e EPROM 4 apagável por UV 5 . Este tipo de memórias tornou esta
família pouco popular entre os amadores e hobistas. Só recentemente a Microchip
relançou para o mercado estas famílias com memória FLASH6, que possibilitam uma
versatilidade quase imensurável.

Fig. 10 – Microcontrolador da família 12Fxxx com core de 12 bits

1.3.3. Core de 14 bits

Os cores de 14 bits são os mais populares na indústria e entre os hobistas, não


sendo tão limitativos como a família de 12 bits. Podem endereçar 8Kbyte de memória
de programa, e disponibilizam até 368 bytes de RAM. Suportam as mesmas
instruções que a família de 12 bits, mas algumas instruções podem endereçar mais
memória.

Estão disponíveis em encapsulamentos de 14, 18, 28 e 44 pinos, bem como em


variadíssimas versões de montagem em superfície.

Fig. 11 – Microcontrolador da família 16F6xxA com core de 14 bits

3
One Time Programable - Programável Apenas Uma Vez
4
Erasable Programable Read Only Memory - Memória Programável e Apagável
5
Ultra Violeta
6
Flash Erasable Programmable Read-Only Memory - EPROM Flash

- 16 - © 2005 Primetec – Engenharia de Sistemas, Lda.


1.3.4. Core de 16 bits

A quase inexistência de suporte, os preços elevados, e o aparecimento de


novas famílias mais poderosas, fez com que esta família dos PIC17 se tornasse uma
família pouco popular e cada vez mais em desuso.

Podem endereçar 32Kbyte de memória de programa, e disponibilizam até 902


bytes de RAM. A lista de instruções sofre alguns acrescentos, e é partilhada com as
famílias anteriores.

Só existem encapsulamentos disponíveis acima de 40 pinos, e apenas 8 chips


diferentes nesta família.

Fig. 12 – Microcontrolador da família 17C4xA com core de 16 bits

1.3.5. Core de 16 bits avançado

As primeiras famílias de PICs não estavam desenhadas para suportar


compiladores de linguagens modernas, tipo C. Apesar de haver uma boa quantidade
de compiladores de C no mercado, estes são um pouco grosseiros no tratamento da
linguagem e, no entanto, podendo parecer-se com esta linguagem, não suportam a
maioria das funções C.

A pequena quantidade de memória de cada PIC, e a curta Stack7, fez com que
o uso de compiladores C se tornasse difícil.

As famílias de 12 e 14 bits têm uma Stack com 8 níveis, enquanto que as de 16


bits já possuem Stack de 16 níveis. A falta de instruções que possam manipular a

7
Pilha de memória

- 17 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Stack, leva o utilizador a implementar a Stack em software, aliada à falta de RAM,
que tornava o processo muito difícil, e a performance diminuída.

A família de 16 bits avançada, implementa uma completa diferente


arquitectura, focada no uso de compiladores, podendo suportar 64Kbytes de memória
de programa e 3Kbytes de RAM. O número de instruções já ascende a um total de 75,
e estão disponíveis em variadíssimos encapsulamentos acima dos 18 pinos.

A disponibilidade de compiladores, a melhor lista de instruções e o seu baixo


custo, fez com que esta família se popularizasse tão depressa na indústria, bem como
no mercado amador.

Fig. 13 – Microcontrolador da família 18Fxx2 com core de 16 bits melhorado

1.3.6. Tipos de Memória de programa

A memória de programa dos PICs, é implementada em uma de várias


tecnologias existentes. Estas são distinguidas por três letras, no modelo do PIC: C, E
ou F.

1.3.6.1. OTP

Existe um grande número de modelos PIC que são implementados com


memória ROM, que só pode ser gravada uma vez. Esta característica faz com que
estes PICs sejam muito populares na indústria devido ao seu baixo custo em largas
quantidades. Contudo, o mercado amador tende a não usar estes PICs, devido à
necessidade de reprogramar a memória, à medida que se corrige o software.
Os PICs são identificados com a letra C, seguindo-se o número de família.

- 18 - © 2005 Primetec – Engenharia de Sistemas, Lda.


1.3.6.2. EPROM

Estes modelos foram introduzidos pois, a possibilidade de apagamento por


UV, faz com que o PIC possa ser reprogramado as vezes necessárias, até à finalização
do software. Distinguem-se pela letra C, e algumas que são apagáveis electricamente,
estão marcadas pela letra CE.

1.3.6.3. FLASH

Trata-se de uma memória não volátil, que pode ser apagada e escrita
electricamente. Todos os PICs mais recentes, incluem este tipo de memória, que se
distingue pela letra F; tais como os 16F84 ou 16F628A.

A vantagem da FLASH sobre as EEPROM, é que com a primeira, o utilizador


pode trocar tempo de escrita, por tempo de leitura. O tempo de escrita foi aumentado,
havendo uma diminuição no tempo de leitura, trazendo óbvias melhorias na execução
do programa.

O PrimeProg PIC Programmer8 está habilitado a trabalhar com os PICs mais


recentes, também como com os mais antigos. O software que acompanha este
programador tem actualizações constantes, e gratuitas, podendo ser usado para todos
os dispositivos com que o PrimeProg PIC Programmer trabalha.

1.3.7. Vantagens do PIC16F628A sobre o PIC16F84

Embora o PIC16F84 possa parecer a melhor escolha para o início da


aprendizagem neste campo, as várias vantagens que o PIC16F628A oferece, faz com
que possamos deixar o PIC16F84 de lado.
A simplicidade do uso entre o PIC16F628A e o PIC16F84, não é mais do que
um uso e leitura atenta dos manuais e folhas de dados do microcontrolador. Sendo o
utilizador inexperiente no uso de microcontroladores, e com a "aproximação" que este
manual tem ao tema, não haverá qualquer dificuldade em inteirar-se da arquitectura
do PIC16F628A.

8
Disponível na Primetec - Engenharia de Sistemas, Lda., www.primetec.pt

- 19 - © 2005 Primetec – Engenharia de Sistemas, Lda.


1.3.7.1. Pinos multiuso

No PIC16F628A, cada pino tem três ou quatro funções acessíveis. Apesar de


parecer confusa a escolha, e a configuração, dos registos internos do
microcontrolador, há que ter em atenção que o PIC tem os pinos pré definidos como
Entradas e todos os periféricos desligados.
Basta configurá-los para Entradas/Saídas, e usá-los normalmente. Quaisquer
das funções especiais adicionais, disponíveis no pino, só serão activadas através de
configuração interna. Apesar de haver informação contraditória que diz que são
necessárias mudanças eléctricas no circuito, tal não é verdade pois as funções
adicionais de cada pino, são seleccionáveis internamente, através da configuração dos
registos.

1.3.7.2. Bancos de memória

Devido a um aumento da memória de dados, a mesma foi distribuída pelos


bancos disponíveis no PIC, que também foram duplicados de maneira a acomodar os
registos de cada periférico disponível. Sendo assim e, comparando os bancos dos dois
PICs, pode observar-se que um programa escrito para o PIC16F84 9 pode ser
facilmente portado para o PIC16F628A sem quaisquer alterações significativas. Mais
à frente falar-se-á nos cuidados a ter aquando da inicialização do PIC.

1.3.7.3. Vantagens do PIC16F628A

• Maior Memória
→ Aumento de memória de programa de 1K a 2K
→ Aumento de memória de dados de 68 para 224 bytes
→ Aumento de memória EEPROM de 64 para 128 bytes

• Mais Hardware Interno


→ USART por hardware
→ Três temporizadores, contra um do PIC16F84
→ PWM por hardware
→ Captura, e comparação, por hardware
→ Duplo comparador interno – (AMPOPS)
→ Tensão de referência programável

• Maior funcionalidade
→ Oscilador interno de 4MHz/37kHz, para aplicações não críticas
→ Detector de abaixamento de tensão
→ Passível de programação em baixa tensão

9
Consultar a folha de dados do microcontrolador, capítulo de Organização de Memória

- 20 - © 2005 Primetec – Engenharia de Sistemas, Lda.


→ Possível de usar três pinos adicionais, convertendo o pino de Reset, e os
pinos do Oscilador, nos chips de 18 pinos

• Compatibilidade entre Hardware/Software


→ O PIC16F628A tem o mesmo pinout que o PIC16F84
→ O PIC16F628A corre software escrito para o PIC16F84, apenas com
ligeiras modificações
→ O PIC16F628A pode ser programado com o mesmo programador do
PIC16F84, mas o software de programação deverá ser actualizado para
suportar o PIC16F628A

- 21 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 2
(2) Começar com os PIC’s

- 22 - © 2005 Primetec – Engenharia de Sistemas, Lda.


2.1. A arquitectura PICMicro

A arquitectura dos microcontroladores PICMicro é, tal como foi dito no


capítulo 1, uma arquitectura Harvard. Isto significa que a unidade central de
processamento dispõe de duas memórias distintas, uma contendo o código de
programa, carregado previamente no microcontrolador, e uma segunda memória de
uso específico onde estão contidos os registos internos, necessários ao funcionamento
do microcontrolador, e também uma área reservada ao uso genérico do programa que
está a correr (RAM).
A família PIC16 tem 8bits de tamanho para toda a informação que circula
internamente no barramento de dados. O barramento de endereçamento da memória
de programa tem um tamanho de 14bits, que permitem endereçar 16384 instruções de
programa. Esta família, dado a sua relação entre entradas/saídas e preço, fez dela a
mais atractiva para os hobistas.
O conceito de registo é importante. A RAM é um banco de memória que pode
ser utilizado de forma genérica, bem como para funções especiais. Além disso, as
portas de entrada e saída são também registos. Desta forma, todas as instruções podem
manipular qualquer registo, o que permite ao programador utilizar o microcontrolador
de forma fácil, rápida e directa.

Memória de INDF
Dados
TMR0
PCL
STATUS
FSR

ALU PORTA

Registo W

RAM

Fig. 14 – Registos

A stack de 8 níveis permite guardar o valor do program counter, aquando de


chamadas a subrotinas. Terminado o processo, os valores originais são recuperados,
permitindo o seguimento do programa sem quaisquer problemas.
Como a arquitectura PIC16 é do tipo RISC (Reduced Instruction Set Code), a
maioria demora apenas um ciclo de relógio. Esta particularidade permite que o
utilizador possa contar de forma rápida o tempo que determinada função demora a
executar. Os microcontroladores PIC16 obtêm resultados numa relação de 2:1 na
compressão do código de programa e 4:1 em velocidade, em relação a outro
microcontroladores do mesmo tipo.
Cada instrução de programa tem um determinado código (OPCODE). O
microcontrolador utiliza uma WORD para codificar as instruções. Dos 14 bits, os 8 bits

- 23 - © 2005 Primetec – Engenharia de Sistemas, Lda.


de menor peso servem para guardar informação de utilização directa (Literal
Instructions). Os restantes bits guardam o código da instrução a executar.

Fig. 15 - Opcode

O sistema de pipeline, também presente nos PIC16, permite colocar os dados


da instrução seguinte nos registos certos, enquanto a instrução actual é executada.
Este método permite que se cumpra cada instrução em apenas um ciclo de relógio. No
entanto, as instruções de saltos no Program Counter, precisam de mais um ciclo, para
que o salto no endereço de destino do Program Counter possa ser executado.

Fig. 16 – Exemplo de Pipelining

A frequência de relógio que é injectada no microcontrolador é chamada de


Fosc. Essa frequência é dividida por 4, que dá origem ao tempo de instrução. Por
exemplo, se o microcontrolador tiver ligado aos seus terminais um cristal de 4 MHz,
que corresponde a um período de 250ns, então o tempo de instrução será de 1µs, que
significa uma frequência de 1 MHz.

Fig. 17 – Oscilador

A memória do PIC divide-se em dois tipos: memória de programa (Program


Memory) e memória de dados (RAM e EEPROM). A família PIC16 tem a memória

- 24 - © 2005 Primetec – Engenharia de Sistemas, Lda.


de programa organizada em páginas e a memória de dados organizada em bancos.
Cada página de memória tem 2k words de tamanho. O tamanho de cada banco de
memória RAM varia entre dispositivos. Na família PIC16 só é possível endereçar um
máximo de 128 bytes, pelo que o uso de bancos, torna possível a utilização de uma
quantidade de RAM maior.

2.2. Periféricos

A Microchip disponibiliza inúmeros modelos na família PIC16. Os periféricos


presentes em cada um deles, variam bastante, segundo diversos factores. Um
projectista de electrónica deve fazer escolher de forma correcta, qual o modelo que
mais se adequa ao seu projecto, para que este possa cumprir as funções para as quais
foi escolhido.
Os periféricos que podem ser encontrados dentro de um PIC16 são então:

• Temporizadores: 1, 2 ou mais consoante o modelo


• RS232 (USART): Porta Série que permite os modos síncronos e
assíncronos
• PSP: Porta Paralela de 8bits
• EEPROM: Memória não volátil adicional para registo de dados
• Comparadores para sinais externos
• PWM: Modulação por largura de impulsos
• SPI (Serial Peripheral Interface): Porta de dados série
• I2C: Porta de dados série
• ADC: Conversores analógico/digital
• ICSP (In Circuit Serial Programming): Programação série directa no
circuito
• Watchdog Timer: Temporizador de guarda para o microcontrolador
• USB (Universal Serial Bus)
• CAN (Controller Area Network)
• LIN (Local Interconnect Network)
• LCD (Liquid Cristal Display): Controlo de ecrãs de cristais líquidos
• rfPIC: Transmissor de ASK e FSK
• Controlador de motores DC
• BOR (Brown-Out RESET): Detector de limites inferiores de tensão de
alimentação

Como não é possível incluir todos os periféricos num PIC, o projectista deve
consultar os catálogos da Microchip, de modo a descobrir qual o modelo que inclui no
seu interior, todos (se possível) os periféricos que necessita para o seu projecto.
Apesar da escolha poder parecer complicada, para a grande maioria dos
projectos, os modelos que existem no mercado, adequam-se perfeitamente. Raras são
as ocasiões em que não se encontra um modelo à medida das necessidades

- 25 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 3
(3) Família 16F6xxA

- 26 - © 2005 Primetec – Engenharia de Sistemas, Lda.


3.1. A arquitectura interna

A elevada performance da família PIC16F6xxA, pode ser atribuída a um sem


número de razões características de microprocessadores RISC10. Esta família usa uma
arquitectura Harvard, onde programa e dados são acedidos de memórias distintas. A
separação destas duas memórias, possibilita que as instruções tenham tamanho
diferente de 8 bits. As instruções têm 14 bits de tamanho, e executam-se num único
ciclo de relógio.
Igualmente, esta família pode endereçar directa, ou indirectamente, os seus
registos e memória de programa. Todos os registos especiais, incluindo o contador de
programa, estão mapeados na memória de dados. Possui uma ALU de trabalho geral
de 8 bits, permitindo funções aritméticas e booleanas, e um registo de trabalho11.
A ALU de 8 bits, permite fazer adição, subtracção, rotação e operações
lógicas, sendo as operações aritméticas realizadas por complemento a dois. Nas
instruções de dois operandos, um deles é o registo de trabalho, e o outro é um registo
da memória de dados, ou uma constante directa. Em instruções de um operando, este é
o registo de trabalho ou o registo da memória de dados.
O registo de trabalho é um registo de 8 bits usado para operações com a ALU,
e não é um registo endereçável.
Dependendo da instrução executada, a ALU poderá afectar os valores da
Carry (C), Digit Carry (DC), e do Zero (Z) no registo de STATUS.
Um diagrama simplificado da arquitectura interna do PIC16F6xxA, é
mostrada na figura 5, capítulo 1.
Dois tipos de memória de dados estão disponíveis nesta família de micro-
controladores. EEPROM não-volátil 12 é usada para guardar dados por um largo
período de tempo, tal como para guardar valores de calibração do aparelho, tabelas de
calibração ou mesmo actualizações feitas no local onde o aparelho está instalado. A
outra memória de dados, RAM, é temporariamente usada para guardar dados durante
o funcionamento normal do micro-controlador. Nesta, os dados são perdidos quando
se corta a energia.

3.2. Organização da memória

3.2.1. Memória de programa

A família PIC16F6xxA tem um contador de programa de 13 bits, e é capaz de


endereçar 8Kbytes x 14 de memória de programa. Apenas os primeiros 1Kbyte x 14
(0000h - 03FFh) estão fisicamente implementadas no PIC16F627A, 2Kbyte x 14
(0000h - 07FFh) para o PIC16F628A e 4Kbyte x 14 (0000h - 0FFFh) para o
PIC16F648A. O acesso a uma localização acima destas regiões, vai causar um retorno
ao início da memória do programa. O conteúdo de qualquer registo, desta memória,
pode ser escrito, ou lido, para o registo de trabalho W.
O endereço vector de RESET é o 0000h, e o de Interrupção é o 0004h.

10
Reduced Instruction Set Computer
11
Identificado por W
12
Os dados permanecem, quando a energia é retirada

- 27 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 18 - Mapa da memória de Programa e da Stack

- 28 - © 2005 Primetec – Engenharia de Sistemas, Lda.


3.2.2. Memória de dados

A memória de dados, tabelas das figuras 21 (Mapa memoria Dados


PIC16F627A/628A) e 21 (Mapa memoria Dados PIC16F648A), está distribuída em
quatro bancos, que também contêm os registos de uso geral 13 , e os registos com
funções especiais14. Os SFRs estão presentes nas primeiras 32 posições de memória
de cada Banco. Os GPRs, estão implementados como RAM estática de uso geral.
A tabela da figura 19 (Distribuição da RAM pelos Bancos de memoria) mostra
os registos de uso geral disponíveis em cada Banco.

PIC16F627A/628A PIC16F648A
Banco 0 20h - 7Fh 20h - 7Fh
Banco 1 A0h - FFh A0h - FFh
Banco 2 120h - 14Fh, 170h - 17Fh 120h - 14Fh
Banco 3 1F0h - 1FFh 1F0h - 1FFh

Fig. 19 - Distribuição da RAM pelos Bancos de memoria

Endereços F0 - FFh, 170h - 17Fh e 1F0h - 1FFh estão implementados como


RAM comum, e estão mapeados nos endereços 70h - 7Fh.
A tabela da figura seguinte mostra como aceder aos registos de uso geral, via
bits de registo de STATUS, RP1 e RP0.

RP1 RP0
Banco 0 0 0
Banco 1 0 1
Banco 2 1 0
Banco 3 1 1

Fig. 20 - Acesso aos Bancos de Memória

13
GPR - General Purpose Registers
14
SFR - Special Function Registers

- 29 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 21 – Mapa de memória de dados do PIC16F628A

- 30 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 22 - Mapa da memória de Dados do PIC16F648A

- 31 - © 2005 Primetec – Engenharia de Sistemas, Lda.


3.2.2.1. Memória de uso geral – RAM

A RAM está organizada em 224 x 8 bytes nos PIC16F627A/628A, e 256 x 8


bytes no PIC16F648A. Cada um destes pode ser acedido, directa ou indirectamente,
através do Registo de Selecção de Registo – FSR15.

3.2.2.2. Registos com funções especiais

Os SFRs são registos usados pelo CPU e pelos periféricos, para informações
de estado e para controlar a operação destes. Estes registos são RAM estática.

Fig. 23 - Registos de Função Especial, Banco 0

15
FSR - File Select Register

- 32 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 24 - Registos de Função Especial, Banco 1

- 33 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 25 - Registos de Função Especial, Banco 2

- 34 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 26 - Registos de Função Especial, Banco 3

3.2.2.2.1. Registo STATUS

O registo de STATUS contém o estado aritmético da ALU, o estado do Reset,


e os bits de escolha de banco de RAM da memória de dados. Este registo comporta-se
como um registo normal, isto é, pode ser escrito por qualquer instrução. Se o registo
de STATUS for destino de instrução que afecta os bits Z, C ou DC, então, a escrita
para estes três bits é desactivada. Estes bits são activados/desactivados, de acordo com
a lógica do chip. Por conseguinte, o resultado de uma instrução com o STATUS como
destino, pode ser diferente do esperado.

- 35 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 27 – Registo STATUS (endereço: 03h, 83h, 103h, 183h)

Como exemplo, a instrução CLRF STATUS limpará os três bits superiores, e


activará o bit Z. Isto deixará o STATUS como 000uu1uu, onde u significa, sem
alteração.

Assim, é recomendado que apenas as instruções BCF, BSF, SWAPF e MOVWF


sejam usadas para alterar o registo STATUS, devido a estas instruções não alterarem
nenhum bit do mesmo.

- 36 - © 2005 Primetec – Engenharia de Sistemas, Lda.


3.2.2.2.2. Registo OPTION

O registo OPTION é passível de escrita/leitura, que contém os bits de controlo


do divisor do TMR0/WDT, interrupção externa RB0/INT, e os pull-ups da porta B.

Fig. 28 - Registo OPTION (endereço: 81h, 181h)

- 37 - © 2005 Primetec – Engenharia de Sistemas, Lda.


3.2.2.2.3. Registo INTCON

O registo INTCON é passível de escrita/leitura, e contém os bits16 de controlo


e monitorização para algumas fontes de interrupção, excepto do comparador. Isto é,
são os bits que controlam a resposta do PIC, quando ocorrem interrupções.

Os bits de Flag são activados quando ocorre uma interrupção,


independentemente de os próprios bits de activação da interrupção estarem activados.

Fig. 29 - Registo INTCON (endereço: 0Bh, 8Bh, 10Bh, 181h)

16
Bits normalmente chamados de Flags

- 38 - © 2005 Primetec – Engenharia de Sistemas, Lda.


3.2.2.2.4. Registo PIE1

Este registo contém bits que activam/desactivam as interrupções. Isto é,


informam o CPU da resposta que este deve ter, quando ocorre uma interrupção, que
foi habilitada por esse mesmo bit.

Fig. 30 - Registo PIE1 (endereço: 8Ch)

- 39 - © 2005 Primetec – Engenharia de Sistemas, Lda.


3.2.2.2.5. Registo PIR1

Este registo contém Flags de interrupções. Os bits de Flag são activados


quando ocorre uma interrupção, independentemente do estado dos bits de activação da
interrupção estarem activados, ou o do bit de activação geral, GIE (INTCON<7>). O
software escrito pelo utilizador, deverá ter em atenção que as Flags das interrupções
deverão ser limpas (desactivadas), antes de activar a interrupção respectiva.

Fig. 31 - Registo PIR1 (endereço: 0Ch)

- 40 - © 2005 Primetec – Engenharia de Sistemas, Lda.


3.2.2.2.6. Registo PCON

Este registo contém Flags para distinguir entre um Reset de alimentação


(Power-on), Reset externo MCLR', Reset por Watchdog, ou Reset de queda de tensão
(Brown-out). É neste registo, também, que se controla a dupla velocidade do oscilador
interno INTOSC.

Fig. 32 - Registo PCON (endereço: 8Eh)

O BOR' é desconhecido quando de RESET de POWER-ON. Deverá ser


activado e lido, via software, de cada vez que ocorre um RESET, para verificar se o
BOR' foi limpo, indicando que ocorreu um RESET por Brown-Out17.

3.3. Contador de programa

As instruções são, normalmente, gravadas sequencialmente na memória de


programa, e o Contador de Programa18 é um registo contador crescente, que tem o
valor de actual instrução do programa. Este contador crescente é, também, chamado
de Ponteiro das Instruções.
Como o PC está ligado à memória de programa e ao barramento de dados do
CPU, a ALU pode ser usada para manipular este registo e, romper com a ordem de

17
RESET por abaixamento da tensão de alimentação
18
PC - Program Counter

- 41 - © 2005 Primetec – Engenharia de Sistemas, Lda.


contagem sequencial do mesmo. Desta maneira, instruções GOTO e CALL podem ser
utilizadas.
O PC está localizado na memória de dados, registo 02h, e é chamado de
19
PCL . Isto significa que pode ser acedido, e manipulado, pelo software, da mesma
maneira que outro qualquer registo. Por exemplo, se o conteúdo do registo W for n, a
instrução addwf 2, f vai escrever o PC com o seu valor original, adicionado do
valor n. Esta é uma instrução de Salto, disponível nas instruções do PIC.
Um GOTO computacional é feito se se adicionar um offset20 ao PC (addwf
PCL).

Existe um problema neste exemplo, que acontece devido ao PC ser de 13 bits,


e o registo 02h apenas contém os 8 bits menos significativos, PC[7..0]. Os 5 bits
mais significativos, PC[12..8], estão contidos num registo que não é directamente
acessível pelo utilizador. Na verdade, qualquer instrução que escreve directamente
para o registo 02h, muda todos os 13 bits dos PC. Não só os 8 bits provenientes da
instrução addwf 2, f vão ser colocados no byte inferior do PC, mas os cinco bits
menos significativos do registo 0Ah, chamado de PCLATH21, são automaticamente
copiados para dentro do byte superior do PC.

O registo PCLATH é limpo de cada vez que ocorre um RESET, e uma


instrução ADDWF como a do exemplo seguinte, vai resultar num endereço da primeira
página de 256 bytes, da memória de programa, a não ser que o PCLATH tenha sido
carregado com um valor diferente de 0. Sendo assim, é necessário cuidado quando da
alteração do estado do PC desta maneira, especialmente se o resultado exceder o
campo de 8 bits. Quando se faz uma leitura de tabela, usando o método de GOTO
computacional, deverá haver o cuidado de fazer com que a mesma não ultrapasse a
fronteira de memória do PCL22.
movlw 0x00 ;carrega W com 0
call tabela ;chama a subrotina da tabela, para
; converter

movlw 0x01 ;carrega W com 0


call tabela ;chama a subrotina da tabela, para
; converter
goto $

org 0x00fe ;endereco onde estah a TABELA

tabela
addwf pcl,f ;adiciona W ao Program Counter - Contador
; de Programa
retlw 'a' ;caracter ASCII 'a'
retlw 'e'
retlw 'i'
retlw 'o'
retlw 'u'

19
Program Counter Low byte
20
positivo ou negativo
21
Program Counter LATch High byte
22
em blocos de 256 bytes

- 42 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Instruções que, indirectamente, alterem o valor do PC, tais como GOTO, vão
também usar parte do conteúdo do PCLATH quando actualizam o PC. Essas
instruções têm um endereço de 11 bits, como parte do código de instrução. Nesta
situação, os bits PCLATH[4:3] são movidos para os bits correspondentes 11 e 12 do
PC, para uma actualização completa de 13 bits no mesmo.

Fig. 33 - Carregamento do Contador de programa em diferentes situações

3.4. Stack

A família PIC com core de 14 bits tem uma Stack 23 de 13 bits, que é
exclusivamente usada para guardar endereços de retorno de subrotinas 24 . Esta
estrutura, mostrada na figura 18, é conhecida como Stack de Hardware. Esta Stack não
pertence ao mapa de memória, por isso, o seu conteúdo não pode ser alterado.
Associado a esta Stack, existe um contador de 3 bits, que aponta para o
seguinte registo livre, da mesma. Este Ponteiro de Stack - SP25 não pode ser alterado
por nenhuma instrução, mas é automaticamente incrementado de cada vez que uma
instrução CALL é executada. CALL é similar à instrução GOTO, mas antes de o
endereço de destino ser posto no PC, o valor actual do PC é empurrado para a Stack.
Este é o endereço da instrução depois da instrução CALL, pois o PC já foi
incrementado, e o PIC já está a ler a próxima instrução para o barramento, ao mesmo
tempo que a instrução CALL é executada – ver figura 16 do capítulo 2 (ciclos de
relógio).

23
Pilha ou acumulador de endereços
24
Os cores de 12 bits têm Stack de 11 bits, e os cores de 16 bits têm Stack de 16 níveis de profundidade
25
Stack Pointer

- 43 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 34 - Utilização da Stack para guardar os endereços de retorno

Na figura 34 a situação é mostrada depois de uma chamada à subrotina DELAY


100ms. A sequência de execução desta é:

1. Empurra os 13 bits do PC, para o registo da Stack apontado pelo SP. Este
endereço é o da instrução a seguir CALL.
2. O SP é incrementado.
3. O destino da subrotina DELAY 100ms, que é o endereço de entrada na
subrotina, apaga o valor original do PC. Na verdade, isto faz com que a
execução do programa salte para a subrotina.

Aparte de empurrar o endereço de retorno para dentro da Stack, nos passos 1 e


2, o CALL comporta-se exactamente como um GOTO. Então, o CALL necessita de
dois ciclos de relógio, para executar a instrução, pois, o barramento tem de ser limpo,
para remover a instrução seguinte que já está pronta a executar.
O ponto de saída de uma subrotina, deverá ser através da instrução RETURN.
Isto inverte o processo de carregamento da Stack, feito pelo CALL, e move o endereço
de retorno, que está na Stack, para o PC. A sequência de execução do RETURN será a
seguinte:

1. Decremento do SP.
2. Copia o endereço que está no registo de Stack, apontado pelo SP, para o
PC.

- 44 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 35 - Comportamento da Stack quando de execução de Subrotinas

3.5. Modos de endereçamento

Antes de se falar das instruções suportadas pelo PIC, devemos falar do


conceito de Modo de Endereçamento. A maioria das instruções actua directamente
nos dados, que podem ser internos ao CPU ou na memória de dados. Então, a
localização desses dados deve fazer parte da instrução. Não seria suficiente escrever
CLR 26 ? Mas limpar o quê? Há diversas maneiras de especificar a localização dos
dados a trabalhar. Estas são conhecidas como Modos de Endereçamento.

3.5.1 Inerente

Das instruções listadas no Apêndice 1 as CLRWDT, RETFIE, NOP, RETURN, e


SLEEP não se referem a registo de dados na memória ou no W.

3.5.2. Registo Directo

Neste modo, o endereço do registo de dados, tanto a origem como o destino, é


directamente especificado. Por exemplo:

clrf 20h ;Limpa o conteúdo do registo 20h

26
Clear - Limpar

- 45 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Em muitos casos, o mesmo registo pode ser origem e destino. Então:

incf 20h, f ;Lê o conteúdo do registo 20h,


; adiciona 1 e põe o resultado no
; registo 20h

ou então:

incf 20h, w ;Põe o conteúdo do registo 20h,


; adiciona 1 e põe o resultado no

A característica principal, deste modo de endereçamento, é o de que a


localização do operando é fixa, como uma parte integral do programa, e não pode ser
alterada durante a execução. Especificar o seu endereço pode parecer a opção
correcta, em algumas situações esta técnica é extremamente desvantajosa.

- 46 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 36 - Mapa de memória de armazenamento de dados

- 47 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 4
(4) Assembler PIC16

- 48 - © 2005 Primetec – Engenharia de Sistemas, Lda.


4.1. Definições de assembler PIC16

A linguagem assembler PIC16 tem 35 instruções divididas por tipos de


operações, que são elas:

¾ Movimento de dados
¾ Manipulação de registos
¾ Controlo de fluxo de programa
¾ Nenhuma operação
¾ Controlo do microcontrolador
¾ Operações lógicas
¾ Operações aritméticas

Num programa em Assembler, tal como numa qualquer linguagem de


programação de alto nível, existem várias regras de sintaxe que têm de ser cumpridas.
O Assembler é, na verdade, a linguagem de programação do microcontrolador. Isto
significa que existe uma ligação directa de cada instrução com a arquitectura interna
do microcontrolador.

Quando se inicia um programa, devem ser incluídos, em primeiro ligar, todos


os ficheiros auxiliares onde constam funções necessárias ao funcionamento do
programa principal. A directiva include serve para isso mesmo.

#include <p16f628A.INC> ;Se o ficheiro estiver na


; directoria pré-definida do
; MPLab
ou

#include “p16f628A.INC” ;Se o ficheiro estiver noutra

A directiva define serve para adicionar constantes ao programa. Esta


funcionalidade que o assembler da Microchip nos dá é muito útil para definir valores
constantes que são utilizados várias vezes durante todo o programa. O utilizador, em
vez de escrever o valor, escreve o nome da constante. Assim, basta substituir no início
o valor uma vez, que o novo valor passa a vigorar em todo o programa.

#define JAN 0x1F ; O mês de Janeiro tem 31 dias


#define FEV 0x1C ; O mês de Fevereiro tem 28 dias
#define MAR 0x1F ; O mês de Março tem 31 dias
#define ABR 0x1E ; O mês de Abril tem 30 dias
#define MAI 0x1F ; O mês de Maio tem 31 dias
#define JUN 0x1E ; O mês de Junho tem 30 dias
#define JUL 0x1F ; O mês de Julho tem 31 dias
#define AGO 0x1F ; O mês de Agosto tem 31 dias
#define SET 0x1E ; O mês de Setembro tem 30 dias
#define OUT 0x1F ; O mês de Outubro tem 31 dias
#define NOV 0x1E ; O mês de Novembro tem 30 dias
#define DEZ 0x1F ; O mês de Dezembro tem 31 dias

- 49 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A directiva __config serve para configurar os bits do microcontrolador. A
palavra é constituída por dois traços em baixo, seguida de config, sem espaços. As
opções que se seguem, estão no ficheiro .INC também incluído no programa.

__CONFIG _XT_OSC & _BODEN_OFF & _CP_OFF & _WDT_OFF

Fig. 37 – Lista de configurações do microcontrolador PIC16F628A

A directiva ORG serve para definir o endereço da memória de programa a


partir do qual ficam registadas as instruções escritas desse ponto em diante.

ORG 0x0000 ;Endereço de arranque da memória de


;programa

A directiva EQU serve para definir variáveis ou nomes de constantes. Para


definir variáveis, são necessárias duas coisas: nome da variável e posição de memória
que irá ocupar.

- 50 - © 2005 Primetec – Engenharia de Sistemas, Lda.


TEMPO equ 0x20 ;Variável TEMPO que fica guardada na
;posição de memória 0x20

movlw TEMPO ;Carrega o valor 0x20 em W

ou

movwf TEMPO ;Guarda na posição de memória 0x20


; (TEMPO) o conteúdo de W

A Directiva END é obrigatória em todo e qualquer programa feito em


Assembler. Esta directiva indica que terminou o código do programa e deve ser
colocada na linha imediatamente a seguir à última instrução.

TEMPO equ 0x20 ;Variável TEMPO que fica guardada na


;posição de memória 0x20
...
movlw TEMPO ;Carrega o valor 0x20 em W
...

END

Para entender bem a mecânica das instruções de Assembler é preciso perceber


o tipo de parâmetros que as constituem. As letras utilizadas nos parâmetros são:

• f - Registos
• d - Destino
0 - Registo W
1 - Registo normal
• k - Constante numérica
• k - Label
• b - Bit
• b - Binário
• d - Decimal

4.1.1. Movimento de dados

Estas instruções dizem respeito às operações de transferência de informação


entre registos.

MOVLW k Carrega W com constante


MOVF f,d Copia conteúdo registo seleccionado para W ou f
MOVWF f Copia conteúdo de W para registo seleccionado

- 51 - © 2005 Primetec – Engenharia de Sistemas, Lda.


4.1.2. Modificação do conteúdo de registos

As instruções apresentadas na tabela seguinte permitem a alteração do


conteúdo de registos. São operações de incremento, decremento, manipulação de bits:
set e clear, rotação.

CLRF f Limpa registo seleccionado


CLRW Limpa W
COMF f,d Complementa registo seleccionado todos os 1's para 0, e
todos os 0's para 1. Resultado em W ou f
DECF f,d Decrementa registo. Resultado em W ou f
INCF f,d Incrementa registo. Resultado em W ou f
BCF f,b Limpa bit seleccionado, no registo seleccionado
BSF f,b Activa bit seleccionado, no registo seleccionado
RLF f,d Roda bits do registo seleccionado, uma posição para a
esquerda, bits rodam pela Carry. Resultado em W ou f.
RRF f,d Roda bits do registo seleccionado, uma posição para a
direita, bits rodam pela Carry. Resultado em W ou f.
SWAPF f,d Troca MSB e LSB do registo seleccionado. Resultado
colocado em W ou f.

4.1.3. Controlo do fluxo de programa

Estas instruções permitem tomar decisões que interferem directamente no


desenrolar do programa. Através de testes a bits com ou sem incrementos e
decrementos, são tomadas as decisões de salto de programa ou prosseguimento
normal.

GOTO k Vai para endereço ou label


CALL k Chama subrotina
RETURN Retorna de subrotina
RETLW k Retorna de subrotina, carrega W com constante
RETFIE Retorna de interrupção
BTFSC f,b Testa bit especificado, no registo seleccionado, salta
próxima instrução se bit testado for 0.
BTFSS f,b Testa bit especificado, no registo seleccionado, salta
próxima instrução se bit testado for 1.
DECFSZ f,d Decrementa registo, salta próxima instrução se registo for
0. Destino em W ou f
INCFSZ f,d Incrementa registo, salta próxima instrução se Registo for
0. Destino em W ou f

- 52 - © 2005 Primetec – Engenharia de Sistemas, Lda.


4.1.4. Nenhuma operação

Esta é a instrução que não faz nada. É útil em situações onde o cumprimento
de períodos temporais é absolutamente fundamental.

NOP Não faz nada durante um ciclo de relógio

4.1.5. Controlo de micro-controlador

Estas instruções dão ordens ao microcontrolador. É possível limpar o


watchdog e o prescaler para impedir um reset, ou colocar o microcontrolador a
dormir, para poupar energia.

CLRWDT Limpa temporizador watchdog, prescaler. Bits TO e


PD do registo STATUS ficam a 1.
SLEEP Adormece o micro-controlador para reduzir consumo
de energia. Acorda por Reset, timer de watchdog, ou
estímulos externos.

4.1.6. Operações lógicas

Estas são as instruções encarregues de executar as operações lógicas.

ANDLW k AND do conteúdo de W com a constante.


ANDWF f,d AND do conteúdo de W com o registo seleccionado
IORLW k OR do conteúdo de W com a constante
IORWF f,d OR do conteúdo de W com o registo seleccionado
XORLW k XOR do conteúdo de W com a constante
XORWF f,d XOR do conteúdo de W com o registo seleccionado

- 53 - © 2005 Primetec – Engenharia de Sistemas, Lda.


4.1.7. Operações aritméticas

Estas são as instruções que executam operações aritméticas: somas e


subtracções.

ADDWF f,d Soma conteúdos de W e do registo


seleccionado, resultado em W ou f
ADDLW k Soma constante a W. Resultado em
W
SUBLW k Subtrai W da constante. Resultado
em W
SUBWF f,d Subtrai W ao registo seleccionado.
Resultado em W ou f

A seguinte tabela mostra todos os comandos disponíveis, a par com a sua


descrição, número de ciclos de relógio, instruções em formato 14 bit, e bits do
STATUS que são afectados aquando da sua execução:

Fig. 38 – Lista de instruções Assembler

- 54 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 5
(5) MPLab IDE da Microchip

- 55 - © 2005 Primetec – Engenharia de Sistemas, Lda.


5.1. Projecto em MPLab

O MPLab IDE da Microchip é a ferramenta de desenvolvimento que o


fabricante disponibiliza aos programadores. Este ambiente de desenvolvimento conta
já com 6 gerações e muitos anos de experiências, aperfeiçoamentos, adição de novas
tecnologias, que o tem mantido a par dos melhores IDE que existem, para inúmeras
linguagens de programação.
Para criar um novo projecto no MPLab, abra o menu ‘Project’ e
carregue em ‘New...’. Vai aparecer uma janela como a que é apresentada em seguida:

Fig. 39 – Criação de um novo projecto

Nesta janela introduza o nome do projecto que está a criar e escolha uma
directoria para gravar todos os ficheiros relativos ao mesmo. Nesta altura, deverá
aparecer-lhe numa segunda janela, normalmente encostada ao canto superior
esquerdo, toda a informação relativa aos ficheiros do projecto.

Fig. 40 – Janela de ficheiros agregados ao projecto

- 56 - © 2005 Primetec – Engenharia de Sistemas, Lda.


O ficheiro ‘Display.mcp’ é o ficheiro principal do projecto criado. Dentro
deste, poderão agora ser incluídos diversos ficheiros de source (código fonte), header
(cabeçalhos), object (objectos), library (bibliotecas) e linker scripts.
O próximo passo será agora abrir um novo ficheiro onde será escrito o código
principal do programa. Para tal, abra o menu File e carregue em New. Uma nova
janela vazia aparecerá. Antes de começar a escrever código, grave esta janela, mesmo
vazia, de forma a escolher já o nome e tipo para o ficheiro.
Como o ficheiro será o principal, sugere-se o nome main.asm.

Fig. 41 – Introdução do nome do ficheiro principal de código fonte

Depois de gravado, já temos o ficheiro em disco, mas ainda não o temos


associado ao novo projecto. Para associar o ficheiro ao projecto vá ao menu Project e
carregue em ‘Add Files to Project...’. Na janela que se abre, seleccione o ficheiro
main.asm que gravou mesmo há instantes.
Se tudo correr bem, repare agora que o ficheiro main.asm já aparece na janela
que contém todos os ficheiros associados ao projecto, como pode ver na Fig. 42 –
Ficheiro principal adicionado ao projecto.

- 57 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 42 – Ficheiro principal adicionado ao projecto

Neste momento, e antes de começar a escrever código fonte do seu programa,


é necessário configurar no MPLab o microcontrolador que vai utilizar. Abra o menu
Configure e carregue em ‘Select Device’. Na janela que se abre escolha então o
modelo de microcontrolador, como mostra a figura 43.

Fig. 43 – Escolha do micro-controlador

- 58 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Também no menu de configuração pode abrir a janela de ‘Configuration Bits’
que permite configurar todos os bits configuração do microcontrolador. Note que esta
janela apresentará conteúdos diferentes, já que cada modelo de microcontrolador tem
uma configuração específica. A figura 44 mostra a janela de configuração de bits do
16F628A, o microcontrolador estudado neste manual.

Fig. 44 – Janela de Bits de Configuração do microcontrolador 16F628A

5.2. Compilação do código fonte

Pode compilar o código fonte do seu programa em qualquer altura. Mesmo


que não tenha nada escrito, o processo de compilação é efectuado à mesma. Após
concluída a operação, a janela principal de compilação apresenta a lista de avisos e
erros ocorridos.
Os avisos apenas advertem o utilizador para possíveis problemas que possam
ocorrer no futuro, mas não originam falha de compilação.
Os erros originam uma falha no processo de compilação e não deixam seguir
em frente até que sejam corrigidos pelo utilizador.
Para facilitar a busca e correcção dos erros, é possível seleccionar um erro da
lista, carregar nele com o botão do rato. A janela de edição do código fonte salta para
a frente e o cursor é posicionado no local exacto onde ocorreu o erro.
Para compilar o código fonte do projecto em curso abra o menu Project e
carregue em ‘Build All’. Se a compilação for concluída, fica disponível ao utilizador
um ficheiro geral de listagem ( Absolute Listing ) de ocupação da memória do micro-
controlador, onde pode ser consultada a localização de todas as instruções do
programa, após terem sido endereçadas pelo compilador.
Como por vezes há tabelas incluídas no código que atravessam as páginas de
memória, o programa deixa de funcionar correctamente. Este problema foi descrito no
capítulo 3. Nestes casos, a consulta da lista geral de programa é importante para
perceber onde poderá ter ocorrido o problema. A figura 7 mostra a janela de
compilação do programa.

- 59 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 45 – Janela de Output da compilação

Para consultar a lista completa do código abra o menu View e carregue em


‘Program Memory’.

5.3. Simulador ( Debugger )

O MPLab tem um simulador incluído ( Debugger ) que permite executar o


código fonte, no computador. Para activar o debugger do MPLab abra o menu
debugger e carregue em ‘Select Tool...’. Seleccione a posição ‘MPLab SIM’. Nesta
altura aparecem novos botões na toolbar do MPLab e no menu debugger.
Para executar o código carregue em ‘Run’ no menu debugger. Para parar a
execução de código carregue em ‘Halt’.
É possível observar variáveis utilizadas no programa enquanto o simulador
cumpre as instruções. Esta função é útil para perceber o estado do conteúdo das
variáveis e verificar se o código fonte escrito está correcto.
Para observar uma variável abra o menu View e carregue em ‘Watch’. Na
janela que se abre escolha as funções, variáveis de sistema ou variáveis pessoais que
pretende observar. A figura 46 mostra um exemplo de observação de símbolos,
variáveis de sistema e variáveis pessoais.

Fig. 46 – Janela de observação de variáveis

- 60 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Durante a simulação o utilizador tem acesso também à janela Simulator Trace
que permite visualizar todas as instruções em pormenor, registos afectos e outras
informações relevantes.
A figura seguinte mostra a janela do Simulator Trace.

Fig. 47 – Janela do Simulator Trace

5.4. Programação do circuito-integrado

O MPLab permite também programar o microcontrolador para o qual se está a


desenvolver código. A versão actual do MPLab apenas suporta os programadores da
marca (Microchip). Para seleccionar um dos 3 programadores disponíveis, abra o
menu Programmer e carregue em Select Programmer. Nesta altura seleccione um dos
modelos suportados. Por omissão, o MPLab não tem nenhum programador
seleccionado.
Para utilizar outro programador não suportado pelo MPLab, terá de utilizar um
software próprio que normalmente acompanha o hardware.

- 61 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 6
(6) Funções e registos internos

- 62 - © 2005 Primetec – Engenharia de Sistemas, Lda.


6.1. Temporizadores e divisores temporais

Os temporizadores são dispositivos internos ao microcontrolador capazes de


fazer contagens. Esta função é útil quando queremos que o programa desenvolva uma
acção, repetidas vezes com um tempo de espera entre elas, ou mesmo quando
queremos efectuar uma pausa de um tempo determinado. Quando trabalhamos sinais
de uma dada frequência, que tem um período associado (T = 1/f), temos de utilizar um
temporizador que nos faça a pausa certa, de modo que a frequência gerada ou
capturada, possa ser a mais correcta possível.
O PIC16F628A dispõe de três temporizadores. Cada um deles é explicado em
seguida.

6.1.1. Timer 0

O módulo Timer0 contém um temporizador/contador de 8 bits com


possibilidade de leitura e escrita do valor. Além disso, existe a possibilidade de
escolher qual a fonte de sinal de contagem, se interna ou externa.
A figura seguinte mostra uma versão simplificada do módulo.

Fig. 48 – Módulo Timer 0

No registo OPTION existe um bit, T0CS (OPTION<5>), que quando levado a


0, selecciona o modo de incrementação de temporizador. Neste modo, o valor do

- 63 - © 2005 Primetec – Engenharia de Sistemas, Lda.


registo TMR0 do temporizador Timer0 incrementará a cada ciclo de relógio do
microcontrolador. Se, num dado instante é escrito algum valor no registo TMR0,
então a sua contagem (incremento) permanecerá inalterada durante dois ciclos. Só
passado esse tempo é retomada a incrementação do registo.
O modo de contador é seleccionado quando se coloca o bit T0CS
(OPTION<5>) a 1. Neste modo, o registo TMR0 fará incrementos sucessivos a cada
flanco ascendente ou descendente do sinal aplicado no pino RA4/T0CKI do micro-
controlador. O tipo de flanco ao qual o contador é sensível, é seleccionado pelo BIT
T0SE (OPTION<4>). Se este bit for colocado a 0, fica seleccionado o flanco
ascendente para o incremento do registo TMR0 do contador.

6.1.2. Divisores

Para utilizar com os temporizadores/contadores existe internamente no


PIC16F628A um divisor (prescaler) que permite dividir as contagens por n vezes. O
temporizador Timer0 dispõe de um divisor de 8 bits, pelo que as contagens podem ser
divididas até 256 vezes. Para configurar o divisor atribuem-se valores aos bits PS0-
PS2 (OPTION<2:0>), mediante a seguinte tabela:

Bits TMR0 WDT


000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128

Fig. 49 – Tabela de valores e correspondências do prescaler

BCF STATUS, RP0 ;Pode ser ignorado


;se estivermos no
;Bank 0
CLRWDT ;Apagar WDT
CLRF TMR0 ;Apagar TMR0 e
;Prescaler
BSF STATUS, RP0 ;Bank 1
MOVLW '00101110’b ;
;PS<0:2> é carregado
MOVWF OPTION_REG ;com o valor 110

Fig. 50 - Programação do valor do divisor (prescaler)

- 64 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A tabela seguinte resume os registos do micro-controlador que estão
associados ao funcionamento do temporizador Timer0. A sua consulta é
imprescindível para que nenhuma configuração seja esquecida, quando se pretende
utilizar este módulo.

Fig. 51 – Registos associados ao módulo Timer0

6.1.3. Timer 1

O módulo Timer1 contém um temporizador/contador de 16 bits. Este


temporizador tem dois registos, o TMR1H e o TMR1L, que em conjunto formam o
registo TMR1. Este par de registos tem possibilidade de leitura e escrita do conteúdo e
pode assumir valores entre 0000h e FFFFh.
A figura seguinte apresenta o esquema simplificado do módulo Timer1.

Fig. 52 – Módulo Timer1

- 65 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Quando se utiliza este temporizador com uma interrupção (Interrupções -
Capitulo 11), este é gerada por ocorrência de um overflow no registo TMR1. Nesta
altura o bit TMR1IF (PIR1<0>) é colocado no nível lógico 1. Esta interrupção pode
ser ligada/desligada configurando o bit TMR1IE (PIE1<0>).
Tal como o módulo Timer0, também o Timer1 pode ser utilizado como
temporizador ou contador. O modo de operação é escolhido, configurando o bit
TMR1CS (T1CON<1>).

Fig. 53 – Registo TCON1 do módulo Timer1

O temporizador pode ser activado colocando o bit TMR1ON no nível lógico 1,


ou desactivado, colocando o mesmo bit no nível lógico 0.
Existe adicionalmente um modo de reiniciar este temporizador a partir do
módulo de Captura/Comparadores/PWM do microcontrolador. Este módulo é tratado
mais à frente neste capítulo.
O módulo Timer1 tem um oscilador interno que pode ser activado colocando
bit T1OSCEN (T1CON<3>) no nível lógico l. Neste caso os pinos RB6 e RB7
tornam-se inputs, sendo ignoradas as configurações TRISB<7:6>. Este oscilador está
preparado para receber um cristal de 32.768kHz nos pinos RB6 e RB7. Devem

- 66 - © 2005 Primetec – Engenharia de Sistemas, Lda.


adicionalmente ser ligados dois condensadores cerâmicos de 15pF entre cada pino do
cristal e a massa eléctrica do circuito.

6.1.4. Timer1 em modo de Temporizador

Para utilizar o módulo Timer1 como temporizador, é necessário colocar o bit


TMR1CS (T1CON<1>) no nível lógico 0. Neste modo, o par de registos TMR1
incrementa a cada ciclo de relógio do micro-controlador (Fosc/4). Desta forma, o bit
T1SYNC (T1CON<2>) não tem qualquer efeito já que o relógio interno está sempre
em sincronismo.
Em seguida apresenta-se um pedaço de código assembler que demonstra como
programar o PIC16F628A para utilizarmos o Timer1 em modo de temporizador.

movlw b'00110101' ; bit 7-6: N/A


; bit 5-4: 11 ->Prescale 1:8
; bit 3: Oscilador do Timer1 desligado
; bit 2: Não sincronizar relogio externo
; bit 1; Relogio interno Fosc/4
; bit 0: Liga o Timer1
movwf T1CON ; Guarda o valor no registo T1CON
bsf PIE1, 0 ; Activa a interrupção TMR1IE

Fig. 54 – Utilização do Timer1 em modo de temporizador

No código apresentado, o Timer1 irá disparar a interrupção TMR1IF. No


vector de interrupção poderá ser adicionado código de tratamento da função que se
pretende que seja executada.

6.1.5. Timer1 em modo de Contador

Para utilizar o módulo Timer1 como contador, é necessário colocar o bit


TMR1CS (T1CON<1>) no nível lógico 1. Em seguida existem duas hipóteses para a
contagem:

- Pino RB7/T1OSI quando o bit T1OSCEN é colocado no nível lógico 1


- Pino RB6/T1OSO/T1CKI quando o bit T1OSCEN é colocado no nível
lógico 0

Se o bit T1SYNC (T1CON<2>)está a 0, então o relógio de entrada do


contagem é sincronizado com os impulsos internos. Este processo de sincronização é
feito após o estágio de prescaler. Neste modo, o registo TMR1 não é incrementado se
o PIC16F628A estiver em modo adormecido (Sleep Mode). No entanto, o prescaler
continua a ser incrementado.

- 67 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A tabela seguinte resume os registos do microcontrolador que estão associados
ao funcionamento do temporizador Timer1. A sua consulta é imprescindível para que
nenhuma configuração seja esquecida, quando se pretende utilizar este módulo.

Fig. 55 – Registos associados ao módulo Timer1

6.1.6. Timer2

O módulo Timer2 é um temporizador de 8 bits com prescaler e postscaler.


Este temporizador tem a particularidade de poder ser utilizado como base de tempos
para o módulo de PWM, também descrito mais à frente neste capítulo.
A figura seguinte apresenta o esquema simplificado do módulo Timer2.

Fig. 56 – Módulo Timer2

O registo TMR2 permite a leitura e escrita do valor e é apagado na sequência


de um RESET do micro-controlador.
Existe a possibilidade de fazer divisão de 1:1, 1:4 ou 1:16 ao relógio interno
do micro-controlador, utilizando o prescaler do Timer2.
Adicionalmente, este módulo dispõe de um registo de 8 bits, o PR2, cujo valor
pode ser programado. O objectivo deste registo é de parar a contagem, o valor do

- 68 - © 2005 Primetec – Engenharia de Sistemas, Lda.


registo TMR2 e PR2 se igualam. Neste altura, o valor de TMR2 volta a 00h na
contagem seguinte. O registo PR2 é inicializado com o valor FFh no arranque
(RESET) do micro-controlador.
A fase final da contagem do Timer2 é o postscaler de 4 bits que controla as
interrupções originadas por este temporizador. Os valores do postscaler vão de 1:1 até
1:16.
Para desligar o Timer2, é necessário colocar o bit TMR2ON (T2CON<2>) no
nível lógico 0. Esta opção permite minimizar o consumo de energia.
Os valores do prescaler e postscaler são apagados quando qualquer uma das
situações acontece:

- Escrita de um valor no registo TMR2


- Escrita de um valor no registo T2CON

O resultado do TMR2 é injectado no módulo USART, quando configurada


para trabalhar em modo síncrono. Esta temporização pode ser utilizada no processo de
desvio de bits da SSP (shift clock).
A tabela seguinte resume os registos do micro-controlador que estão
associados ao funcionamento do temporizador Timer2. A sua consulta é
imprescindível para que nenhuma configuração seja esquecida, quando se pretende
utilizar este módulo.

Fig. 57 – Registos associados ao módulo Timer2

¾ Contagem de 1 segundo com o Timer1

Este exemplo ensina a fazer uma contagem com o temporizador Timer1, de


modo a termos um intervalo de 1 segundo com precisão. Como o temporizador
Timer1 tem 16 bits, significa que é capaz de contar de 0 até 2^16, ou seja, 65535.
Se estivermos a utilizar um cristal de 4MHz, o relógio interno do micro-
controlador é de 1MHz. O período desta frequência é de 1 µs. Ora, 65535 vezes 1 µs
são obviamente 65535 µs. Isto significa que temos de contar até 1000000 para atingir
1 segundo. Como temos o prescaler do temporizador, podemos dividir o relógio até 8
vezes, ou seja cada contagem representa 8 µs. O valor do temporizador passa para
65535x8 µs = 524280 µs.

- 69 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Com duas contagens completas do Timer1 atingimos 1s. Neste caso, vamos
ver no código seguinte como é feita a contagem.

contador1 equ 20h ; Variavel de contagem

movlw 00h ;
movwf TRISB ; PORTB como outputs
movlw 02h ; Valor para contador
movwf contador1; Grava o valor
movlw 0Bh ; Valor para TMR1H
movwf TMR1H ; Grava o valor
mowlw DBh ; Valor para TMR1L
movwf TMR1L ; Grava o valor
; O valor programado é 3035
; que é = 65536-62500
; 62500 * 8 = 500000us
movlw b'00110101' ; bit 7-6: N/A
; bit 5-4: 11 ->Prescale 1:8
; bit 3: Oscilador do Timer1 desligado
; bit 2: Não sincronizar relógio externo
; bit 1: Relogio interno Fosc/4
; bit 0: Liga o Timer1
movwf T1CON ; Guarda o valor no registo T1CON
bsf PIE1, 0 ; Activa a interrupção TMR1IE

No vector de interrupção utiliza-se uma variável adicional para fazer a


contagem de 2. Após cada contagem de 2, cumprimos o tempo de 1s. Os valores de
TMR1H e TMR1L devem ser repostos a cada interrupção, mostra o pedaço de código
que lá deve constar.

org 0004h

movf contador1, 0 ; Move o valor de contador1 para W


btfss STATUS, Z ; Testa se contador igual a 0
goto mesma_contagem ;
movlw 01h ;
xorwf PORTB, 1 ; Comuta o pino RB0 (Toggle)

return

mesma contagem:

movlw 0Bh ; Valor para TMR1H


movwf TMR1H ; Grava o valor
mowlw DBh ; Valor para TMR1L
movwf TMR1L ; Grava o valor
movlw b'00110000' ; Prescaler 1:8
xorwf T1CON ; Repõe o valor do prescaler
bsf PIE1, 0 ; Activa a interrupção TMR1IE

- 70 - © 2005 Primetec – Engenharia de Sistemas, Lda.


6.2. Módulo de captura/comparadores/PWM

O módulo CCP1 é composto por um registo de 16 bits que pode funcionar


como registo de captura, comparação ou master/slave de Duty Cycle. Este registo é
composto por dois registos de 8 bits cada, o CCPR1L e CCPR1H.
O registo CCP1CON controla o funcionamento deste módulo. Todos os
registos permitem leitura e escrita dos seus conteúdos.

Para utilizar o módulo nos modos de captura, comparação ou PWM, são


necessários temporizadores. A tabela seguinte apresenta a origem dos temporizadores
utilizados em cada um dos modos.

Fig. 58 - Registo CCP1 de temporizadores

Fig. 59 – Registo CCP1CON

- 71 - © 2005 Primetec – Engenharia de Sistemas, Lda.


6.2.1. Módulo de Captura

Para utilizar o modo de captura, o pino RB3 do PIC16F628A deve estar


configurado como input, utilizando o registo TRISB.
Quando ocorre um evento no pino RB3, o registo de 16 bits
CCPR1H:CCPR1L captura o valor do temporizador Timer1. Um evento do pino RB3
pode ser definido como:

• Todos os flancos descendentes


• Todos os flancos ascendentes
• De 4 em 4 flancos ascendentes
• De 16 em 16 flancos ascendentes

Para seleccionar que tipo de evento, em que queremos que desencadeie uma
captura, é necessário configurar os bits CCP1M3:CCP1M0 (CCP1CON<3:0>).
Quando uma captura é feita, o bit CCP1IF (PIR<2>) é colocado automaticamente no
nível lógico 1. Se ocorre uma nova captura, sem que o valor do registo CCP1R seja
lido, o valor da captura anterior é perdido.

Fig. 60 – Modo de Captura

- 72 - © 2005 Primetec – Engenharia de Sistemas, Lda.


6.2.2. Módulo de Comparação

Este módulo contém dois comparadores analógicos. As entradas para os


comparadores são multiplexadas nos pinos RA0 a RA3.
O registo CMCON permite controlar os multiplexer de entrada e saída deste
módulo. Existem diversas formas de fazer a ligação destes comparadores.

Fig. 61 – Registo CMCON

- 73 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A figura seguinte apresenta as várias formas como os circuitos internos dos
comparadores podem tomar.

Fig. 62 – Modos de operação do módulo de comparação

- 74 - © 2005 Primetec – Engenharia de Sistemas, Lda.


São necessários uma série de passos para configurar o módulo de comparação
de forma completa.

FLAG_REG EQU 0X20


CLRF FLAG_REG ;Iniciar o registo de flags
CLRF PORTA ;Iniciar PORTA
MOVF CMCON, W ;Carregar em W os bits do
;registo CMCON
ANDLW 0xC0 ;Adiciona uma mascara com os
;bits a alterar neste registo
IORWF FLAG_REG,F ;Guarda em CMCON a nova config.
MOVLW 0x03 ;Inicia em modo de comparador
MOVWF CMCON ;CM<2:0> = 011
BSF STATUS,RP0 ;Selecciona Bank1
MOVLW 0x07 ;Configura TRISA
MOVWF TRISA ;Set RA<2:0> como entradas
;RA<4:3> como saidas
;TRISA<7:5> lê sempre como ‘0’
BCF STATUS,RP0 ;Selecciona Bank0
CALL DELAY10 ;Pausa de 10µs
MOVF CMCON,F ;Lê CMCON para alterar
;condição de mudança
BCF PIR1,CMIF ;Apaga interrupts pendentes
BSF STATUS,RP0 ;Selecciona Bank1
BSF PIE1,CMIE ;Activa interrupções do comparador
BCF STATUS,RP0 ;Selecciona Bank0
BSF INTCON,PEIE ;Activa interrupções de perifericos
BSF INTCON,GIE ;Activa interrução geral

Quando o valor do Vin+ é inferior ao valor do Vin-, teremos na saída do


módulo, nível lógico baixo (0). Por outro lado, quando o valor do Vin+ é superior ao
valor do Vin-, teremos na saída do módulo, nível lógico alto (1). Existem no entanto
áreas de sombra, ou indecisão, em que o nível lógico seja incerto ou intermitente. Este
fenómeno ocorre perto as zonas de transição de estados. Aconselha-se neste caso, que
os sinais de entrada estejam, em termos de amplitudes, longe da amplitude de
comparação, para que se possa ter ambos os níveis lógicos, bem definidos, na
comparação.

No funcionamento do comparador, pode ser utilizado um sinal externo de


referência. Este sinal tem de estar situado entre VSS e VDD. O PIC disponibiliza
internamente o sinal de referência. No que diz respeito às interrupções, o módulo de
comparação desencadeia uma interrupção sempre que haja uma mudança de estado no
valor de saída do comparador. O programa do utilizador deve monitorizar os registos
CMCON<7:6> para saber onde houve alteração. O bit CMIF do registo PIR<6> é a
FLAG de interrupção do comparador. Este bit informa o utilizador de que ocorreu
uma mudança de estado no comparador.

O módulo de comparação também funciona quando o PIC está adormecido


(Sleep Mode). Nestas situações, quando ocorre uma mudança de estado no
comparador, a interrupção dispara e o PIC acorda.

Atenção! O circuito que é ligado ao PIC, aos pinos do módulo de comparação,


não deve ter mais de 10 kΩ de impedância.

- 75 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A figura seguinte apresenta o esquema interno da porta de entrada do módulo
de comparação e da ligação de componentes externos.

Fig. 63 – Esquema de ligação de circuitos externos ao módulo de comparação

Para a configuração do módulo de comparação, apresenta-se na figura seguinte


a lista de registos associados ao módulo de comparação.

Fig. 64 – Registos associados ao módulo de comparação

No modo de comparador o registo CCPR1 de 16 bits é comparado


constantemente com o valor do registo TMR1, também de 16bits. Quando ocorre uma
igualdade, o pino RB3/CCP1 será:

• Colocado a nível lógico 1;


• Colocado a nível lógico 0;
• Permanece inalterado;

A acção a realizar no pino RB3/CCP1 é baseada na configuração dos bits


CCP1M3:CCP1M0 (CCP1CON<3:0>). Nesse instante em que ocorre o evento, o bit
CCP1IF é colocado em nível lógico 1. A operação do bloco de comparador pode ser
observada na figura 66.

- 76 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 65 – Diagrama de blocos do módulo comparador

A tabela seguinte apresenta a lista dos registos que estão associados aos modos
de Captura, Comparador e Timer1.

Fig. 66 – Registos associados aos módulos de captura/comparação e Timer1

- 77 - © 2005 Primetec – Engenharia de Sistemas, Lda.


6.2.3. Módulo de PWM

O PWM (Pulse Width Modulation) permite gerar ondas quadradas com


variação da largura de impulsos. Esta variação significa alterar o Duty Cycle da onda.
Esta técnica é muito utilizada para fazer controlo de equipamentos externos, como por
exemplo, variador de potência numa lâmpada, controlar o movimento de motores,
actuação de contadores, etc.
No modo de PWM, o PIC envia para o pino RB3/CCP1 a onda gerada
internamente. Desta forma, torna-se necessário configurar o bit TRISB<3> para o
nível lógico 0, de forma que seja uma saída (output).
A figura seguinte apresenta o esquema de funcionamento do bloco de PWM.

Fig. 67 – Esquema de blocos do módulo de PWM

A onda de saída de PWM tem uma dada frequência/período. Num período


completo de onda, existe uma percentagem em que tensão de saída está no nível
lógico 1, ao qual se chama (Duty Cycle). A frequência de trabalho é o inverso do
período completo:

1
F= [Hz ]
T

A figura seguinte apresenta a forma de onda de PWM. Pode observar-se os


tempos de Duty Cycle, Off e também o Período. O período da onda PWM é definido
configurando o registo PR2.

- 78 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 68 – Forma de onde de saída do gerador PWM

A fórmula apresentada em seguida, mostra como se pode calcular o período, e


consequentemente, a frequência da onda de PWM.

Período do PWM = [( PR 2) + 1]* 4 * Tosc * TMR 2 prescaler value

Quando o valor do registo TMR2 é igual ao PR2, acontecem 3 eventos,


aquando do ciclo de incremento:

O registo TMR2 é apagado


O pino RB3/CCP1 é colocado no nível lógico 1 (excepção: se o Duty Cycle do
PWM for 0%, o pino RB3/CCP1 não será colocado a nível lógico 1)
O Duty Cycle é passado do registo CCPR1L para o CCPR1H

Atenção: O valor do postscaler do Timer2 não entra na fórmula de cálculo do


período da onda de PWM.

6.2.3.1. Duty Cycle do PWM

A configuração do valor de Duty Cycle é feita, escrevendo o valor pretendido


nos registos CCPR1L e CCP1CON<5:4>. A onda de PWM gerada tem desta forma,
uma resolução de 10 bits. Os 8 bits de maior peso MSB's, são guardados no registo
CCPR1L e os últimos 2 bits de menor peso são guardados nos bits CCP1CON<5:4>.
Em seguida apresenta-se a fórmula de calcular o Duty Cycle da onda de
PWM, baseada no valor escrito nestes registos, bem como a frequência de oscilação

- 79 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Tosc e também o valor guardado no prescaler do TMR2 (ver secção XX deste capítulo
onde é abordado o Timer2).

Duty Cycle do PWM = (CCPR1L : CCP1CON < 5 : 4 > ) * Tosc * TMR 2 prescaler value

Os registos CCPR1L e CCP1CON<5:4> podem ser escritos em qualquer


altura. No entanto, o novo valor de Duty Cycle só será actualizado quando ocorrer
uma igualdade entre o valor do registo TMR2 e PR2. O registo CCPR1H é de leitura
apenas.
Quando ocorre uma igualdade detectada pelo comparador do módulo, entre o
registo CCPR1H + 2 bits, e os 8 bits do TMR2 concatenados com 2 bits oriundos de
um clock interno ou com 2 bits do prescaler, o pino RB3/CCP1 é colocado no nível
lógico 0.
Neste caso, a máxima resolução em bits do PWM, é dada pela fórmula
apresentada na figura seguinte:

⎛ Fosc ⎞
log⎜ ⎟
⎜ FPWM * TMR 2 prescaler value ⎟
Re solução do PWM = ⎝ ⎠ [bits ]
log(2)

Atenção: Se o Duty Cycle do PWM é maior do que o período, o pino


RB3/CCP1 nunca será colocado no nível lógico 0.

Para se configurar o módulo de PWM, devem então executar-se os seguintes


passos:

1. Configurar o registo PR2, para estabelecer o valor do período


da onda de PWM

2. Configurar o registo CCPR1L e os bits CCP1CON<5:4>, para


estabelecer o valor do Duty Cycle

3. Configurar o pino RB3/CCP1 como saída (output)

4. Configurar o registo TMR2, para estabelecer o valor do


prescaler e activar o Timer2 através do registo T2CON

5. Activar o módulo de PWM para iniciar o seu funcionamento

- 80 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A figura seguinte apresenta os registos associados ao funcionamento do
módulo de PWM e Timer2.

Fig. 69 – Registos associados ao módulo de PWM e Timer2

- 81 - © 2005 Primetec – Engenharia de Sistemas, Lda.


6.3. Módulo de comunicações USART

As comunicações série têm sido bastante utilizadas em todo o mundo. Desde o


aparecimento da porta RS232 (standard da EIA) e consequente implementação nos
mais diversos sistemas informáticos, esta porta de comunicações pode ser encontrada
em inúmeros sistemas electrónicos embebidos, para comunicação com periféricos.
A tecnologia tem evoluído e consigo, a velocidade máxima que se consegue
obter neste tipo de porta de comunicações.
Os PIC implementam há já vários anos, portas de comunicações USART. Tem
havido também uma evolução constante nas portas implementadas no silício, já que a
crescente capacidade de processamento dos microcontroladores, tem também
permitido implementar USART's cada vez mais rápidas. O PIC16F628A dispõe de
uma porta série USART capaz de comunicar até 500kbit/s quando utilizado um cristal
de 20MHz.
Esta porta pode ser configurada para trabalhar em modo síncrono ou
assíncrono, full-duplex ou half-duplex, de forma que se possa comunicar com
terminais de PC's, conversores A/D e D/A, módulos Ethernet ou USB, leitores de
cartões, modems GSM/GPRS, memórias EEPROM, LCD's, entre tantos outros
existentes no mercado.
O registo TXSTA do PIC16F628A permite configurar o modo de
funcionamento da porta USART. A configuração mais comum para trabalhar com
periféricos é em modo assíncrono, 8 bits. A figura seguinte apresenta os bits do
registo TXSTA. Está também presente o bit TRMT que indica o estado do shift-
register do emissor.

- 82 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 70 – Registo TXSTA

O registo RCSTA também contém bits de configuração relacionados com a


porta USART. Nele é necessário configurar o SPEN RCSTA<7> que, quando
colocado a 1, indica que que a porta está ligada. A porta pode ser colocada em modo
de recepção contínua, colocando a 1, o bit CREN RCSTA<4>. A figura seguinte
apresenta o registo RCSTA.

- 83 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 71 – Registo RCSTA

A velocidade que a porta USART funciona é configurada através de um


cálculo prévio. Esta velocidade depende directamente da frequência do oscilador do
PIC.

- 84 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fosc
Baud Rate desejado =
64( x + 1)
16000000
9600 =
64( x + 1)
x = 25.042

16000000
Baud Rate calculado = = 9615
64(25 + 1)

( Baud Rate calculado) − ( Baud Rate desejado)


Erro = = 0.16%
9600

Fig. 72 – Cálculo do valor SPBRG

O resultado do cálculo efectuado, que tem como variáveis, a frequência do


oscilador e a velocidade que se pretende, é um valor inteiro arredondado. A conta
pode ser feita novamente com o valor x obtido, de forma a encontrar-se o valor da
velocidade real que terá a porta. A partir deste valor, calcula-se o erro cometido, em
percentagem.

O valor x encontrado, deve ser escrito no registo SPBRG, endereço 0x99h, de


forma a configurar no PIC a velocidade da porta USART. Quando isto é feito, o
temporizador BRG é reiniciado. Isto garante que a porta USART não aguarda por um
overflow do temporizador para utilizar a nova velocidade.

- 85 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A tabela seguinte apresenta uma lista de valores para o registo SPBRG obtidos
para diferentes velocidades de oscilador, para a porta USART em modo síncrono.

Fig. 73 – Valores de SPBRG possíveis, para diferentes baud rates, em modo síncrono

- 86 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A tabela seguinte apresenta uma lista de valores para o registo SPBRG obtidos
para diferentes velocidades de oscilador, para a porta USART em modo assíncrono.

Fig. 74 - Valores de SPBRG possíveis, para diferentes baud rates, em modo


assíncrono

- 87 - © 2005 Primetec – Engenharia de Sistemas, Lda.


6.3.1. USART em modo assíncrono

Neste modo de funcionamento, a porta USART utiliza um formato NRZ


standard com 1 start bit e 8 ou 9 bits de dados. O modo mais comum, utilizado é o de
8 bits. O PIC transmite primeiros os bits de menor peso (LSb). A paridade não é
suportada em hardware. Portanto, se se pretende transmitir neste modo, terá de ser
implementada por software. O nono bit pode ser utilizado com bit de paridade.
Em modo assíncrono, a USART desliga-se se o PIC entrar em modo sleep.
Para colocar a USART em modo assíncrono, o bit SYNC (TXSTA<4>) deve
ser colocado no nível lógico zero. A figura seguinte apresenta o esquema de blocos do
emissor da porta USART.

Fig. 75 – Módulo de emissão da USART

O registo TXREG recebe os dados a serem transmitidos. Quando a informação


é transmitida, o registo TXREG é limpo pelo PIC e o bit TXIF é colocado no nível
lógico 1. Pode ser activada a interrupção deste bit TXIF para controlo da emissão de
dados. Esta configuração é feita através do bit TXIE (PIE1<4>). A flag TXIF não
pode ser apagada por software. Ela só será apagada quando o registo TXREG for
carregado com novos dados. Existe também o registo TRMT que dá informação do
estado do registo TSR (shift-register da porta USART).
A emissão da porta USART é activada activando o bit TXEN (TXSTA<5>).
Se se apagar o bit TXEN durante uma transmissão, a porta TX/RB2 passa ao estado
de alta impedância.

- 88 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Em seguida apresentam-se os passos resumidos, que devem ser tomados para
configurar a porta USART em modo assíncrono, para emissão:

1. Colocar a 0 o bit TRISB<2> para modo output

2. Inicializar o registo SPBRG com o baudrate apropriado. Se se tratar


de uma velocidade alta, colocar a 1 o bit BRGH

3. Colocar a 0 o bit SYNC para obter modo assíncrono e colocar a 1 o


bit SPEN

4. Se se pretender interrupções na porta, activar o bit TXIE

5. Se se pretender utilizar 9bits, colocar a 1 o bit TX9

6. Activar a transmissão através do bit TXEN, colocando-o a 1

7. Em modo de 9bits, o nono bit deve ser carregado no bit TX9D

8. Carregar os dados a transmitir, no registo TXREG ( é iniciada a


transmissão)

A figura seguinte apresenta o esquema de blocos do receptor da porta USART.

Fig. 76 – Módulo de recepção da USART

- 89 - © 2005 Primetec – Engenharia de Sistemas, Lda.


É possível receber dois bytes de cada vez com o receptor da porta USART.
Quando é detectado o stop bit, se o registo RCREG que guarda os dados de chegada,
estiver ainda cheio, o PIC coloca o bit de erro OERR a 1. Isto significa que o buffer
excedeu a capacidade e perderam-se dados. Quando isto acontece, este bit deve ser
apagado manualmente por software. Por outro lado, se um stop bit é detectado mas
em nível 0, o bit FERR é colocado a 1 pelo PIC. Quando se lê um byte do buffer de
entrada, o RCREG, são colocados novos valores nos bits RX9D e FERR. É
importante ler sempre o conteúdo do registo RCSTA antes de fazer uma leitura de
dados do receptor, para que não se percam os dados de FERR e RX9D de bytes
anteriores.
Em seguida apresentam-se os passos resumidos, que devem ser tomados para
configurar a porta USART em modo assincrono, para recepção:

1. Colocar os bits TRISB<1> a 1 e TRISB<2> a 0, para configurar os


pinos de TX e RX da porta USART

2. Inicializar o registo SPBRG com o baud rate apropriado. Se se tratar


de uma velocidade alta, colocar a 1 o bit BRGH

3. Colocar a 0 o bit SYNC para obter modo assincrono e colocar a 1 o


bit SPEN

4. Se se pretender interrupções na porta, activar o bit RCIE

5. Se se pretender utilizar 9bits, colocar a 1 o bit RX9

6. Activar a transmissão através do bit CREN, colocando-o a 1

7. A flag RCIF será activada quando a recepção de um byte está


completa. Surgirá a interrupção se o bit RCIE estiver activo

8. Ler o byte recebido através do registo RCREG. Como o shift-


register suporta 2 bytes, o segundo fica a ser pronto a ler,
imediatamente a seguir a ser lido o primeiro

9. Se ocorrer algum erro, apagar o bit CREN para voltar ao estado


normal da porta

- 90 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A figura seguinte apresenta os registos associados ao módulo de comunicações
USART:

Fig. 77 – Registos associados ao módulo de comunicações USART

6.4. Memória de dados EEPROM

A memória de dados EEPROM pode ser lida e escrita, durante o


funcionamento normal do PIC. Esta memória não está directamente mapeada no mapa
de registos do PIC. A EEPROM tem de ser endereçada indirectamente através dos
registos SFR. Existem 4 registos SFR que são:

- EECON1
- EECON2
- EEDATA (Não implementado fisicamente)
- EEADR

O registo EEDATA guarda 1 byte de dados para emissão e/ou recepção. O


EEADR guarda o endereço da posição de memória da EEPROM a aceder. O
PIC16F628A tem 128bytes de EEPROM internos. A gama de endereços de memória
EEPROM vão de 0x00 a 0x7F. A figura seguinte mostra o conteúdo do registo
EEDATA.

Fig. 78 – Registo EEDATA

- 91 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Para endereçar um byte de dados na memória EEPROM, devem ser
configurados os 7 bits EEADR<6:0>.
O registo EECON1 tem os bits de configuração e controlo. Os bits RD e WR
iniciam operações de leitura e escrita, respectivamente. Estes bits só podem ser
activados. O PIC apagá-los-á quando terminam as operações. Quando o bit WREN é
activado, permitirá que seja feita uma escrita. Este bit encontra-se a 0 quando o PIC
arranca. O bit WRERR é activado pelo PIC quando uma operação de escrita é
interrompida por um Reset /MCLR ou Watchdog. Nestas situações, o utilizador pode
verificar no arranque, se o bit WRERR está activo.
O bit EEIF do registo PIR1 é activado pelo PIC quando uma operação de
escrita é concluída. Este bit tem de ser apagado por software.

6.4.1. Ler a EEPROM

Para ler a memória EEPROM, o utilizador deve escrever no registo EEADR, o


endereço de memória pretendido. Depois, deve activar o bit RD. A informação fica
disponível no registo EEDATA, no ciclo de clock seguinte.

BSF STATUS, RP0 ;Banco 1


MOVLW CONFIG_ADDR ;
MOVWF EEADR ;Endereço a ler
BSF EECON1, RD ;Leitura da EEPROM
MOVF EEDATA, W ;W = EEDATA
BCF STATUS, RP0 ;Banco 0

6.4.2. Escrever na EEPROM

Para escrever na memória EEPROM, o utilizador deve escrever no registo


EEADR, o endereço de memória pretendido e o byte a escrever, no registo EEDATA.
Depois, a sequência apresentada em seguida, deve ser cumprida:

BSF STATUS, RP0 ;Banco 1


BSF EECON1, WREN ;Activa a escrita
BCF INTCON, GIE ;Desactiva as interrupções
MOVLW 55h ;
MOVWF EECON2 ;Escreve 55h
MOVLW AAh ;
MOVWF EECON2 ;Escreve AAh
BSF EECON1,WR ;Activa bit WR
;Inicia a escrita
BSF INTCON, GIE ;Activa interrupções

O registo WREN deve ser activado para permitir a escrita. Quando a sequência
de escrita é concluída, a flag EEIF é activada pelo PIC.

- 92 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 7
(7) Funções especiais

- 93 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Para lidar com as necessidades de aplicações em tempo real, as funções
especiais dos micro-controladores, são os que os diferencia uns dos outros.
A família PIC 16F6xx tem uma panóplia destas funções, que maximizam a
funcionalidade e credibilidade dos sistemas onde estão instalados, minimizando
componentes externos, energia e protecção do programa interno.

7.1. Bits de configuração

Os bits de configuração podem ser, ou não, programados para configurar o


chip para determinadas funções. Estes bits estão mapeados no endereço 0x2007, no
mapa de memória de programa, e são apenas acessíveis durante a programação.
A figura seguinte apresenta a lista de configurações do PIC16F628A.

Fig. 79 – Lista de Bits de configuração do microcontrolador PIC16F628A

- 94 - © 2005 Primetec – Engenharia de Sistemas, Lda.


7.2. Configurações do Oscilador

O oscilador pode ter oito modos de funcionamento diferente, que se podem


verificar pelos bits FOSC2:FOSC0, no registo de Configuração.

Fig. 80 - Registo de Configuração

- 95 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Tipos de Osclilador:

• LP – Cristal em baixo consumo


• XT – Cristal/Ressoador
• HS – Cristal/Ressoador de alta velocidade
• RC – Resistência/Condensador externos
• INTOSC – Oscilador de precisão, interno
• EC – Entrada de relógio, externo

7.2.1. Oscilador a Cristal/Ressoador

Nos modos XT, LP ou HS, um cristal/ressoador é ligado aos pinos OSC1 e


OSC2, para estabelecer oscilação.

Fig. 81 – Oscilador a cristal

7.2.2. Entrada de relógio externo

Para aplicações em que um relógio externo existe, o pino de OSC1 pode ser
directamente ligado ao mesmo.

Fig. 82 – Oscilador por relógio externo

- 96 - © 2005 Primetec – Engenharia de Sistemas, Lda.


7.2.3. Oscilador RC - versões 16F6xxA

Quando temporizações precisas não são necessárias, o oscilador RC está


disponível. O funcionamento desce oscilador é dependente da tensão de alimentação,
dos valores da resistência e condensador, e da temperatura ambiente.

Fig. 83 – Oscilador com malha Resistência/condensador

7.2.4. Oscilador ER - versões 16F62x

Quando temporizações precisas não são necessárias, o oscilador ER está


disponível, bastando, para isso, ligar uma resistência à massa, que vai controlar a
frequência de oscilação, através da uma corrente DC imposta por esta mesma
resistência.
O funcionamento desce oscilador é dependente de unidade para unidade, da
tensão de alimentação, e da temperatura ambiente.
Os valores aconselhados a resistência situam-se entre os 38k e os 1 MOhm.
Fora destes valores, o oscilador torna-se instável, e muito sensível a ruído.

Fig. 84 – Oscilador interno

- 97 - © 2005 Primetec – Engenharia de Sistemas, Lda.


7.2.5. Modo de Dupla Velocidade de oscilador

Um modo de oscilação, com Dupla Velocidade, programável por software,


está disponível nesta série de PIC’s, quando estes estão configurados no modo
INTOSC. Esta funcionalidade permite comutar, dinamicamente, entre os 4MHz e os
37kHz nominais.
Aplicações que necessitem de baixo consumo, mas que não permitam pôr o
chip em modo SLEEP, podem usar este modo.
O bit OSCF, no registo PCON, é usado para controlar o modo de Dupla
Velocidade.

7.3. Reset

Os PIC’s têm várias formas de reset ao chip:

• Reset de restabelecimento de energia – POR (Power-on Reset)


• Reset de pino MCLR’, durante operação normal
• Reset de pino MCLR’, durante modo SLEEP
• Reset de Watchdog, durante operação normal
• Reset de Watchdog, durante modo SLEEP
• Reset de queda de tensão – BOR (Brown-out Reset)

Alguns registos não são afectados em nenhuma condição de reset; o seu estado
é desconhecido no POR, e não modificado em qualquer outro reset. Os outros registos
são modificados no POR, BOR, MCLR’ e Watchdog normal; não são modificados no
Watchdog SLEEP, pois este reset é visto como um resumo de uma operação normal.
Os bits TO’ e PD’ são activados/desactivados em diferentes situações de reset,
conforme a Tabela 8.1, e são usados pelo software, para saber que tipo de reset
ocorreu.

- 98 - © 2005 Primetec – Engenharia de Sistemas, Lda.


A figura seguinte apresenta um diagrama de blocos simplificado dos circuitos
de reset internos:

Fig. 85 – Diagrama de blocos simplificado dos circuitos de reset internos

Fig. 86 – Bits de estado e seu significado

- 99 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Fig. 87 – Registos associados ao Reset

7.4. Interrupções

Esta série de PIC’s tem dez fontes de interrupção:

• Interrupção externa no pino RB0/INT


• Término do TMR0
• Mudança nos pinos RB7:RB4
• Comparador
• USART fim de transmissão
• USART byte recebido
• CCP
• Término do TMR1
• Igualdade de TMR2
• Fim de escrita/leitura de EEPROM

O registo de controlo de interrupções INTCON grava as interrupções, através


da activação de bits. Tem também activação de interrupções individuais ou globais.
O bit de interrupções globais, GIE, activa ou desactiva todas as interrupções
activadas individualmente, e é desactivado quando de um Reset.
Quando uma interrupção ocorre, GIE é desactivado para evitar que futuras
interrupções ocorram, o endereço de retorno é carregado na Stack, e o PC é carregado
com o endereço de interrupção, 0x0004. Quando dentro da rotina de interrupção, se
tenta por software, descobrir a origem da interrupção, através dos bits da mesma,
deverá ser extinta a dita interrupção, aquando da reactivação do funcionamento das
interrupções, para evitar que haja uma falsa reentrada na zona de atendimento de
interrupções, logo a seguir. As interrupções são tratadas mais à frente no capítulo 11
deste manual.

- 100 - © 2005 Primetec – Engenharia de Sistemas, Lda.


7.5. Temporizador Watchdog - WDT

Este temporizador é um oscilador RC de contagem livre, que não necessita de


componentes externos, mesmo sendo separado do oscilador RC do pino CLKIN. Isto
significa que o WDT irá funcionar, mesmo que o relógio nos pinos OSC1 e OSC2,
estiver parado; por exemplo, quando da execução do modo SLEEP.
Durante operação normal, o WDT gera um reset do chip, enquanto que se o
chip estiver em modo SLEEP, o WDT acorda-o deste modo, e resume a operação
normal.
O WDT pode ser permanentemente desactivado, desligando o bit WDTE.
O WDT tem um período nominal de 18ms sem divisor. Este valor depende
muito de factores externos, tais como temperatura, tensão de alimentação e diferenças
entre chips. Um período de 2.3seg, nominal, pode ser alcançado, se for usado o
divisor.
As instruções CLRWDT e SLEEP limpam o WDT e o pós-divisor, e evitam o
seu término antecipado, que iria gerar um Reset.

Fig. 88 – Diagrama de blocos do temporizador Watchdog

Fig. 89 – Registos associados ao temporizador Watchdog

- 101 - © 2005 Primetec – Engenharia de Sistemas, Lda.


7.6. Modo SLEEP – Power Down

O modo de SLEEP é executado pela instrução SLEEP. As portas I/O mantêm


os estados que tinham, antes da instrução ser iniciada. Para menores consumos de
energia, neste modo, todos os pinos I/O devem ser ligados ao Vdd/Vss e, os
periféricos não usados, deverão ser desactivados.

7.6.1. Acordar do modo SLEEP

O chip pode acordar do modo SLEEP, das seguintes maneiras:

• Reset externo no pino MCLR’


• Término do temporizador Watchdog
• Interrupção no pino RB0/INT, mudança na porta B, ou diferentes
periféricos.

O primeiro evento irá causar um Reset, enquanto que os dois últimos são
considerados, uma continuação da execução do programa. Os bits TO’ e PD’ podem
ser usados para determinar a causa do Reset.

Quando a instrução SLEEP é executada, a instrução seguinte é lida porque, se


o bit GIE estiver desactivado, o chip continua a execução do programa na instrução a
seguir ao SLEEP. Se o bit GIE estiver activado, o chip executa a instrução seguinte ao
SLEEP, e posiciona-se no endereço de interrupção 0x0004. Nos casos onde a
execução da instrução seguinte ao SLEEP, não é desejada, deverá ser usada a
instrução NOP a seguir ao SLEEP.

- 102 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 8
(8) Utilização das portas

- 103 - © 2005 Primetec – Engenharia de Sistemas, Lda.


8.1. Direcção das portas

A direcção de cada pino das portas (entrada/saída) é controlada por um registo


especial chamado TRISA e TRISB, de 8 bits cada um.
Carregando um ‘0’ nos bits dos registos TRISA/B, faz com que o pino
correspondente seja uma saída; o valor da latch de saída no respectivo pino.
Carregando com ‘1’, torna o pino numa entrada; o driver de saída em alta impedância.
Quando ocorre um Reset, os registos TRISA/B estão configurados como
entradas, e as entradas dos comparadores estão forçadas à massa, para reduzir o
consumo energético.

CLRF PORTA ;Apaga a porta A


;
MOVLW 0x07 ;Desliga os
; comparadores
MOVWF CMCON ;Activa pinos para
; funcões I/O
BCF STATUS, RP1 ;
BSF STATUS, RP0 ;Banco 1
MOVLW 0x1F ;Carrega W com o valor
; a utilizar para a
MOVWF TRISA ; configuracao dos pinos
; da porta A

Fig. 90 - Inicialização da porta A

8.2. Escrita/leitura das portas

Os oito bits de uma porta podem ser lidos ao mesmo tempo, usando a
instrução MOVF portX, W. Os dados são válidos, no momento em que a porta é
lida. Os pinos de cada porta podem ser lidos independentemente, usando as instruções
BTFSC e BTFSS.
As instruções orientadas para a manipulação directa de bits, BCF e BSF, lêem
toda a porta para o CPU, mudam o bit pretendido, e volta a escrever o conteúdo do
CPU de volta para a porta. Tudo num ciclo de relógio. Este método é chamado de Lê-
Modifica-Escreve.
A porta é lida no início de cada ciclo de instrução, e escrita no fim do mesmo
ciclo. Se a escrita é imediatamente seguida de uma leitura, na mesma porta, problemas
poderão ocorrer, porque a porta necessita de tempo para estabilizar. Este problema é
ultrapassado, inserindo uma instrução NOP entre a escrita e a leitura.
Executando duas escritas consecutivas em uma porta, pode originar o mesmo
problema. De novo, inserindo um NOP, resolverá a questão.

- 104 - © 2005 Primetec – Engenharia de Sistemas, Lda.


8.3. FLAGS

Uma Flag é um registo de 1 bit, que pode ser activado (1), ou desactivado (0),
por intermédio de vários tipos de instruções. A activação/desactivação, normalmente,
é feita automaticamente. Depois da execução da instrução, a Flag em questão pode ser
testada, para saber se foi activada ou desactivada. O fluxo/decisão do software escrito,
pode depender destes testes.

Das muitas Flags existentes, nos vários registos atrás mencionados, há duas de
extrema importância, e que devem ser descritas com mais pormenor. São elas a Z
(Zero bit), e a C (Carry bit). Estas encontram-se no registo STATUS.

Fig. 91 – Exemplo de flags

8.4. Transferências de dados

O simples programa que se segue, transfere o conteúdo da porta B, para um


registo temporário:

movf portb, w ;carrega conteúdo da porta B, para o registo W


movwf temp ;carrega conteúdo de W, para registo TEMP

Todos os procedimentos de transferência de dados entre registos implicam a


utilização do registo W, como se pode ver na Figura 5.1 – Esquema de blocos do
16F6xx, porque não existe meio de transferir dados de forma directa.

O exemplo seguinte vai mandar um byte de valor aleatório, e escolhido pelo


autor, directamente para a porta B, onde poderá ser visualizado com a ajuda de
periféricos externos:

Byte a mandar, em formato binário 0011 1010


Hexadecimal 0x3 0xA

- 105 - © 2005 Primetec – Engenharia de Sistemas, Lda.


movlw 0x00 ;carrega valor 0x00 para registo W
movwf TRISB ;configura porta B, 8 saídas
movlw 0x3A ;carrega W com valor 0x3A
movwf PORTB ;carrega conteúdo de W, para porta B

Caso se queira limpar todos os bits da porta B, de uma só vez, não esquecer que a
porta B está mapeada como um registo normal, e a instrução CLRF pode ser usada
para o efeito:

clrf PORTB ;limpa todos os bits da porta B

- 106 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 9
(9) Comparação, manipulação de bits e sequências

- 107 - © 2005 Primetec – Engenharia de Sistemas, Lda.


9.1. Comparações

O conteúdo do registo W pode ser comparado com valores numéricos N, para


determinar as suas magnitudes. Uma das maneiras de o conseguir é subtraindo o
conteúdo de W, pelo valor numérico.

movlw 0xXX ;carrega W com valor 0xXX

sublw N ;subtrai conteúdo de W, do valor N.


; Resultado em W

btfsc/s status, 2 ;testa flag Z, salta se a próxima


; instrução é 0/1
...

O resultado é então:

→ Flag Zero está activada se W = N


→ Flag Zero está desactivada se W <> N

Um salto de programa pode acontecer, dependendo da programação do


código. Não esquecer que, a instrução SUBLW subtrai o W do valor numérico,
carregando em W o resultado.

Mais resultados podem ser tirados desta manipulação:

→ Flag Carry está activada se W <= N


→ Flag Carry está desactivada se W > N

Os seguintes testes podem ser feitos:

Teste Flag testada


W=N Z activado
W <> N Z desactivado
W <= N C activado
W>N C desactivado

- 108 - © 2005 Primetec – Engenharia de Sistemas, Lda.


O seguinte programa, exemplifica o método de teste de comparação:

N W Z C
W < N 0x05 0x04 0 1
W = N 0x05 0x05 1 1
W > N 0x05 0x06 0 0

STATUS equ 0x03


PORTB equ 0x06

org 0x0000

start
bsf status, 5 ;Banco 1
movlw 0x00 ;carrega W com 0x00
movwf TRISB ;configura porta B
bcf status, 5 ;Banco 0

movlw 0x04 ;carrega W com 0x04


sublw 0x05 ;subtrai W de N (0x05)

movf status,w ;carrega W com o STATUS


movwf PORTB ;mostra o STATUS na porta B

repete
goto repete ;ciclo infinito

end

Outra maneira de testar se dois bytes são iguais, é usando a instrução XORLW.
O byte a ser testado é XOR’ado com o byte de teste. Se coincidirem, a flag Z será
activada.
Outra das maneiras, é mover o registo para si mesmo, isto é, com a ajuda da
instrução MOVF registo,f. A flag Z é afectada, por conseguinte, se estiver activada
depois desta instrução, o registo é 0x00.

- 109 - © 2005 Primetec – Engenharia de Sistemas, Lda.


9.2. Manipulação de bits usando instruções de manipulação de bit

9.2.1. BIT Set/Clear

Bit set – BSF, e bit clear – BCF, operam directamente num bit, num
determinado registo. Um exemplo, o bit 3 da porta A pode ser activado:

bsf porta,3 ;activa bit 3 na porta A

Outro exemplo, desactivação do bit 6 do registo TEMP:

bcf temp,6 ;desactiva bit 6 do registo TEMP

9.2.2. Teste de BIT

Um bit num registo pode ser testado usando as instruções BTFSC e BTFSS:

btfsc temp, 3 ;testa bit 3 do registo TEMP


goto ???? ;salta se activado
;continua

Se o bit testado for 0, a instrução seguinte é saltada. Então, a instrução GOTO


posiciona o programa, noutra localização do mesmo, se o bit for 1. Caso contrário, o
programa continua em sequência.

9.3. Manipulação de bits, usando instruções lógicas

Operações lógicas são bastante úteis se, dois ou mais bits num byte, têm que
ser alterados ou testados, num ciclo de relógio.

- 110 - © 2005 Primetec – Engenharia de Sistemas, Lda.


9.3.1. Mudar bit específico para ‘1’

→ OR com um byte de todos os bits 0, excepto o bit a mudar para ‘1’


→ OR com ‘0’ deixa o bit no mesmo estado
→ OR com ‘1’ resulta em ‘1’

9.3.2. Mudar bit específico para ‘0’

→ AND com um byte de todos os bits 1, excepto o bit a mudar para ‘0’
→ OR com ‘0’ deixa o bit no mesmo estado
→ OR com ‘1’ resulta em ‘1’

9.3.3. Mudar bit específico para o seu complemento

Pode ser utilizado tanto de 0 para 1, como de 1 para 0:

→ XOR com um byte de todos os bits 0, excepto o bit a mudar para o


seu complemento
→ XOR com ‘1’ muda o bit para o seu complemento
→ XOR com ‘0’ resulta sem mudança

9.3.4. Comparação – testa para byte específico

→ XOR com o byte igual ao que se procura. Se a flag Z estiver activada,


eles são iguais.

9.3.5. Testa para ‘0’

→ OR com ‘0’, e depois testa a flag Z. Se Z estiver activado, os bytes


são iguais, e o byte testado é 0.

- 111 - © 2005 Primetec – Engenharia de Sistemas, Lda.


9.4. Sequências

A instrução RLF pode ser usada para deslocar o conteúdo do registo para a
esquerda, um bit de cada vez. Sempre que a instrução é executada, o byte desloca-se
uma posição para a esquerda, o bit mais à esquerda é movido para a flag de Carry, e o
conteúdo da flag de Carry é carregado no bit menos significante do registo.
A instrução RRF tem exactamente o mesmo procedimento, mas na direcção
oposta.
Por vezes, poderá ser necessário fazer circular um registo, sendo um requisito
para aplicações industriais, ou quando alimentando um display de LED’s.
A instrução RLF/RRF mantém o valor inicial do registo, fazendo o ciclo
completo através da Carry, e de volta, para o bit menos significativo.
Uma vez que o conteúdo da Carry é reciclado, de cada vez que usamos a
instrução RLF/RRF, a Carry deverá ser posta num estado conhecido (‘1’ ou ‘0’). Para
o fazer, basta usar a instrução BCF/BSF no bit 0 do registo STATUS (flag de Carry).

Fig. 92 - Sequência com RLF e RRF

- 112 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 10
(10) Tabelas

- 113 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Uma tabela de procura pode ser usada para converter um código para outro.
Suponhamos que queremos converter valores hexadecimais, para sinais de 7-
segmentos, para aplicar num mostrador.

HEX 7-segmentos gfe dcba


0x00 0x3F 0011 1111
0x01 0x06 0000 0110
0x02 0x5B 0101 1011
0x03 0x4F 0100 1111
0x04 0x66 0110 0110
0x05 0x6D 0110 1101
0x06 0x7D 0111 1101
0x07 0x07 0000 0111
0x08 0x7F 0111 1111
0x09 0x6F 0110 1111

O código, de 7-segmentos, pode ser retirado da tabela, usando endereçamento


relativo. Se o valor hexadecimal for somado ao PC, o valor em 7-segmentos estará
nesse endereço. O exemplo segue:

org 0x0000

start bsf status, 5 ;Banco 1


movlw 0x00 ;Carrega W com 0x00
movwf trisb ;Configura porta B
bcf status, 5 ;Banco 0
clrf portb

char movlw 0x02 ;Carrega w com 0x02


call segmnt ;Chama a subrotina que contem o código 7-
seg movwf portb ;Carrega a porta B com o valor lido na
; tabela
loop goto loop ;Ciclo infinito
;
segmnt
addwf pc,f ;Soma W ao PC
retlw 0x3f ;0 7-segmentos
retlw 0x06 ;1 7-segmentos
retlw 0x5b ;2 7-segmentos
retlw 0x4f ;3 7-segmentos
retlw 0x66 ;4 7-segmentos
retlw 0x6d ;5 7-segmentos
retlw 0x7d ;6 7-segmentos
retlw 0x07 ;7 7-segmentos
retlw 0x7f ;8 7-segmentos
retlw 0x6f ;9 7-segmentos

O processador soma o valor hexadecimal ao PC, onde este vai ser o apontador
para o código de 7-segmentos, que irá ser posteriormente posto na saída da porta B.
A instrução ADDWF soma 8 bits aos 8 bits baixos do PC, e não afecta os 5
bits altos.

- 114 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Capítulo 11
(11) Interrupções

- 115 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Quando um evento ocorre, que necessita da atenção do microcontrolador, uma
interrupção pode ser gerada, que vai fazer com que o mesmo pare o que está a
executar, execute a tarefa de interrupção, e retorne ao ponto onde estava no início.
Quando uma interrupção ocorre, a instrução que está a ser executada é
terminada, e o chip salta para o endereço 0x0004 do programa, e executa as instruções
nessa posição de memória. Este programa é chamado de rotina de interrupção. Esta
rotina de interrupção, pode fazer com que o chip guarde os dados do status do
programa que estava a executar, quando a interrupção ocorreu, para que quando voltar
ao programa principal, saiba o que estava a fazer. Então, a rotina de interrupção é
executada e quando terminar, volta a pôr o status como estava no início.
As interrupções podem ser activadas/desactivadas a dois niveis: global e
particular, e podem ser geradas interna, ou externamente.

Fig. 93 – Lógica dos circuitos de interrupções

11.1. Interrupção RB0/INT

A interrupção externa no pino RB0/INT, é activada por nível


ascendente/descendente, de acordo com o bit INTEDG. Quando um nível válido
aparece na porta RB0/INT, o bit INTF é activado. A interrupção pode ser desactivada
pelo bit INTE, e o bit INTF deve ser desactivado por software, antes de sair da rotina
de interrupção.
A interrupção RB0/INT pode acordar o chip do SLEEP, se o bit INTE for
activado antes da entrada em modo SLEEP.

- 116 - © 2005 Primetec – Engenharia de Sistemas, Lda.


11.2. Interrupção TMR0

Um término da contagem do TMR0 (0xFF -> 0x00), vai activar o bit de


interrupção TMR0, T0IF. Esta interrupção pode ser activada/desactivada pelo bit
T0IE.

11.3. Interrupção PORTB

A interrupção acontece quando há uma mudança de estado lógico, nos pinos 4,


5, 6 ou 7, da porta B, e que activa o bit RBIF.
Esta interrupção é activada/desactivada pelo bit RBIE. Apenas as portas
referidas acima, e como entradas, são usáveis.
O valor do pino de entrada, é comparado com o último valor lido na porta, e as
diferenças são OR juntas, para gerar uma interrupção RBIF.
A interrupção pode ser limpa por: desactivando o bit RBIE, ou lendo a porta
B, e depois limpando o bit RBIF. Isto termina a condição de “diferença”, e possibilita
a limpeza do RBIF.
Este tipo de interrupção é recomendada para “acordar” o chip com uso de
teclados, e operações onde a porta B é apenas usada para interrupções de mudança de
nível.

11.4. GIE – Bit de activação geral de interrupções

Quando ocorre uma interrupção, o bit de interrupção geral é desactivado,


prevenindo que futuras interrupções perturbem a execução da rotina de interrupção
em curso.
Quando da saída da mesma, pelo uso da instrução RETFIE, o bit GIE é
novamente activado.

Fig. 94 – Registos associados às interrupções

- 117 - © 2005 Primetec – Engenharia de Sistemas, Lda.


11.5. Gravação de valores de registos, quando das interrupções

Durante uma interrupção, apenas o valor do PC é gravado para a stack; os


registos W e STATUS, têm que ser gravados por software.
O exemplo seguinte demonstra como tal poderá ser feito, executando as
seguintes funções, e por ordem:

• Grava o registo W
• Grava o registo STATUS
• Executa a rotina de interrupção
• Devolve os valores ao STATUS
• Devolve os valores ao W

MOVWF W TEMP ;Copia o W para um registo


; temporario
SWAPF STATUS,W ;swap ao status. Grava em W
BCF STATUS,RP0 ;Banco 0
MOVWF STATUS_TEMP ;Grava status no registo status_temp
:
:(ISR)
:
SWAPF STATUS_TEMP,W ;swap ao STATUS_TEMP. Grava em W
; W volta ao estado inicial
MOVWF STATUS ;
SWAPF W_TEMP,F ;swap ao W_TEMP
SWAPF W_TEMP,W ;swap ao W_TEMP. Grava em W

11.6. Atraso de interrupção

Quando de uma interrupção, vai haver um atraso antes da execução da rotina


da mesma. Este atraso é de 3 a 4 ciclos de relógio.
O uso de interrupções, realça a potência do microcontrolador; podem ser
periódicas, controladas por um relógio em tempo real, ou podem estar relacionadas
com um evento tipo contador, ou eventos externos.
O microcontrolador não necessita de ficar num ciclo, à espera que algo
aconteça, por isso, pode executar outras tarefas úteis, enquanto a interrupção não
surge.

- 118 - © 2005 Primetec – Engenharia de Sistemas, Lda.


Notas:

- 119 - © 2005 Primetec – Engenharia de Sistemas, Lda.