Você está na página 1de 30

Introduo ao Microcontrolador PIC

Nikolas Libert

Aula 11
Eletrnica Digital ET52C
Tecnologia em Automao Industrial

Memrias

Memrias

Memria
de dados

Ncleo
do C

Memria
de cdigo

Normalmente os microcontroladores possuem duas


memrias: de cdigo e de dados.
Memria de cdigo

Contm o firmware: sequncia de operaes que o


microcontrolador programado para executar.

No alterada em tempo de execuo (h excees).

No voltil: as informaes continuam gravadas mesmo


que haja desenergizao.

Tipos: ROM, EPROM, EEPROM, Flash.


DAELT Nikolas Libert

Memrias
Memria de dados

Contm informaes dinmicas: o estado atual de um


contador, o nmero que o usurio digitou numa
calculadora

voltil: h perda de informaes quando o circuito


desenergizado.

Tipos:

Esttica: formada por flip-flops.


Dinmica: informao guardada em capacitores
(memrias DDR de PCs).
Memria
de dados

Ncleo
do C
DAELT Nikolas Libert

Memria
de cdigo
3

Arquiteturas de Acesso Memria

Arquiteturas de Acesso Memria


Memria
de dados
Ncleo
do C

ADDR

DATA
ADDR

Memria
de dados

Ncleo
do C

DATA

Memria
de cdigo

ADDR
DATA

Memria
de cdigo

Von Neumman

Harvard

Barramentos compartilhados para


todas as memrias.

Barramentos separados para


cada memria.

DAELT Nikolas Libert

Microcontrolador Genrico

Microcontrolador Genrico
Tudo num nico CI:

Ncleo com Unidade


Lgica e Aritmtica.

Memrias.

Pinos disponveis
para o usurio.

Perifricos.

Circuito de Clock.

DAELT Nikolas Libert

Famlias de Microcontroladores

Famlias de Microcontroladores

Fabricantes dividem seus modelos de C em famlias.


Todos C numa famlia possuem o mesmo ncleo.

Famlia 1
Ncleo A Memria
Perifricos
Ncleo A
Perifricos

Memria

Ncleo A Memria
Perifricos

Famlia 2
Ncleo Memria
B
Perifricos
Ncleo
B

Memria
Perifricos

Famlia 3
Ncleo C
Memria Perifricos
Ncleo C
Memria Perifricos
Ncleo C

Ncleo
B

Memria
Perifricos

DAELT Nikolas Libert

Memria Perifricos
6

Famlias de Microcontroladores
PIC - Peripheral Interface Controller

Anos 70 C criados pela General Instruments.

Anos 90 PIC vendido para a Microchip.

4 prefixos so utilizados para nomear os C de 8 bits


da Microchip: 10, 12, 16, 18 (ex.: 12F675, 18F4520).
Pode-se dizer que existem 3 famlias: Base Line,
Mid Range e High Performance.
Famlia
Base line
Mid Range

Exemplos
de modelos
10F200, 12F508,
16F57
12F675, 16F84A
16F631, 16F873A

High
18F242,
Performance 18F2420

Tamanho das
instrues

Tamanho
da pilha

Nmero de
instrues

Vetores de
interrupo

12 bits

33

nenhum

14 bits

35

16 bits

32

75

2, com
prioridade

DAELT Nikolas Libert

PIC12F675

O PIC12F675
8 pinos

2 para alimentao.

6 para uso geral (um deles para reset / MCLR).

Pertence famlia Mid Range: 35 instrues.


Tenso de alimentao 2 a 5,5 V (pino VDD).
Clock de at 20 MHz Oscilador interno de 4MHz.

Executa uma instruo a cada 4 ciclos de clock.

1M instrues por segundo com oscilador interno.


DAELT Nikolas Libert

PIC12F675

O PIC12F675
Memria de programa:

Memria flash para 1024 comandos (words).


100000 escritas.

Memria de dados:

64 bytes de memria SRAM (voltil / flip-flops).

128 bytes de memria EEPROM (no voltil / 1000000


de escritas).

Conversor AD, 2 timers, um comparador, programao


in-circuit.
DAELT Nikolas Libert

PIC12F675
Parte da tabela de instrues.

DAELT Nikolas Libert

10

PIC12F675
Registrador W:

Memria de 8 bits presente no ncleo de todo C PIC.

Nas operaes lgicas, o valor em W usado como


operando e W pode armazenar o resultado.

Exemplo de Instruo
Memria de Cdigo
Posio
Contedo
(...)
(...)
0b11 0000 1010 1010
Word N
Word N+1 0b11 1001 0000 1111
(...)
(...)

Operao
(...)
W = 0b1010 1010
W = W . 0b0000 1111
(...)

DAELT Nikolas Libert

Estado de W
(aps instruo)
0b???? ????
0b1010 1010
0b0000 1010
(...)

11

PIC12F675
Status Register

Registrador (memria de 8 bits) que contm


informaes sobre a ltima operao realizada pela
ULA.

Bits de Carry e Borrow.

Bit de Zero: indica que ltima operao deu zero.

Instrues de desvio no fluxo do programa podem


se basear no estado desse bit.
Se dois nmero forem iguais, por exemplo, uma
subtrao entre eles dar zero.

DAELT Nikolas Libert

12

PIC12F675
Estrutura Interna

DAELT Nikolas Libert

13

PIC12F675
Memria

DAELT Nikolas Libert

14

PIC12F675
Cada perifrico est associado a um endereo na
memria de dados.

Ex.: Os pinos de sada so controlados


pelo registrador GPIO, no endereo 0x05.

Ao escrever em um dos bits do registrador


GPIO (General Purpose Input Output), um
pino correspondente vai para nvel lgico alto ou baixo.

DAELT Nikolas Libert

15

MikroC

O Compilador MikroC
Na prtica, no precisamos aprender as 35 instrues
do PIC12F675.
Podemos escrever o programa em linguagem C e um
compilador faz a converso para assembly (linguagem
de mquina).
Mas ainda precisamos conhecer os registradores do PIC
que afetam os perifricos que sero utilizados.

O Datasheet sempre indispensvel!

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 (no esquea de excluir ao terminar).
Configure o clock para 4 MHz (freq. oscilador interno).
Selecione a opo Open Edit Project window....

DAELT Nikolas Libert

18

Criando um projeto no MikroC


Avance at esta tela, e faa as opes 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 analgicos
CMCON = CMCON | 0b00000111; // Desabilita comparador
TRISIO = TRISIO & 0b11111011; // GP2->sada
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.

No 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 analgicos
CMCON = CMCON | 0b00000111; // Desabilita comparador
TRISIO = TRISIO & 0b11111011; // GP2->sada
TRISIO = TRISIO | 0b00000010; // GP1->entrada
EstadoBTO = GPIO & 0b00000010; // Grava o estado inicial de GP1.
while(1){
if(EstadoBTO != (GPIO & 0b00000010)){ // Houve mudana no pino?
EstadoBTO = EstadoBTO ^ 0b00000010; // Atualiza varivel.
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 sada.

Para controlar o display podemos utilizar um


registrador de deslocamento.

GP5 sada de dados.

GP4 sada de clock.


5V

g
c

e
d

6
5
4
3
2
1
15

16
10
14
11
12
13
8

Vcc
MR
DS
SHCP
STCP
OE
Gnd

DAELT Nikolas Libert

5V
Vcc
1
GP5
2
GP4
3
MCLR
4

12F675

Q6
Q5
Q4
Q3
Q2
Q1
Q0

74HC595

a
b
c
d
e
f
g

10k

5V
8
7
6
5

Gnd
GP0
GP1
GP2

23

Programa com display de 7 segmentos.


Cronmetro com display de 7 segmentos (parte 1).
void main() {
unsigned char ContadorSerial=0;
unsigned char ContadorSegundos=0;
unsigned char CodigoAtual;
// Definio dos dgitos para 7 segmentos. Considerando display
ando comum (nvel alto = LED apagado):
//
- Dgitos 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.


Cronmetro com display de 7 segmentos (parte 2).
// Pino GP5:transmisso dos dados em srie.
// Pino GP4:transmisso dos pulsos de clock.
TRISIO &= 0b11001111; // GP4 e GP5 configurados como sada.
ANSEL &= 0b11110000; // GP0, GP1, GP2 e GP4 como pinos digitais.
CMCON |= 0b00000111; // Desabilita comparador analgico.
while(1){ // Lao infinito
CodigoAtual = D7S[ContadorSegundos]; // Cdigo p/ LEDs display.
while (ContadorSerial < 7){ // Repete at transmitir os 7 bits.
GPIO = GPIO & 0b11101111; // Baixa clock.
// O bit0 do cdigo ser trasmitido pela serial (GP5).
//
- GP5 zerado.
//
- O bit0 do cdigo 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.


Cronmetro com display de 7 segmentos (parte 3).
// Desloca todos os bits do cdigo para a direita. O bit0
// corresponde agora ao prximo 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; // Ento zera a contagem.
}
Delay_ms(1000); // Espera 1 segundo.
}
}
DAELT Nikolas Libert

26

Quatro botes + display de 7 segmentos


Adicione 4 botes ao circuito anterior (Bto0, 1, 2 e 3).

Se o boto N for pressionado, o nmero N dever


aparecer no display.

Atualize o circuito e o cdigo. Ser necessrio utilizar o


multiplexador 74HC151.

GP0 e GP1 sada para seleo de canal do


multiplexador (S0 e S1).

GP2 entrada com sinal de 1


dos botes (Y)
Vcc
1
GP5
2
GP4
3
MCLR
4

12F675

10k

5V
8
7
6
5

Gnd
GP0
GP1
GP2
DAELT Nikolas Libert

27

Quatro botes + display de 7 segmentos


Hardware:

Conecte um boto (pode ser s um fio) com um resistor de


pull-down nas entradas I0 a I3 do mux.

Aterre a entrada S2 (s sero 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 sada.

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 botes + display de 7 segmentos


Firmware:

Em cada passo do loop, um dos 4 botes poder ser


lido da sada do multiplexador, pelo pino GP2.

Se voc detectar que o boto foi pressionado, atualize


o display com o nmero correto.

Pode ser necessrio um delay de uns 5ms para


debounce depois da atualizao.

DAELT Nikolas Libert

29

Referncias
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