MICROCONTROLADOR PIC 18F4550
Os microcontroladores começaram a ser fabricados a partir da década de 1980 e a família 8051, da Intel tornou-se um padrão. Com o tempo, outros microcontroladores, de outros fabricantes, foram conquistando o seu espaço no mercado. Além disso, os microcontroladores foram se tornando mais robustos e com maior capacidade de processamento, ficando cada vez mais rápidos, com novos
dispositivos de I/O integrados, tais como, USART (universal synchronous/asynchronous
receiver/transmitter, que é um tipo de interface serial para comunicação) , conversor A/D, PWM (pulse-width modulation, modulação por largura de pulso), oscilador interno, modulador de RF (rádio freqüência), interfaces CAN (controller area network), SPI (serial peripheral interface) , I2C (
inter-integrated circuit, tipo de barramento utilizado para interconectar periféricos e microcontrolador), etc.
Introdução
Microcontroladores da Família PIC
Família de microcontroladores fabricados pela Microchip Technology (www.microchip.com); Apresenta centenas de MCUs, com características específicas.
Baseados na arquitetura Harvard (RISC); Operam com clock de até 40 MHz;
Memória de dados com 8 bits ,16 bits ou 32 bits (dependendo do MCU);
Memória de programa:
Pode apresentar 12 bits, 14 bits ou 16 bits em cada localidade (dependendo do MCU); Diferentes tecnologias:
ROM tipo máscara (o chip já sai gravado de fábrica, sem possibilidade de regravação vantagem: baixíssimo custo; chips com sufixo “CR” – ex.: 16CR56A );
OTP (utiliza PROM, ou seja, o chip pode ser gravado uma única vez; sufixo “C”
ex.: 16C432);
Características do Microcontrolador PIC 18F4550
40 pinos de I/O;
Freqüência de operação de até 48 MHz;
Oscilador interno de 8 MHz;
Memória de programa (FLASH): 32kB x 16 bits;
Memória de dados (RAM): 2kB x 8 bits;
Memória EEPROM interna: 256 bytes x 8 bits;
Conversor A/D de 10 bits (13 canais);
4 Módulos de temporização (Timers);
Módulo CCP (modos capture, compare e PWM);
Comparadores analógicos (referência de tensão interna programável);
Módulo de Comunicação serial
–
USART;
Módulo de Comunição USB;
Watchdog timer
;
Capacidade de corrente de 25 mA por pino de I/O;
75 instruções (RISC);
Set de instruções otimizado para programação em linguagem C;
Múltiplas fontes de interrupção independentes;
Modo de funcionamento
sleep
;
Pinagem do PIC 18F4550
OBS.:
*Dreno aberto: deve ser conectado um resistor de “pull-up” ao pino
*LVP: baixa tensão de programação *ICSP: gravação in-circuit
Pino Tipo Descrição
1 E Reset CPU/ Tensão de programação
2 E/S PORTA (bit 0)/ Entrada do comparador analógico
3 E/S PORTA (bit 1)/ Entrada do comparador analógico
4 E/S
PORTA (bit2)/ Entrada do comparador analógico/ saida de tensão de referencia negativa/saida comparador Vref
5 E/S
PORTA (bit 3)/ Entrada do comparador analógico/ saida de tensão de referencia positiva/saida comparador Vref
6 E/S
PORTA (bit 4)/ Entr. de clock externo do Timer0/ saida do comparador 1
7 E/S
Porta (bit5)/ Entrada do comparador
analógico/entrada seleção de SPI*/saida do comparador 2
8 E/S
PORTE (bit 0)/ Read control for Parallel Slave Port/Entrada do comparador analógico
9 E/S
PORTE (bit 1)/ write control for Parallel Slave Port/Entrada do comparador analógico
10 E/S
PORTE (bit 2)/ Chip select control for Parallel Slave Port/Entrada do comparador analógico
Pinagem do PIC 18F4550
OBS.:
*Dreno aberto: deve ser conectado um resistor de “pull-up” ao pino
*LVP: baixa tensão de programação *ICSP: gravação in-circuit
Pino Tipo Descrição
13 E/S Entr. para cristal oscilador/ Entr. de clock
14 E/S Entr. para cristal oscilador/saida de clock
15 E/S
PORTC( bit 0)/ saida. do oscilador Timer1/ Entr. de clock externo do Timer1
16 E/S
PORTC( bit 1)/ Entr. do oscilador Timer1/ Capture2 input, Compare2 output, PWM2 output/USB Transceiver
17 E/S
PORTC( bit 2)/ Capture1 input, Compare1 output, PWM1 output.
18 E/S
PORTC( bit 3)/ Synchronous serial clock input/output for SPI/ Synchronous serial clock input/output for I2C
19 E/S PORTD (bit 0)/ porta paralela
20 E/S PORTD (bit 1)/ porta paralela
21 E/S PORTD (bit 2)/ porta paralela
22 E/S PORTD (bit 3)/ porta paralela
Pinagem do PIC 18F4550
OBS.:
*Dreno aberto: deve ser conectado um resistor de “pull-up” ao pino
*LVP: baixa tensão de programação *ICSP: gravação in-circuit
Pino Tipo Descrição
25 E/S
PORTC (bit6)/Transmissão USART (modo assínc.)/ Clock (modo síncrono)
26 E/S
PORTB (bit 1)/ Recepção USART (modo assíncr.) / Dados (modo síncrono
27 E/S PORTD (bit 4)/ porta paralela
28 E/S PORTD (bit 5)/ porta paralela
29 E/S PORTD (bit 6)/ porta paralela
30 E/S PORTD (bit 7)/ porta paralela
31 E Terra (GND)
32 E Alimentação positiva (+5V)
33 E/S PORTB (bit 0)/ Entr. de interrupção externa
34 E/S PORTB (bit 1)
35 E/S PORTB (bit 2)
36 E/S PORTB (bit 3)/ Entr. de programação LVP*.
37 E/S PORTB (bit 4)
38 E/S PORTB (bit 5)
39 E/S PORTB (bit 6)/Clock na programação ICSP*
Execução e Busca de Instruções
Toda CPU é capaz de executar várias tarefas denominadas instruções. A base de tempo utilizada pela CPU para executar cada instrução é obtida a partir de um sinal de clock (que pode ser gerado internamente ao MCU ou proveniente de um oscilador externo). Nos MCUs da família PIC, a freqüência do sinal de clock é dividida, internamente, por quatro. Este novo sinal de clock, cuja freqüência é ¼ da freqüência do clock original, define o
ciclo de instrução do microcontrolador. O PIC 16F6877A possui um oscilador interno capaz de gerar um sinal de freqüência de até 4 MHz. Além disso, pode operar, utilizando um oscilador externo, em até 20 MHz.
ciclo de clock
ciclo de instrução
PC PC
OSC1
Busca instrução (PC)
PC+1 PC+2
Executa instrução (PC-1) Busca instrução (PC+1)
Quase todas as instruções dos microcontroladores da família PIC são executadas em um ciclo de instrução. O processo de busca e execução de instruções deste microcontrolador é ilustrado abaixo:
O contador de programa (PC, do inglês program counter) indica a posição
da memória de programa que contém a instrução que está sendo “buscada”.
NÃO FAZER NADA
SETAR PINO1
MOVER 10010110,TRISA
NÃO FAZER NADA
RESETAR PC
Memória de Programa
00h
01h
02h
03h PC=01
Enquanto a CPU executa a instrução “NÃO FAZER NADA” (que está na posição de memória “PC-1”), é feita a busca da próxima instrução a ser executada (que está armazenada na memória de programa na posição “PC”, ou seja, na posição de mem. “01h”).
PC=02
A CPU executa a instrução “SETAR PINO1” (que está na posição de memória “PC-1”) e é feita a busca da próxima instrução a ser executada (que está armazenada na memória de programa na posição “02h”, ou seja, na posição de memória “PC”).
Esta característica de buscar a instrução em um ciclo de máquina
e executá-la no próximo torna o sistema mais rápido e é
conhecida como
pipeline
.As instruções são formadas por um conjunto de bits que são decodificados pelo microcontrolador, fazendo com que ele execute uma operação bem definida. A quantidade de bits pode variar de uma instrução para outra, dependendo do microcontrolador. No caso do PIC 16F877A, todas as instruções
possuem o mesmo tamanho: 14 bits.
As instruções são compostas de dois campos: código de operação (OP. CODE) e operando. Os primeiros bits de uma instrução representam o “OP. CODE” e os demais formam o operando, podendo conter dados, endereço ou o “nome” de um registrador.
• Código de operação (OP. CODE)
É o campo da instrução que especifica qual tarefa deve ser realizada pelo MCU quando a instrução é processada. O OP. CODE é um conjunto de bits (representado em binário ou em hexadecimal). Para facilitar o desenvolvimento dos programas, é dado um nome a cada instrução (que é associada a um determinado OP. CODE). Este nome é o MNEMÔNICO da instrução, que é uma forma abreviada da descrição da instrução (em inglês). Exs: MOV (mover), ADD (somar), CLR (limpar), NOP (não fazer nada).
• Operando
Representa quais elementos serão “envolvidos” na instrução definida. Por exemplo, numa operação de armazenamento de dados na memória, o operando é composto pelo dado que será armazenado e o endereço da localidade de memória onde ele deve ser armazenado. No caso do PIC 16F877A, os operandos de uma instrução podem ser do tipo REGISTRADOR, BIT DE UM REGISTRADOR ou DADO. Existem algumas instruções que não possuem operandos, como veremos adiante.
SET
DE
INSTRUÇÕES BÁSICO
DOS
MCU’s
DA
FAMÍLIA PIC
Nomenclatura das Instruções
A sintaxe utilizada na construção dos mnemônicos das instruções segue uma lógica. Conhecer a nomenclatura adotada pelo fabricante facilita o entendimento do significado de cada instrução.
W : Representa o registrador WORK (em alguns MCUs este registrador é conhecido como acumulador). É um registrador que não é mapeado na memória de dados (ao contrário dos outros SFR), mas é muito utilizado, pois não é possível escrever um dado em um outro registrador sem que antes a informação passe pelo registrador W.
F : (File) Representa uma posição de memória ou um registrador.
L : (Literal) A instrução opera um valor numérico (constante), que pode ser representado em decimal, binário, octal, hexadecimal ou ASCII.
B : (Bit) Representa um bit dentro de um byte.
T : (Teste) Indica que a instrução fará um teste em um determinado bit, dentro de um byte, para verificar se ele é “0” ou “1”.
S : (Skip) Indica que a próxima linha do programa será “pulada” se uma certa condição for satisfeita.
S : Aparecendo como última letra do mnemônico, S significa que um determinado bit, dentro de um byte, será “SETADO”, ou seja, levado a nível lógico “1”.
C : (Clear) Indica que um determinado bit, dentro de um byte, será “LIMPO”, ou seja, levado a nível lógico “0”.
Nas instruções de desvio, o“S” e“C”também são usados para indicar se um bit está em“1”ou“0”, respectivamente.
Tipos de Instruções
•
Manipulação de byte
•
Manipulação de bit
•
Matemáticas
•
Lógicas
•
Testes e desvios condicionais
•
Controle de fluxo
•
Controle de cpu
Termos utilizados para indicar a tarefa que será realizada por uma instrução:
•
ADD
(soma de 2 números);
•
AND
(operação lógica
“E”
entre 2 números);
•
IOR
(operação lógica
“OU”
entre 2 números);
•
CLR
(limpar);
•
COM
(complemento
– “inversão
bit a
bit”)
;
•
DEC
(decremento de um número);
•
INC
(incremento de um número);
•
MOV
(mover uma informação para algum lugar);
•
RL
(rotacionar um bit para a esquerda);
•
RR
(rotacionar um bit para a direita);
•
SUB
(subtração entre 2 números);
Legenda f : registrador
d: destino
(“0”W; “1” registrador f)
b: bit
k: constante
Instruções Básicas
–
Família PIC
Instrução Descrição OP. CODE (14 bits)
Status
afetado Exemplo Operações com registradores
ADDWF f,d Soma W e f: d (W+f) 00 0111 dfff ffff C, CD, Z ADDWF REG1,0
ANDWF f,d AND entre W e f: d (W AND f) 00 0101 dfff ffff Z ANDWF REG1,1
CLRF f Limpa f 00 0001 1fff ffff Z CRLF REG1
CLRW Limpa W 00 0001 0000 0011 Z CLRW
COMF f,d Complemento de f: d NOT(f) 00 1001 dfff ffff Z COMF REG1,0
DECF f,d d (f-1) 00 0011 dfff ffff Z DECF CONT,1
DECFSZ f,d d (f-1) e salta próxima linha se o resultado for zero 00 1011 dfff ffff DECFSZ REG,1
INCF f,d d (f+1) 00 1010 dfff ffff Z INCF CONT,1
INCFSZ f,d d (f+1) e salta próxima linha se o resultado for zero 00 1111 dfff ffff INCFSZ REG1,1
IORWF f,d OR entre W e f: d (W OR f) 00 0100 dfff ffff Z IORWF REG1,0
MOVF f,d d cópia de f 00 1000 dfff ffff Z MOVF REG1,0
MOVWF f f cópia de W 00 0000 1fff ffff MOVWF REG1
RLF f,d rotaciona f um bit para a esquerda e copia em d 00 1101 dfff ffff C RLF REG1,0
RRF f,d rotaciona f um bit para a direita e copia em d 00 1100 dfff ffff C RRF REG1,0
Instrução Descrição OP. CODE (14 bits)
Status
afetado Exemplo Operações com bits
BCF f,b Reseta (clear) o bit b do registrador f 01 00bb bfff ffff BCF REG1,7
BSF f,b Seta o bit b do registrador f 01 01bb bfff ffff BSF REG1,5
BTFSC f,b Testa o bit b do registrador f e salta a próxima linha se ele for "0" 01 10bb bfff ffff BTFSC REG1,4
BTFSS f,b Testa o bit b do registrador f e salta a próxima linha se ele for "1" 01 11bb bfff ffff BTFSS REG1,3
Operações com literais (valores numéricos)
ADDLW k W (W+k) 11 111x kkkk kkkk C, CD, Z ADDLW 0x15
ANDLW k W (W AND k) 11 1001 kkkk kkkk Z ANDLW 0x5F
IORLW k W (W OR k) 11 1000 kkkk kkkk Z IORLW 0X3D
MOVLW k W k 11 00xx kkkk kkkk MOVLW 0X5A
SUBLW k W (k-W) 11 110x kkkk kkkk C, CD, Z SUBLW 0X02
XORLW k W (W XOR k) 11 1010 kkkk kkkk Z XORLW 0XAF
Operações de Controle
NOP "No operation" (não faz nada) 00 0000 0xx0 0000 NOP
CALL k Chamada à sub-rotina 10 0kkk kkkk kkkk CALL ROTINA1
CLRWDT Limpa WDT (watch-dog) 00 0000 0110 0100 TO, PD CLRWDT
GOTO k Desvio para endereço 10 1kkk kkkk kkkk GOTO INICIO
RETFIE Retorno de interrupção 00 0000 0000 1001 RETFIE
MAPEAMENTO DE MEMÓRIA
Tipo
Função
Tamanho
16F877A
18F4550
Flash
Memória de programa
8192 x 14
32k x 16
RAM
Memória de dados
368 x 8
2k x 8
EEPROM
Armazenamento de dados que não
podem ser perdidos quando a
energia for desligada
256 x 8
256 x 8
Memória EEPROM (16F877A)
256 posições, cada uma com capacidade de armazenamento de 1 byte;
Faixa de endereços para acesso: 00h to FFh
;
Memória EEPROM
EECON1: registro de controle para os acessos de memória
.
EECON2 : não é um registrador físico. Ler o EECON2 obtem-se zeros. Utilizado na sequencia de escrita da EEPROM.
EEDATA: contem o dado lido/ a ser escrito EEADR: contem o endereço a ser acessado
bit 7 EEPGD: Seleção entre Program/Data EEPROM 1 = Acessa memória de programa
0 = Acessa memórica de dados
Obs: Lê ‘0’ depois de um POR; este bit não muda enquanto a operação de escrita está em progresso.
bit 6-4 Não Implementado: Lê ‘0’
bit 3 WRERR: Flag de erro da EEPROM
1 = Operação de escrita prematuramente terminada (algum MCLR ou WDT Reset durante a operação) 0 = Operação de escrita completada
bit 2 WREN: Habilitação da escrita da EEPROM 1 = permite escrita
0 = não permite escrita
bit 1 WR: Controle de escrita 1 = inicia o processo de escrita 0 = processo de escrita terminado bit 0 RD: Controle de leitura
Flash-ROM;
8192 localidades de 14 bits.
Endereços de 0000h a 1FFFh.
Memória de Programa (16F877A)
Vetor de reset
Reservado
Reservado
Reservado
Vetor de interrupção
Memória de Programa
0000h
0001h
0002h
0003h
0004h
0005h
Primeiro endereço da memória de programa que é executado quando o PIC começa a rodar
(após a alimentação ou um reset).
Memória de Dados
A memória de dados é particionada em múltiplos bancos, que possuem
registradores de uso geral e de funções especiais.
Bits RP1 (Status<6>) e
RP0 (Status<5>)
são os bits de seleção destes bancos
Todos os bancos possuem registradores de funções especiais (SFR).
Alguns deles usados em um banco são espelhados nos outros para
Mapeamento da Memória RAM
Memória de Dados
(16F877A)
4 bancos de memória;
Contém os SFR’s e os GPR’s;
368 posições de 8 bits para uso geral (GPR);
São utilizados para configurar as
características da operação do MCU como, por
exemplo, se um
determinado pino será uma entrada ou saída de dados.
Registradores com Finalidades Específicas (SFR)
SFR’s
(BANCO 0)
Legenda: R: bit de leitura W: bit de escrita
n: valor assumido no POR (“0” ou “1”) x: valor desconhecido no POR
SFR’s
SFR’s
O registrador STATUS contém informações sobre o estado da ALU, a forma do último Reset e os bits que selecionam os bancos da memória de dados.
Registrador STATUS
Legenda:
R: bit de leitura
W: bit de escrita
-n: valor assumido no POR (“0” ou “1”) -x: valor desconhecido no POR
Registrador STATUS
(Endereços: 03h, 83h, 103h e 183h)
Chaves de seleção de banco de memória (paginação de memória – endereçamento direto)
RP1 RP0 Seleção
0 0 Banco 0
0 1 Banco 1
1 0 Banco 2
1 1 Banco 3
Z (“bit zero”): indica que o resultado da última operação realizada pela ALU é zero (Z=1);
DC (“digit carry/borrow”): indica que a última operação de soma (instruções ADD - ADDWF, ADDLW,SUBLW,SUBWF) provocou um estouro (vai-um) entre os bits 3 e 4, isto é, o resultado ultrapassou os 4 bits menos significativos (DC=1);
C (“carry/borrow”): indica que a última operação de soma (instruções ADD - ADDWF, ADDLW,SUBLW,SUBWF) provocou um estouro (vai-um) no bit 7, isto é, o resultado ultrapassou os 8 bits dos registradores
PD: Power-down bit
O CONTADOR DE PROGRAMA (PC) do PIC 16F877A possui 13 bits. O byte menos significativo do PC
(PC<7:0>) fica no registrador PCL. A parte alta do PC
(PC<12:8>) não é diretamente endereçada, mas é fornecida pelos 5 bits menos significativos do registrador PCLATH (PCLATH<4:0>).
Registradores PCL e PCLATH
Legenda:
R: bit de leitura
W: bit de escrita
-n: valor assumido no POR (“0” ou “1”) -x: valor desconhecido no POR
Registrador PCL
Registrador PCLATH
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
bit12 bit11 bit10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
PC
(Endereços: 0Ah, 8Ah, 10Ah e 18Ah) (Endereços: 02h, 82h, 102h e 182h)
parte alta parte baixa
O registrador PIE1 habilita bits para as
interrupções dos periféricos.
Registrador PIE1
Legenda:
R: bit de leitura
W: bit de escrita
-n: valor assumido no POR (“0” ou “1”) -x: valor desconhecido no POR
Registrador PIE1 ( endereço 8Ch)
bit 7 PSPIE: Parallel Slave Port Read/Write Interrupt Enable bit(1) bit 6 ADIE: A/D Converter Interrupt Enable bit
bit 5 RCIE: USART Receive Interrupt Enable bit bit 4 TXIE: USART Transmit Interrupt Enable bit
bit 3 SSPIE: Synchronous Serial Port Interrupt Enable bit bit 2 CCP1IE: CCP1 Interrupt Enable bit
PORTAS DE I/O
O PIC 16F6887A possui cinco portas de I/O, cada uma
com quantidades de bits diferentes, chamadas
“PORTA” (pinos RA5:RA0), “PORTB” (pinos
RB7:RB0), “PORTC” (pinos RC7:RC0), “PORTD”
(pinos RD7:RD0) e “PORTE” (pinos RE2:RE0). Cada bit de cada porta está associado ao respectivo pino do MCU, podendo ser configurado como entrada ou saída, independentemente dos demais.
Níveis de Tensão
ENTRADA
V
IL(tensão de entrada baixa, “0”)
0
–
0,8 V
V
IH(tensão de entrada alta, “1”)
2 V
–
V
DDSAÍDA
V
OL(tensão de saída baixa, “0”)
0,6 V
V
OH(tensão de saída alta, “1”)
(
V
DD-
0,7 V)≈4,3 V
Registradores Associados às Portas de I/O
TRISA
: configura os pinos da “PORTA” como entrada ou saída PORTA
: acesso aos bits da “PORTA” (leitura ou escrita).Obs.: Alguns bits dos registradores CMCON (bits 2:0) e CVRCON (bits 7 e 6) têm influência sobre a “PORTA”. Dependo do valor destes Registradores RA4 e RA5 têm outras utilidades.
PORTA
TRISB
: configura os pinos da “PORTB” como entrada ou saída PORTB
: acesso aos bits da “PORTB” (leitura ou escrita).Obs.: O bit 7 do registrador OPTION (referenciado como “OPTION_REG” nos programas em
assembly) tem influência sobre a “PORTB”
PORTB
TRISC
: configura os pinos da “PORTC” como entrada ou saída PORTC
: acesso aos bits da “PORTC” (leitura ou escrita).
PORTC
0 = Output (saída) 1 = Input (entrada)
TRISD
: configura os pinos da “PORTD” como entrada ou saída PORTD
: acesso aos bits da “PORTD” (leitura ou escrita).OBS: Ao setar PSPMODE configuramos PORTD como uma porta paralela escrava (Parallel Slave Port)
PORTD
TRISE
: configura os pinos da “PORTE” como entrada ou saída PORTE
: acesso aos bits da “PORTE” (leitura ou escrita).OBS: Ao setar PSPMODE configuramos PORTE como uma porta paralela escrava (Parallel Slave Port)