Você está na página 1de 33

MICROCONTROLADORES

PIC 16F

Resumo

António M. S. Francisco
Janeiro de 2009
Versão 2
Microcontroladores PIC

ÍNDICE

1. Introdução ................................................................................................... 2
2. Pinout ......................................................................................................... 3
3. Memória ...................................................................................................... 3
3.1. Memória de Programa ............................................................................. 4
3.2. Memória de Dados .................................................................................. 4
4. Registos SFR mais Utilizados .......................................................................... 6
4.1. Registo W.............................................................................................. 6
4.2. Registos PORTs ...................................................................................... 6
4.3. Registos TRIS ........................................................................................ 7
4.4. Registo STATUS ..................................................................................... 7
4.5. Registo INTCON ..................................................................................... 9
4.6. Registo OPTION ................................................................................... 10
4.7. Registo ANSEL e ANSELH....................................................................... 12
4.8. Módulo TIMER0 .................................................................................... 12
4.9. Módulo TIMER1 .................................................................................... 15
4.10. Módulo TIMER2 .................................................................................. 16
4.11. Módulo CAPTURE/COMPARE/PWM ......................................................... 18
4.12. Módulo conversor A/D (ADC) ................................................................ 20
4.13. Memória de Dados EEPROM.................................................................. 21
5. Códigos Utilizados nos Sistemas de Numeração ............................................... 24
6. Descrições de Opcode.................................................................................. 24
7. Set de Instruções (1) (2) ............................................................................. 25
8. Escrita de um Programa em Assembly ........................................................... 26
8.1. Directivas ............................................................................................ 27
8.2. Instruções ........................................................................................... 28
8.3. Etiquetas............................................................................................. 28
8.4. Comentários ........................................................................................ 28
9. Organização de um Programa em Assembly .................................................... 28
10. MPLAB IDE ............................................................................................... 29
10.1. Editor ............................................................................................... 29
10.2. Assemblador/Compilador ..................................................................... 30
10.3. Simulador .......................................................................................... 30
10.4. Gravador ........................................................................................... 31

INTERNET:

Outras publicações do autor em:


http://amsfrancisco.planetaclix.pt (aqui programas disponíveis para download)
http://automatos.planetaclix.pt
http://motores.planetaclix.pt

Endereços sobre microcontroladores:


http://www.microchip.com
http://perso.wanadoo.es/luis_ju
http://platea.pntic.mec.es/~lmarti2
http://www.alos.5u.com/index.html
http://www.unicrom.com/Tut_PICs4.asp
http://www.webdearde.com/modules/Tutoriales/microcontroladorespic/pic.htm
http://www.webdearde.com/modules/Tutoriales/picgamamedia/pic-gama-media.pdf
http://www.redeya.com/electronica/microcontroladores.html
http://www.geocities.com/micros_uan/index.html
Livro: Sistemas Baseados em Microcontroladores PIC – Editora Publindústria

António Francisco 1
Microcontroladores PIC

1. INTRODUÇÃO
Os microcontroladores são circuitos integrados que possuem num único dispositivo todos os
circuitos necessários para realizar um completo sistema programável, logo, para serem
utilizados, necessitam de ser programados.
Diferenciam-se uns dos outros, essencialmente, pela capacidade e tipo de memória
(programa e dados), velocidade de processamento, número de pinos de entrada/saída (I/O)
e periféricos.

Existem diferentes fabricantes de microcontroladores, como: Microchip, Motorola, Atmel,


Holtek, Cypress, Intel, etc.
Os microcontroladores PIC são produzidos pela Microchip Technology Inc.
(www.microchip.com) e estão disponíveis numa ampla gama de modelos para melhor se
adaptarem às necessidades dos projectos.
Uma descrição detalhada da tipologia dos PICs está disponível no site da Microchip, onde
também se encontra abundante informação técnica, ferramentas de software, exemplos de
aplicações, entre outras, de utilização livre.
Os microcontroladores mais recentes deste fabricante podem ser programados sem serem
retirados do circuito onde estão aplicados (In-Circuit Serial Programming - ICSP).

A estrutura básica de um microcontrolador é a seguinte:

Utilizando-se microcontroladores é possível em pouco tempo e com poucos componentes


projectar de simples a complexos sistemas com a vantagem de os mesmo serem
programáveis.
Os microcontroladores PIC têm como periféricos: timers, watchdog, contadores, módulo CCP
(Capture, Compare e PWM), ADCs, comparadores analógicos, oscilador interno, entre outros.

Notas:
• Nos exemplos que se seguem utiliza-se o PIC16F690, microcontrolador com um conjunto
alargados de características e de baixo custo. Feitas as devidas ressalvas, o documento
pode ser aplicado a uma grande variedade de microcontroladores PIC de uso corrente.
Também, a utilização deste documento, deve ser complementada com a consulta do data
sheet do referido micro, cujo download pode ser feito a partir do site do fabricante.
• No site do autor: http://amsfrancisco.planetaclix.pt, estão disponíveis, para download,
programas didácticos para PICs.

António Francisco 2
Microcontroladores PIC

2. PINOUT
Encapsulamento DIP

Descrição do Pinout

3. MEMÓRIA
Os PIC têm dois blocos de memória separados; um para o programa e outro para os dados.

António Francisco 3
Microcontroladores PIC

3.1. MEMÓRIA DE PROGRAMA

A memória de programa é implementada usando tecnologia FLASH (EEPROM), o que torna


possível programar o microcontrolador muitos milhares de vezes. A capacidade da memória
de programa depende da referência do microcontrolador. Esta memória não perde os dados
após se desligar a tensão de alimentação do microcontrolador.
Nos microcontroladores da família 16F do fabricante Microchip, os endereços 00h e 04h
desta memória estão geralmente reservados, respectivamente, para o vector de reset e para
o vector de interrupção.
Assim, o microcontrolador, logo que é alimentado ou após sofrer um reset, começa a
funcionar a partir do endereço 00h. Existindo o vector das interrupções no endereço 04h é
conveniente que o programa salte este endereço e continue num endereço acima de 04h.

A pilha (Stack) é um local reservado na memória, onde é guardado o endereço de retorno


das subrotinas. É capaz de armazenar até 8 endereços.

3.2. MEMÓRIA DE DADOS


Constituída por memória RAM e memória EEPROM. A memória RAM está organizada por
bancos (blocos). Estes contêm os registos de funções especiais (SFR- Special Function
Registers) e os registos de uso geral (GPR-General Purpose Registers). Estes registos são
formados por palavras de 8 bits e distribuem-se pelos diferentes bancos. O número de
bancos e a sua distribuição depende do tipo de PIC. (Um registo é um local na memória do
PIC, que pode ser lido e escrito).
A memória de dados EEPROM, cujo conteúdo não se perde durante uma falha da
alimentação, é acedida indirectamente através dos registos EEADR e EEDATA.
Como a memória EEPROM serve usualmente para guardar parâmetros importantes (por
exemplo, uma temperatura), existe um procedimento próprio para escrever na EEPROM que
tem que ser seguido de modo a evitar-se uma escrita acidental.

António Francisco 4
Microcontroladores PIC

ORGANIZAÇÃO DOS BANCOS DE MEMÓRIA DE DADOS

SELECÇÃO DO BANCO DE MEMÓRIA1

1 Nos PIC18, trabalhando com os bytes iniciais do banco 0 (endereços dos GPR) e os bytes finais do banco 15
(endereços dos SFR) não é necessário mudar de banco (access bank seleccionado, a=0).

António Francisco 5
Microcontroladores PIC

4. REGISTOS SFR MAIS UTILIZADOS


Os registos mais utilizados em programação básica dos microcontroladores PIC são:

Registo Endereço
PORTA 05h e 105h
PORTB 06h e 106h
PORTC 07h e 107h
TRISA 85h e 185h
TRISB 86h e 186h
TRISC 87h e 187h
STATUS 03h, 83h, 103h e 183h
OPTION 81h e 181h
INCON 0Bh, 8Bh, 10Bh e 18Bh
TIMER 0 01h e 101h

Alguns registos mais importantes estão em todos os bancos, permitem o acesso sem
sair do banco onde se está. Tanto faz alterar num como noutro banco, pois são sempre
cópias.

4.1. REGISTO W – WORKING REGISTER (WREG) (ACUMULADOR)


O Acumulador é o registo mais solicitado do microcontrolador. Neste registo são colocados
os resultados das operações efectuadas pelo programa, sendo portanto um registo cujo
conteúdo está permanentemente a ser alterado. Caso se pretenda utilizar o conteúdo do
acumulador no programa, este deve ser imediatamente copiado para um registo específico.
O acumulador pode ser acedido a partir de qualquer banco de memória.

4.2. REGISTOS PORTS (portos)


PORTA, PORTB e PORTC são grupo de pinos do microcontrolador que podem ser acedidos
individualmente ou simultaneamente e no qual podemos colocar valores lógicos ou ler deles
o estado existente.

PORTA (05h e 105h)

- - RA5 RA4 RA3 RA2 RA1 RA0


Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

PORTB (06h e 106h)

RB7 RB6 RB5 RB4 - - - -


Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

PORTC (07h e 107h)

RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0


Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

Fisicamente, porto é um registo dentro do microcontrolador que está ligado por condutores
aos terminais do integrado, podendo-se assim aceder ao seu conteúdo ou nele colocar
valores lógicos.

António Francisco 6
Microcontroladores PIC

Os portos são a conexão física do microcontrolador com o mundo exterior. O micro utiliza-os
para observar ou comandar outros componentes ou dispositivos.

Os pinos do PORTA e do PORTB, quando configurados como entradas, podem ser ligados
internamente ao positivo da alimentação através de resistência de pull-up. Estas resistências
são activadas pondo a 0 o bit RABPU (bit 7 do registo OPTION). Estas resistências são
automaticamente desligadas quando os pinos do porto são configurados como saídas.

Para aumentar a sua funcionalidade, os mesmos pinos de um porto podem ter aplicações
distintas, por exemplo, o pino 16 do PIC16F690 pode ser configurado como:
RCO/AN4/C2IN+. Pode ser o bit 0 do porto C, a entrada analógica n.º 4 ou a entrada “+” do
comparador C2. A escolha da função é feita nos registos de configuração.

4.3. REGISTOS TRIS


Os pinos dos portos A, B e C podem ser definidos como entrada ou como saídas (excepto
RA3 que pode ser apenas entrada), de acordo com as necessidades do projecto (por defeito
estão programados como entrada).

Para definir um pino como entrada ou como saída, é preciso, em primeiro lugar, escrever no
registo TRIS respectivo o valor lógico 0 ou 1.
Se num bit do registo TRIS for escrito o valor lógico 1, então o correspondente pino do porto
é definido como entrada (1≡Input), se for escrito o valor 0, então o pino é definido como
saída (0≡Output).

TRISA (85h e 185h)

- - TRIS5 TRIS4 TRIS3 TRIS2 TRIS1 TRIS0


Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

Por exemplo, se no registo TRISA for colocada a seguinte palavra: 00001111, os pinos RA0 a
RA3 funcionam entradas e os pinos RA4 e RA5 como saídas.

TRISB (86h e 186h)

TRIS7 TRIS6 TRIS5 TRIS4 - - - -


Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

TRISC (87h e 187h)

TRIS7 TRIS6 TRIS5 TRIS4 TRIS3 TRIS2 TRIS1 TRIS0


Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

4.4. REGISTO STATUS (03h, 83h, 103h e 183h)

O registo de estado (STATUS) contém o estado da ALU (bits: C, DC, Z), estado de RESET
(bits: TO e PD) e os bits para selecção do banco de memória (IRP, RP1, RP0).
Sendo a selecção do banco de memória controlada por este registo, ele está presente em
todos os bancos.
Se o registo STATUS for o registo de destino para instruções que afectem os bits Z, DC ou C,
não é possível escrever nestes três bits.

António Francisco 7
Microcontroladores PIC

R <> bit que só pode ser lido


W <> bit que só pode ser escrito
U <> bit não implementado
n <> valor para reset ao ligar
x <> pode ser 0 ou 1
u <> sem alteração
q <> depende da condição actual

bit 0 - C (Carry) Transporte


Este bit é afectado pelas operações de adição, subtracção e deslocamento. Toma o valor “1”
quando um valor mais pequeno é subtraído de um valor maior e toma o valor “0” quando
um valor maior é subtraído de um menor.
1= Ocorreu um transporte no bit mais significativo
0= Não ocorreu transporte no bit mais significativo
O bit C é afectado pelas instruções ADDWF, ADDLW, SUBLW, SUBWF RLF e RRF

bit 1 - DC (Digit Carry) Transporte de dígito


Este bit é afectado pelas operações de adição e subtracção. Ao contrário do anterior, DC
assinala um transporte do bit 3 para o bit 4 do resultado. Este bit toma o valor “1”, quando
um valor mais pequeno é subtraído de um valor maior e toma o valor “0” quando um valor
maior é subtraído de um menor.
1= Ocorreu um transporte no quarto bit mais significativo
0= Não ocorreu transporte nesse bit
O bit DC é afectado pelas instruções ADDWF, ADDLW, SUBLW e SUBWF.

bit 2 - Z (bit Zero) Indicação de resultado igual a zero.


Este bit toma o valor “1” quando o resultado da operação lógica ou aritmética executada é
igual a 0.
1= resultado igual a zero
0= resultado diferente de zero

bit 3 - PD (bit de baixa de tensão – Power Down)


Este bit é posto a “1” quando o microcontrolador é alimentado e começa a trabalhar, depois
de um reset normal e depois da execução da instrução CLRWDT. A instrução SLEEP põe este
bit a “0” ou seja, quando o microcontrolador entra no regime de baixo consumo / pouco
trabalho. Este bit pode também ser posto a “1”, no caso de ocorrer um impulso no pino
RB0/INT, uma variação nos quatro bits mais significativos do porto B, ou quando é
completada uma operação de escrita na DATA EEPROM ou ainda pelo watchdog (WDT).
1 = depois de ter sido ligada a alimentação
0 = depois da execução de uma instrução SLEEP

bit 4 - TO Time-Out; transbordo do watchdog


Este bit é posto a “1”, depois de a alimentação ser ligada e depois da execução das
instruções CLRWDT e SLEEP. O bit é posto a “0” quando o watchdog consegue chegar ao fim
da sua contagem (overflow = transbordar), o que indica que qualquer coisa não esteve bem.
1 = não ocorreu transbordo
0 = ocorreu transbordo

António Francisco 8
Microcontroladores PIC

bits 5 e 6 - RP1 e RP0 (bits de selecção de banco de registos)


Estes dois bits são a parte mais significativa do endereço utilizado para endereçamento
directo. Como as instruções que endereçam directamente a memória, dispõem somente de
sete bits para este efeito, é preciso mais um bit para poder endereçar todos os 256 registos
do PIC.
00 = banco de registos 0 10 = banco de registos 2
01 = banco de registos 1 11 = banco de registos 3

bit 7 - IRP (Bit de selecção de banco de registos)


Este bit é utilizado no endereçamento indirecto da RAM interna, como oitavo bit.
1 = bancos 2 e 3 (endereços de 100h a 1FFh)
0 = bancos 0 e 1 (endereços de 00h a FFh)

No exemplo seguinte está escrito o programa para configurar os pinos 0, 1, 2 e 3 do porto C


como entradas e os pinos 4, 5, 6 e 7 como saídas.

bsf STATUS,RP0 ;coloca bit RP0 do registo Status a 1


bcf STATUS,RP1 ;coloca bit RP1 do registo Status a 0
;foi seleccionado o banco 1* para se aceder ao registo TRISC
movlw b'00001111' ;Move o literal (b'00001111’) para o registo W
movwf TRISC ;Move o conteúdo do registo W para o registo TRISC.
;Configura os pinos 0 a 3 do PORTC como entradas e os
;restantes como saídas
bcf STATUS,RP0 ;coloca bit RP0 do registo Status a 0
bcf STATUS,RP1 ;coloca bit RP1 do registo Status a 0
;regressa ao banco 0

* Quando o PIC arranca vai para o Banco 0, como TRISA, TRISB e TRISC estão no banco 1 ou no banco
3, para se aceder a estes registos tem que se configurar o registo STATUS para seleccionar o banco 1
ou o banco 3.

4.5. REGISTO OPTION - OPTION_REG (81h e 181h)

Registo que contém bits que se destinam a configurar o funcionamento do micro.

bit 0, bit 1 e bit 2: PS0, PS1 e PS2: Bits de selecção do divisor prescaler
O prescaler e como estes bits afectam o funcionamento do microcontrolador, são abordados
na secção que trata do registo TMR0.

António Francisco 9
Microcontroladores PIC

bit 3 - PSA: Bit que atribui o prescaler ao temporizador TMR0 ou ao temporizador do


watchdog
1 = o prescaler é atribuído ao temporizador do watchdog.
0 = o prescaler é atribuído ao temporizador TMR0.

bit 4 - T0SE: Com o timer0 configurado para contar impulsos externos, aplicados ao pino
RA2/T0CKI, este bit vai determinar quando a contagem irá incidir sobre os impulsos
ascendentes ou descendentes do sinal.
1 = incrementa nos impulsos de flanco descendente no pino RA2/T0CKI
0 = incrementa nos impulsos de flanco ascendente no pino RA2/T0CKI

bit 5 - T0CS: Este bit permite seleccionar a fonte de clock do TMR0.


1 = impulsos externos aplicados ao pino RA2/T0CKI
0 = impulsos do clock interno (Fosc/4)

bit 6 – INTEDG: Se a ocorrência de interrupções estiver habilitada, este bit vai determinar
qual o bordo em que a interrupção no pino RA2/INT vai ocorrer.
1 = flanco ascendente
0 = flanco descendente

bit 7 – RABPU: Este bit introduz ou retira as resistências de pull-up internas, do Porto A e
do Porto B, ligadas ao “+” da alimentação.
1 = resistências de “pull-up” desligadas
0 = resistências de “pull-up” ligadas

4.6. REGISTO INTCON (0Bh, 8Bh, 10Bh e 18Bh)

É o registo que controla as interrupções. O papel do INTCON é permitir ou impedir as


interrupções e, mesmo no caso de elas não serem permitidas, ele toma nota dos pedidos,
alterando o nível lógico de alguns dos seus bits.

As interrupções são um mecanismo que o microcontrolador possui e que torna possível


responder a acontecimentos no momento em que eles ocorrem, qualquer que seja a tarefa
que o microcontrolador esteja a executar.
Esta é uma parte importante do funcionamento dos micros, permite reagir aos
acontecimentos na hora. Geralmente, cada interrupção muda a direcção de execução do
programa, suspendendo a sua execução, enquanto o microcontrolador corre um
subprograma que é a rotina de atendimento da interrupção. Depois de este subprograma ter
sido executado, o microcontrolador continua no programa principal, a partir do local em que
o tinha abandonado.

bit 0 - RABIF: Bit que informa que houve mudança nos níveis lógicos nos pinos do porto A
ou do porto B; 0 para 1 ou 1 para 0:
1= Pelo menos um destes pinos mudou de nível lógico.
0= Não ocorreu nenhuma variação nestes pinos.

Para que estes pinos detectem as variações, eles devem ser definidos como entradas. Se

António Francisco 10
Microcontroladores PIC

qualquer deles for definido como saída, nenhuma interrupção será gerada quando surgir
uma variação do nível lógico. Se estes pinos forem definidos como entradas, o seu valor
actual é comparado com o valor anterior, que foi guardado quando se fez a leitura anterior
ao porto.

bit 1 - INTF: Bit que informa que houve interrupção externa no pino RA2/INT
1= Ocorreu uma interrupção externa (depois, colocar a 0 na rotina da interrupção para
que a mesma possa ocorrer de novo)
0= Não ocorreu uma interrupção externa

Se um impulso ascendente ou descendente for detectado no pino RA2/INT, o bit INTF é


posto a “1” (o tipo de sensibilidade, ascendente ou descendente, é definida através do bit
INTEDG do registo OPTION). O subprograma de atendimento desta interrupção deve repor
este bit a “0”, afim de que a próxima interrupção possa ser detectada.

bit 2 – T0IF: Bit que informa que houve interrupção por transbordo do contador de TMR0:
1= Contador mudou a contagem de FFh para 00h (overflow) (depois, colocar a 0 na
rotina da interrupção o bit T0IF para que a interrupção possa ocorrer de novo).
0= Não ocorreu overflow.

bit 3 - RABIE: Bit de habilitação de interrupção no PORTA/PORTB. Permite que a


interrupção por variação dos níveis lógicos nos pinos ocorra.
1= Habilita a interrupção.
0= Inibe a interrupção.

bit 4 - INTE: Bit de habilitação da interrupção externa no pino RA2/INT.


1=Interrupção externa habilitada.
0= Interrupção externa impedida.

bit 5 – T0IE: Bit de habilitação de interrupção por transbordo do contador TMR0.


1= Interrupção autorizada.
0= Interrupção impedida.

bit 6 - PEIE: Bit que habilita as interrupção dos periféricos


1= Interrupções habilitada.
0= Interrupções desabilitadas.

bit 7 - GIE: Bit que permite ou impede todas as interrupções.


1= Permite a execução de todas as interrupções cujos bits de permissão individual
estejam activados.
0= Todas as interrupções impedidas.

De um modo geral, cada fonte de interrupção tem dois bits associados. Um habilita a
interrupção e o outro assinala quando a interrupção ocorre.
Existe um bit comum a todas as interrupções –GIE- que pode ser usado para impedir ou
habilitar todas as interrupções simultaneamente. Este bit é muito útil quando se está a
escrever um programa porque permite que todas as interrupções sejam impedidas durante
um período de tempo, de tal maneira que a execução de uma parte crítica do programa não
possa ser interrompida. Quando a instrução que faz GIE=0 é executada (GIE=0 impede
todas as interrupções) e todas os pedidos de interrupção pendentes, serão ignorados.
As interrupções que estão pendentes e que são ignoradas serão processadas quando o bit
GIE é posto a “1” (GIE=1, todas as interrupções permitidas).
Quando a interrupção é atendida, o bit GIE é posto a “0”, de tal modo que, quaisquer

António Francisco 11
Microcontroladores PIC

interrupções adicionais sejam inibidas, o endereço de retorno é guardado na pilha e, no


contador de programa, é escrito 04h. Somente depois disso, é que a resposta a uma
interrupção começa.
Depois de a interrupção ser processada, o bit que por ter sido posto a “1” permitiu a
interrupção, deve agora ser reposto a “0”, senão, a rotina de interrupção irá ser novamente
processada, mal se efectue o regresso ao programa principal.

Guardar os conteúdos de registos importantes


A única coisa que é guardada na pilha durante uma interrupção é o valor de retorno do
contador de programa (por valor de retorno do contador de programa entende-se o
endereço da instrução que estava para ser executada, mas que não foi, por causa de ter
ocorrido a interrupção). Guardar apenas o valor do contador de programa não é, muitas
vezes, suficiente. Alguns registos que já foram usados no programa principal, podem
também vir a ser usados na rotina de interrupção. Se não salvaguardamos os seus valores,
quando acontece o regresso da subrotina para o programa principal os conteúdos dos
registos podem ser diferentes, o que provoca um erro no programa.
Um exemplo para este caso é o conteúdo do registo de trabalho W. Se, por exemplo, o
programa principal estiver a usar o registo de trabalho W nalgumas das suas operações e se
ele contiver algum valor que seja importante para a instrução seguinte, então a interrupção
que ocorre, antes desta instrução, vai alterar o valor do registo de trabalho W, indo
influenciar directamente o programa principal.
O procedimento para a gravação de registos importantes antes de ir para a subrotina de
interrupção, designa-se por “PUSH”, enquanto o procedimento que recupera esses valores é
chamado POP.
O regresso de uma rotina de interrupção é efectuado com instrução RETFI. Esta instrução
coloca automaticamente o bit GIE a “1”, permitindo assim que novas interrupções possam
ocorrer.

4.7. REGISTO ANSEL E ANSELH

Registos que determinam o funcionamento de alguns pinos do microcontrolador como I/O


digitais ou entradas analógicas (ADC). Nalguns tipos de PICs, por exemplo PIC16F688, esta
configuração é efectuada no registo CMCON0.

ANSEL

ANSEH

4.8. MÓDULO TIMER0

O micro PIC16F690 possui vários registos TIMER. Destes, o TIMER0 com o registo TMR0, é o
mais utilizado. Trata-se de um contador/temporizador de 8 bits, daí o seu conteúdo poder
ser incrementado até 255, independentemente da execução do resto do programa.
Funcionando o TIMER0 em modo temporizador, os impulsos são obtidos internamente a
partir do sinal de relógio do micro. Em modo contador os impulsos provêm do exterior

António Francisco 12
Microcontroladores PIC

através do pino T0CKI do micro.


TIMER0 é configurado através do registo OPTION_REG e possui o seguinte diagrama de
blocos:

Uma vez atingido o valor 255 o registo TMR0 volta automaticamente a zero, iniciando nova
contagem. Esta inicia-se em zero e não no valor em que TMR0 tivesse sido originalmente
programado.
A contagem do registo é directamente proporcional à frequência do sinal aplicado à entrada,
sendo, no entanto, possível efectuar a divisão da frequência de entrada através de um
prescaler, conforme se pode verificar, de forma simplificada, nos diagramas de blocos
seguintes:

Bit T0CS=0 e bit PSA=1, o percurso do sinal é o seguinte:

António Francisco 13
Microcontroladores PIC

Bit T0CS=0 e bit PSA=0, o percurso do sinal será:

Fosc/4 e T0CKI representam as duas possíveis fontes de sinal para o contador TMR0. Fosc/4
é um sinal gerado internamente no PIC pelo circuito de clock. É a frequência de clock
dividida por quatro. T0CKI é o pino do PIC onde pode ser aplicado um sinal de um circuito
externo.
Os blocos T0CS e PSA são comutadores que permitem seleccionar as entradas do sinal. São
programados no registo OPTION com o valor 0 ou 1.
O bloco Prescaler é a designação para a parte do microcontrolador que divide a frequência
de oscilação do clock antes que os respectivos impulsos possam incrementar o
temporizador. O número pelo qual a frequência de clock é dividida está definido nos três
primeiros bits do registo OPTION: PS0, PS1 e PS2. A maior divisão possível é 256. Neste
caso, significa que só após 256 impulsos de clock é que o conteúdo do temporizador é
incrementado de uma unidade. Isto permite-nos medir grandes intervalos de tempo.

Com o PIC a funcionar com um clock de 4 MHz, o prescaler=256 e o TMR0 a contar o valor
máximo (256), o overflow de TMR0 acontece a cada 65,53ms (4/fosc x 256 x 256 =
65,54ms).
Se a interrupção de TMR0 estiver habilitada, sempre que ocorrer o overflow de TMR0
(transição de 255 para 0), o bit T0IF do registo INTCON é colocado a “1”.
Cabe ao programador voltar a colocar a “0” o bit T0IF, na rotina de interrupção, para que
uma nova interrupção possa ser detectada.
O prescaler pode ser atribuído ao temporizador TMR0, ou ao temporizador do watchdog
(WDT), isso é feito através do bit PSA no registo OPTION.
A mudança do prescaler está completamente sob o controle do programador e pode ser
executada enquanto o programa está a correr.

O watchdog é um mecanismo que o microcontrolador usa para se defender contra


"bloqueios" do programa. Como qualquer circuito eléctrico, também os microcontroladores
podem ter uma falha ou algum percalço no seu funcionamento. Infelizmente, o
microcontrolador também pode ter problemas com o seu programa. Quando isto acontece, o
microcontrolador pára de trabalhar e mantém-se nesse estado até que alguém faça o reset.
Por causa disso, foi introduzido o mecanismo de watchdog (cão de guarda). Depois de um
certo período de tempo, o watchdog faz o reset do microcontrolador (o que realmente
acontece, é que o microcontrolador executa o reset de si próprio).
O watchdog trabalha na base de um princípio simples: se o seu temporizador transbordar, é
feito o reset do microcontrolador e este começa a executar o programa a partir do princípio.
Deste modo, o reset poderá ocorrer tanto no caso de funcionamento correcto como no caso
de funcionamento incorrecto.
Para que ele não ocorra, no caso de funcionamento correcto, o registo WDT terá de ser
colocado a 0 (instrução CLRWDT) sempre que este está próximo de transbordar. Assim, o
programa irá evitar um reset enquanto está a funcionar correctamente. Se ocorrer o
"bloqueio" do programa, este zero não será escrito, haverá transbordo do temporizador
WDT, o que fará ocorrer o reset que vai fazer com que o microcontrolador comece de novo a
trabalhar correctamente.

António Francisco 14
Microcontroladores PIC

4.9. MÓDULO TIMER1

O TIMER1 possui os registos TMR1L (Low) e TMR1H (High) e, à semelhança de TIMER0,


também pode funcionar em modo temporizador e contador. Em modo temporizador os
impulsos têm origem no relógio do micro e em modo contador provêm do exterior através
dos pinos T1CHI ou T1G.
TIMER1 possui 16 bits e, por isso, pode efectuar contagens até 65.535. Tal como TIMER0,
TIMER1 funciona independentemente da execução do resto do programa.
Com o PIC a funcionar com um clock de 4 MHz, o prescaler=8 e o TMR1 a contar o valor
máximo (65.536), o overflow de TMR1 acontece a cada 524,288ms (4/fosc x 8 x 65.536 =
524,288ms).
TIMER1 é configurado através do registo T1CON.

4.9.1. REGISTO T1CON

António Francisco 15
Microcontroladores PIC

4.10. MÓDULO TIMER2

O TIMER2 possui um funcionamento diferente de TIMER0 e TIMER1; funciona apenas no


modo temporizador e a activação da sua flag (TMR2IF) não está associada ao overflow do
contador, ocorre quando o conteúdo do registo de TIMER2 (TMR2) igualar o do registo PR2.
TMR2 e PR2 são registos dei 8 bits e, por isso, podem efectua contagens até 255.
Tal como TIMER0 e TIMER1, TIMER2 também funciona independentemente da execução
do resto do programa.
TIMER2 é configurado através do registo T2CON.

4.10.1. REGISTO T2CON

A seguir mostra-se um programa que faz piscar um led, ligado no pino RC0, por interrupção
devida ao overflow de TMR0.

António Francisco 16
Microcontroladores PIC

org 00 ;início do programa


goto configuracao_SFR ;para saltar o vector da interrupção
org 04 ;endereço para onde o programa vem quando ocorrer a
;interrupção
goto int_TMR0 ;interrupção por transbordo de TMR0, T0IF=1 e faz GIE=0
configuracao_SFR
;Banco 1: RP0=1 e RP1=0
bsf STATUS,RP0 ;coloca o bit RP0 do registo STATUS a "1"
bcf STATUS,RP1 ;coloca o bit RP1 do registo STATUS a "0"
clrf TRISC ;0=saída, 1=entrada
movlw b'00000010'
movwf OPTION_REG ;<2:0> configura prescaler 1:8
;Banco 2: RP0=0 e RP1=1
bcf STATUS,RP0 ;coloca o bit RP0 do registo STATUS a "0"
bsf STATUS,RP1 ;coloca o bit RP1 do registo STATUS a "1"
clrf ANSEL ;0 = I/O digital
clrf ANSELH ;0 = I/O digital
;Banco 0: RP0=0 e RP1=0
bcf STATUS,RP0 ;coloca o bit RP0 do registo STATUS a "0"
bcf STATUS,RP1 ;coloca o bit RP1 do registo STATUS a "0"
movlw b'10100000' ;interrupções permitidas (bit 7-GIE) e interrupção por
;transbordo de TMR0 (bit 5-T0IE)
movwf INTCON
clrf PORTC ;garante saída PORTC a zero
;**********************************************************************
PROGRAMA
;**********************************************************************
movlw d'13' ;coloca em W o valor 13. AJUSTAR A OSCILAÇÃO AQUI (0,5s
;ON, 0,5s OFF)
movwf memo ;guarda o valor em memo
movwf TMR0 ;carrega TMR0 com o valor
goto $ ;fica em ciclo nesta linha, sendo incrementado TMR0 a partir do
;valor de "memo". Quando TMR0 transita de 255>0 -> T0IF=1,
;indo, neste caso, o programa para org 04
;------------------------------------------------------------------------------------------------------
;Rotina de Serviço da Interrupção (RSI)
;------------------------------------------------------------------------------------------------------
int_TMR0
decfsz contador,f ;1ª vez toma o valor 255, quando contador=0, ignora linha
;seguinte
goto salto2 ;se contador>0 faz esta linha
btfsc led ;se led=0, ignora linha seguinte
goto salto1
bsf led ;acende led
goto salto2
salto1
bcf led ;apaga led
salto2
movf memo,W ;move o conteúdo de memo (f) para W
movwf TMR0 ;volta a carrega TMR0 com o mesmo valor
bcf INTCON,T0IF ;coloca novamente T0IF (bit 2) do registo INTCON a 0 para que
;a interrupção em TMR0 possa voltar a ocorrer
retfie ;retorna ao programa do ponto em que foi interrompido pela
;interrupção e faz GIE=1
;------------------------------------------------------------------------------------------------------
end

António Francisco 17
Microcontroladores PIC

4.11. MÓDULO CAPTURE/COMPARE/PWM

O módulo Captura, Comparação e PWM é um periférico que permite controlar diferentes


eventos. A programação deste módulo implica a configuração de vários SFR.
No modo Captura, é possível contar eventos que ocorram num pino do micro.
No modo Comparação é possível comparar o valor de uma contagem com o valor de registos
do micro.
No modo PWM - Pulse Width Modulation (Modulação por largura de impulso) e possível gerar
sinais cuja frequência e duty cycle podem ser configurados. A resolução do sinal PWM é de
10 bits.
A técnica PWM é bastante utilizada, nomeadamente no controlo de velocidade de motores DC.
Com esta técnica controla-se o tempo que um sinal digital, num período, está a “1” e a “0”
(duty cycle), conseguindo-se assim controlar a energia fornecida ao motor e
consequentemente a sua velocidade.
O valor “1” corresponde ao tempo durante o qual o motor é alimentado, e o valor “0” ao
tempo em que o motor não é alimentado.

Para activar o módulo PWM é necessário configurar os seguintes registos:


CCP1CON, T2CON, CCPR1L e PR2

4.11.1. REGISTO CCP1CON

Registo de controlo de CCP1.

António Francisco 18
Microcontroladores PIC

4.11.2. REGISTO CCPR1L

Registo que, em conjunto com dois bits do registo CCP1CON, vão determinar o TON
(Pulse Width).

4.11.3. REGISTO PR2

Registo de 8 bits que é carregado com valor que vai afectar o PWM Period.

O período do PWM depende do valor do registo PR2 e do valor seleccionado em TMR2


Prescale Value. É calculado pela seguinte fórmula:

PWM Period = [(PR2)+ 1]•4•TOSC • (TMR2 Prescale Value)

O tempo que o impulso está no estado “1” TON, é dado pela seguinte expressão:

Pulse Width = (CCPR1L<7:0>:CCP1CON<5:4>) • TOSC • (TMR2 Prescale Value)

Obs.
• Para habilitar o sinal PWM, colocar a 1 o bit TMR2ON do registo T2CON;
• Configurar o pino de saída do sinal PWM (RC5), no respectivo registo TRIS, como
saída.

De seguida código de um programa que permite gerar um sinal, no pino RC5, com uma
frequência de 4 kHz e com um duty cycle variável entre 0 e 100%, por alteração do valor do
registo CCPR1L.

banksel TRISC ;muda para o banco 1


bcf TRISC,5 ;RC5/CCP1 = saída digital PWM
movlw d'249' ;d'249' <> T=250us <> f=4kHz
movwf PR2 ;PWM Period =[(PR2)+ 1] • 4 • TOSC • (TMR2 Prescale Value)
;[(PR2)+ 1]=250, TOSC=1/4MHz, Prescale Value=1
banksel PORTC ;muda para o banco 0
movlw b'00001100'
movwf CCP1CON ;<7:6> 00 = single output (saída em P1A)
;<5:4> 00 = 2 bits LSB de PWM duty cycle (podem ficar a 0, erro
;mínimo)
;<3:0> 1100 = saída P1A active-high
movlw d'125' ;ALTERAR AQUI (valores entre 0 e 250 para controlo do duty cycle)
movwf CCPR1L ;TON = (CCPR1L<7:0>:CCP1CON<5:4>) •TOSC • (TMR2 Prescale
;Value)
;d'250' (máximo)<>duty cycle 100%, 0 (mínimo)<>duty cycle 0%,
;d'125'<>duty cycle 50%
;Atenção! não se considerou os dois bits LSB do PWM duty cycle
movlw b'00000100'
movwf T2CON ;<2> =1, liga o timer 2
;<1:0> = 00 <> TMR2 Prescaler Value=1
goto $ ;ciclo indefinido, continuando o PWM a funcionar

António Francisco 19
Microcontroladores PIC

4.12. MÓDULO CONVERSOR A-D (ADC)

A conversão analógico-digital (ADC) é uma função vulgar nos microcontroladores PIC.


Este módulo permite a conversão de um sinal analógico externo para digital, com 10
bits de resolução.

Os registos que configuram o funcionamento do ADC são: ADCON0 e ADCON1, sendo o


resultado da conversão, com 10 bits, guardado nos registos ADRESH e ADRESL.
Note-se que o resultado da conversão fica em dois registos porque 10 bits não cabem
num só registo. Assim 8 bits ficam num registo e 2 bits noutro registo, ver bit ADFM do
registo ADCON0.

4.12.1. REGISTO ADCON0

Segue-se um código que permite a conversão de um sinal analógico, aplicado na


entrada RA2, num valor digital.

António Francisco 20
Microcontroladores PIC

banksel TRISA ;muda para o banco 1


movlw b'00000001' ;1=entrada, 0=saída
movwf TRISA ;<0>=RA0=entrada
movlw b'00010000'
movwf ADCON1 ;<6:4>=010, frequência da conversão: Fosc/8
;(para 4MHz período do clock do ADC TAD=2us)
banksel ANSEL ;muda para o banco 2
bsf ANSEL,0 ;1=Analog input, 0=I/O digital
banksel ADCON0 ;muda para o banco 0
movlw b'00000001' ;<7>=justificado à esquerda; <6>=Vref=Vdd;
movwf ADCON0 ;<5:2>=seleccionado CANAL0 (AN0); <0>=ADC ligado
call tempo ;delay necessário para carregar o condensador do
;conversor (>11xTAD >22us)
bsf ADCON0,GO ;inicio da conversão (GO=1)
btfsc ADCON0,GO ;testa se conversão está completa (GO=0)
goto $-1 ;não, testa novamente linha anterior (-1)
bcf ADCON0,ADON ;conversão completa, desliga conversor
movf ADRESH,W ;move bits da conversão <9:2> de ADRESH para W
movwf resultado ;guarda bits mais significativos no registo “resultado”
;Nota: não se consideraram os 2 bits menos
;significativos de ADRES

4.13. MEMÓRIA DE DADOS EEPROM (256 bytes no PIC16F690)

A EEPROM de DADOS é uma área específica da memória que se destina, na maioria dos
casos, a guardar dados que não se podem perder em caso de falha da tensão de
alimentação do microcontrolador.
Por exemplo, num sistema de alarme, o código de acesso não se pode perder, mesmo em
caso de falta de energia
A memória EEPROM é escrita e lida em condições normais de alimentação e sem ter que
recorrer a programadores suplementares. Todavia, necessita de uma série de procedimentos
próprios para se evitar a eventualidade de se perder dados em condições de funcionamento
anormal do microcontrolador.

REGISTOS UTILIZADOS PARA A ESCRITA/LEITURA DA EEPROM

4.13.1. REGISTO DE ENDEREÇOS EEADR

Registo utilizado para endereçar as diferentes localizações de memória EEPROM em que se


deseja efectuar a escrita ou a leitura de dados.

4.13.2. REGISTO DE DADOS EEDAT

Registo onde é colocado o valor a guardar na EEPROM na operação de escrita ou o valor lido
na EEPROM na operação de leitura.

António Francisco 21
Microcontroladores PIC

4.13.3. REGISTO DE CONTROLO EECON1

Registo que possui os bits de controlo do processo de leitura e de escrita na memória de


dados EEPROM. O registo contém uma série de flags com as quais é possível controlar as
operações efectuadas na EEPROM.

Bit 0 - RD: Read Control bit


Este bit serve para activar o ciclo de leitura da EEPROM.
1 = Comanda o início da leitura da EEPROM (o bit é colocado da a 0 por hardware no
fim da leitura). Pode ser activada a 1 no programa mas não a 0.
0 = Não inicia a leitura da EEPROM

Bit 1 - WR: Write Control bit


Este bit serve para activar o ciclo de escrita na EEPROM. Para activar a escrita coloca-se a 1
este bit. O bit será automaticamente colocado a 0 pelo hardware do PIC uma vez
completada a escrita na célula. Para ser possível escrever na EEPROM o bit EEPGD=0.
1 = Comanda o início da escrita na EEPROM (o bit é colocado a 0 por hardware no fim
da escrita). Pode ser colocado a 1 no programa mas não a 0.
0 = Ciclo de escrita completo

Bit 2 - WREN: EEPROM Write Enable bit


Este bit habilita as sucessivas operações de escrita numa célula da EEPROM. Deve ser
activado previamente ao início de uma qualquer operação de escrita na EEPROM. Se for
colocado a zero a EEPROM comporta-se como uma memória só de leitura.
1 = Escrita na EEPROM habilitada
0 = Escrita na EEPROM desabilitada

Bit 3 - WRERR: EEPROM Error Flag bit


Este bit indica se a operação de escrita foi prematuramente interrompida, por exemplo, por
causa de um reset do PIC ou do Watchdog Timer.
1 = Operação de escrita interrompida prematuramente
0 = Operação de escrita completada correctamente

Bit 7 - EEPGD
1 = Acesso à memória de programa
0 = Acesso a memória de dados EEPPROM

4.13.4. REGISTO EECON2

EECON2 não é um registo físico. Destina-se exclusivamente, na operação de escrita, a escrever


uma sequência específica com a finalidade de se evitarem erros na gravação da EEPROM. Lido o
seu valor está a “0”.

António Francisco 22
Microcontroladores PIC

4.13.5. ESCRITA DE DADOS NA EEPROM

movf valor,W ;guarda valor em W


;(escrever na EEPROM)
banksel EEDAT ;muda para o banco 2
movwf EEDAT ;valor é colocado no registo de dados EEDAT
movlw 0 ;”0” endereço escolhido para escrita na memória EEPROM
movwf EEADR ;coloca no registo de endereços EEADR o endereço para
;escrita
banksel EECON1 ;muda para o banco 3
bcf EECON1,EEPGD ;permite aceder à memória de dados EEPROM
bsf EECON1,WREN ;habilita a escrita (WREN=WRite ENable) na EEPROM
;(sequência obrigatória)
movlw d’85’
movwf EECON2 ;(55h=d’85’) registo que fisicamente não existe
movlw d’170’
movwf EECON2 ;(AAh=d’170’)
;(fim da sequência)
bsf EECON1,WR ;inicia a escrita (WR=1) na EEPROM
btfsc EECON1,WR ;testa final da escrita (WR=0)
goto $-1 ;ciclo de espera pelo final da escrita
bcf EECON1,WREN ;desabilita a escrita
;(fim da escrita)
banksel 0 ;muda para o banco 0

Notas:
• A sequência obrigatória representa uma espécie de código de acesso à EEPROM e serve
para evitar a escrita acidental em caso de funcionamento anormal do PIC, por exemplo,
em caos de baixa de tensão ou erros de programação. Na prática, escrevem-se os dois
valores hexadecimais 55h e AAh sequencialmente no registo EECON2
• O ciclo de espera criado por “goto $-1” também é possível de programar com interrupção.
• Para escrever um novo valor na mesma célula da EEPROM, basta repetir o processo de
escrita.

4.13.6. LEITURA DE DADOS NA EEPROM

Para se efectuar a leitura do dado localizado num determinado endereço da memória


EEPROM, terá de ser programado o seguinte código:

banksel EEADR ;muda para o banco 2


movlw 0 ;"0" endereço da memória EEPROM a ler
movwf EEADR ;coloca em EEADR o endereço
banksel EECON1 ;muda para o banco 3
bcf EECON1,EEPGD ;permite aceder à memória de dados EEPROM
bsf EECON1,RD ;lê a EEPROM e coloca o resultado em EEDAT
banksel EEDAT
movf EEDAT,W ;coloca o conteúdo de EEDAT em W
banksel 0 ;muda para o banco 0
movwf valor_lido ;coloca conteúdo de W no registo valor_lido

António Francisco 23
Microcontroladores PIC

5. CÓDIGOS UTILIZADOS NOS SISTEMAS DE NUMERAÇÃO


Decimal: d'100' ou .100
Hexadecimal: h'64' ou 0x64
Binário: b'01101100'
ASCII: a'6' ou '6'

A numeração utilizada no MPLAB, por defeito, é a hexadecimal.

6. DESCRIÇÕES DE CAMPOS DE OPCODE

f endereço do registo.
W registo de trabalho (Working register), similar ao acumulador.
b posição de um bit de um registo.
k representa uma constante de 8 bits.
d bit que selecciona o destino onde se guarda o resultado de uma operação. Se d=0, o destino
é W, se d=1 o destino é f (default).
l literal (as constantes são designadas por “literais”. A palavra literal significa “número”.
a bit de acesso à RAM (só para PICs 18F):
a=0 (valor por defeito): Access Bank;
a=1: Acesso via BSR.

António Francisco 24
Microcontroladores PIC

7. SET DE INSTRUÇÕES(1)

António Francisco 25
Microcontroladores PIC

SET DE INSTRUÇÕES(2)

1 Se o porto de entrada/saída for o operando origem, é lido o estado dos pinos do microcontrolador.
2 Se esta instrução for executada no registo TMR0 e se d=1, o prescaler atribuído a esse
temporizador é automaticamente limpo.
3 Se o PC for modificado ou se resultado do teste for verdadeiro, a instrução é executada em dois
ciclos.

8. ESCRITA DE UM PROGRAMA EM ASSEMBLY


A escrita do programa em linguagem assembly não obedece a uma estrutura rígida, no
entanto, existem algumas regras que devem ser observadas para facilitar o entendimento e
compreensão do mesmo.
Assim, como elementos fundamentais dessa linguagem temos:

António Francisco 26
Microcontroladores PIC

8.1. DIRECTIVAS

As directivas não são instruções que o compilador traduza no respectivo opcode. Trata-se de
informações enviadas ao compilador, para executar determinados procedimentos, durante a
compilação. As mais utilizadas são as seguintes:

processor PIC16F690
Trata-se de uma directiva para o compilador assembler que informa para que tipo de PIC o
programa é escrito.

list p=PIC16F690
Idêntica a “processor PIC16F690”, identifica o microcontrolador utilizado.

#include P16F690
Esta directiva faz com que um ficheiro com os endereços dos registos SFR e o nome dos bits
do PIC utilizado possa ser utilizado pelo compilador, evitando-se assim a escrita dessa
informação no programa.

__config
Esta directiva permite configurar os “Configuration Bits” do PIC. Trata-se de bits que
determinam o modo de funcionamento do micro, por exemplo, tipo de oscilador,
watchdog, etc.
Oscillator – permite escolher o tipo de clock com que o micro funciona
Power Up Timer – quando o micro é ligado fica em estado de reset vários ms
Master Clear Enable - pino do micro utilizado como entrada de reset ou de input
Brown Out Detect – se ocorrer uma queda de tensão o micro “reseta”
Watchdog Timer – cão de guarda, destina-se a evitar a paragem do programa
Low Voltage Program – gravação sem necessidade de tensão >5V no pino Vpp
Code Protect – não permite ler o código de programa gravado no micro
Data EE Read Protect – protecção contra leitura na memória EEPROM
Internal External Switch Over Mode – condições de funcionamento, na inicialização,
do clock interno/externo
Monitor Clock Fail-Safe - caso haja uma falha do clock externo, liga automaticamente
o clock interno.
Os Configuration Bits estão mapeados na memória programa, endereço 2007h, fora do
programa do utilizador, e só são acedidos durante a programação do micro.

radix dec
Directiva que informa o compilador que a numeração utilizada no programa seria, no caso,
decimal. Caso a directiva “radix” não seja utilizada, a numeração, por defeito, é
hexadecimal.

equ
Directiva que é normalmente utilizada para atribuir nomes, facilmente identificáveis, a
variáveis utilizadas no programa.

#define
Directiva usada, nomeadamente, para atribuir nomes, facilmente identificáveis a bits
utilizados no programa.
Utilizando-se as directivas “equ” e “#define”, o programa torna-se mais legível, facilitando a
sua compreensão e entendimento. Também, por alteração destas, numa única linha do
programa, se afecta todo o programa.

org
“org” significa origem, sendo esta directiva utilizada para definir o endereço da memória de
programa onde a linha de código que lhe está após é escrita.

António Francisco 27
Microcontroladores PIC

banksel
Directiva que possibilita a selecção do banco de memória. Afecta os bits RP1 e RP0
atribuindo-lhe valores que permitem seleccionar o banco de memória em que se encontra o
registo indicado por banksel.
end
No fim do programa é necessário colocar a directiva “end” para que o tradutor assembly
saiba que não existem mais instruções no programa.

8.2. INSTRUÇÕES
São as ordens que o microcontrolador recebe para realizar uma determinada tarefa. São
escritas com recurso a um conjunto de palavras reservadas (mnemónicas) e a operandos.
Cada família de microcontroladores tem o seu próprio conjunto de instruções.

8.3. ETIQUETAS (LABELS)


São constituídas por um conjunto de caracteres alfanuméricos, sendo estas palavras
colocadas no programa com a finalidade de aceder a partes do código através de instruções
de salto ou de subrotinas.

8.4. COMENTÁRIOS
Texto que o programador escreve no programa com a finalidade de informar sobre o
funcionamento do mesmo. Os comentários iniciam-se com ponto e vírgula ";", não fazendo
os mesmos parte do código do programa.

9. ORGANIZAÇÃO DE UM PROGRAMA EM ASSEMBLY


Informação do projecto
Na escrita de um programa deve existir um cabeçalho com informação que se destina a
identificar o projecto em causa. Note-se que esta informação se encontram em comentário,
não sendo por isso interpreta como código do programa.
Directivas
Após a informação sobre o projecto, deve colocar-se, nomeadamente, as directivas com a
informação relativa ao microcontrolador, aos bits de configuração e às variáveis utilizadas no
programa.
Esta informação destina-se ao compilador, não fazendo parte do set de instruções do PIC.
Inicialização do microcontrolador
Ao ligar-se o microcontrolador à energia ou após um reset, o programa começa a funcionar
na linha 0 (org 0), pois é esta a linha do vector de reset do micro.
Na estrutura do programa e se não existirem interrupções, deve-se, após “org 0”, configurar
os registos SFR do PIC que controlam as opções de funcionamento do microcontrolador.
Código do programa
Linhas com o código (instruções) do programa, tendo em conta o set de instruções do
microcontrolador utilizado.
O programa inicia-se na linha zero (org 0) e termina, obrigatoriamente, com a directiva
“end”.
Como na linha zero e seguintes está o código referente à configuração dos SFR, se essa
parte do código não necessitar de ser novamente acedida, o programa não necessita de
“correr” segunda vez esse código.
Subrotinas
As subrotinas são partes de programa que, embora guardados num único local da memória,
podem ser utilizadas mais do que uma vez no programa, terminam obrigatoriamente com a
instrução “Return”. A sua utilização possibilita a escrita de programas mais pequenos e,
consequentemente, evitam o gasto desnecessário de memória.

António Francisco 28
Microcontroladores PIC

10. MPLAB IDE (Editor, Compilador e Simulador)


O MPLAB IDE é um programa que funciona em ambiente de desenvolvimento integrado (IDE
Integrated Development Environment). Destina-se ao desenvolvimento de projectos com
microcontroladores PIC e é distribuído gratuitamente pela Microchip (www.microchip.com),
fabricante dos PICs.
O MPLAB integra num único ambiente de desenvolvimento, o editor de programa fonte, o
compilador/assemblador, o simulador e, quando conectado às ferramentas de gravação da
Microchip, também o gravador de PICs.

Para podermos escrever (gravar) num microcontrolador precisamos de um editor para


escrever o programa, um assemblador/compilador e um gravador/programador.
De entre os vários PICs existem diferenças ao nível da escrita do programa, para se
evitarem erros, deve-se consultar o data sheet do PIC para o qual o programa vai ser
escrito. Não esquecer também de configurar os Configuration Bits.

10.1. EDITOR

Utilizando-se o MPLAB IDE faz-se uso do seu próprio editor para escrever o programa. Este é
escrito em linguagem Assembly (através de mnemónicas), dando origem a um ficheiro com
extensão *.asm (ficheiro fonte).
O ficheiro fonte é um programa constituído por um conjunto de instruções, organizadas de
acordo com regras próprias e com uma determinada ordem. Ou seja, uma sequência de
código organizada de forma a resolver um determinado problema.
O programa também pode ser escrito em linguagem Basic (linguagem semelhante ao inglês
mas mais fácil de ler e escrever que a linguagem Assembly). Neste caso, cria-se um ficheiro
com extensão *.bas.
Também, o programa pode ser escrito noutra linguagem, por exemplo, linguagem C.

No MPLAB para se escrever um programa é necessário, em primeiro lugar, criar-se um


projecto. Todos os ficheiros dum projecto têm de estar dentro de um mesmo directório.
• Project > New > Project Name
• Browse > Escolher o directório > Criar Nova Pasta

Atenção! O caminho para esta pasta não pode possuir mais de 62 caracteres.

Criado o projecto, o ficheiro de escrita do programa será gravado do seguinte modo:


• File > New > Save As > gravar, com extensão “.asm”, dentro da pasta do projecto.
Caso o ficheiro já exista fazer:
• Source Files > Add Files
Depois:
• Config > Select Device (seleccionar o tipo de PIC)

Notas:
1. A linguagem Basic é de compreensão mais fácil que a linguagem Assembly, no entanto,
gasta mais código.
A linguagem Assembly, mesmo utilizando mnemónicas, torna-se uma linguagem
compreensível por humanos. Caso se programasse em linguagem máquina, que utiliza
apenas 0 e 1, a escrita e o entendimento do programa seria uma tarefa deveras difícil.
2. Quando se liga a alimentação ou ocorre um reset, o contador de programa (PC) aponta à
direcção 00h e o micro inicia-se a partir daí. Por esta razão, no endereço 00h deve-se
escrever tudo o que tenha a ver com a inicialização do programa (por ex. configuração dos
SFRs).
Se ocorrer uma interrupção, o contador do programa aponta à direcção 04h e inicia-se a
partir desta direcção.

António Francisco 29
Microcontroladores PIC

10.2. ASSEMBLADOR/COMPILADOR

• Ícone , tecla F10 ou Project>Make

O Assemblador/Compilador é o programa que converte o código fonte em códigos máquina.


Transforma o ficheiro fonte (*.asm), escrito em linguagem Assembly, ou escrito em
linguagem Basic (*.bas) ou outra, num ficheiro de “execução” com extensão “.hex”
(hexadecimal) que é utilizado pelo gravador do microcontrolador.
Se existirem erros os mesmos são indicados. Fazer um duplo clique sobre o erro direcciona-
se o programa para a linha onde se encontra o mesmo no ficheiro “.asm”.

Para além do ficheiro com extensão “.asm”, o MPLAB necessita de um segundo ficheiro, com
extensão “.inc”. O mesmo é acedido através da instrução “#include P16F690.INC” do
programa. Este ficheiro contém informações relativas ao tipo de PIC utilizado. Caso não se
forneça este ficheiro, será necessário indicar-se no programa os endereços dos registos e
dos bits utilizados.
Durante a compilação do programa, o compilador gera um conjunto de arquivos com nome
idêntico ao programa fonte mas com extensões diferentes:

• Ficheiro de Execução “.hex” é o ficheiro que contém o programa em código


hexadecimal e que vai ser utilizado pelo gravador para gravar o micro.
• Ficheiro de Listagem “.lst” é um ficheiro produzido pelo tradutor assembler, que
contém todas as instruções do ficheiro fonte, o código destino e os respectivos
endereços e, ainda, os comentários que o programador escreveu. É um ficheiro muito
útil para detectar erros no programa. Não é utilizado pelo gravador do PIC mas é útil
quando se pretende verificar o processo de compilação efectuado pelo compilador.
• Ficheiro de Erros “.err” contem uma lista de erro de compilação que mostra o número
da linha do código que possui erro no programa assembly.

Os ficheiros “.lst” e “.err” destinam-se somente para controlo da compilação, sendo o


ficheiro “.hex” utilizado realmente para gravar o PIC.

10.3. SIMULADOR

O Simulador é programa que simula o funcionamento do microcontrolador, permitindo testar


os diferentes comandos. O ambiente MPLAB IDE também possui simulador: MPLAB SIM.

Para utilizar o MPLAB SIM efectuar os seguintes comandos:


• Debugger > Select Tools > MPLAB SIM
• Debugger > Settings > Osc/Trace > Escolher a frequência de trabalho do PIC
• Debugger > Settings > Animation / Realtime Updates (≥0) – velocidade da animação
• View > Special Function Register - ver estados dos SFR
• View > Watch - permite ver o estado de registos seleccionados
• Debugger > Stimulus > New Workbook > Asynch - permite simular entradas para o PIC.
Criado o “Asynchronous Stimulus”, associado a um pino de entrada do PIC, cada vez
que dermos um clique com o cursor do rato em Fire, o pino activa-se de acordo com a
função seleccionada em Action.
• Debugger > StopWatch (cronómetro) – permite calcular o tempo de execução do
programa entre dois Breakpoints.

António Francisco 30
Microcontroladores PIC

Para simular utilizar os seguintes ícones:

Run: Ícone ou tecla F9


Comando que executa as instruções do programa a uma velocidade que depende da
velocidade de funcionamento do PC. Esta velocidade é elevada mas mais lenta do que a
velocidade do clock do PIC. Sendo as instruções executadas muito rapidamente, o ícone fica
parado.

Halt (parar): Ícone


Pára a execução do programa.

Animate: Ícone
Executa as instruções do programa de forma visível. A velocidade de execução é
seleccionada em Debugger > Settings > Animation. A gama é de 0 a 20.000 ms.

Step Into: Ícone ou tecla F7


Este comando executa passo-a-passo as instruções do programa, incluindo as subrotinas.

Step Over: Ícone ou tecla F8


Este comando executa as instruções do programa, incluindo as subrotinas. Nestas, pára a
execução no endereço de retorno.

Step Out: Ícone


Só funciona quando entra numa subrotina. Aqui, este comando executa automaticamente o
resto do código, parando no endereço de retorno.

Reset: Ícone
Inicializa o programa.

10.4. GRAVADOR

Dispositivo que permite escrever o programa na memória do microcontrolador,


possibilitando, assim, que o micro funcione autonomamente. Converte a informação
hexadecimal contida no ficheiro “.hex” em informação binária (linguagem de 0 e 1, também
chamada linguagem máquina) e transfere-a para memória do microcontrolador.
O micro não utiliza as instruções tal como foram escritas no programa, mas sim os
respectivos códigos operativos (do inglês operation code ou abreviadamente opcode).
Existem no mercado vários gravadores para microcontroladores PIC, fabricados pela
Microchip e outras empresas. Destes, destacamos o PICkit2 da Microchip, é de baixo custo e
de fácil utilização e permite a gravação dos microcontroladores sem se retirar os mesmos do
circuito (ICSP - In-Circuit Serial Programmer).
O PicKit2 pode funcionar integrado no ambiente de desenvolvimento MPLAB e é ligado ao PC
através da porta USB.

Nota:
O PICkit2 não grava os micros PIC mais antigos.

António Francisco 31
Microcontroladores PIC

Gravador PICkit2

O software para a utilização do PicKit2 é distribuído gratuitamente pela Microchip.

EM RESUMO, O PROCESSO DE GRAVAÇÃO DO PROGRAMA NO MICROCONTROLADOR É O SEGUINTE:

António Francisco 32