Sei sulla pagina 1di 87

MICROCONTROLADORES PIC

TEORIA

MSc. Gustavo Souto de Sá e Souza


MICROCONTROLADORES PIC

• Por que PIC?


Programmable Inferface Controller – Controlador de Interface Programável
X
Peripheral Inferface Controller – Controlador de Interface Periféricas

• Fabricados pela Microchip Technology


MICROCONTROLADORES PIC

• Por que PIC?

PICmicro
Programmable Inferface Controller – Controlador de Interface Programável
X
Peripheral Inferface Controller – Controlador de Interface Periféricas

• Fabricados pela Microchip Technology


MICROCONTROLADORES PIC

• Instruções de um PIC podem variar de cerca de 35 instruções


(PICs mais simples) para mais de 80 instruções para os PICs
high-end.
• Ciclo de instruções de 4 ciclos de clock.
• Diferentemente do 8051, possui uma arquitetura RISC,
apresentando maiores velocidades
• Processam dados de 8 bits, 16 bits ou até mesmo 32 bits.
• Trabalham com frequência de até 200 MHz.
NOP Nenhuma operação (MOVW 0,W)
OPTION Copia W para o registrador OPTION
SLEEP Entra em modo de economia de energia
CLRWDT Reinicia o watchdog timer
TRIS f Copia W para o registrador de triplo estado (f = 1, 2 or 3)
MOVWF f dest ← W
CLR f,d dest ← 0, normalmente escrito CLRW ou CLRF f
SUBWF f,d dest ← f−W (dest ← f+~W+1)
DECF f,d dest ← f−1
IORWF f,d dest ← f | W, OU inclusivo lógico
ANDWF f,d dest ← f & W, AND (E) lógico
XORWF f,d dest ← f ^ W, XOR lógico
ADDWF f,d dest ← f+W
MOVF f,d dest ← f
COMF f,d dest ← ~f, complemento bit a bit
INCF f,d dest ← f+1
DECFSZ f,d dest ← f−1, então pula se 0
RRF f,d dest ← CARRY<<7 &#124; f>>1, rotacionar para a direita através do carry
RLF f,d dest ← F<<1 | CARRY, rotacionar para a esquerda através do carry
SWAPF f,d dest ← f<<4 | f>>4, swap nibbles
INCFSZ f,d dest ← f+1, então pula se 0
BCF f,b Limpar bit b de f
BSF f,b Definir bit b de f
BTFSC f,b Pular se bit b de f está limpo
BTFSS f,b Pular se bit b de f está definido
RETLW k Define W ← k, então retorna de uma subrotina
CALL k Chama uma subrotina, endereço de 8 bits k
GOTO k Pula para o endereço de 9 bits k[8]
MOVLW k W←k
IORLW k W ← k | W, OU lógico (OR) bit a bit
ANDLW k W ← k & W, E lógico (AND) bit a bit
XORLW k W ← k ^ W, OU exclusivo (XOR) bit a bit
NOP Nenhuma operação (MOVW 0,W)
OPTION Copia W para o registrador OPTION
SLEEP Entra em modo de economia de energia
CLRWDT Reinicia o watchdog timer
TRIS f Copia W para o registrador de triplo estado (f = 1, 2 or 3)
MOVWF f dest ← W
CLR f,d dest ← 0, normalmente escrito CLRW ou CLRF f
SUBWF f,d dest ← f−W (dest ← f+~W+1)
DECF f,d dest ← f−1
IORWF f,d dest ← f | W, OU inclusivo lógico
ANDWF f,d dest ← f & W, AND (E) lógico
XORWF f,d dest ← f ^ W, XOR lógico
ADDWF f,d dest ← f+W
MOVF f,d dest ← f
COMF f,d dest ← ~f, complemento bit a bit
INCF f,d dest ← f+1
DECFSZ f,d dest ← f−1, então pula se 0
RRF f,d dest ← CARRY<<7 &#124; f>>1, rotacionar para a direita através do carry
RLF f,d dest ← F<<1 | CARRY, rotacionar para a esquerda através do carry
SWAPF f,d dest ← f<<4 | f>>4, swap nibbles
INCFSZ f,d dest ← f+1, então pula se 0
BCF f,b Limpar bit b de f
BSF f,b Definir bit b de f
BTFSC f,b Pular se bit b de f está limpo
BTFSS f,b Pular se bit b de f está definido
RETLW k Define W ← k, então retorna de uma subrotina
CALL k Chama uma subrotina, endereço de 8 bits k
GOTO k Pula para o endereço de 9 bits k[8]
MOVLW k W←k
IORLW k W ← k | W, OU lógico (OR) bit a bit
ANDLW k W ← k & W, E lógico (AND) bit a bit
XORLW k W ← k ^ W, OU exclusivo (XOR) bit a bit
NOP AJMP LJMP RR INC INC INC INC INC INC INC INC INC INC INC INC
JBC ACALL LCALL RRC DEC DEC DEC DEC DEC DEC DEC DEC DEC DEC DEC DEC
JB AJMP RET RL ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD
JNB ACALL RETI RLC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC
JC AJMP ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL
JNC ACALL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL
JZ AJMP XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL
JNZ ACALL ORL JMP MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
SJMP AJMP ANL MOVC DIV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
MOV ACALL MOV MOVC SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB
ORL AJMP MOV INC MUL ? MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
ANL ACALL CPL CPL CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE
PUSH AJMP CLR CLR SWAP XCH XCH XCH XCH XCH XCH XCH XCH XCH XCH XCH
POP ACALL SETB SETB DA DJNZ XCHD XCHD DJNZ DJNZ DJNZ DJNZ DJNZ DJNZ DJNZ DJNZ
MOVX AJMP MOVX MOVX CLR MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
MOVX ACALL MOVX MOVX CPL MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
NOP AJMP LJMP RR INC INC INC INC INC INC INC INC INC INC INC INC
JBC ACALL LCALL RRC DEC DEC DEC DEC DEC DEC DEC DEC DEC DEC DEC DEC
JB AJMP RET RL ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD ADD
JNB ACALL RETI RLC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC ADDC
JC AJMP ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL ORL
JNC ACALL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL ANL
JZ AJMP XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL XRL
JNZ ACALL ORL JMP MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
SJMP AJMP ANL MOVC DIV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
MOV ACALL MOV MOVC SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB SUBB
ORL AJMP MOV INC MUL ? MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
ANL ACALL CPL CPL CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE CJNE
PUSH AJMP CLR CLR SWAP XCH XCH XCH XCH XCH XCH XCH XCH XCH XCH XCH
POP ACALL SETB SETB DA DJNZ XCHD XCHD DJNZ DJNZ DJNZ DJNZ DJNZ DJNZ DJNZ DJNZ
MOVX AJMP MOVX MOVX CLR MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
MOVX ACALL MOVX MOVX CPL MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV
ARDUINO X PIC

vs
ARDUINO X PIC

vs
ATMEL AVR VS PIC

• Se destacou por ser pioneiro no uso de memória flash em seus chips, em uma
época onde se usava PROM, EPROM e EEPROM.
• A grande diferença: Atmel AVR usa Arquitetura de Harvard Modificada - capaz
de reescrever a memória do programa durante a própria execução.

• Velocidades e recursos são comparáveis. Ambos possuem famílias diferentes


capazes de atender diversas necessidades.
ARDUINO VS PICKIT

vs
Arduino PicKit
Plataforma completa de desenvolvimento Programador de chip
Arduino IDE possui uma única linguagem que MPLAB X IDE possui instruções e comandos
engloba inúmeros modelos diferentes diferentes para cada família, e até mesmo varia de
chip pra chip.
Possibilidade de usar Shields com diversas funções A expansão das funções depende do
desenvolvimento de uma placa
Custo varia entre R$40 para os mais simples até R$ Custa em torno de R$ 150
150 para o modelo Due.
Mais simples Mais complexo
Menor liberdade para trabalhos específicos Liberdade absoluta para se trabalhar com todos os
registradores do microcontrolador
Chip nem sempre é removível. Por se tratar somente do programador, o chip é
obtido separadamente.
FAMÍLIAS PIC
8 bits:
• PIC10 – 8 microcontroladores (6 pinos)
• PIC12 – 20 microcontroladores (8 pinos)
• PIC16 – 155 microcontroladores (8 a 64 pinos)
• PIC18 – 223 microcontroladores (18 a 100 pinos)

Variadas aplicações que exigem economia de energia, processamento


simples, compatibilidade e robustez.
FAMÍLIAS PIC

16 bits:
• PIC24, dsPIC30, dsPIC33
• Total de 432 microcontroladores (12 a 122 pinos)

Periféricos mais amplos:


• Conversores AD de maior resolução
• Conversores DA
Funções de processamento digital de sinais (FFT, filtros)
Bibliotecas e funções mais acessíveis para uso de vários recursos como PWM, USB e TCP/IP.
FAMÍLIAS PIC

32 bits:
• PIC32: 184 microcontroladores (28 a 144 pinos)

Hardware dedicado para operações em pontos flutuantes.


Frequência de operação de até 200 MHz (contra 48 MHz das outras famílias)
Integração simplificada com interfaces gráficas, áudio, comunicações e controles
multitarefa.
MPLAB Harmony Framework
FAMÍLIAS PIC
Cada família difere em vários aspectos:
• Bits de configuração
• Tensão de funcionamento
• Frequência de funcionamento
• Periféricos
• Instruções

Ou seja: um programa feito para um chip de uma família não funcionará em


outra família sem inúmeras adaptações. De fato, um programa feito para chips
diferentes da mesma família também podem precisar de algumas adaptações.
FAMÍLIAS PIC

A quantidade de bits do microcontrolador define o tamanho do barramento de


leitura e escrita de dados. Ou seja: é a quantidades de bits que serão lidos e
escritos por vez. Isso implica que um microcontrolador de 16 bits pode fazer
operações com números de 0 a 65535 de uma só vez, enquanto um de 8 bits
precisa de sub-rotinas complexas usando vários registradores de 0 a 255 para se
chegar ao mesmo resultado.
Apesar de que durante a programação em alto nível, isso pode passar
despercebido, ganha-se em eficiência de execução e em espaço de memória.
COMPILADORES E AMBIENTES DE PROGRAMAÇÃO

Apesar de o chip ser gravado apenas em baixo nível, como todo


microcontrolador, geralmente a programação dele é feita pelos usuários em
linguagem de alto nível, por meio de compiladores.

Esse é um dos grandes motivos da popularização do PIC (e também do Arduino).

Existem vários compiladores e ambientes de programação diferentes para PICs.


Cada um possui conjuntos de instruções diferentes.
COMPILADORES E AMBIENTES DE PROGRAMAÇÃO

• O Compilador é o software responsável por traduzir as instruções de


linguagem de alto nível para linguagem de baixo nível.

• O Ambiente de Programação é a interface que o usuário usa para programar o


chip.

Os compiladores mais usados são os da própria Microchip: C18 compiler, os


mais recentes XC8, XC16 e XC32. Apesar disso, também são bem usados outros
como o mikroC e o CCS. Todos possuem variações gratuitas e pagas, cada uma
com suas características.
AMBIENTES DE PROGRAMAÇÃO

Geralmente cada compilador tem um ambiente de programação próprio, como


os da mikroC.

Porém há ambientes como o PIC C Wizard, que utiliza o compilador CCS para
gerar os arquivos hex a serem gravados nos chips.

O ambiente de programação da Microchip é o MPLAB IDE ou o mais recente


MPLAB X IDE.
MPLAB X IDE E COMPILADORES XC8/XC16/XC32
Utilizaremos o MPLAB X IDE, que é o ambiente de programação mais recente da
própria fabricante do PIC.

Ele suporta os compiladores mais recentes XC8, XC16 e XC32. Estes


compiladores possuem versões gratuitas, onde o código não é otimizado,
versões Padrão, de “baixo” custo e otimiza o programa em até 25% comparado
com a versão gratuita, e a versão Pro, de alto custo e pode otimizar o programa
mais de 50%.

Um código menor é mais eficiente e ocupa menos memória.


MPLAB X IDE E COMPILADORES XC8/XC16/XC32
Utilizaremos o MPLAB X IDE, que é o ambiente de programação mais recente da
própria fabricante do PIC.

Ele suporta os compiladores mais recentes XC8, XC16 e XC32.

Estes compiladores possuem versões:


• Gratuitas: onde o código não é otimizado,
• Standard: de “baixo” custo (US$ 595 para o XC32) e otimiza o programa em
até 25% comparado com a versão gratuita
• Pro: de alto custo (US$1295 para o XC32) e pode otimizar o programa mais de
50%.
MPLAB X IDE E COMPILADORES XC8/XC16/XC32
• Os compiladores XC8, XC16 e XC32 possuem várias bibliotecas e
instruções específicas para os microcontroladores PIC de 8, 16 e 32
bits respectivamente.
• Utilizam uma linguagem C.
• Possuem várias bibliotecas prontas para acesso a periféricos e
funções específicas, como funções de atraso, acesso a LCDs ou
comunicação serial.
• Aceitam partes do código em assembly.
ALIMENTAÇÃO

• Normalmente PICs são alimentados com 5 V ou 3.3 V.


• Confirmar no datasheet do chip!

• Famílias de 8 ou 16 bits geralmente trabalham com 5 V ou


3.3 V.
• Família PIC32 focam em chips de 3.3 V.
OSCILADOR

Na eletrônica, inúmeros circuitos necessitam de um “clock”,


geralmente obtido por meio de circuitos osciladores.

Oscilador RC Oscilador com cristal em um microcontrolador


OSCILADOR

• Como todo microcontrolador, o PIC necessita de um clock.


• Ele vem com um oscilador RC interno, mas também pode
ser ligado a um oscilador externo.
• A frequência do oscilador, juntamente com
multiplicadores e divisores internos, definem a frequência
de ciclo de máquina do PIC.
FREQUÊNCIA DE CICLO DE MÁQUINA
Os PICs possuem várias formas de se configurar sua
frequência de operação, por meio de definição de Bits de
Configuração.
Definições:
• Frequência do oscilador.
• Frequência do sistema.
• Frequência de ciclo de máquina.
FREQUÊNCIA DE CICLO DE MÁQUINA

• Frequência do oscilador: frequência do oscilador interno


ou externo.
• Frequência do sistema: frequência do oscilador
multiplicado ou dividido pelas PLLs (phase locked loop -
Malha de Captura de Fase).
• Frequência de ciclo de máquina: frequência do sistema
dividido por 4.
FREQUÊNCIA DE CICLO DE MÁQUINA

PLL – Phase Locked Loop


FREQUÊNCIA DE CICLO DE MÁQUINA

PLL
FREQUÊNCIA DE CICLO DE MÁQUINA

2xPLL
FREQUÊNCIA DE CICLO DE MÁQUINA

4xPLL
FREQUÊNCIA DE CICLO DE MÁQUINA

8xPLL
FREQUÊNCIA DE CICLO DE MÁQUINA

16xPLL
BITS DE CONFIGURAÇÃO

• Registradores internos que configuram várias características de


operação do PIC: oscilador, modo de operação de temporizadores
e conversores A/D, recursos de debug e segurança.

• Variam muito de chip pra chip.

• Dependendo do chip, é possível alternar entre osciladores durante


a execução de um programa.
dsPIC30F3014
dsPIC30F3014
PIC18F4550
PIC18F4550
PIC18F4550
PIC18F4550
PIC18F4550
INPUTS E OUTPUTS

Os microcontroladores
PICs utilizam entradas e
saídas digitais:
• Portas A, B, C, D e até E,
com até 8 pinos em
cada uma, dependendo
do modelo do chip.
INPUTS E OUTPUTS

Como ler essas entradas ou escrever nessas saídas?


O pino ou porta pode ser definido como entrada ou saída
usando o registrador TRIS.
Definindo um valor igual a “1” no registrador TRIS específico,
define aquele pino como entrada e um valor “0” o define como
saída.
1 entrada
0  saída
INPUTS E OUTPUTS

Para definir todos os pinos da porta D como saída:


TRISD = 0b00000000;

Para definir todos os pinos da porta D como entrada:


TRISD = 0b11111111;
INPUTS E OUTPUTS
Para definir os pinos de 0 a 4 da porta B como saída e os de 5 a
7 restante como entrada:
TRISB = 0b11100000;

Podemos também usar um valor decimal ou hexadecimal:


TRISB = 224;
TRISB = 0xE0;
INPUTS E OUTPUTS
TRISD = 0;
Significa que todos os pinos da porta D estão sendo usados
como saída.

TRISB = 1;
Significa que o pino RB0 está sendo usado como entrada e os
pinos RB1, RB2, RB3, RB4, RB5, RB6 e RB7 são de saída.
INPUTS E OUTPUTS

Quando for necessário definir apenas um pino de uma porta


inteira, pode-se usar a seguinte sintaxe:
TRISBbits.TRISB3 = 1;
Dessa forma se define apenas o pino RB3 como entrada e o
restante continua como estava anteriormente.
INPUTS E OUTPUTS

Para se definir o estado de um pino digital de saída, usa-se o


registrador LAT.

Exemplo: para definir os pinos 0, 2, 4 e 6 da porta B em nível


baixo e os outros pinos em nível alto:
LATB = 0b10101010;
INPUTS E OUTPUTS
Também pode se mudar o valor bit a bit com a seguinte sintaxe:

Exemplo: o pino 0 da porta B em nível baixo:


LATBbits.LATB0 = 0;

Ou em nível alto:
LATBbits.LATB0 = 1;
INPUTS E OUTPUTS
Para se ler o estado de uma porta, usa-se o registrador PORT.

Exemplo: para salvar na porta C o estado atual da porta D:


LATC = PORTD;

Também é possível ler apenas o valor de um pino:


LATCbits.LATC0 = PORTDbits.RD0;
INPUTS E OUTPUTS

É possível usar operadores lógicos da linguagem C, como o sinal


de exclamação (não).

Para inverter o sinal do pino RD0:


LATDbits.LATD0 = !PORTDbits.RD0;
INPUTS E OUTPUTS
Por que LAT e PORT?
INPUTS E OUTPUTS

Por que LAT e PORT?


• Escrita em LAT escreve no registrador LAT.
• Leitura em LAT lê registrador LAT.

• Escrita em PORT escreve no registrador LAT.


• Leitura em PORT lê nível de tensão no pino.
INPUTS E OUTPUTS
O estado atual do pino (PORT) pode ser diferente do valor escrito no
registrador em algumas circunstâncias. Por exemplo,
• Quando o pino de saída está conectado a cargas indutivas ou
capacitivas muito grandes.
• Quando o pino de saída está ligado a LEDs sem resistores limitadores
de corrente.
• Quando o pino de saída regula um transistor sem um resistor de base.
• Quando o pino de saída está aterrado.
INPUTS E OUTPUTS

Por isso é uma boa prática ler de LAT e escrever em


PORT. Mas na maioria dos casos, se você ler e
escrever em PORT, irá funcionar conforme
esperado.
CONCLUSÃO
CONCLUSÃO
HELLO, WORLD!

O programa mais básico de um microcontrolador é fazer um


LED piscar num intervalo fixo de tempo.

Faremos a comparação entre o código entre o 8051, PIC e


Arduino.
HELLO, WORLD! - 8051
ORG 00H
LJMP INICIO

ORG 30H
INICIO: CPL P1.0
LCALL ATRASO
SJMP INICIO

ATRASO: MOV R0,#10


V2: MOV R1,#100
V1: MOV R2,#200
DJNZ R2,$
DJNZ R1,V1
DJNZ R0,V2
RET

END
HELLO, WORLD! – PIC18F4550 @ XC8
#include <pic18f4550>
#define _XTAL_FREQ 2000000

void main(void)
{
TRISD=0;
PORTD = 1;
while(1)
{
PORTDbits.RD0 = !LATDbits.LATD0;
__delay_ms(100);
}
}
HELLO, WORLD! - ARDUINO
int ledPin = 0;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
digitalWrite(ledPin, !digitalRead(ledPin));
delay(100);
}
TUTORIAL “HELLO WORLD!”

1) Instalar MPLAB X IDE


2) Instalar compiladores XC8/XC16 ou XC32
3) Definir chip
4) Configurar oscilador
5) Corpo do programa
6) Testar
CONVERSÃO ANALÓGICO - DIGITAL

Resolução:
• Dada em bits
• Define a menor variação de tensão
detectável
• Geralmente os ADCs têm resolução
de 8, 10 ou 12 bits nos PICs
CONVERSÃO ANALÓGICO - DIGITAL

Resolução:
• Dada em bits
• Define a menor variação de tensão
detectável
• Geralmente os ADCs têm resolução
de 8, 10 ou 12 bits nos PICs
CONVERSÃO ANALÓGICO – DIGITAL

Para 0-5V, as menores


variações detectáveis
são de:
• 8 bits: 20 mV
• 10 bits: 5 mV
• 12 bits: 1 mV
• 16 bits: 76 uV
Ruído! • 24 bits: 298 nV
CONVERSÃO ANALÓGICO – DIGITAL

Para reduzir ruídos, recomenda-se tomar as seguintes precauções:


• Criar uma placa com um (ou vários) planos de terra;
• Separar o circuito analógico do circuito digital: evita ruído de chaveamento de altas
frequências;
• Casamento de impedâncias em trilhas;
• Desconectar dispositivo da rede elétrica (alimentação por baterias);
• Uso de capacitores de desacoplamento;
CONVERSÃO ANALÓGICO – DIGITAL

Plano de Terra:
CONVERSÃO ANALÓGICO – DIGITAL

Circuitos separados:
CONVERSÃO ANALÓGICO – DIGITAL

Capacitores de desacoplamento:
• Evita oscilações na tensão de
alimentação durante oscilações na
energia requerida pelo circuito.
CONVERSÃO ANALÓGICO – DIGITAL
Taxa de amostragem:
CONVERSÃO ANALÓGICO – DIGITAL
Taxa de amostragem:
CONVERSÃO ANALÓGICO – DIGITAL
Aliasing:

Teorema de Nyquist: taxa de amostragem deve ser 2 vezes maior que a maior
frequência do sinal amostrado.
PULSE WIDTH MODULATION - PWM
Modulação por largura de pulso:

Tensão média:
10 %

50 %

90 %
PULSE WIDTH MODULATION - PWM
Modulação por largura de pulso:

Na prática:

T – PR2 (timer2)

t (%) - CCPR2L
(0 a 255)
PULSE WIDTH MODULATION - PWM
Modulação por largura de pulso:

Na prática:
CCPR2L = 25

CCPR2L = 128

CCPR2L = 230

Potrebbero piacerti anche