an
tó
nio sérg
microcontroladores
PIC
an
tó
nio sérg
microcontroladores
PIC
Índice de Conteúdos
COMO TUDO COMEÇOU ... 10
Microcontrolador versus Microprocessador ... 13
Conceitos Básicos ... 14
Um mundo de números ...14
Sistema de numeração Binário ...15
Sistemas de numeração Hexadecimal ...16
O código BCD...17
Conversão de Binário para Decimal ...17
Conversão de Hexadecimal para Decimal ...18
Conversão de Hexadecimal para Binário ...18
Bit ...19
Byte ...19
Circuitos Lógicos ...20
Porta lógica AND ...20
Porta lógica OR ...21
Porta lógica NOT ...21
Porta lógica EXCLUSIVE OR / XOR ...22
Registo ...23
SFR / Special Function Register - Registo de Função Especial ...23
Portas de Entrada/Saída - I/O ...24
Unidade de memória ...26
Interrupções ...27
CPU - Unidade Central de Processamento ...28
Barramento ...29
Comunicações Série ...29
Baud Rate - Velocidade de transferência ...30
Oscilador ...32 Circuito de Alimentação ...32 Temporizadores e Contadores ...33 Temporizadores / Contadores ...34 Contadores ...37 Temporizador Watchdog ...37 Conversores Analógico/Digital ...38
Arquitectura Interna ... 40
Arquitectura von-Neumann ...40
Arquitectura Harvard ...40
Conjunto de Instruções ... 42
Como escolher o microcontrolador certo para a aplicação? ... 43
Microcontroladores PIC ... 43
Microcontrolador PIC16F887 ... 44
Uma panorâmica ... 44
Descrição dos pinos ...48
CPU ...51
Memória ...52
Registos de função geral - GPR ...54
Registos de função especial - SFR ...55
Bancos de Memória ...55
Pilha de memória - Stack ...59
Sistema de interrupção ...60
Como usar os Registos de função especial - SFR ...61
Os Registos de Função Especial - SFR - do CPU ... 62
Características e Funções ... 62
Registo STATUS ...62
Registo OPTION_REG ...64
Registos do Sistema de Interrupções ...66
Registo PCON ...75
Registos PCL e PCLATH ...76
Endereçamento Indirecto ...79
Portas I/O - Entrada/Saída ... 80
Registos PORTA e TRISA ...81
Unidade ULPWU ...82
Registos PORTB e TRISB ...84
Pino RB0/INT ...87
Pinos RB6 e RB7 ...87
Registos PORTC e TRISC ...88
Registos PORTD e TRISD ...89
Registos PORTE e TRISE...89
Registos ANSEL e ANSELH ...90
Temporizadores ... 93
Temporizador TMR0 ... 93
Registo OPTION_REG... 94
Temporizador TMR1 ... 99
Divisor do TMR1 ...100 Oscilador do TMR1 ...101 Gate do TMR1 ...101 TMR1 em modo de Temporizador ...102 Oscilador do TMR1 ...103 TMR1 em modo de Contador ...104 Registo T1CON ...105Temporizador TMR2 ... 106
Registo T2CON ...108Módulos CCP ... 110
Capture/Compare/PWM - Captura/Compara/PWM ... 110
Módulo CCP1 ... 110
Periodo do PWM...116 Duty-Cycle do PWM ...116 Resolução do PWM ...117 Registos CCP1CON ...117
Módulo CCP2 ... 120
Registo CCP2CON ...120Confi guração do módulo CCP1, para funcionamento em PWM ... 121
Modo avançado do CCP1 ... 122
Módulos de Comunicação Série ... 123
Modo Assíncrono da EUSART ... 124
Transmissor Assíncrono da EUSART ...125
Receptor Assíncrono da EUSART ...127
BRG - Baud Rate Generator - Gerador de Relógio para a EUSART ...133
Registo BAUDCTL ...137
Resumidamente: ...139
Modo Síncrono da EUSART ... 141
Modo SPI ...142
Modo I2C ...146
I2C em modo Mestre ...154
Módulos Analógicos ... 161
Registos e Modo do ADC - Conversor A/D...161
Requisitos da Aquisição A/D ... 163
Periodo do ADC ...163
Como usar o Conversor A/D ... 164
Registo ADCON0 ...165
Registo ADCON1 ...167
Resumidamente: ...167
Comparador Analógico ... 168
Fonte de Tensão de Referência interna ...169
Comparadores e funcionamento com Interrupções ...170
Registo CM1CON0 ...171
Registo CM2CON0 ...173
Registo CM2CON1 ...175
Registo VRCON ...176
Em resumo : ... 177
Outros circuitos internos ... 178
Oscilador, EEPROM e Reset ... 178
Registo OSCCON ...179
Modos de Relógio Externo ... 181
Modo EC - Oscilador Externo ...181
Modo LP, XT ou HS - Oscilador Externo ...183
Ressoador Cerâmico no modo XT ou HS ...184
Modos de Relógio Interno ... 186
Modo INTOSC - Oscilador Interno ...186
Modo INTOSCIO - Oscilador Interno ...186
Confi guração do Oscilador Interno ... 187
Modo de Arranque de Relógio a Duas-Velocidades ... 188
Fail-Safe Clock Monitor - FSCM - Monitor de Relógio contra falhas ...188
Registo OSCTUNE ...189
Memória EEPROM ... 191
Registo EECON1 ...191
Leitura da EEPROM ...192
Escrita da EEPROM ...193
Reset! Black-out, Brown-out ou Ruidos? ... 195
Reset por Black-out - Falha de Energia Súbita ...196
Reset por Brown-out - Descida de Tensão Lenta e Gradual ...196
Ruidos ...197
Pino de MCLR ...197
Conjunto de Instruções ... 198
Conjunto de Instruções da Família PIC16Fxx de Microcontroladores ... 198
Transferência de dados ... 200
Lógicas e aritméticas ... 200
Controlo de Execução de um Programa ...201
Período de execução da instrução ...203
Listagem das instruções ...203
Como programar um Microcontrolador ... 224
Linguagem Assembly ... 226
Instruções ... 227
Operandos ... 227
Comentários ... 228
Directivas ... 228
Directiva PROCESSOR ...228 Directiva EQU ...228 Directiva ORG ...229 Directiva END ...229 Directiva ...$IN-CLUDE ...230Directivas CBLOCK e ENDC ...230
Directivas IF, ENDIF e ELSE ...231
Directiva BANKSEL ...232
Operadores aritméticos de assembler ... 233
Exemplo de como escrever um Programa ... 234
Ficheiros criados ao compilar um programa ... 236
MPLAB ... 238
Instalando o programa - MPLAB ...238
A implementação de um PROJECTO ...243
Escrever um novo Programa ...245
COMO TUDO COMEÇOU
Em 1969, uma equipa de engenheiros Japoneses da BUSICOM, foi para os EUA com o pedido de desenhar alguns circuitos integrados para calculadoras. O pedido foi enviado para a INTEL, e Marcian Hoff estava en-carregue do projecto. Tendo experiência em trabalhar com um computador, o PDP8, ele teve a ideia de sugerir soluções diferentes, ao invés dos designs sugeridos pelos Japoneses. A ideia dele presumia que o funcionamento do circuito integrado, era determinado pelo programa armazenado dentro do chip. Signifi cava que a confi gura-ção era mais simples, mas iria requerer muito mais memória que o projecto dos engenheiros Japoneses.
Após um certo tempo, apesar de os Japoneses estarem ainda a tentar encontrar uma solução mais simples, a ideia de Marcian venceu, e o primeiro microprocessador nasceu. Federico Faggin foi uma grande ajuda em tornar a ideia num produto acabado. E, nove meses após ter sido contratado, a INTEL tinha acabado de de-senvolver um produto desde a ideia original.
Em 1971, a INTEL obteve os direitos de venda deste circuito integrado, e antes disso já tinha comprado a licença da BUSICOM. Durante esse ano, um microprocessador chamado 4004 foi lançado no mercado. Esse foi o primeiro processador de 4 bits, com a velocidade de 6000 instruções por segundo.
Não muito tempo depois, uma empresa Americana chamada CTC pediu à INTEL e TEXAS Instruments, para fabricarem um microprocessador de 8 bits, para ser aplicado nos seus terminais. Embora a CTC tenha desistido do projecto, a INTEL e a TEXAS continuaram o trabalho e, em Abril de 1972, o primeiro micro-processador de 8 bits, chamado de 8008, foi lançado no mercado. Podia endereçar 16Kb de memória, tinha 45 instruções e uma velocidade de 300.000 instruções por segundo. Esse microprocessador foi o predecessor de todos os actuais microprocessadores.
A INTEL continuou o desenvolvimento e, em Abril de 1974, lançou um processador de 8 bits, chamado de 8080. Podia endereçar 64Kb de memória, tinha 75 instruções, e um preço inicial de $360.
microprocessador de 8 bit, 6800. O engenheiro chefe era Chuck Peddle. Aparte do microprocessador, a MO-TOROLA também fabricava periféricos como o 6820 e 6850.
Nessa altura muitas empresas reconheciam a importância dos microprocessadores, e iniciaram o seu próprio desenvolvimento. Chuck Peddle deixou a MOTOROLA, juntou-se à MOS Technology, e continuou o traba-lho intensivo no desenvolvimento em microprocessadores.
Na exposição WESCON, nos EUA em 1975, um evento crucial na história dos microprocessadores aconte-ceu. A MOS Technology anunciou que estava a vender os processadores 6501 e 6502 a $25 cada, que os inte-ressados podiam comprar na hora. Foi tamanha a sensação, que muita gente pensava em fraude, considerando que a concorrência vendia o 8080 e 6800, a $179 cada.
No primeiro dia da exposição, em resposta à concorrência, a MOTOROLA e a INTEL baixaram os seus microprocessadores para $69,95. A MOTOROLA acusou a MOS Technology e Chuck Peddle de plagiarem o protegido 6800.
Devido a isto, a MOS Technology desistiu do fabrico do 6501, mas continuou o fabrico do 6502. Era um pro-cessador de 8 bits, com 56 instruções, e capaz de endereçar directamente 64Kb de memória.
Devido ao seu baixo preço, o 6502 tornou-se muito popular, e então foi instalado em computadores como o KIM-1, Apple I, Apple II, Atari, Commodore, Acorn, Oric, Galeb, Orao, Ultra e muitos outros.
Em breve, muitas empresas começaram a fabricar o 6502 (Rockwell, Sznertek, GTE, NCR, Ricoh, Commo-dore assumiram a MOS Technology).
No ano da sua prosperidade, 1982, este processador estava a ser vendido à taxa de 15 milhões de unidades por ano.
Outras empresas não desistiram. Frederico Faggin deixou a INTEL, e abriu a sua própria empresa chamada ZILOG INC. Em 1976 a ZILOG anunciou o Z80. Quando desenhou este processador, Faggin tomou uma decisão crucial. O 8080 já tinha sido desenvolvido, e ele apercebeu-se que muitos iriam continuar fi eis a esse processador, devido aos grandes gastos em reescrever todos os programas. Então, ele decidiu que este novo processador teria de ser compativel com o 8080, ou seja, teria de poder correr todos os programas escritos para o 8080.
micropro-cessador mais poderoso da altura. Podia endereçar directamente 64Kb de memória, tinha 176 instruções, um grande número de registos, uma opção interna para fazer o refrescamento da RAM, só uma fonte de alimenta-ção, maior velocidade, entre outros. O Z80 foi um grande sucesso, e toda a gente substituiu o 8080 pelo Z80. Além da ZILOG, outros fabricantes como Mostek, NEC, SHARP e SGS apareceram logo a seguir. O Z80 era o coração de muitos computadores, tais como: Spectrum, Partner, TRS703, Z-3 and Galaxy.
Em 1976 a INTEL lançou uma versão melhorada do microprocessador de 8 bits, chamado de 8085. No en-tanto, o Z80 era muito melhor, e a INTEL perdeu a batalha.
Mesmo após outros microprocessadores terem aparecido no mercado, 6809, 2650, SC/MP, etc, não havia grandes melhoramentos que justifi casse aos fabricantes mudarem de processador, por isso o 6502, o Z80 e o 6800 continuaram os microprocessadores dominantes, e durante muito tempo.
Microcontrolador versus Microprocessador
Um microcontrolador difere de um microprocessador em diversas formas.
A primeira, e mais importante, é a sua funcionalidade. Para que um microprocessador possa ser usado, outros componentes tais como memória, têem que ser ligados ao chip. Mesmo sendo os microprocessador considera-dos potentes máquinas matemáticas, o seu ponto fraco é a sua parca possibilidade de comunicar com periféri-cos.
Então, de maneira a que possa comunicar com periféricos, o microprocessador tem que usar circuitos especiais, como chips externos.
Resumindo, os microprocessadores são o coração dos computadores. Era assim no início, e ainda nos dias de hoje se mantêm.
Por outro lado, o microcontrolador está desenhado para ser um “tudo-em-um”. Não são necessários componen-tes externos, para as suas aplicações, porque todos os circuitos, que pertencem aos periféricos, já estão dentro do chip. Poupa tempo e espaço necessários, aquando do design de um sistema.
Conceitos Básicos
Um mundo de números
O universo por ser descrito com apenas 10 digitos. Mas, precisamos apenas de 10 digitos? Claro que não, é apenas uma questão de hábito.
Por exemplo, o número 764 o que signifi ca?: quatro unidades, seis dezenas e sete centenas, ou 4 + 60 + 700, ou 4*1 + 6*10 + 7*100!
Podemos representar o número de uma maneira mais científi ca? a resposta é positiva: 4*10^0 + 6*10^1 + 7*10^2. Mas porquê? Simplesmente porque usamos um sistema de numeração de base 10, ou seja, um sistema de numeração décimal.
Sistema de numeração Binário
O que aconteceria se apenas dois digitos pudessem er usados, o 0 e o 1?
Nada de especial, continuaríamos a usar números mas de forma diferente. Por exemplo: 11011010. Qual a quantidade que o número 11011010 indica?
De maneira a que possamos aprender isto, devemos seguir a mesma lógica do exemplo anterior, mas em ordem inversa. Não esquecer que se trata de matemática com apenas dois digitos, ou seja, um sistema de numeração binário.
É o mesmo número, representado de duas formas distintas. A única diferença reside no número de dígitos necessários para escrever um número. Um dígito (2) é usado para escrever o número 2 em décimal, onde dois dígitos (1 e 0), são usados para escrever esse número em sistema binário.
É chamado de nível lógico zero (0) e nível lógico um (1), com os quais a electrónica perfeita e simplesmente trabalha as operações complexas matemáticas. É a electrónica que aplica a matemática, onde todos os números são representados por apenas dois dígitos, e onde só importa saber se há tensão eléctrica, ou não. Estamos a falar de electrónica digital.
Sistemas de numeração Hexadecimal
No início do desenvolvimento dos computadores, percebeu-se que as pessoas tinham muitas difi culdades em trabalhar com numeração binária. Devido a isto, um novo sistema de numeração foi desenvolvido, e usando 16 digitos distintos. Os primeiros dez dígitos são os tradicionais (0, 1, 2,... 9), mas existem mais seis. Por forma a não inventar novos símbolos, convencionou-se usar as seis primeiras letras do alfabeto: A, B, C, D, E e F. Um sistema hexadecimal de numeração, consistindo nos dígitos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F foi estabelecido.
O maior número que pode ser representado por 4 dígitos binários é 1111. E corresponde ao número 15 no sistema decimal. Esse número no sistema hexadecimal, é representado pelo dígito F. É o maior número de um dígito no sistema hexadecimal. O número da fi gura escrito com oito dígitos, é ao mesmo tempo o número he-xadecimal de dois dígitos. Não esquecer que os computadores usam números binários de 8 dígitos.
O código BCD
O código BCD é um código binário apenas para números decimais. É usado para fazer comunicar os circuitos electrónicos com os periféricos, e num sistema binário dentro do seu próprio mundo. Consiste em números binários de quatro dígitos, que representam os primeiros dez dígitos décimais (0, 1, 2,... 9). Embora quatro digitos nos dêem 16 combinações possiveis, apenas as primeiras 10 são usadas.
Conversão de Binário para Decimal
Os digitos de um número binário têem diferentes valores, dependendo da posição onde se encontram. Adi-cionalmente, cada posição pode ter 1 ou 0, e o seu valor facilmente determinado através da sua posição desde a direita. Para executar a conversão, é necessário multiplicar valores pelos dígitos correspondentes, e somar os resultados.
Conversão de Hexadecimal para Decimal
Por forma a se fazer a conversão de um número hexadecimal para decimal, cada digito hexadecimal deve ser multiplicado por 16, levantado ao expoente da sua posição. Por exemplo:
Conversão de Hexadecimal para Binário
Não é necessário nenhum cálculo, de maneira a converter números hexadecimais para binario. Os dígitos hexa-cedimais são simplesmente substituidos pelos seus congéneres 4 dígitos binários. Por exemplo:
Bit
Um bit é um dígito binário. De igual forma que o sistema de numeração decimal, no qual os dígitos de um nú-mero não têem o mesmo valor, o signifi cado do bit depende da sua posição no núnú-mero binário. Então, não faz sentido falar de unidades, dezenas, etc. Deve-se, sim, falar do bit zero, bit um, bit dois, etc. Sempre a contar do lado direito. E, como o sistema binário usa apenas dois dígitos, 0 e 1, o valor de um bit só pode ser 0 ou 1. Não nos devemos confundir, se o bit tiver valor de 4, 16 ou 32. Isso signifi ca que os valores dos bits estão repre-sentado em sistema decimal. Será correcto dizer que: o valor do quinto bit de um número binário, é equivalente ao decimal 32.
Byte
os dígitos dos bytes não têem o mesmo signifi cado. O maior valor tem o bit mais à esquerda chamado de Bit Mais Signifi cativo (MSB - Most Signifi cant Bit). O bit mais à direita tem o menor valor, e é chamado de Bit Menos Signifi cativo (LSB - Least Signifi cant Bit). Como um byte pode ter 256 combinações possiveis de bits, o maior número decimal possível de representar é o 255, pois há uma combinação que representa zero.
Um nibble é representado como meio byte. Dependendo de que metade do byte estamos a falar, há nibbles “altos” ou “baixos”.
Circuitos Lógicos
A electrónica de que são feitos os circuitos integrados, microcontroladores ou microprocessadores, é composta de elementos chamados de “circuitos lógicos” ou “portas lógicas”.
Os princípios operacionais desdes elementos foram estabelecidos pelo matemático Inglês, George Boole, e a ideia central era expressar formas lógicas, como funções de álgebra. Mais tarde o princípio evoluiu para o que hoje conhecemos como circuitos lógicos AND, OR e NOT, também conhecido como Álgebra de Boole. Como algumas instruções de programa do microcontrolador funcionam da mesma maneira que as portas lógi-cas, o seu princípio de funcionamento é descrito a seguir.
Porta lógica AND
A porta lógica AND tem duas ou mais entradas, e uma saída. A saída terá um 1 lógico, se as as suas entradas A e B estiverem a nivel lógico 1.
A tabela mostra dependência entre entradas e saída. Qualquer outra combinação nas entradas, dará um nivel lógico 0 na saída.
Quando usada num programa, a operação lógica AND é feita por instruções, que serão discutidas mais à fren-te. Por agora, é importante referir que AND num programa, faz correspondência aos bits de dois registos.
Porta lógica OR
A porta lógica OR tem duas ou mais entradas, e uma saída. A saída terá um 1 lógico, se qualquer das suas en-tradas A ou B estiverem a nivel lógico 1.
Num programa, a operação lógica OR é feita entre os bits correspondentes dos registos. À semelhança da ope-ração lógica AND.
Porta lógica NOT
saída apresenta um 1 lógico, e vice-versa. Esta porta é também chamada de Inversora.
Se for executada num programa, a operação NOT é feita num byte. O resultado é esse byte com todos os bits inver-tidos. Se o byte for considerado um número, o valor invertido é na realidade o complemento desse número. Isto é, o complemento de um número é o que é necessário adicionar-lhe, para que o mesmo atinja o máximo valor de 8 bits (255).
Porta lógica EXCLUSIVE OR / XOR
Esta porta é uma combinação das atrás referidas. A saída apresenta um 1 lógico, apenas quando as suas entradas apresentam niveis lógicos diferentes.
Em um programa, esta operação também é usada para comparar dois bytes, para inverter quaisquer bits de um byte ou para subtrair. E não há o perigo de subtrair um número grande, de um menor.
Registo
Um registo é um circuito electrónico que consegue memorizar o estado de um byte.
Registo
SFR / Special Function Register - Registo de Função Especial
Como acrescento aos registos que não têem qualquer função predeterminada, todos os microcontroladores têem alguns registos em que a sua função está predeterminada pelo fabricante. Os seus bits estão interligados fi sicamente aos circuitos internos, tais como temporizadores, conversores A/D, osciladores, portas série e ou-tros, o que signifi ca que são responsaveis pelo funcionamento do microcontrolador. Como um byte tem oito bits, é como se fossem oito interruptores que comandam outros pequenos circuitos dentro do chip. Os SFR têem essa exacta função.
SFR - Special Function Register - Registo de Função Especial
Portas de Entrada/Saída - I/O
De maneira a tornar o microcontrolador de alguma utilidade, o mesmo tem que estar ligado a electrónica adi-cional no seu exterior, tais como periféricos. Cada micro tem um ou mais registos, chamados de Portas, ligados aos pinos do mesmo.
O porquê de I/O, deve-se a que o utilizador pode alterar a função a seu belo prazer, e conforme a aplicação a dar-lhes. Como exemplo, vamos supor que queremos comandar três LEDs, e simultaneamente controlar o es-tado lógico de cinco botões: algumas portas têem de ser confi guradas para que haja três saídas e cinco entradas. Esta confi guração é simples e confortavelmente feita por software, o que signifi ca, também, que a função pode ser alterada durante a operação (on-the-fl y).
Uma das mais importantes especifi cações dos pinos I/O, é a corrente máxima que os mesmos podem suportar. Para a maioria dos microcontroladores, a corrente possível de tirar de um pino é a sufi ciente para activar um LED, ou outro dispositivo similar de baixa corrente (5-25mA). Se o microcontrolador tiver muitos pinos I/O, então a máxima corrente de um só pino é menor. Resumidamente, não é possível que todos os pinos suportem a máxima corrente, se houver mais de 80 pinos em total no microcontrolador. A corrente máxima descrita nas especifi cações, é partilhada entre todos os portos I/O.
Outra importante função, é a de que podem ter resistências de “pull-up” (polarização positiva). Estas resistên-cias ligam os pinos à alimentação positiva, e o seu efeito é visivel quando o pino está confi gurado como entrada. As novas versões de microcontroladores já têem estas resistências confi guraveis por software.
Normalmente, cada porto I/O é controlado por um SFR, o que signifi ca que, cada bit desse registo, determina o estado do pino correspondente do microcontrolador. Como exemplo, escrevendo 1 lógico no bit desse SFR, o pino da porta correspondente é automaticamente confi gurado como entrada. De outra maneira, escrevendo 0 lógico no SFR, o pino da porta correspondente é confi gurado como saída. A tensão deste pino, 0v ou 5v, cor-responde ao estado do corcor-respondente bit do registo da Porta.
Se escrevermos 0 em um bit de registo da Porta, esse pino apresentará 0v. Se, inversamente, escrevermos 1 no mesmo bit, o pino já vai apresentar 5v.
Unidade de memória
A memória é a parte do microcontrolador usada para o armazenamento de dados.
Cada endereço de memória corresponde a uma po-sição de memória. O conteúdo dessa popo-sição, é co-nhecido através do seu endereçamento. A memória tanto pode ser lida de, como pode ser escrita para. Existem vários tipos de memória dentro do micro-controlador.
ROM - Read Only Memory: Apenas de Leitura, é usada para permanentemente gravar o programa a
execu-tar.
OTP ROM - One Time Programmable ROM: ROM onde só se pode escrever o programa na memória
ape-nas uma vez. Se houver necessidade de alterar o mesmo, terá de se fazer a gravação em um novo chip.
UV EPROM - UltraViolet Erasable Programmable ROM: ROM que
permite apagar o programa, usando luz Ultra-Violeta. O chip tem uma janela de vidro no topo do seu corpo, o que permite a passagem dos raios Ultra-Violeta, que vão apagar a memória.
FLASH - Este tipo de memória foi inventada pela Intel nos anos 80. O seu conteúdo pode ser
escrito/apaga-do quase que infi nitamente. Os microcontrolaescrito/apaga-dores com memória Flash são muito uteis para aprendizagem, investigação e desenvolvimento, bem como para pequenas séries. Devido à sua popularidade, a maioria dos microcontroladores são fabricados com este tipo de memória.
RAM - Random Access Memory: Este tipo de memória é volátil, o que signifi ca que quando se desliga a
ali-mentação do chip, a sua informação desaparece. É usada para o armazenamento temporário de dados, criados e usados durante a operação do microcontrolador. Como exemplo, se o programa faz uma adição, é necessário haver um registo que tenha o valor da soma. Para esse fi m, um dos registos da RAM é chamado de “soma” e usado para armazenar o resultado da adição.
EEPROM - Electrically Erasable Programmable ROM: ROM programavel, que se pode apagar
electricamen-te. O conteúdo desta memória pode ser mudado durante a operação, mas o seu conteúdo não é perdido quando se desliga a alimentação do microcontrolador. Este tipo de memória é usada para guardar valores, criados du-rante a operação, que devem ser permanente armazenados.
Interrupções
A maioria dos programas usa interrupções durante a execução normal dos mesmos. O fi m de um microcon-trolador é o de reagir consoante os estímulos exteriores. Posto por outras palavras, quando algo acontece, o microcontrolador faz qualquer coisa. Como exemplo, quando se pressiona um botão de um controlo remoto, o microcontrolador vai registar o acto, e responder à ordem aumentando/baixando o volume, mudando de canal, etc.
Se o microcontrolador dispendesse o teu tempo indefi nidademente, a ler alguns botões durante horas ou dias, simplesmente seria impraticavel. Em vez de o fazer, o microcontrolador delega este trabalho ao “especialista”, que vai apenas reagir quando houver necessidade de atenção.
CPU - Unidade Central de Processamento
Como o seu nome sugere, esta é a unidade que monitoriza e controla todos os processos dentro do microcon-trolador. Consiste em variadas subunidades, em que as mais importantes são:
Descodifi cador de Instruções: é a parte electrónica que reconhece as instruções de programa, e faz funcionar
o outros circuitos com base nisso. O conjunto de instruções que é diferente para cada familia de microcontro-ladores, mostra as capacidades deste circuito.
ALU: Unidade Lógica e Aritmética: responsavel por todas as operações lógicas e matemáticas.
Acumulador: é um registo SFR responsavel pela operação da ALU. É como um registo de trabalho, usado para
armazenar todos os dados que são usados para executar uma operação, e que também armazena os resultados prontos para serem usados para a continuação do processamento. Um dos SFR, chamado de Status, contém bastante informação sobre o estado dos dados armazenados no Acumulador (o número é maior ou menor que zero, etc).
Barramento
Fisicamente, o barramento é constituido por 8, 16 ou mais condutores. Existem dois tipos de barramento: o de endereçamento e o de dados. O barramento de endereçamento consiste no número de linhas necessárias para poder endereçar a memória. É usado para transmitir o endereço da CPU para a Memória. O barramento de dados é tão largo quanto os dados que vão ser trabalhados, e no caso deste manual é de 8 bits ou largura de fi os. É usado para ligar todos os circuitos dentro do microcontrolador.
Comunicações Série
Ligações paralelas entre microcontroladores e periféricos, através de portas I/O, são a solução ideal para curtas distâncias - poucos metros. No entanto, e em outros casos em que há necessidade de estabelecer comunicações entre dois dispositivos em maiores distâncias, não é possível utilizar comunicações paralelas. Nestas situações, a comunicação série é a melhor solução.
Hoje em dia, a maior parte dos microcontroladores têem dentro, já de fábrica, variados sistemas para comuni-cações série. Quais destes são usados, depende de muitos factores, os quais mais importantes são:
com quantos dispositivos, o microcontrolador tem de trocar informação? com que velocidade tem que ser feita a troca de dados?
qual é a distância entre os dispositivos?
é necessário enviar e receber dados simultaneamente?
Um dos mais importantes pontos a considerar na comunicação série, é o Protocolo.
O protocolo é um conjunto de regras que devem ser obedecidas, de maneira a que os dispositivos possam cor-rectamente interpretar os dados que todos trocam entre si. Felizmente, o microcontrolador trata desta situação de maneira perfeitamente autónoma, o que liberta o programador para a tarefa de simplesmente ler e escrever. •
• • •
CPU - Central Processing Unit - Unidade de Processamento Central
Baud Rate - Velocidade de transferência
O termo Baud Rate é normalmente usado para especifi car o número de bits transferidos por segundo (bps). Dever-se-á ter em atenção que se referem bits, e não bytes. É, normalmente, requisito do protocolo, que cada byte seja transferido em conjunto com vários bits de controlo, o que pode signifi car que um byte da trama de dados série, consista em 11 bits. Como exemplo, se o Baud Rate é de 300 bps, então, um máximo de 37 e um mínimo de 27 bytes podem ser transferidos por segundo, ambos dependentes do tipo de ligação e protocolo usado.
Os sistemas de comunicação Série mais usados são:
I2C (Inter Integrated Circuit) é um sistema usado quando a distância entre microcontroladores e periféricos
é curta (normalmente o emissor e o receptor estão na mesma placa de circuito impresso). A ligação é feita com dois condutores: um para transferência de dados, e o outro para o sinal de relógio (sincronização). Como se pode ver na fi gura, um dos dispositivos é sempre o Mestre. Faz o endereçamento de um chip Escravo, antes da comunicação se iniciar. Desta maneira, um microcontrolador pode comunicar com 112 dispositivos diferentes.
O Baud Rate é normalmente de 100 Kbit/s no modo normal, ou de 10 Kb/s em modo lento. A distância má-xima, sem ajudas, entre dispositivos que se comunicam por I2C, está limitada a poucos metros.
Comunicação I2C
SPI (Serial Peripheral Interface Bus) é um sistema de comunicação série, que usa até 4 condutores: um para
receber dados, outro para enviar dados, um para sinal de relógio, e em alternativa outro para escolher com qual dos dispositivos o Mestre vai comunicar. É uma ligação Full-Duplex, o que signifi ca que o envio e a recepção podem ser feitas simultaneamente. O Baud Rate máximo é superior a uma ligação I2C.
Comunicação SPI
UART (Universal Asynchronous Receiver/Transmitter) é uma ligação assíncrona, o que signifi ca que o sinal
de relógio não é usado. Como há apenas uma linha de comunicação, ambos o receptor e emissor trabalham a um Baud Rate pré-determinado, de maneira a manter a sua sincronização. Esta é uma maneira muito simples de transferir informação, pois representa a conversão de dados 8-bit em formato paralelos, para formato série. O Baud Rate faz-se abaixo de 1 Mbit/s.
Oscilador
Pulsos dados pelo oscilador, possibilitam a operação síncrona de todos os circuitos do microcontrolador. O módulo oscilador é normalmente confi gurado para usar um cristal de quartzo, ou um ressoador cerâmico, para ter a sua oscilação estabilizada. Se não houver, por parte da aplicação, necessidade de estabilidade da oscilação, então pode usar-se um oscilador RC (resistência/condensador).
É importante sublinhar que, as instruções, não são executas ao ritmo imposto pelo oscilador, mas algumas vezes mais lento. Isto acontece porque cada instrução é executada em vários passos. Em alguns microcontroladores, o mesmo número de ciclos é necessário para qualquer instrução, enquanto que em outros, o tempo de execução não é o mesmo para todas as instruções. Se o sistema usa um cristal de 20 MHz, o tempo de execuçaõ de uma instrução não é de 50ns, mas 200ns, 400 ou 800ns, dependendo do tipo de microcontrolador usado.
Oscilador
Circuito de Alimentação
Brown-Out, é um estado potencialmente perigoso, e que acontece no momento em que o microcontrolador
está a ser desligado, ou em situações onde a energia de alimentação cai para o limite, devido a ruido eléctrico. Como o microcontrolador consiste em vários circuitos com diferentes necessidades de nível de tensão, este esta-do pode causar um grande desvio na sua performance. De maneira a preveni-lo, este circuito imediatamente faz Reset a toda a electrónica interna, quando a tensão de alimentação desce abaixo de um nível pré-determinado.
Pino Reset, normalmente marcado como MCLR (Master Clear Reset), e serve para fazer o Reset externo do
microcontrolador, aplicando nível lógico 0 ou 1, dependendo do tipo de microcontrolador usado. No caso de o chip não ter circuito de Brown-Out, um simples circuito externo de Brown-Out pode ser ligado a este pino.
Temporizadores e Contadores
O microcontrolador usa, normalmente, cristal de quartzo para funcionar. Mesmo que não seja a solução mais simples, há muitas razões para o fazer. Nomeadamente, a frequência do oscilador é precisamente defi nida e muito estavel, os pulsos originados têem sempre a mesma largura, o que os faz ideais para medições de tempo. Estes osciladores são usados em relógios de quartzo.
Temporizadores / Contadores
Se é necessário medir o tempo entre dois eventos, é sufi ciente contar os pulsos enviados pelo oscilador. Isto é exactamente o que o Temporizador faz.
Muitos programas usam estes cronómetros miniatura, que são SFR de 8 ou 16 bits, e o seu conteudo é automa-ticamente incrementado a cada pulso recebido. Quando um registo chegar ao fi m da contagem (255 ou 65535), uma Interrupção é gerada.
Se os temporizadores usam um oscilador interno de quartzo, então é possível medir o tempo entre dois eventos (se o valor do registo é T1 no momento inicial, e T2 no momento fi nal, então o tempo passado é igual ao resul-tado da subtração T2-T1). Se os temporizadores usam pulsos externos, então o temporizador é transformado em contador.
Como funciona um temporizador
Na prática, os pulsos que chegam do oscilador de quartzo a cada ciclo de máquina, ou através o divisor, vão incrementar (somar uma unidade) o valor do registo do temporizador. Se uma instrução (um ciclo de máqui-na) durar por quatro periodos do oscilador de quartzo, então, o número vai mudar um milhão de vezes por segundo, ou a cada microsegundo (us).
Funcionamento do Temporizador
É simples medir curtos intervalos de tempo (até 256us), pelo método descrito acima, porque é o maior número que um registo pode ter. Esta óbvia desvantagem pode ser facilmente contornavel de diversas maneiras, como usando um oscilador mais lento, registos com mais bits, um divisor ou interrupções. Como as duas primeiras soluções são menos simples de resolver, é preferivel enveredar pelas duas últimas.
Usar o divisor no funcionamento do temporizador
Um divisor é um dispositivo electrónico usado para reduzir a frequência, por um factor pré-determinado. O que signifi ca que, para gerar um pulso na sua saída, é necessário fazer chegar 1, 2, 4, 8 ou mais pulsos à sua entrada. Este circuito é parte integrante do microcontrolador, e o seu factor de divisão pode ser alterado pelo software. É usado quando é necessário medir períodos de tempo longos.
Este divisor é normalmente partilhado pelo Temporizador e pelo Watchdog, o que faz com que não possa ser usado por ambos em simultâneo.
Usando o Divisor, no funcionamento do Temporizador
Usar a Interrupção no funcionamento do Temporizador
Se o registo do temporizador for de 8 bits, o maior número que lhe poderá ser escrito é de 255 (ou de 65535 se o registo for de 16 bits). Se este número for excedido, o temporizador vai automaticamente limpar-se (auto reset), e a contagem vai iniciar-se do 0. Esta condição é chamada de Overfl ow. Se for habilitado pelo software, esse overfl ow pode gerar uma interrupção, o que nos trás imensas novas possibilidades.
Como exemplo, o estado dos registos de um relógio, segundos-minutos-horas, podem ser alterados dentro da rotina de interrupção.
Todo o processo, excepto a rotina de interrupção, é executado em “background”, o que possibilita que o circuito principal do microcontrolador execute outras operações.
Usando a Interrupção, no funcionamento do Temporizador
Atrasos de diferente duração, com mínima interferência do programa principal, podem facilmente ser obtidos atribuindo o divisor ao temporizador.
Contadores
Se o temporizador estiver a ser carregado com pulsos do exterior, então o mesmo torna-se num Contador. O circuito não mudou, mantém-se o mesmo.
A única diferença é que, neste caso, os pulsos a contar chegam através das portas, e a sua duração nunca é defi -nida. Esta é a razão pela qual não podem ser usados para medição de tempo, embora os seus fi ns sejam imensos. Desde a contagem de peças numa linha de montagem, quantidade de passos que o motor andou, número de passageiros numa fi la, etc. As possibilidades são vastas, e são dependentes dos sensores usados.
Temporizador Watchdog
O watchdog é um temporizador ligado a um oscilador RC, e totalmente independente do microcontrolador. O que faz com que não possa ser desligado durante o funcionamento.
Se o watchdog estiver ligado, escolha que apenas pode ser feita durante a programação física, cada vez que chega ao fi m da sua contagem, ocorre um reset do microcontrolador, e a execução do programa volta à primeira instrução. O objectivo é fazer com que isto não aconteça, pelo uso de uma instrução específi ca.
Assim, se algo se descontrolar na execução do programa, o microcontrolador poderá reiniciar-se, não correndo o risco de fi car empatado num círculo infi nito.
Se as instruções que fazem o reset do watchdog, forem colocadas em sítios específi cos do programa, então, o funcionamento do watchdog não vai interferir com o programa principal. Se, por alguma razão, normalmente por ruidos na linha eléctrica, o programa fi car bloqueado em alguma posição da qual não consegue sair, não vai ser feito o reset do watchdog e, quando este chegar ao fi m da contagem, o reset do microcontrolador acontece, iniciando o programa desde o início.
Temporizador Watchdog
Conversores Analógico/Digital
Os sinais externos são, normalmente, diferentes dos que o microcontrolador compreende (1’s e 0’s). Devido a isto, os sinais têem que ser convertidos para linguagem compatível. Um conversor de Analógico para Digital, é um circuito que converte sinais contínuos, para números digitais. Este circuito é, então, usado para converter um valor analógico, para um número binário, e enviá-lo ao CPU para processamento. Posto por outras pala-vras, este módulo é usado para medir tensões presentes no pino. O resultado da medida é um número de valor
digital, usado e processado pelo programa.
Arquitectura Interna
Todos os microcontroladores modernos usam uma de duas arquitecturas: Harvard ou von-Neumann. Em suma, são duas formas distintas de trocar a informação entre o CPU e a Memória.
Arquitectura von-Neumann
Os microcontroladores que usam esta tecnologia, só têem disponivel uma zona de memória, e um barra-mento de dados de 8 bits. Como todos os dados são trocados, usando estas 8 linhas, este barramento é sobrecarregado e a comunicação extremamente lenta e inefi ciente.
O CPU pode lêr uma instrução, ou lêr/escrever da-dos de/para a memória. Ambas as situações ao mes-mo tempo são impossiveis, pois as instruções parti-lham o barramento com os dados.
Arquitectura Harvard
Os microcontroladores que usam esta arquitectura, dispõem de dois barramentos de dados distintos. Um é de 8 bits e liga o CPU à RAM. O outro tem várias linhas (12, 14 ou 16) e liga o CPU à ROM.
Assim, o CPU pode ler uma instrução, ao mesmo tempo que faz um acesso à memória de dados. Como todos os registos RAM são de 8 bits, todos os dados trocados dentro do microcontrolador estão no mesmo formato. Adicionalmente, durante a escrita do software, apenas 8 bits de dados são considerados. Por outras palavras, só se pode trabalhar com 8 bits de dados, no máximo.
No entanto, estas posições de memória não têem apenas 8 bits, mas sim 12, 14 ou 16. Os restantes 4, 6 ou 8 bits representam a própria instrução, especifi cando ao CPU o que fazer com os dados de 8 bits.
Arq. Harvard
As vantagens deste modelo, são as seguintes:
Todos os dados são de 8 bits. Como o barramento usado para a leitura do programa tem 12, 14 ou 16 linhas, ambos as instruções e dados pode ser lidos simultaneamente. Assim, todas as instruções são execu-tadas em apenas um ciclo. A única excepção são as instruções de salto, que são execuexecu-tadas em dois ciclos. Como a ROM e RAM são separadas, o CPU pode executar duas instruções simultaneamente. Enquanto a leitura/escrita da RAM está a ser feita, a próxima instrução está a ser lida pelo outro barramento.
Nesta arquitectura, o barramento de programa é maior que um byte, o que possibilita que cada linha de programa seja feita de instrução + dados. Por outras palavras: uma linha de programa - uma instrução. •
•
Conjunto de Instruções
As instruções que são compreendidas pelo microcontrolador, são conhecidas como o “Conjunto de Instruções”. Quando se escreve um programa em linguagem Assembler, está-se a “contar uma estória”, especifi cando as instruções pela ordem que as mesmas devem ser executadas. A única restrição, é pelo reduzido número de instruções disponiveis.
Como escolher o microcontrolador certo para a aplicação?
Antes de se começar a desenvolver um sistema baseado num microcontrolador, dever-se-á equacionar o seguin-te:
quantas entradas/saídas são necessárias? comunicações série?
conversor A/D? outro...
Quando se defi ne muito bem os requisitos do projecto, a larga oferta é naturalmente fi ltrada, e é muito mais simples fazer a escolha adequada.
Por último, fazer a escolha consoante o número de unidades do produto, e o preço por unidade.
Microcontroladores PIC
Estes microcontroladores, fabricados pela Microchip, são provavelmente a melhor aposta para iniciados. O verdadeito nome deste microcontroladores é PICmicro, mas são mais conhecidos por PIC.
O primeiro modelo foi desenhado em 1975 pela General Instruments. Chamava-se PIC1650, e foi idealizado para fi ns totalmente diferentes.
Após 10 anos, e juntando memória EEPROM, este circuito transforma-se num verdadeiro microcontrolador PIC.
• • • •
Microcontrolador PIC16F887
Uma panorâmica
O PIC16F887 é um dos mais recentes produtos da Microchip. Tem todos os componentes que um moderno microcontrolador tem e, pelo baixo custo, amplo campo de aplicações, alta qualidade e facilidade de adquirir, é a solução ideal para aplicações como: controlo de processo industrial, controlo de máquinas, medição de valores, entre outros.
Algumas das funcionalidades estão descritas abaixo:
Arquitectura RISC (CPU de instruções reduzidas) apenas 35 instruções para aprender
todas as intruções de um-ciclo, excepto os saltos
Frequência de operação de 0 a 20MHz
Oscilador interno de precisão calibrado de fábrica
frequência escolhida por software entre 31KHz e 8MHz
Tensão de alimentação entre 2.0V e 5.5V
consumo: 220uA @ 2.0V @ 4MHz, 11ua @ 2.0V @ 32KHz, 50nA em Stand-by
Modo de poupança de energia
Reset por Brown-out, com controlo por software • • • • • • • • • • •
35 pinos de I/O
alta corrente para polarizar LEDs directamente
resistências individuais de polarização positiva, programaveis por software interrupção quando há mudança no estado lógico dos pinos de entrada
Memória ROM de 8k, em tecnologia FLASH
o chip pode ser reprogramado cerca de 100.000 vezes
Opção de gravação no circuito
o chip pode ser programado, quando está já montado no sistema fi nal
Memória EEPROM de 256 bytes
pode ser escrita cerca de 1.000.000 vezes
Memória RAM de 368 bytes
Conversor A/D 14 canais
10 bits de resolução
3 Temporizadores/Contadores independentes
Temporizador Watch-dog
Módulo comparador analógico com dois comparadores analógicos tensão fi xa de referência, 0.6V referência de tensão programavel
Saída por PWM • • • • • • • • • • • • • • • • • • • • •
Módulo USART melhorado
suporta RS-485, RS-232 e LIN2.0 detecção automática de Baudrate
Porta série síncrona
suporta os modos I2C e SPI
Microcontrolador PIC16F887 - Encapsulamento PDIP40 •
• •
• •
Microcontrolador PIC16F887 - Encapsulamento QFN44
Descrição dos pinos
Como se pode ver na fi gura acima, quase todos os pinos são multi-funcionais. Como exemplo, o pino 33, com a designação RB0/AN12/INT, tem as seguintes funções:
RB0, Porta B, primeiro pino entrada/saída (I/O) AN12, Décima segunda entrada analógica INT, Pino de interrupção externa
Este modo de dar funcionalidade extra aos pinos, faz o microcontrolador mais compacto, sem perder a sua fun-cionalidade. Estas funcionalidades não podem ser usadas em simultâneo, mas podem ser alteradas a qualquer momento pelo software.
As tabelas seguintes, referem-se ao microcontrolador com caixa PDIP 40 pinos : •
• •
Atribuição de Pinos
CPU
Não vamos falar do funcionamento da CPU por enquanto. Mas é importante frisar que a CPU é desenhada com tecnologia RISC, o que é um importante factor a ter em conta, aquando da decisão de que microcontro-lador usar.
Esta tecnologia oferece duas grandes vantagens:
apenas 35 instruções para aprender
o tempo de execução é o mesmo para todas as instruções, excepto para as que fazem salto. O que signifi ca que com o microcontrolador a 20MHz, o tempo de execução de cada instrução é ed 200ns, ou seja, o pro-grama é executado à velocidade de 5 milhões de instruções por segundo.
A CPU e a Memória
Memória
Este microcontrolador tem três tipos de memória: ROM, RAM e EEPROM. Todas elas vão ser separada-mente discutidas, pois cada uma delas têm funcionalidade e organização especifi cas.
Memória ROM
A memória ROM é usada para permanentemente guardar o programa a executar, e esta é a razão pela qual é •
chamada de memória de programa. O PIC16F887 tem 8Kb de ROM, num total de 8192 posições. Como esta ROM é feita com tecnologia FLASH, o seu conteúdo pode ser mudado electricamente, com o auxílio de um programador externo.
Conceito de Memória ROM
Memória EEPROM
Com parecenças à memória de programa, o conteúdo da EEPROM é permanentemente gravado, mesmo que a energia seja desligada. No entanto, ao contrário da ROM, o conteúdo da EEPROM pode ser alterado durante a execução do programa. E esta é a razão, pela qual esta memória é perfeita para guardar resultados criados, e usados, durante a operação.
Memória RAM
Esta é a mais complexa memória do microcontrolador. Neste caso, consiste em dois módulos: os registos-de-função-geral (GPR), e os registos-de-função-especial.
Embora ambos os módulos de registos sejam limpos quando a alimentação desliga, e sejam fabricados da mesma maneira, as suas funções são completamente díspares.
Registos SFR - Special Funcion Registers, e GPR - General Purpose Registers
Registos de função geral - GPR
programa. Se o programa está a executar uma contagem, é necessário que haja um registo que sirva de “soma-dor” ou contador. Como o microcontrolador tem que ser confi gurado para trabalhar como o utilizador deseja, é necessário, também, especifi car o endereço de alguns GPR’s e dar-lhes novas funções.
Então, o microcontrolador pode executar o programa, porque “sabe” o quê, e onde está a “soma” que deve ser incrementada. Por analogia, a cada variavel do programa deve ser atribuido um GPR.
Registos de função especial - SFR
Os SFR também são locais na RAM, mas contrariamente aos GPR, o seu fi m é predeterminado no processo de fabrico, e não pode ser alterado.
Como os seus bits estão fi sicamente ligados a circuitos internos do chip (módulo de comunicações série, con-versor A/D, temporizadores, etc), qualquer alteração ao seu conteudo, afecta directamente o funcionamento do microcontrolador, ou alguns dos seus circuitos. Como exemplo, mudando o registo TRISB, a função de cada pino da porta B pode ser alterada, para que seja ou entrada ou saída.
Outra particularidade dos SFR’s, é a de que estes têem nomes, tanto o registo como os seus bits, o que torna a escrita do programa mais facilitada. Como a programação em linguagens de alto-nível pode usar a lista de
todos os registos, com o seu endereço exacto, é apenas necessário especifi car o nome do registo, de maneira a escrever/lêr o seu conteudo.
Bancos de Memória
A memória de dados está particionada em quatro bancos. Antes de aceder a algum registo, durante a escrita do programa para escrever/lêr, é necessário seleccionar o banco que contém esse mesmo registo. Dois bits no reg-isto STATUS são usados para a selecção dos bancos. De forma a facilitar esta operação, os SFR mais comuns têm o mesmo endereço em todos os bancos, o que possibilita que possam ser facilmente acedidos.
SFR - Banco 2
SFR - Banco 3
Pilha de memória - Stack
uma subrotina (instrução CALL), ou quando surge uma interrupção, o endereço da próxima instrução é em-purrado para dentro de um registo da stack.
Dessa maneira, aquando da conclusão da subrotina ou interrupção, o microcontrolador sabe de onde deve con-tinuar a execução normal do programa. Este endereço, na stack, é limpo depois do retorno ao programa princi-pal, pois não há necessidade de o conservar, e essa posição fi ca automaticamente disponivel para ser usada.
É importante compreender que a stack funciona em círculo, ou seja, quando a stack já foi carregada oito vezes, a nona carga vai ser sobrepôr-se ao valor que está guardado na primeira posição. A décima carga vai sobrepôr a segunda posição, e por aí em diante. Os dados que foram sobrepostos desta maneira, não têem qualquer ma-neira de serem recuperados. Ainda, o programador não tem acesso a estes registos para escrever/ler, e não há nenhum bit no registo STATUS que indique que houve “stack overfl ow” ou “stack underfl ow”. Devido a isto, deve ter-se em consideração esta particularidade aquando da programação.
Sistema de interrupção
A primeira situação que o microcontrolador faz quando acontece uma interrupção, é executar a actual instrução e parar a execução do programa.
Imediatamente depois disso, o endereço da memória do programa é automaticamente empurrado para a stack, e o endereço predefi nido é carregado para o contador de programa. Essa localização de onde o programa con-tinua, chama-se de Vector de Interrupção. Para o PIC em causa, o vector é 0x0004.
Como se pode ver na fi gura abaixo, o endereço que tem o vector de interrupção é saltado durante a execução normal do programa.
Parte do programa que é activado quando acontece uma interrupção, é chamado de Rotina de Interrupção. A sua primeira instrução está localizada no vector de interrupção. Quão longa a subrotina vai ser, e como vai ser, depende apenas do programador, bem como do tipo de interrupção.
Alguns microcontroladores têem mais vectores de interrupção (cada interrupção têm um vector associado), mas no caso deste PIC, existe apenas um vector. Consequentemente, a primeira parte da rotina de interrupção, consiste no reconhecimento da fonte da mesma, ou onde foi originada.
Por último, quando a origem da interrupção foi encontrada, e a rotina de interrupção é executada, o micro-controlador chega à instrução RETFIE, puxa o endereço da stack, e continua a execução do programa de onde tinha saído.
Stack e Sistema de Interrupção
Como usar os Registos de função especial - SFR
O programador adquire o microcontrolador, já com uma ideia bem defi nida do que vai fazer com o mesmo. Há uma lista longa de SFR’s, com os seus bits. Cada um deles controla um qualquer processo. Num todo, é tudo como uma grande tabela de controlo, com muitos instrumentos e interruptores.
Os microcontroladores oferecem muitos produtos a baixo preço, que cabe ao programador tomar a decisão. Assim, este deve escolher a área que mais o agrada, e estudar apenas aquilo que necessita de saber.
Depois, quando compreender por completo o funcionamento completo do hardware, deve estudar os SFR’s que o controlam.
E não esquecer!, que durante a escrita do programa, aquando do trabalho com registos e seus bits, deve ser lembrado mudar para o banco apropriado. As tabelas acima são perfeitamente explanatórias.
Os Registos de Função Especial - SFR - do CPU
Características e Funções
Os SFRs podem ser classifi cados em duas categorias:
SFR do CPU, que controlam e monitorizam os processos no processador central. Mesmo havendo poucos, a operação de todo o microcoltrolador depende do seu conteúdo.
SFR periféricos, que controlam a operação dos periféricos (conversor A/D, módulo de comunicações série, etc). Cada um destes registos é normalmente usado para um circuito, e por esta razão, será explicado mais à frente o seu funcionamento junto com o do periférico.
Os SFR do CPU do PIC, serão descritos neste capítulo. Visto que os seus bits controlam vários circuitos den-tro do chip, não é possivel classifi cá-los por grupos. Estes bits são descritos juntamente com o processo que vão controlar.
Registo STATUS
O registo de STATUS contém: o estado aritmético do registo W, o estado do RESET e os bits de selecção do banco de memória.
O programador deve ser cauteloso, quando escreve valores para este registo porque, se o fi zer erradamente, os •
resultados podem ser diferentes do esperado. Por exemplo, se se tentar apagar todos os bits, usando a instrução “CLRF STATUS”, o resultado no registo será 000xx1xx, em vez do esperado 00000000.
Tais erros acontecem, porque alguns bits deste registos são comandados pelo hardware, e não podem ser altera-dos pelo programa. E, também, os bits 3 e 4 são apenas de leitura.
Por estas razões, se é necessário alterar o seu conteúdo, é recomendado usar instruções que não alterem os bits de estado C, DC e Z. Consultar o capítulo sobre as Instruções do PIC.
IRP - selecciona o banco de resgistos. É usado para endereçamento indirecto.
1 - Bancos 0 e 1 são activados (endereços de memória 0x00 a 0xFF) 2 - Bancos 2 e 3 são activados (endereços de memória 0x100 a 0x1FF)
RP1,RP0 - selecciona o banco de registos. É usado para endereçamento directo
RP1 RP0 Banco Activo 0 0 Banco 0 0 1 Banco 1 1 0 Banco 2 1 1 Banco 3 TO - bit de Time-out
1 - A seguir ao Power-on, ou depois de executar a instrução CLRWDT, que limpa o temporizador do watch-dog, ou da instrução SLEEP, que põe o microcontrolador em modo adormecido.
0 - A seguir a ter ocorrido um time-out do temporizador watchdog.
PD - bit de Power-down
1 - Depois do Power-on, ou depois de executar a instrução CLRWDT, que limpa o temporizador watchdog. 0 - Depois de de executar a instrução SLEEP, que coloca o microcontrolador em modo adormecido e baixo consumo.
Z - bit Zero
0 - O resultado da operação lógica ou aritmética é diferente de zero
DC - bit de transporte de digito, é mudado durante a soma ou subtracção, se houver “overfl ow” ou um “borrow”
do resultado
1 - Houve transporte do 4º bit do resultado. 0 - Não houve transporte do 4º bit do resultado.
C - bit de Transporte, é mudado durante a soma ou subtracção, se houver “overfl ow” ou um “borrow” do
resul-tado: se o resultado é maior que 255 ou menor que 0 1 - Houve transporte do bit mais signifi cativo do resultado 0 - Não houve transporte do bit mais signifi cativo do resultado
Registo OPTION_REG
O registo OPTION_REG tem vários bits de controlo, para confi gurar: divisor do TMR0/WDT, temporiza-dor TMR0, Interrupção externa e Pull-ups da Porta B.
RBPU - Interruptor dos Pull-ups da Porta B
1 - Pull-ups desligados 0 - Pull-ups ligados
INTEDG - Selecção do fl anco da interrupção
1 - Interrupção no fl anco ascendente do pino RB0/ INT
0 - Interrupção no fl anco descendente do pino RB0/ INT
T0CS - Selecção da fonte de clock para o TMR0
1 - Transição no pino T0CKI 0 - Clock interno a Fosc/4
T0SE - Selecção do fl anco para o contador TMR0,
no pino RA4/T0CKI
1 - Incrementa no fl anco descendente do pino T0CKI
PSA - Selecciona a atribuição para o TMR0 ou
Watchdog, do divisor
1 - Divisor atribuido ao Watchdog 0 - Divisor atribuido ao TMR0
PS2, PS1 e PS0 - Bits de selecção da magnitude de divisão, do divisor interno
A magnitude de divisão, do divisor interno, é confi gurada por estes três bits, descritos na tabela abaixo. A mag-nitude depende de se o divisor está atribuido ao TMR0, ou ao Watchdog.
PS2 PS1 PS0 TMR0 WDT 0 0 0 1:2 1:1 0 0 1 1:4 1:2 0 1 0 1:8l 1:4 0 1 1 1:16 1:8 1 0 1 1:64 1:32 1 1 0 1:128 1:64 1 1 1 1:256 1:128
De maneira a conseguir uma divisão de 1:1, quando o temporizador TMR0 é usado, o divisor deverá estar atri-buido ao Watchdog. Como resultado, o temporizador TMR0 não usa o divisor, e conta directamente os pulsos que lhe são chegados pelo oscilador interno, ou por via externa no pino RA4/T0CKI.
Registos do Sistema de Interrupções
Quando um pedido de interrupção chega ao microcontrolador, não signifi ca que a interrupção seja automatica-mente atendida pois, a mesma, terá de estar habilitada pelo programador. Devido a isto, há bits seleccionados para ligar/desligar as interrupções.
É simples reconhecer estes bits, porque o seu nome tem a sigla “IE” (Interrupt Enable, ou Habilitação da Inter-rupção). Além disto, cada interrupção está associada com outro bit chamado de Flag (sinalizador), que indica que o pedido de interrupção chegou ao microcontrolador, independentemente se a interrupção está habilitada, ou não. Também são facilmente reconhecidos pelas últimas letras “IF” (Interrup Flag, ou Sinalizador de Inter-rupção).
Como já foi descrito, o princípio é baseado numa ideia simples e efi ciente. Quando um pedido de interrupção chega, o bit de fl ag é também automatica e autonomamente ligado em primeiro lugar.
Registos do Sistema de Interrupções
Se o bit respectivo IE não está activado, este evento será completamente ignorado pelo microcontrolador. De outra forma, a interrupção será trabalhada pelo CPU.
Se várias fontes de interrupção estão activadas, então é necessário detectar as que estão activas, antes de iniciar a execução da interrupção. A detecção é feita, analisando quais os bits de fl ags que estão activos.
É importante compreender que os bits de fl ag não são automaticamente limpos, depois da interrupção ser ex-ecutada. Sim, devem ser apagados pelo programador, dentro do software de execução da interrupção.
Se este pormenor não fôr tomado em conta, outra interrupção irá disparar quando se voltar para o programa principal, mesmo que não haja mais pedidos para a sua execução. Resumindo, o bit de fl ag e o bit IE continu-arão activados.
Todas as fontes de interrupção do microcontrolador PIC16F887, poderão ser visualisadas na imagem abaixo. De notar os seguintes pontos:
bit GIE - activa/desactiva todas as interrupções
bit PEIE - activa/desactiva todas as interrupções de periféricos. Não se aplicam ao TMR0 e Porta B.
Para habilitar as interrupções causadas pela mudança de estado na Porta B, é necessário activar cada bit sepa-radamente. Neste caso, os bits do registo IOCB têem essa função em particular.
SFR’s - Special Function Registers das Interrupções
Registo INTCON
O registo INTCON contém vários bits de activação, e fl ag, para o TMR0, Porta B e pino INT. •
GIE - Habilitação global e simultânea de Interrupções
1 - Activa todas as interrupções 0 - Desactiva todas as interrupções
PEIE - Habilita as Interrupções dos periféricos
1 - Activa todas as interrupções dos periféricos 0 - Desactiva todas as interrupções dos periféricos
T0IE - Habilita a interrupção de fi m de contagem do TMR, quando da contagem de 255 para 0.
1 - Activa interrupção do TMR0 0 - Desactiva interrupção do TMR0
INTE - Habilita interrupção externa em RB0/INT, causada pela mudança de estado no pino
1 - Activa interrupção do RB0/INT 0 - Desactiva interrupção do RB0/INT
RBIE - Habilita interrupção da Porta B, da mudança de estado nos pinos. Quando confi gurados como
entra-das, os pinos da Porta B podem causar interrupção, se mudarem de estado lógico. Seja com fl anco ascendente, seja descendente. Interessa apenas que houve mudança.
1 - Activa interrupção por mudança de estado da Porta B 0 - Deactiva interrupção por mudança de estado da Porta B
T0IF - Flag de interrupção de fi m de contagem do TMR0
1 - TMR0 chegou ao fi m da contagem, fl ag deverá ser limpa pelo software 0 - TMR0 não chegou ao fi m da contagem
INTF - Flag de interrupção externa por mudança de estado no pino RB0/INT
1 - Ocorreu interrupção externa em INT, fl ag deverá ser limpa pelo software 0 - Não ocorrer interrupção externa em INT
RBIF - Flag de interrupção pela mudança de estado nos pinos da Porta B
1 - Pelo meno um dos pinos da Porta B mudou de estado lógico. Após a leitura da Porta B, a fl ag RBIF deverá ser limpa pelo software.
0 - Nenhum dos pinos da Porta B mudou de estado lógico.
Registo PIE1
O registo PIE1 contém os bits que habilitam as interrupções dos periféricos.
ADIE - Habilita a interrupção do Conversor A/D
1 - Liga a interrupção do conversor A/D 0 - Desliga a interrupção do conversor A/D
RCIE - Habilita a interrupção da Recepção da EUSART
1 - Liga a interrupção da Recepção da EUSART 0 - Desliga a interrupção da Recepção da EUSART
TXIE - Habilita a interrupção da Transmissão da EUSART
0 - Desliga a interrupção da Transmissão da EUSART
SSPIE - Habilita a interrupção da Porta Série Síncrona (MSSP), a cada transferência efectuada
1 - Liga a interrupção MSSP 0 - Desliga a interrupção MSSP
CCP1IE - Habilita a interrupção do módulo CCP1 (Capture/Compare/PWM - Captura/Compara/
PWM)
1 - Liga a interrupção CCP1 0 - Desliga a interrupção CCP1
TMR2IE - Habilita a interrupção por comparação entre PR2 e TMR2
1 - Liga a interrupção da comparação PR2 e TMR2 0 - Desliga a interrupção da comparação PR2 e TMR2
TMR1IE - Habilita a interrupção de fi m de contagem do TMR1, quando da contagem de 255 para 0.
1 - Activa interrupção do TMR1 0 - Desactiva interrupção do TMR1
Registo PIE2
OSFIE - Habilita interrupção por falha do Oscilador interno
1 - Liga interrupção por falha do Oscilador 0 - Desliga interrupção por falha do Oscilador
C2IE - Habilita interrupção do Comparador C2
1 - Liga interrupção do Comparador C2 0 - Desliga interrupção do Comparador C2
C1IE - Habilita interrupção do Comparador C1
1 - Liga interrupção do Comparador C1 0 - Desliga interrupção do Comparador C1
EEIE - Habilita a interrupção pela escrita da EEPROM
1 - Liga a interrupção pela escrita da EEPROM 0 - Desliga a interrupção pela escrita da EEPROM
BCLIE - Habilita a interrupção pela Colisão de Dados no Barramento
1 - Liga a interrupção pela Colisão de Dados no Barramento 0 - Desliga a interrupção pela Colisão de Dados no Barramento
ULPWUIE - Habilita a interrupção pelo “Despertar” em extrema baixa potência
1 - Liga a interrupção pelo “Despertar” em extrema baixa potência 0 - Desliga a interrupção pelo “Despertar” em extrema baixa potência
CCP2IE - Habilita a interrupção do módulo CCP2 (Capture/Compare/PWM - Captura/Compara/
PWM)
1 - Liga a interrupção CCP2 0 - Desliga a interrupção CCP2
Registo PIR1
O registo PIR1 contém as fl ags das interrupções.
ADIF - Flag da interrupção do conversor A/D
1 - A conversão A/D está completa. Flag deverá ser limpa por software 0 - A conversão não está completa ou não foi iniciada
RCIF - Flag da interrupção da recepção da EUSART
1 - O buff er de recepção da EUSART está completo. A fl ag é limpa, lendo o registo RCREG. 0 - O buff er de recepção da EUSART não está completo.
TXIF - Flag de interrupção da transmissão da EUSART
1- O buff er de transmissão da EUSART está vazio. A fl ag é limpa, escrevendo para o registo TXREG 0 - O buff er de transmissão da EUSART está completo.
SSPIF - Flag de interrupção da Porta Série Síncrona (MSSP)
1 - A interrupção MSSP durante a transmissão/recepção ocorreu. Estas condições diferem, dependendo do modo em que se opera: SPI ou I2C. Esta fl ag deve ser limpa por software.
0 - Nenhuma interrupção MSSP ocorreu.
CCP1IF - Flag de interrupção de CCP1
1 - A interrupção de CCP1 ocorreu. Dependendo do modo de operação, ocorreu um valor coincidente com sucesso na captura ou comparação. Em ambos os casos, a fl ag deverá ser limpa por software. Este bit não é usado no modo de PWM.