Professional Documents
Culture Documents
TUTORIAL
INTRODUÇÃO À PROGRAMAÇÃO DE MICROCONTROLADORES PIC 16F62X
Índice
1. Introdução............................................................................................................................. 3
2.5 Memória........................................................................................................................ 7
4 Exercícios Resolvidos........................................................................................................... 11
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.
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.
4
2.3 Conjunto de Instruções
5
Onde:
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
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.
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).
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).
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)
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
9
3.2 Ler e Escrever Valores nas Entradas/Saídas
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
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
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
END
#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
#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)
#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''
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
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
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
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
18
pretende visualizar. Pode em alternativa seleccionar ViewSpecial function
registers para visualizar o conteúdo de todos os registos.
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.
20
4) Verificar se o programa foi transferido com êxito.
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
21