Você está na página 1de 30

Introdução ao Microcontrolador PIC

Nikolas Libert

Aula 11
Eletrônica Digital ET52C
Tecnologia em Automação Industrial
Memórias

Memórias Memória Núcleo Memória


de dados do μC de código

 Normalmente os microcontroladores possuem duas


memórias: de código e de dados.
 Memória de código
– Contém o firmware: sequência de operações que o
microcontrolador é programado para executar.
– Não é alterada em tempo de execução (há exceções).
– Não volátil: as informações continuam gravadas mesmo
que haja desenergização.
– Tipos: ROM, EPROM, EEPROM, Flash.

DAELT ● Nikolas Libert ● 2


Memórias

 Memória de dados
– Contém informações dinâmicas: o estado atual de um
contador, o número que o usuário digitou numa
calculadora…
– É volátil: há perda de informações quando o circuito é
desenergizado.
– Tipos:
● Estática: formada por flip-flops.
● Dinâmica: informação guardada em capacitores
(memórias DDR de PCs).

Memória Núcleo Memória


de dados do μC de código

DAELT ● Nikolas Libert ● 3


Arquiteturas de Acesso à Memória

Arquiteturas de Acesso à Memória


DATA
Memória Memória
de dados de dados
ADDR

ADDR
Núcleo Núcleo
do μC do μC
DATA
ADDR
Memória Memória
de código DATA de código

Von Neumman Harvard


Barramentos compartilhados para Barramentos separados para
todas as memórias. cada memória.
DAELT ● Nikolas Libert ● 4
Microcontrolador Genérico

Microcontrolador Genérico

 Tudo num único CI:


– Núcleo com Unidade
Lógica e Aritmética.
– Memórias.
– Pinos disponíveis
para o usuário.
– Periféricos.
– Circuito de Clock.

DAELT ● Nikolas Libert ● 5


Famílias de Microcontroladores

Famílias de Microcontroladores
 Fabricantes dividem seus modelos de μC em famílias.
– Todos μC numa família possuem o mesmo núcleo.

Família 1 Família 2 Família 3

Núcleo A Memória Núcleo Memória Núcleo C


B Memória Periféricos
Periféricos Periféricos

Núcleo C
Núcleo A Núcleo Memória
Memória
Periféricos
B Memória Periféricos
Periféricos

Núcleo A Memória Núcleo C


Núcleo Memória Memória Periféricos
Periféricos B Periféricos

DAELT ● Nikolas Libert ● 6


Famílias de Microcontroladores

 PIC - Peripheral Interface Controller


– Anos 70 – μC criados pela General Instruments.
– Anos 90 – PIC é vendido para a Microchip.
 4 prefixos são utilizados para nomear os μC de 8 bits
da Microchip: 10, 12, 16, 18 (ex.: 12F675, 18F4520).
 Pode-se dizer que existem 3 famílias: “Base Line”,
“Mid Range” e “High Performance”.
Exemplos Tamanho das Tamanho Número de Vetores de
Família
de modelos instruções da pilha instruções interrupção
10F200, 12F508,
Base line 12 bits 2 33 nenhum
16F57
12F675, 16F84A
Mid Range 14 bits 8 35 1
16F631, 16F873A
High 18F242, 2, com
16 bits 32 75
Performance 18F2420 prioridade
DAELT ● Nikolas Libert ● 7
PIC12F675

O PIC12F675

 8 pinos
– 2 para alimentação.
– 6 para uso geral (um deles para reset / MCLR).
 Pertence à família Mid Range: 35 instruções.
 Tensão de alimentação 2 a 5,5 V (pino VDD).
 Clock de até 20 MHz – Oscilador interno de 4MHz.
– Executa uma instrução a cada 4 ciclos de clock.
– 1M instruções por segundo com oscilador interno.

DAELT ● Nikolas Libert ● 8


PIC12F675

O PIC12F675

 Memória de programa:
– Memória flash para 1024 comandos (words).
100000 escritas.
 Memória de dados:
– 64 bytes de memória SRAM (volátil / flip-flops).
– 128 bytes de memória EEPROM (não volátil / 1000000
de escritas).
 Conversor AD, 2 timers, um comparador, programação
in-circuit.

DAELT ● Nikolas Libert ● 9


PIC12F675

 Parte da tabela de instruções.

DAELT ● Nikolas Libert ● 10


PIC12F675

 Registrador W:
– Memória de 8 bits presente no núcleo de todo μC PIC.
– Nas operações lógicas, o valor em W é usado como
operando e W pode armazenar o resultado.
 Exemplo de Instrução
Memória de Código Estado de W
Operação
Posição Conteúdo (após instrução)
(...) (...) (...) 0b???? ????
Word N 0b11 0000 1010 1010 W = 0b1010 1010 0b1010 1010
Word N+1 0b11 1001 0000 1111 W = W . 0b0000 1111 0b0000 1010
(...) (...) (...) (...)

DAELT ● Nikolas Libert ● 11


PIC12F675

 Status Register
– Registrador (memória de 8 bits) que contém
informações sobre a última operação realizada pela
ULA.
– Bits de Carry e Borrow.
– Bit de Zero: indica que última operação deu zero.
● Instruções de desvio no fluxo do programa podem
se basear no estado desse bit.
● Se dois número forem iguais, por exemplo, uma
subtração entre eles dará zero.

DAELT ● Nikolas Libert ● 12


PIC12F675

 Estrutura Interna

DAELT ● Nikolas Libert ● 13


PIC12F675
 Memória

DAELT ● Nikolas Libert ● 14


PIC12F675

 Cada periférico está associado a um endereço na


memória de dados.
– Ex.: Os pinos de saída são controlados
pelo registrador GPIO, no endereço 0x05.
– Ao escrever em um dos bits do registrador
GPIO (General Purpose Input Output), um
pino correspondente vai para nível lógico alto ou baixo.

DAELT ● Nikolas Libert ● 15


MikroC

O Compilador MikroC
 Na prática, não precisamos aprender as 35 instruções
do PIC12F675.
 Podemos escrever o programa em linguagem C e um
compilador faz a conversão para assembly (linguagem
de máquina).
 Mas ainda precisamos conhecer os registradores do PIC
que afetam os periféricos que serão utilizados.
– O Datasheet é sempre indispensável!
– Os detalhes mudam muito entre modelos diferentes de
microcontroladores.
DAELT ● Nikolas Libert ● 16
Criando um projeto no MikroC

 Criando um projeto no MikroC


– Clique em “Project → New Project...”

DAELT ● Nikolas Libert ● 17


Criando um projeto no MikroC

 Chame o projeto de PiscaLED e crie uma pasta para


o mesmo (não esqueça de excluir ao terminar).
 Configure o clock para 4 MHz (freq. oscilador interno).
 Selecione a opção “Open Edit Project window...”.

DAELT ● Nikolas Libert ● 18


Criando um projeto no MikroC

 Avance até esta tela, e faça as opções mostradas


abaixo:

DAELT ● Nikolas Libert ● 19


Criando um projeto no MikroC

 Escreva um programa para fazer o LED piscar.

void main() {
unsigned long int Contador=0;
ANSEL = ANSEL & 0b11110000; // Desabilita pinos analógicos
CMCON = CMCON | 0b00000111; // Desabilita comparador
TRISIO = TRISIO & 0b11111011; // GP2->saída

while(1){
Contador = Contador +1;
if(Contador == 100000){
Contador = 0;
GPIO = GPIO ^ 0b00000100; // Comuta GP2
}
}
}

DAELT ● Nikolas Libert ● 20


Criando um projeto no MikroC

 Compile clicando em “Build → Build”.

Não devem haver erros na tela de mensagens

DAELT ● Nikolas Libert ● 21


Flip-Flop T

 Programa que simula Flip-Flop T.


void main() {
unsigned char EstadoBTO;
ANSEL = ANSEL & 0b11110000; // Desabilita pinos analógicos
CMCON = CMCON | 0b00000111; // Desabilita comparador
TRISIO = TRISIO & 0b11111011; // GP2->saída
TRISIO = TRISIO | 0b00000010; // GP1->entrada

EstadoBTO = GPIO & 0b00000010; // Grava o estado inicial de GP1.


while(1){
if(EstadoBTO != (GPIO & 0b00000010)){ // Houve mudança no pino?
EstadoBTO = EstadoBTO ^ 0b00000010; // Atualiza variável.
if(EstadoBTO == 0){ // Foi borda de descida?
GPIO = GPIO ^ 0b00000100; // Comuta GP2
Delay_ms(3); // Debounce em Firmware!
}
}
}
}
DAELT ● Nikolas Libert ● 22
Controlando display de 7 segmentos

 Controlando um display de 7 segmentos.


– O PIC 12F675 possui apenas 6 pinos de saída.
– Para controlar o display podemos utilizar um
registrador de deslocamento.
– GP5 → saída de dados.
– GP4 → saída de clock.
5V
5V
a a Q6 Vcc 5V
6 16
b Q5 MR Vcc Gnd
f b 5 10 1 8
Q4

12F675
74HC595

c DS GP5 GP0
4 14 2 7

10k
g d Q3 SHCP GP4 GP1
3 11 3 6
e Q2 STCP MCLR GP2
2 12 4 5
e c f Q1 OE
1 13
d g Q0 Gnd
15 8

DAELT ● Nikolas Libert ● 23


Programa com display de 7 segmentos.

 Cronômetro com display de 7 segmentos (parte 1).


void main() {
unsigned char ContadorSerial=0;
unsigned char ContadorSegundos=0;
unsigned char CodigoAtual;
// Definição dos dígitos para 7 segmentos. Considerando display
anôdo comum (nível alto = LED apagado):
// - Dígitos armazenados no formato “0b 1gfe dcba”
const char D7S[10] = {
0xFF, //0: 0b1111 1111
0xF9, //1: 0b1111 1001
0xA4, //2: 0b1010 0100
0xB0, //3: 0b1011 0000
0x99, //4: 0b1001 1001
0x92, //5: 0b1001 0010
0x82, //6: 0b1000 0010
0xF8, //7: 0b1111 1000
0x80, //8: 0b1000 0000
0x90 //9: 0b1001 0000
};
DAELT ● Nikolas Libert ● 24
Programa com display de 7 segmentos.

 Cronômetro com display de 7 segmentos (parte 2).


// Pino GP5:transmissão dos dados em série.
// Pino GP4:transmissão dos pulsos de clock.
TRISIO &= 0b11001111; // GP4 e GP5 configurados como saída.
ANSEL &= 0b11110000; // GP0, GP1, GP2 e GP4 como pinos digitais.
CMCON |= 0b00000111; // Desabilita comparador analógico.

while(1){ // Laço infinito


CodigoAtual = D7S[ContadorSegundos]; // Código p/ LEDs display.
while (ContadorSerial < 7){ // Repete até transmitir os 7 bits.
GPIO = GPIO & 0b11101111; // Baixa clock.
// O bit0 do código será trasmitido pela serial (GP5).
// - GP5 é zerado.
// - O bit0 do código é deslocado 5 vezes para a esquerda
// para que fique alinhado com GP5.
// - GP5 recebe o valor do bit0 deslocado.
GPIO = GPIO & 0b11011111;
GPIO = GPIO | ((CodigoAtual & 0b00000001) << 5);

GPIO = GPIO | 0b00010000; // Levanta clock.


DAELT ● Nikolas Libert ● 25
Programa com display de 7 segmentos.

 Cronômetro com display de 7 segmentos (parte 3).


// Desloca todos os bits do código para a direita. O bit0
// corresponde agora ao próximo bit que será transmitido.
CodigoAtual = CodigoAtual >> 1;

ContadorSerial = ContadorSerial + 1; // Foi enviado +1 bit!


}
ContadorSerial = 0;

GPIO = GPIO & 0b11101111; // Baixa clock.


GPIO = GPIO | 0b00010000; // Levanta clock.

ContadorSegundos = ContadorSegundos + 1; // Incrementa segundos


if (ContadorSegundos == 10){ // Chegou em 10?
ContadorSegundos = 0; // Então zera a contagem.
}
Delay_ms(1000); // Espera 1 segundo.
}
}

DAELT ● Nikolas Libert ● 26


Quatro botões + display de 7 segmentos

 Adicione 4 botões ao circuito anterior (Bto0, 1, 2 e 3).


– Se o botão N for pressionado, o número N deverá
aparecer no display.
– Atualize o circuito e o código. Será necessário utilizar o
multiplexador 74HC151.
– GP0 e GP1 → saída para seleção de canal do
multiplexador (S0 e S1).
– GP2 → entrada com sinal de 1
dos botões (Y)
5V
Vcc Gnd
1 8
12F675

GP5 GP0
2 7
10k

GP4 GP1
3 6
MCLR GP2
4 5

DAELT ● Nikolas Libert ● 27


Quatro botões + display de 7 segmentos
 Hardware:
– Conecte um botão (pode ser só um fio) com um resistor de
pull-down nas entradas I0 a I3 do mux.
– Aterre a entrada S2 (só serão usados os canais I0 a I3).
– Conecte GP0, GP1 e GP2 em S0, S1 e Y, respectivamente.
 Firmware:
– Configure os pinos corretamente
como entrada ou saída.
– Crie um loop (while) que conte de 0 a 3.
– Dentro do loop atualize GP0 e GP1
(S0 e S1), selecionando um dos
canais (I0 a I3).

DAELT ● Nikolas Libert ● 28


Quatro botões + display de 7 segmentos

 Firmware:
– Em cada passo do loop, um dos 4 botões poderá ser
lido da saída do multiplexador, pelo pino GP2.
– Se você detectar que o botão foi pressionado, atualize
o display com o número correto.
– Pode ser necessário um delay de uns 5ms para
debounce depois da atualização.

DAELT ● Nikolas Libert ● 29


Referências

 WILMSHURST, TIM Designing Embedded Systems


with PIC Microcontrollers, 2nd ed., Newnes, Oxford.
 MICROCHIP Datasheet PIC 12F675.

DAELT ● Nikolas Libert ● 30

Você também pode gostar