Você está na página 1de 21

MICROPROCESSADORES E MICROCONTROLADORES

TUTORIAL
INTRODUÇÃO À PROGRAMAÇÃO DE MICROCONTROLADORES PIC 16F62X

Índice
1. Introdução............................................................................................................................. 3

2. Microcontrolador PIC16F62X ................................................................................................ 3

2.1 Principais Características............................................................................................... 3

2.2 Arquitectura .................................................................................................................. 4

2.3 Conjunto de Instruções ................................................................................................. 5

2.4 Organização dos pinos do microcontrolador ................................................................ 6

2.5 Memória........................................................................................................................ 7

2.6 Entrada e Saída.............................................................................................................. 8

2.6.1 Registos para configuração de entradas e saídas ................................................. 8

2.6.2 Registos para leitura e escrita nos pinos............................................................... 8

3 Programação em Linguagem Assembly............................................................................. 8

3.1 Configurar Pinos para Actuarem como Entrada ou Saída............................................. 8

3.1.1 Selecção do banco de memória ............................................................................ 9

3.1.2 Configurar pinos como entradas/saídas ............................................................... 9

3.2 Ler e Escrever Valores nas Entradas/Saídas................................................................ 10

3.3 Utilizar Variáveis.......................................................................................................... 10

3.4 Como Escrever um Programa...................................................................................... 11

4 Exercícios Resolvidos........................................................................................................... 11

5 Exercícios para Resolver...................................................................................................... 17

6 Utilizar o MPLAB IDE ........................................................................................................... 18

6.1 Utilizar o Debugger do MPLAB IDE......................................................................... 18

6.2 Simular do microcontrolador ...................................................................................... 19

6.3 Transferir o programa para o microcontrolador......................................................... 20


7 Links Úteis ........................................................................................................................... 21

7.1 Ferramentas ................................................................................................................ 21

7.2 Sítios sobre microcontroladores PIC ........................................................................... 21

2
1. Introdução
Este tutorial apresenta uma introdução à programação em assembly de Microcontroladores
PIC16F62X.
Saliente-se no entanto que os microcontroladores PIC podem ser programados em várias
linguagens de programação.

2. Microcontrolador PIC16F62X
O microcontrolador PIC16F627 é um microcontrolador de 8 bits. O seu processador tem uma
arquitectura RISC. Tal como o nome indica, é um microcontrolador da família 16 e possui
memória flash (letra F) o que significa que pode ser gravado as vezes que forem necessárias.
Existem várias famílias de microcontroladores PIC (ex. 12, 16, 18, 24). As funcionalidades e o
desempenho aumentam de acordo com a família. A família 10 é a mais simples e juntamente
com os microcontroladores das famílias 12, 16 e 18 são de 8 bits. Os modelos da família 24 são
de 16 bits e os modelos da família 32 são de 32 bits.

Figura 1 - Famílias de microcontroladores PIC (www.microchip.com).

2.1 Principais Características

As características principais do microcontrolador PIC16F626 são:


• Memória de Programa Flash (1024 posições de 14bits)
• Memória para dados RAM de 224 bytes
• Memória para dados EEPROM de 128 bytes
• 16 Entradas/Saídas

3
• PORTA: RA0, RA1, RA2, RA3, RA4, RA5, RA6, RA7 (8 PINOS)
• PORTB: RB0, RB1, RB2, RB3, RB4, RB5, RB6, RB7 (8 PINOS)
• Comunicação série
• Módulo PWM
• 3 Temporizadores/contadores
• 2 Módulos comparadores
• 10 tipos de Interrupção

2.2 Arquitectura

A arquitectura de um sistema digital define quem são e como as partes que compõe o sistema
estão interligadas. As duas arquitecturas mais comuns para sistemas computacionais digitais
são as seguintes:
• Arquitectura de Von Neuman: A Unidade Central de Processamento é interligada à
memória por um único barramento. O sistema é composto por uma única memória
onde são armazenados dados e instruções.
• Arquitectura de Harvard: Existem memórias distintas para programa e para dados. A
Unidade Central de Processamento é interligada a memória de dados e à memória de
programa por barramentos independentes.
O PIC possui arquitectura Harvard.

Figura 2 - Arquitectura do microcontrolador PC 16F62X.

4
2.3 Conjunto de Instruções

Sintaxe Descrição ciclos Operação equivalente status


OPERAÇÕES SOBRE BYTES
ADDWF f,d Add W and f 1 d = W + f (onde d pode ser W ou f) C, DC, Z
ANDWF f,d AND W with f 1 d = W AND f (onde d pode ser W ou f) Z
CLRF f Clear f 1 f=0 Z
CLRW Clear W Register 1 W=0 Z
COMF f,d Complement f 1 d = not f (onde d pode ser W ou f) Z
DECF f,d Decrement f 1 d = f -1 (onde d pode ser W ou f) Z
DECFSZ f,d Decrement f, Skip if 0 1 (2) d = f -1 (onde d pode ser W ou f) se d = 0 pula
INCF f,d Increment f 1 d = f +1 (onde d pode ser W ou f) Z
INCFSZ f,d Increment f, Skip if 0 1 (2) d = f +1 (onde d pode ser W ou f) se d = 0 pule
IORWF f,d Inclusive OR W with f 1 d = f OR W (onde d pode ser W ou f) Z
MOVF f,d Move f 1 d = f (onde d pode ser W ou f) Z
MOVWF f Move W to f 1
NOP No Operation 1 Nenhuma operação
RLF f,d Rotate Left f through Carry 1 d = f << 1 (onde d pode ser W ou f) C
RRF f,d Rotate Right f through Carry 1 d = f >> 1 (onde d pode ser W o f) C
SUBWF f,d Subtract W from f 1 d = f - W (onde d pode ser W ou f) C, DC, Z
SWAPF f Swap f 1 f = Swap do bit 0123 com 4567 de f
XORWF f,d Exclusive OR W with f 1 Z
OPERAÇÕES SOBRE BITS
BCF f,b Bit Clear f 1 f(b) = 0
BSF f,b Bit Set f 1 f(b) = 1
BTFSC f,b Bit Test f, Skip if Clear 1 (2) f(b) = 0 ? Se é, pule uma instrução
BTFSS f,b Bit Test f, skip if Set 1 (2) f(b) = 1 ? Se é, pule uma instrução
LITERAL AND CONTROL OPERATIONS
ADDLW k Add Literal and W 1 W=W+k C, DC, Z
ANDLW k AND Literal with W 1 W = W AND k Z
CALL k Subroutine Call 2 Chamada a uma subrotina no endereço k
CLRWDT Clear Watchdog Timer 1 Watchdog timer = 0 TO,PD
GOTO k Go to address 2 Pule para o endereço k
IORLW k Inclusive OR Literal with W 1 W = W OR k Z
MOVLW k Move literal to W 1 W=k
RETFIE Return from Interrupt 2 Retorna de uma interrupt handler
RETLW k Return Literal to W 2 Retorna de uma subrotina com W = k
RETURN Return from Subroutine 2 Retorna de uma subrotina
SLEEP Go into Standby Mode 1 Coloca em standby o PIC TO, PD
SUBLW k Subtract W from Literal 1 W=k-W C, DC, Z
XORLW k Exclusive OR Literal with W 1 W = W XOR k Z

Figura 3 - Conjunto de instruções.

5
Onde:

 f qualquer local de memória num microcontrolador


 W registo de trabalho
 b posição de bit no registo f
 d registo de destino
O conjunto de instruções do PIC16F62X é constituído por 35 instruções. Estas incluem
instruções para transferência de dados (ex. MOVLW, CLRF), lógicas e aritméticas (ex. ADDWF,
ANDWF, RLF), direcção de execução do programa (ex. GOTO, CALL, RETURN) e operações
sobre bits (ex. BSF, BCF).
De seguida apresentam-se a descrição e exemplos de algumas das instruções.
o Colocar o bit 2 do registo TRISA com o valor ‘0’
BSF TRISA, 2
o Colocar o valor do registo a ‘0’
CLRF TRISA
o Incrementar o valor de uma variável
INCF VAR, 0 ; Var +1. O resultado fica no registo W. VAR não é alterada.
INCF VAR, 1 ; Var +1. O resultado fica na variável VAR
INCF VAR ; VAR++
o Copiar o valor de uma variável
MOVF PORTA, 0 ; W = PORTA
o Atribuir um valor ao registo W (working register)
o MOVLW B’11110000’ ; Atribui o valor ao registo W
o MOVLW 10 ; Atribui o valor ao registo W
o Copiar o valor do registo W para outro registo (TRISA no exemplo)
o MOVWF TRISA ;TRISA = W

2.4 Organização dos pinos do microcontrolador

O microcontrolador PIC16F62X tem 18 pinos. Vários dos pinos suportam várias funcionalidades
e, por isso, durante a sua programação é necessário especificar as funcionalidades estes
devem executar.
A figura 4 mostra a organização dos pinos do microcontrolador PIC16F62X.

6
Figura 4 - Diagrama dos pinos do microcontrolador PIC 16F62X.

2.5 Memória

O microcontrolador PIC 16F62X tem 3 tipos de memória distintos


 Memória de dados EEPROM
 Memória de dados
 Memória de programa

A memória de dados está organizada em 4 bancos (ver figura 5).

Figura 5 - Organização da memória de dados.

7
2.6 Entrada e Saída

O microcontrolador PIC16F62X tem dois portos: PORTA e PORTB. Alguns dos bits destes registos são
multiplexados de forma a suportar várias funções. Estes registos são utilizados para receber/enviar
dados de e para o exterior.
A função de cada um deles está especificada a seguir.

2.6.1 Registos para configuração de entradas e saídas

 TRISA – usado para configurar os pinos de PORTA como entradas ou saídas (TRISA pertence ao
banco 1 – ver figura 5).
 TRISB – usado para configurar os pinos de PORTB como entradas ou saídas (TRISB pertence ao
banco 1 – ver figura 5).

2.6.2 Registos para leitura e escrita nos pinos

 PORTA – usado para ler/escrever valores dos pinos (PORTA pertence ao banco 0 – ver figura 5).
 PORTB – usado para ler/escrever valores dos pinos (PORTA pertence ao banco 0 – ver figura 5).

3 Programação em Linguagem Assembly

Nesta secção são apresentados alguns exemplos de programação de microcontroladores PIC


em assembly.

3.1 Configurar Pinos para Actuarem como Entrada ou Saída

Para configurar determinados pinos como entrada ou saída é necessário configurar os bits
correspondentes dos registos TRIS.
Para configurar pinos como saídas deve colocar-se os bits correspondentes no registo TRIS com o valor
‘0’. Se for pretendido configurar como entradas deve colocar-se os bits correspondentes no registo TRIS
com o valor ‘1’.
Por exemplo, se for pretendido configurar o pino RA0 como entrada devemos colocar o bit ‘0’ do registo
TRISA com o valor ‘1’ (BSF TRISA, 0). Se pretendermos colocar RA1 como saída devemos escrever BCF
TRISA, 1. É, no entanto, importante ter em consideração que os registos estão organizados em bancos
de memória e, por isso, é necessário que esteja seleccionado o banco correcto antes de aceder ao
registo. No caso do acesso ao registo TRIS, que pertence ao banco 1 é necessário seleccionar
previamente o banco ‘0’ da memória.
Nas subsecções seguintes são apresentados alguns exemplos.

8
3.1.1 Selecção do banco de memória

Para aceder aos registos é necessário seleccionar previamente o banco de memória onde o registo se
encontra. No caso do TRISA ou TRISB é necessário fazer a selecção do banco 1 (ver figura 5). A selecção
do banco de memória é realizada através dos bits RP1 (bit 6) e RP0 (bit 5) do registo STATUS.
o RP1:RP0 = 00 -> selecciona o banco 0
o RP1:RP0 = 01 -> selecciona o banco 1
o RP1:RP0 = 10 -> selecciona o banco 2
o RP1:RP0 = 11 -> selecciona o banco 3
o Por exemplo, para seleccionar o banco 1 podemos escrever
BCF STATUS, RP1 ; (ou BCF STATUS, 6)
; Pois o 6 indica a posição do bit RP1
BSF STATUS, RP0 ; (ou BSF STATUS, 5)
; Pois o 5 indica a posição do bit RP0

Para aceder aos registos PORTA ou PORTB é necessário seleccionar o banco 0 (ver figura 5). Para
seleccionar o banco 0 os bits RP1 e RP2 devem ser colocados a ‘0’
BCF STATUS, RP1
BCF STATUS, RP0 ; (RP1 = 0 e RP0 = 0 -> selecciona o banco 0)

3.1.2 Configurar pinos como entradas/saídas

o BSF TRISA, RA0 ; Configura RA0 como entrada (ou BSF TRISA, 0)
o BSF TRISB, RB1 ; Configura RB1 como entrada (ou BSF TRISB, 1)
o BCF TRISA, RB3 ; Configura RB3 como saída (ou BCF TRISA, 3)
o …
No entanto antes de alterar os bits do registo TRISA ou TRISB é necessário seleccionar o banco correcto
(os registos TRISA/TRISB pertencem ao banco 1). Assim para o código correcto para configurar RA0
como entrada será:
BCF STATUS, RP1
BSF STATUS, RP0 ; Selecciona o banco 1
BSF TRISA, RA0 ; Configura RA0 como entrada

Configurar todos os bits de PORT simultaneamente


o BCF STATUS, RP1
o BSF STATUS, RP0 ; (RP1 = 0 e RP0 = 1 -> selecciona banco 1)
o MOVLW B’11111111’ ; O B indica que é uma representação em binário
o MOVWF TRISA ; Configura todos os bits de PORTA como entradas

9
3.2 Ler e Escrever Valores nas Entradas/Saídas

 Configurar RB2 como saída e colocar RB2 com o valor ‘1’


BCF STATUS, RP1
BSF STATUS, RP0 ; Selecciona o banco 1 (ao qual pertence TRISB)
BCF TRISB, 2 ; Configura RB0 como saída
BCF STATUS, RP1
BCF STATUS RP0 ; Selecciona o banco 0 (ao qual pertence PORTB)
BSF PORTB, 2 ; RB2 = 1 (ou BSF PORTB, 2)

 Configurar RA0 como entrada e RA1 como saída. Quando RA0 = 1 colocar RA1 = 1.
BCF STATUS, RP1
BSF STATUS, RP0 ; Selecciona o banco 1 (ao qual pertence TRISB)
BSF TRISA, 0 ; Configura RA0 como entrada
BCF TRISA, 1 ; Configura RA1 como entrada

BCF STATUS RP0


BCF STATUS, RP0 ; Selecciona o banco 0 (para acesso a PORTA)
ISZERO
BTFSS PORTA, 0 ; Testa RA0 (se estiver a ‘1’ avança a próxima instrução)
GOTO ISZERO ; Se RA0 = 0
BSF PORTA, 1 ; Se RA0 = 1 então RA1 = 1

3.3 Utilizar Variáveis

As variáveis podem ser definidas na memória de dados. Devem ser definidas nas posições
correspondentes a general purpose registers. Por exemplo no banco 0 nas posições 20h –
7Fh (VER FIGURA 5).
VAR1 EQU 0x20
VAR2 EQU 0x21
VAR3 QUE 0x22
START
BCF STATUS, RP1
BSF STATUS, RP0
CLRF VAR1 ; VAR1 = 0
INCF VAR1 ; VAR1 ++
MOVLW 30
MOVWF VAR2 ; VAR2 = 30

10
3.4 Como Escrever um Programa

Para escrever um programa em assembly é necessário seguir um conjunto de regras.


1) O programa deve iniciar com a especificação do microcontrolador onde o código vai ser
executado (ex. #INCLUDE <P16F627.INC>). Esta linha de código serve para incluir no

ficheiro correspondente ao microcontrolador utilizado.


2) Definir o endereço para que o microcontrolador deve ir quando se liga a alimentação
(ORG 0x00). ORG Define o endereço a partir do qual o programa é armazenado na memória do
microcontrolador.
3) Especificar, através da palavra start, onde tem inicio o programa.
4) Instruções que compõem o programa são escritas entre as palavras start e end.
5) Colocar a palavra end no fim do programa, de modo a informar o tradutor de
assembly que não existem mais instruções.

O código seguinte mostra a aplicação das regras.


#INCLUDE <P16F627.INC>
ORG 0x00
START

; Aqui deve ser escrito o código do programa

END

Os comentários são escritos precedidos de um ponto e vírgula.

4 Exercícios Resolvidos
1. Escreva um programa em assembly para o microcontrolador PIC16F62X que configure RA0,
RA1, RA2 e RA3 como entradas e que configure RA4, RA5, RA6 e RA7 como saídas.

#INCLUDE <P16F627.INC>
ORG 0x00
START
MOVLW 0x07
MOVWF CMCON
BCF STATUS, RP1
BSF STATUS, RP0 ; Selecciona o banco 1 (acesso a TRISA)

11
BSF TRISA, 0 ; Configura RA0 como entrada
BSF TRISA, 1 ; Configura RA1 como entrada
BSF TRISA, 2 ; configura RA2 como entrada
BSF TRISA, 3 ; configura RA3 como entrada
BCF TRISA, 4 ; configura RA4 como saída
BCF TRISA, 5 ; configura RA5 como saída
BCF TRISA, 6 ; configura RA6 como saída
BCF TRISA, 7 ; configura RA7 como saída

END

Ou em alternativa

#INCLUDE <P16F627.INC>

START

BCF STATUS, RP1


BSF STATUS, RP0 ; Selecciona o banco 1 (acesso a TRISB)
MOVLW B’00001111’ ; Coloca o registo W = 00001111
MOVWF TRISA ; TRISA = 00001111

END

2. Escreva um programa em assembly para o microcontrolador PIC16F62X que coloque a ‘1’ os


bits o e 7 do registo PORTA.

#INCLUDE <P16F627.INC>

START
MOVLW 0x07
MOVWF CMCON
BCF STATUS, RP1
BSF STATUS, RP0 ; selecciona o banco 1 (acesso a TRISA)
BCF TRISA, 0 ; configura RA0 como saída
BCF TRISA, 7 ; configura RA7 como saída

12
BCF STATUS RP0
BCF STATUS, RP0 ; Selecciona o banco 0 (acesso a PORTA)
BSF PORTA, 0 ; Coloca RA0= 1 (ou BSF PORTA, 0)
BSF PORTA, 7 ; Coloca RA7 = 1 (ou BSF PORTA, 7)
END

3. Escreva um programa em assembly para o microcontrolador PIC16F62X que permite ligar e


desligar sequencialmente 3 LED ligados a RB0, RB1 e RB2 (cada LED deve manter o estado
ligado durante um determinado período de tempo).

#INCLUDE <P16F627.INC>
ORG 0x20
COUNT EQU 0x1 ; Variável para utilizar no ciclo delay
ORG 0X0
START
CLRF PORTA ; inicializa PORTA
MOVLW 0x07
MOVWF CMCON ; Comparadores off
BCF STATUS, RP1
BSF STATUS, RP0 ; Selecciona Banco 1 (para acesso ao registo TRIS)
MOVLW 0x00
MOVWF TRISB ; Configura todos os pinos de PORTB como saídas
BCF STATUS, RP0
BCF STATUS, RP1 ; Selecciona o banco 0 (para acesso ao PORTB)
CICLO
BSF PORTB, 0 ; RB0 = 1
CALL DELAY ; Delay
BCF PORTB, 0 ; RB0 = 0
BSF PORTB, 1 ; RB1 = 1
CALL DELAY ; Delay
BCF PORTB, 1 ; RB1 = 0
BSF PORTB, 2 ; RB2 = 1
CALL DELAY
BCF PORTB, 2
GOTO CICLO
DELAY
CLRF COUNT

13
CICLODELAY
INCFSZ COUNT, 1 ; Count++. Quando count = 0 salta a próxima instrução
GOTO CICLODELAY
RETURN
END
4. Escreva um programa em assembly para ser executado no PIC16F627 que permita
colocar em PORTB um valor que é continuamente incrementado. Deve começar em
‘0’. A contagem deve permanecer algum tempo em cada número.

#INCLUDE <P16F627.INC>
ORG 0x20
COUNT EQU 0x1 ; Variável para utilizar no ciclo delay
ORG 0X0
START
MOVLW 0x07
MOVWF CMCON
BCF STATUS, RP1
BSF STATUS, RP0 ; Selecciona Banco 1 (para acesso ao registo TRIS)
MOVLW 0x00
MOVWF TRISB ; Configura todos os pinos de PORTB como saídas
BCF STATUS, RP0
BCF STATUS, RP1 ; Selecciona o banco 0 (para acesso ao PORTB)

CLRF PORTB ; inicializa PORTB a '0'


CICLO
CALL DELAY ; Delay
INCF PORTB ; Incrementa o valor de PORTB
GOTO CICLO
DELAY ; Executa ciclos para implementar a espera
CLRF COUNT
CICLODELAY
INCFSZ COUNT, 1
GOTO CICLODELAY
RETURN
END

5. Escreva um programa em assembly para ser executado no PIC16F627 que permita


executar continuamente num display de 7 segmentos a contagem crescente 0-9. A
contagem deve permanecer algum tempo em cada número.

#INCLUDE <P16F627.INC>
ORG 0x40
COUNT EQU 0x20 ; Variável para utilizar no ciclo delay
NUM EQU 0x21 ; Para representar o número do dígito
ORG 0X00
START
BCF STATUS, RP1
BSF STATUS, RP0 ; Selecciona Banco 1 (para acesso ao registo TRIS)
MOVLW 0x00

14
MOVWF TRISB ; Configura todos os pinos de PORTB como saídas
BCF STATUS, RP0
BCF STATUS, RP1 ; Selecciona o banco 0 (para acesso ao PORTB)
CLRF NUM
CLRF PORTB
CICLO
CALL CONVERTE
MOVWF PORTB ; Envia o valor para o PORTB
CALL DELAY ; Delay
INCF NUM, 1
GOTO CICLO
CONVERTE
MOVF NUM, W ; PCL indica a posição de processamento
ADDWF PCL, 1 ; Soma ao PCL o número do dígito. Muda a posição do
; processamento para a posição correspondente
; Ex. se o digito for o ‘3’ fica PCL+3 o que significa que
; vai avançar 3 instruções
RETLW B'00111111' ; Código para o '0''
RETLW B'00000110' ; Código para o '1'
RETLW B'01011011' ; Código para o '2'
RETLW B'01001111' ; Código para o '3'
RETLW B'01100110' ; Código para o '4'
RETLW B'01101101' ; Código para o '5'
RETLW B'01111101' ; Código para o '6'
RETLW B'00000111' ; Código para o '7'
RETLW B'01111111' ; Código para o '8'
RETLW B'01101111' ; Código para o '9'
CLRF NUM ; Quando atinge o limite reinicia a ‘0’
RETLW B'00111111' ; Código para o '0''

DELAY ; Executa ciclos para implementar a espera


CLRF COUNT
CICLODELAY
INCFSZ COUNT, 1
GOTO CICLODELAY
RETURN
END

6. Escreva um programa em assembly para ser executado no PIC16F627 que permita


identificar em 3 LED ligados à saída, em qual linha do teclado foi pressionada uma
tecla. O programa deve ler o dígito, entre 1 e 3, através de um teclado matricial e,
mediante número inserido, permita ligar o LED correspondente. Ex. se for pressionada
a tecla ‘4’ deve ligar o segundo LED que indica que a tecla pertence à linha 2 do
teclado.
Nota: A solução apresentada considera que o teclado apresenta a configuração
apresentada na figura 6.

15
Figura 6 – Teclado matricial.

#INCLUDE <P16F627.INC>
ORG 0x00
START
MOVLW 0x07
MOVWF CMCON
BCF STATUS, RP1
BSF STATUS, RP0 ; Selecciona o banco 1
MOVLW B'11110000'
MOVWF TRISB ; RB0-RB3 saídas para teste do teclado.
; RB4-RB7 entradas para verificar o teclado
BCF TRISA, 0 ; RA0 como saída
BCF TRISA, 1 ; RA1 como saída
BCF TRISA, 2 ; RA2 como saída
BCF STATUS, RP1
BCF STATUS, RP0 ; Selecciona o banco 0

CICLO
BSF PORTB,0 ; Testar a primeira coluna
BTFSC PORTB, 4 ; Ver se o 1 está pressionado
GOTO UM
BTFSC PORTB, 5 ; Ver se o 4 está pressionado
GOTO QUATRO
BTFSC PORTB, 6 ; Ver se o 7 está pressionado
GOTO SETE

; Se for para verificar as restantes colunas deve fazer-se


;BSF PORTB,1 ; Testar a segunda coluna
;BTFSC PORTB,4 ; Ver se o 2 está pressionado
;GOTO DOIS
;BTFSC PORTB,5 ; Ver se o 5 está pressionado
;GOTO CINCO
;BTFSC PORTB,6 ; Ver se o 8 está pressionado
;GOTO OITO
; ...

BCF PORTA,0
BCF PORTA,1
BCF PORTA,2

16
GOTO CICLO
UM ; Linha 1
BSF PORTA,0
BCF PORTA,1
BCF PORTA,2
GOTO CICLO
QUATRO ; Linha 2
BCF PORTA,0
BSF PORTA,1
BCF PORTA,2
GOTO CICLO
SETE ; Linha 3
BCF PORTA,0
BCF PORTA,1
BSF PORTA,2
GOTO CICLO
END

5 Exercícios para Resolver


1. Escreva um programa em assembly para ser executado no PIC16F627 que permita
configurar RA0 e RA1 como entradas e RA6 e RA7 como saídas.

2. Escreva um programa em assembly para ser executado no PIC16F627 que permita


configurar os bits 0 e 7 do PORTA como entradas e colocá-los a ‘1’.

3. Escreva um programa em assembly para ser executado no PIC16F627 que faça a


leitura de RA0, RA1 e RA2. Quando pelo menos dois deles estiverem a ‘1’ então o programa
deve ligar um LED conectado a RB0.

4. Escreva um programa em assembly para ser executado no PIC16F627 que permita


contar o número de vezes que um botão conectado a RA0 foi pressionado e envie esse valor
para PORTB.

5. Implemente um programa em assembly (PIC 16F627) que permita fazer o controlo


de um sistema com 3 saídas ligadas a RB0, RB1 e RB2. O sistema deve possuir uma
entrada associada ao pino RA3.Quando a entrada estiver activa o circuito deve activar
sequencialmente cada uma das 3 entradas. Quando a entrada não estiver activa
(desligada) a sequência nas saídas deve manter-se parada na situação em que se
encontra.

6. Escreva um programa em assembly para ser executado no PIC16F627 que permita


fazer o controlo de dois dispositivos. O programa aceitar uma entrada que permite
seleccionar um de dois modos de funcionamento:

17
a. Se a entrada for accionada então o sistema deve alternadamente accionar cada
um dos dispositivos (liga dispositivo um, desliga dispositivo um, liga dispositivo
dois, desliga dispositivo dois).
b. Se a entrada estiver desligada então liga simultaneamente os dois dispositivos

6 Utilizar o MPLAB IDE


Para desenvolver um programa em assembly no MPLAB IDE deve executar os seguintes
passos.
1) Criar um novo projecto (opção ProjectProject Wizard…)
a. Seleccionar o microcontrolador adequado (PIC16F627)
b. Seleccionar a linguagem (deve estar seleccionado MPASM Toolsuite e no
menu inferior devem estar incluídas MPASM, MPLINK e MPKIB).
c. Criar o novo projecto (especificar a directoria e o nome do projecto).
d. Incluir os ficheiros de código (caso ainda não estejam escritos podem incluir-se
mais tarde).
2) Escreva o código do programa num ficheiro .asm. Caso ainda não o tenha adicionado
ao projecto pode criar um novo ficheiro e guardá-lo com extensão .asm. Deve depois
adicioná-lo ao projecto. Para isso clique com o botão direito do rato na opção source
files da janela do projecto e seleccionar a opção add files… (figura 7 janela
lateral esquerda)
3) Quando o programa estiver completo seleccione a opção ProjecBuild All.
Caso no programa não tenha erros será apresentada a mensagem BUILD
SUCCEEDED. Caso existam erros será apresentada a mensagem BUILD FAILED. As
linhas de código onde foram detectados erros encontram-se especificadas no texto
anterior.
Se as tarefas anteriores tiverem sido executadas com êxito então foi criado um ficheiro .HEX
que corresponde ao código máquina do microcontrolador. Este é o ficheiro que deve ser
transferido para o microcontrolador.

6.1 Utilizar o Debugger do MPLAB IDE

Para verificar se o programa realiza as funções para que foi desenvolvido pode utilizar o
Debugger. Para isso pode seleccionar DebuggerSelect toolMPLAB SIM. Depois
pode executar o programa passo-a-passo pressionando a tecla F8 (ou F7). Para visualizar o
conteúdo dos registos seleccione ViewWatch e adicione os registos ou variáveis que

18
pretende visualizar. Pode em alternativa seleccionar ViewSpecial function
registers para visualizar o conteúdo de todos os registos.

Figura 7 - Fazer o debug do programa.

6.2 Simular do microcontrolador

Pode também utilizar programas que permitem simular o comportamento do


microcontrolador quando executa o programa. Um exemplo de um simulador é o PIC
SIMULATOR (www.oshonsoft.com). Este permite adicionar vários dispositivos que ajudam a
compreender o funcionamento do programa (display de 7 segmentos, teclados matriciais,
LEDs, visualização do pinos do microcontrolador, etc.). Além disso, permite também visualizar
o valor dos registos do microcontrolador e de variáveis.
Para simular o funcionamento do programa é necessário abrir o ficheiro .HEX. É também
necessário seleccionar o microcontrolador correcto (opção FileLoad program).
Dispositivos para testar as saídas podem ser adicionados no menu tools.
Para iniciar a simulação deve seleccionar o menu SimulationStart. A velocidade da
simulação pode ser ajustada no menu Rate.

19
Figura 8 – Simular o microcontrolador (PIC SIMULATOR).

Existem várias ferramentas que podem utilizar-se para simular dispositivos ligados às saídas do
microcontrolador. De seguida um resumo de algumas delas.
A janela Microcontroller View permite visualizar o estado dos pinos do
microcontrolador. Permite também que, clicando com o rato sobre o ‘T do pino
correspondente, se accionem as entradas do circuito (On/Off). Para visualizar as saídas do
microcontrolador.
A janela 8 LED Board permite visualizar através de LEDs o estado das saídas. É, no entanto,
necessário fazer a associação entre as saídas do programa e os LEDs da board.
A janela 7-Segment LED Displays Panel permite simular a utilização de display de 7
segmentos. Através do botão Setup pode configurar-se quais as saídas do microcontrolador
são associadas a cada segmento do display.

6.3 Transferir o programa para o microcontrolador

Para executar o programa no microcontrolador é necessário transferir o ficheiro .HEX que é


gerado após a assemblagem (Build all). Para transferir o ficheiro é necessário utilizar um
programador. Nas aulas utilizaremos o PICSTART Plus.
Para transferir o programa no MPLAD IDE é necessário executar as seguintes tarefas:
1) Seleccionar/Verificar a opção ProgrammerSelect ProgrammerPICSTART
Plus no menu Programmer.
2) Habilitar o programador (opção ProgrammerEnable Programmer).
3) Transferir o programa (opção ProgrammerProgram).

20
4) Verificar se o programa foi transferido com êxito.

Figura 9 – Transferir programa para o microcontrolador.

7 Links Úteis
Seguem-se alguns links com interesse para a disciplina.

7.1 Ferramentas

IDE
• MPLAB IDE: www.microchip.com
Simulador
• PIC Simulator: www.oshonsoft.com
Outras informações
• Microchip: www.microchip.com

7.2 Sítios sobre microcontroladores PIC

Livro online sobre microcontroladores PIC (16F84):


http://www.mikroe.com/pt/product/books/picbook/00.htm
PIC16F627/8 Data Sheet
http://ww1.microchip.com/downloads/en/DeviceDoc/40300C.pdf

21