Programar_Microcontroladores_PIC16F62X

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

Transcript of Programar_Microcontroladores_PIC16F62X

Page 1: Programar_Microcontroladores_PIC16F62X

MICROPROCESSADORES E MICROCONTROLADORES

TUTORIAL

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

Índice1. 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

Page 2: Programar_Microcontroladores_PIC16F62X

2

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

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

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

Page 3: Programar_Microcontroladores_PIC16F62X

3

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

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

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

Page 4: Programar_Microcontroladores_PIC16F62X

4

• 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.

Page 5: Programar_Microcontroladores_PIC16F62X

5

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.

Page 6: Programar_Microcontroladores_PIC16F62X

6

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.

Page 7: Programar_Microcontroladores_PIC16F62X

7

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.

Page 8: Programar_Microcontroladores_PIC16F62X

8

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.

Page 9: Programar_Microcontroladores_PIC16F62X

9

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

Page 10: Programar_Microcontroladores_PIC16F62X

10

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

Page 11: Programar_Microcontroladores_PIC16F62X

11

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)

Page 12: Programar_Microcontroladores_PIC16F62X

12

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

Page 13: Programar_Microcontroladores_PIC16F62X

13

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

Page 14: Programar_Microcontroladores_PIC16F62X

14

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 permitacolocar 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 delayORG 0X0

STARTMOVLW 0x07MOVWF CMCONBCF STATUS, RP1BSF STATUS, RP0 ; Selecciona Banco 1 (para acesso ao registo TRIS)MOVLW 0x00MOVWF TRISB ; Configura todos os pinos de PORTB como saídasBCF STATUS, RP0BCF STATUS, RP1 ; Selecciona o banco 0 (para acesso ao PORTB)

CLRF PORTB ; inicializa PORTB a '0'CICLO

CALL DELAY ; DelayINCF PORTB ; Incrementa o valor de PORTBGOTO CICLO

DELAY ; Executa ciclos para implementar a esperaCLRF COUNT

CICLODELAYINCFSZ COUNT, 1GOTO CICLODELAYRETURNEND

5. Escreva um programa em assembly para ser executado no PIC16F627 que permitaexecutar continuamente num display de 7 segmentos a contagem crescente 0-9. Acontagem deve permanecer algum tempo em cada número.

#INCLUDE <P16F627.INC>ORG 0x40

COUNT EQU 0x20 ; Variável para utilizar no ciclo delayNUM EQU 0x21 ; Para representar o número do dígito

ORG 0X00START

BCF STATUS, RP1BSF STATUS, RP0 ; Selecciona Banco 1 (para acesso ao registo TRIS)MOVLW 0x00

Page 15: Programar_Microcontroladores_PIC16F62X

15

MOVWF TRISB ; Configura todos os pinos de PORTB como saídasBCF STATUS, RP0BCF STATUS, RP1 ; Selecciona o banco 0 (para acesso ao PORTB)CLRF NUMCLRF PORTB

CICLOCALL CONVERTEMOVWF PORTB ; Envia o valor para o PORTBCALL DELAY ; DelayINCF NUM, 1GOTO CICLO

CONVERTEMOVF NUM, W ; PCL indica a posição de processamentoADDWF 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 esperaCLRF COUNT

CICLODELAYINCFSZ COUNT, 1GOTO CICLODELAYRETURNEND

6. Escreva um programa em assembly para ser executado no PIC16F627 que permitaidentificar em 3 LED ligados à saída, em qual linha do teclado foi pressionada umatecla. 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 pressionadaa tecla ‘4’ deve ligar o segundo LED que indica que a tecla pertence à linha 2 doteclado.Nota: A solução apresentada considera que o teclado apresenta a configuraçãoapresentada na figura 6.

Page 16: Programar_Microcontroladores_PIC16F62X

16

Figura 6 – Teclado matricial.

#INCLUDE <P16F627.INC>ORG 0x00START

MOVLW 0x07MOVWF CMCONBCF STATUS, RP1BSF STATUS, RP0 ; Selecciona o banco 1MOVLW B'11110000'MOVWF TRISB ; RB0-RB3 saídas para teste do teclado.

; RB4-RB7 entradas para verificar o tecladoBCF TRISA, 0 ; RA0 como saídaBCF TRISA, 1 ; RA1 como saídaBCF TRISA, 2 ; RA2 como saídaBCF STATUS, RP1BCF STATUS, RP0 ; Selecciona o banco 0

CICLOBSF PORTB,0 ; Testar a primeira colunaBTFSC PORTB, 4 ; Ver se o 1 está pressionadoGOTO UMBTFSC PORTB, 5 ; Ver se o 4 está pressionadoGOTO QUATROBTFSC PORTB, 6 ; Ver se o 7 está pressionadoGOTO 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,0BCF PORTA,1BCF PORTA,2

Page 17: Programar_Microcontroladores_PIC16F62X

17

GOTO CICLOUM ; Linha 1

BSF PORTA,0BCF PORTA,1BCF PORTA,2GOTO CICLO

QUATRO ; Linha 2BCF PORTA,0BSF PORTA,1BCF PORTA,2GOTO CICLO

SETE ; Linha 3BCF PORTA,0BCF PORTA,1BSF PORTA,2GOTO CICLO

END

5 Exercícios para Resolver

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

2. Escreva um programa em assembly para ser executado no PIC16F627 que permitaconfigurar 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 controlode um sistema com 3 saídas ligadas a RB0, RB1 e RB2. O sistema deve possuir umaentrada associada ao pino RA3.Quando a entrada estiver activa o circuito deve activarsequencialmente 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 seencontra.

6. Escreva um programa em assembly para ser executado no PIC16F627 que permitafazer o controlo de dois dispositivos. O programa aceitar uma entrada que permiteseleccionar um de dois modos de funcionamento:

Page 18: Programar_Microcontroladores_PIC16F62X

18

a. Se a entrada for accionada então o sistema deve alternadamente accionar cadaum dos dispositivos (liga dispositivo um, desliga dispositivo um, liga dispositivodois, 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 ProjectProject 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 ProjecBuild 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 DebuggerSelect toolMPLAB SIM. Depois

pode executar o programa passo-a-passo pressionando a tecla F8 (ou F7). Para visualizar o

conteúdo dos registos seleccione ViewWatch e adicione os registos ou variáveis que

Page 19: Programar_Microcontroladores_PIC16F62X

19

pretende visualizar. Pode em alternativa seleccionar ViewSpecial 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 FileLoad program).

Dispositivos para testar as saídas podem ser adicionados no menu tools.

Para iniciar a simulação deve seleccionar o menu SimulationStart. A velocidade da

simulação pode ser ajustada no menu Rate.

Page 20: Programar_Microcontroladores_PIC16F62X

20

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 ProgrammerSelect ProgrammerPICSTART

Plus no menu Programmer.

2) Habilitar o programador (opção ProgrammerEnable Programmer).

3) Transferir o programa (opção ProgrammerProgram).

Page 21: Programar_Microcontroladores_PIC16F62X

21

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