120
Curso de Microcontroladores Microchip PIC

Curso de Micro Control Adores Microchip

Embed Size (px)

Citation preview

Page 1: Curso de Micro Control Adores Microchip

Curso de Microcontroladores Microchip PIC

Page 2: Curso de Micro Control Adores Microchip

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

Í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

Page 3: Curso de Micro Control Adores Microchip

- 2 - © 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

Page 4: Curso de Micro Control Adores Microchip

- 3 - © 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

Page 5: Curso de Micro Control Adores Microchip

- 4 - © 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

Page 6: Curso de Micro Control Adores Microchip

- 5 - © 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

Page 7: Curso de Micro Control Adores Microchip

- 6 - © 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

Page 8: Curso de Micro Control Adores Microchip

- 7 - © 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

Page 9: Curso de Micro Control Adores Microchip

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

Capítulo 1

(1) História dos Microcontroladores

Page 10: Curso de Micro Control Adores Microchip

- 9 - © 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.

Page 11: Curso de Micro Control Adores Microchip

- 10 - © 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.

MemóriaBarramento de Endereçamento

Barramento de Dados

ROM(Read Only

Memory)

RAM(Random Access

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.

Page 12: Curso de Micro Control Adores Microchip

- 11 - © 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.

Page 13: Curso de Micro Control Adores Microchip

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

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

Page 14: Curso de Micro Control Adores Microchip

- 13 - © 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.

Unidade Central de

Processamento

Memória

Entradas

Entradas Saídas

Armazenamento auxiliar

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.

Código de programa

Dados

Memória

Entradas Saídas

Unidade Central de

ProcessamentoALU

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

Page 15: Curso de Micro Control Adores Microchip

- 14 - © 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.

Dados

Memória

Entradas Saídas

Unidade Central de

ProcessamentoALU

Código de Programa

Memória

Fig. 9 – Arquitectura Harvard

Page 16: Curso de Micro Control Adores Microchip

- 15 - © 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

Page 17: Curso de Micro Control Adores Microchip

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

memória OTP3 e EPROM4 apagável por UV5. 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

Page 18: Curso de Micro Control Adores Microchip

- 17 - © 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

Page 19: Curso de Micro Control Adores Microchip

- 18 - © 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.

Page 20: Curso de Micro Control Adores Microchip

- 19 - © 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

Page 21: Curso de Micro Control Adores Microchip

- 20 - © 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

Page 22: Curso de Micro Control Adores Microchip

- 21 - © 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

Page 23: Curso de Micro Control Adores Microchip

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

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

Page 24: Curso de Micro Control Adores Microchip

- 23 - © 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.

INDF

TMR0

PCL

STATUS

FSR

PORTA

RAM

ALU

Registo W

Memória de Dados

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

Page 25: Curso de Micro Control Adores Microchip

- 24 - © 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

Page 26: Curso de Micro Control Adores Microchip

- 25 - © 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

Page 27: Curso de Micro Control Adores Microchip

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

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

Page 28: Curso de Micro Control Adores Microchip

- 27 - © 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

Page 29: Curso de Micro Control Adores Microchip

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

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

Page 30: Curso de Micro Control Adores Microchip

- 29 - © 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 geral13, 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

Page 31: Curso de Micro Control Adores Microchip

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

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

Page 32: Curso de Micro Control Adores Microchip

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

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

Page 33: Curso de Micro Control Adores Microchip

- 32 - © 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

Page 34: Curso de Micro Control Adores Microchip

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

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

Page 35: Curso de Micro Control Adores Microchip

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

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

Page 36: Curso de Micro Control Adores Microchip

- 35 - © 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.

Page 37: Curso de Micro Control Adores Microchip

- 36 - © 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.

Page 38: Curso de Micro Control Adores Microchip

- 37 - © 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)

Page 39: Curso de Micro Control Adores Microchip

- 38 - © 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

Page 40: Curso de Micro Control Adores Microchip

- 39 - © 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)

Page 41: Curso de Micro Control Adores Microchip

- 40 - © 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)

Page 42: Curso de Micro Control Adores Microchip

- 41 - © 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

Page 43: Curso de Micro Control Adores Microchip

- 42 - © 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 PCL19. 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.

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

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'

Page 44: Curso de Micro Control Adores Microchip

- 43 - © 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

Page 45: Curso de Micro Control Adores Microchip

- 44 - © 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.

Page 46: Curso de Micro Control Adores Microchip

- 45 - © 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 CLR26? 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:

26 Clear - Limpar

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

Page 47: Curso de Micro Control Adores Microchip

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

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

ou então:

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.

incf 20h, f ;Lê o conteúdo do registo 20h, ; adiciona 1 e põe o resultado no ; registo 20h

incf 20h, w ;Põe o conteúdo do registo 20h, ; adiciona 1 e põe o resultado no

Page 48: Curso de Micro Control Adores Microchip

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

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

Page 49: Curso de Micro Control Adores Microchip

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

Capítulo 4 (4) Assembler PIC16

Page 50: Curso de Micro Control Adores Microchip

- 49 - © 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.

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

#include <p16f628A.INC> ;Se o ficheiro estiver na ; directoria pré-definida do ; MPLab ou #include “p16f628A.INC” ;Se o ficheiro estiver noutra

Page 51: Curso de Micro Control Adores Microchip

- 50 - © 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.

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.

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.

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

__CONFIG _XT_OSC & _BODEN_OFF & _CP_OFF & _WDT_OFF

Page 52: Curso de Micro Control Adores Microchip

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

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.

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

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

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

Page 53: Curso de Micro Control Adores Microchip

- 52 - © 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

Page 54: Curso de Micro Control Adores Microchip

- 53 - © 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

Page 55: Curso de Micro Control Adores Microchip

- 54 - © 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

Page 56: Curso de Micro Control Adores Microchip

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

Capítulo 5 (5) MPLab IDE da Microchip

Page 57: Curso de Micro Control Adores Microchip

- 56 - © 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

Page 58: Curso de Micro Control Adores Microchip

- 57 - © 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.

Page 59: Curso de Micro Control Adores Microchip

- 58 - © 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

Page 60: Curso de Micro Control Adores Microchip

- 59 - © 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.

Page 61: Curso de Micro Control Adores Microchip

- 60 - © 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

Page 62: Curso de Micro Control Adores Microchip

- 61 - © 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.

Page 63: Curso de Micro Control Adores Microchip

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

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

Page 64: Curso de Micro Control Adores Microchip

- 63 - © 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

Page 65: Curso de Micro Control Adores Microchip

- 64 - © 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

010

011

100

101

110

111

1:4

1:8

1:32

1:16

1:64

1:128

1:256

1:2

1:4

1:8

1:32

1:16

1:64

1:128

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

Fig. 50 - Programação do valor do divisor (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

Page 66: Curso de Micro Control Adores Microchip

- 65 - © 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

Page 67: Curso de Micro Control Adores Microchip

- 66 - © 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

Page 68: Curso de Micro Control Adores Microchip

- 67 - © 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.

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.

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

Page 69: Curso de Micro Control Adores Microchip

- 68 - © 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

Page 70: Curso de Micro Control Adores Microchip

- 69 - © 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.

Page 71: Curso de Micro Control Adores Microchip

- 70 - © 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.

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.

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

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

Page 72: Curso de Micro Control Adores Microchip

- 71 - © 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

Page 73: Curso de Micro Control Adores Microchip

- 72 - © 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

Page 74: Curso de Micro Control Adores Microchip

- 73 - © 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

Page 75: Curso de Micro Control Adores Microchip

- 74 - © 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

Page 76: Curso de Micro Control Adores Microchip

- 75 - © 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.

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.

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

Page 77: Curso de Micro Control Adores Microchip

- 76 - © 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.

Page 78: Curso de Micro Control Adores Microchip

- 77 - © 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

Page 79: Curso de Micro Control Adores Microchip

- 78 - © 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:

[ ]HzT

F 1=

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.

Page 80: Curso de Micro Control Adores Microchip

- 79 - © 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.

[ ] valueprescalerosc TMRTPRPWMdoPeríodo 2**4*1)2( +=

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

Page 81: Curso de Micro Control Adores Microchip

- 80 - © 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).

( ) valueprescalerosc TMRTCONCCPLCCPRPWMdoCycleDuty 2**4:51:1 ><=

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:

( ) [ ]bitsTMRF

F

PWMdosolução valueprescalerPWM

osc

2log

2*log

Re⎟⎟⎠

⎞⎜⎜⎝

=

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

Page 82: Curso de Micro Control Adores Microchip

- 81 - © 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

Page 83: Curso de Micro Control Adores Microchip

- 82 - © 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.

Page 84: Curso de Micro Control Adores Microchip

- 83 - © 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.

Page 85: Curso de Micro Control Adores Microchip

- 84 - © 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.

Page 86: Curso de Micro Control Adores Microchip

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

%16.09600

)()(

9615)125(64

16000000

042.25)1(64

160000009600

)1(64

=−

=

=+

=

=+

=

+=

desejadoRateBaudcalculadoRateBaudErro

calculadoRateBaud

xx

xF

desejadoRateBaud osc

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.

Page 87: Curso de Micro Control Adores Microchip

- 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 síncrono.

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

Page 88: Curso de Micro Control Adores Microchip

- 87 - © 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

Page 89: Curso de Micro Control Adores Microchip

- 88 - © 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.

Page 90: Curso de Micro Control Adores Microchip

- 89 - © 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

Page 91: Curso de Micro Control Adores Microchip

- 90 - © 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

Page 92: Curso de Micro Control Adores Microchip

- 91 - © 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

Page 93: Curso de Micro Control Adores Microchip

- 92 - © 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.

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:

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

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

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

Page 94: Curso de Micro Control Adores Microchip

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

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

Page 95: Curso de Micro Control Adores Microchip

- 94 - © 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

Page 96: Curso de Micro Control Adores Microchip

- 95 - © 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

Page 97: Curso de Micro Control Adores Microchip

- 96 - © 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

Page 98: Curso de Micro Control Adores Microchip

- 97 - © 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

Page 99: Curso de Micro Control Adores Microchip

- 98 - © 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.

Page 100: Curso de Micro Control Adores Microchip

- 99 - © 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

Page 101: Curso de Micro Control Adores Microchip

- 100 - © 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.

Page 102: Curso de Micro Control Adores Microchip

- 101 - © 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

Page 103: Curso de Micro Control Adores Microchip

- 102 - © 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.

Page 104: Curso de Micro Control Adores Microchip

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

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

Page 105: Curso de Micro Control Adores Microchip

- 104 - © 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.

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.

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

Page 106: Curso de Micro Control Adores Microchip

- 105 - © 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:

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

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

Page 107: Curso de Micro Control Adores Microchip

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

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:

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

clrf PORTB ;limpa todos os bits da porta B

Page 108: Curso de Micro Control Adores Microchip

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

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

Page 109: Curso de Micro Control Adores Microchip

- 108 - © 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.

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

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

...

Page 110: Curso de Micro Control Adores Microchip

- 109 - © 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

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.

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

Page 111: Curso de Micro Control Adores Microchip

- 110 - © 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:

Outro exemplo, desactivação do 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:

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.

btfsc temp, 3 ;testa bit 3 do registo TEMP goto ???? ;salta se activado ;continua

bsf porta,3 ;activa bit 3 na porta A

bcf temp,6 ;desactiva bit 6 do registo TEMP

Page 112: Curso de Micro Control Adores Microchip

- 111 - © 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.

Page 113: Curso de Micro Control Adores Microchip

- 112 - © 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

Page 114: Curso de Micro Control Adores Microchip

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

Capítulo 10 (10) Tabelas

Page 115: Curso de Micro Control Adores Microchip

- 114 - © 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:

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.

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

Page 116: Curso de Micro Control Adores Microchip

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

Capítulo 11 (11) Interrupções

Page 117: Curso de Micro Control Adores Microchip

- 116 - © 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.

Page 118: Curso de Micro Control Adores Microchip

- 117 - © 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

Page 119: Curso de Micro Control Adores Microchip

- 118 - © 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

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.

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

Page 120: Curso de Micro Control Adores Microchip

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

Notas: