introdução ao microcontrolador pic
TRANSCRIPT
Introdução ao Microcontrolador PICIntrodução ao Microcontrolador PIC
Nikolas Libert
Aula 11
Eletrônica Digital ET52CTecnologia em Automação Industrial
DAELT ● Nikolas Libert ● 2
Memórias
Memórias Núcleodo μC
Memóriade dados
Memóriade 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 ● 3
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).
Núcleodo μC
Memóriade dados
Memóriade código
DAELT ● Nikolas Libert ● 4
Arquiteturas de Acesso à Memória
Arquiteturas de Acesso à Memória
Núcleodo μC
Memóriade dados
Memóriade código
ADDR
DATA
Núcleodo μC
Memóriade dados
Memóriade código
ADDR
DATA
ADDR
DATA
Von Neumman HarvardBarramentos compartilhados para
todas as memórias.Barramentos separados para
cada memória.
DAELT ● Nikolas Libert ● 5
Microcontrolador Genérico
Microcontrolador Genérico
Tudo num único CI:
– Núcleo com UnidadeLógica e Aritmética.
– Memórias.
– Pinos disponíveispara o usuário.
– Periféricos.
– Circuito de Clock.
DAELT ● Nikolas Libert ● 6
Famílias de Microcontroladores
Famílias de Microcontroladores
Núcleo A Memória
Periféricos
Núcleo AMemória
Periféricos
Núcleo A Memória
Periféricos
Fabricantes dividem seus modelos de μC em famílias.– Todos μC numa família possuem o mesmo núcleo.
NúcleoB
Memória
Periféricos
NúcleoB
Memória
Periféricos
NúcleoB
Memória
Periféricos
Núcleo C
Memória Periféricos
Núcleo C
Memória Periféricos
Núcleo C
Memória Periféricos
Família 1 Família 2 Família 3
DAELT ● Nikolas Libert ● 7
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”.
Família Exemplosde modelos
Tamanho dasinstruções
Tamanhoda pilha
Número deinstruções
Vetores deinterrupção
Base line
Mid Range
HighPerformance
12 bits
14 bits
16 bits
10F200, 12F508,16F57
12F675, 16F84A16F631, 16F873A
18F242,18F2420
2
8
32
33
35
75
nenhum
1
2, comprioridade
DAELT ● Nikolas Libert ● 8
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 ● 9
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 ● 11
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
(...)0b11 0000 1010 10100b11 1001 0000 1111
(...)
Memória de Código
(...)Word NWord N+1
(...)
Estado de W (após instrução)
0b???? ????0b1010 10100b0000 1010(...)
Operação
(...)W = 0b1010 1010W = W . 0b0000 1111
(...)
Posição Conteúdo
DAELT ● Nikolas Libert ● 12
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 ● 15
PIC12F675
Cada periférico está associado a um endereço na memória de dados.
– Ex.: Os pinos de saída são controladospelo registrador GPIO, no endereço 0x05.
– Ao escrever em um dos bits do registradorGPIO (General Purpose Input Output), umpino correspondente vai para nível lógico alto ou baixo.
DAELT ● Nikolas Libert ● 16
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 ● 17
Criando um projeto no MikroC
Criando um projeto no MikroC
– Clique em “Project → New Project...”
DAELT ● Nikolas Libert ● 18
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 ● 19
Criando um projeto no MikroC
Avance até esta tela, e faça as opções mostradas abaixo:
DAELT ● Nikolas Libert ● 20
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 ● 21
Criando um projeto no MikroC
Compile clicando em “Build → Build”.
Não devem haver erros na tela de mensagens
DAELT ● Nikolas Libert ● 22
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 ● 23
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.
12F
675
Vcc
GP5
GP4
MCLR
Gnd
GP0
GP1
GP2
1
4
3
2
8
5
6
7
5V
74HC
5 95
Q6
1
15
Q5
Q4
Q3
Q2
Q1
Q0
6
2
3
4
5
Vcc
MR
DS
SHCP
STCP
OE
Gnd13
8
16
12
11
14
10
5V
10k
a
b
c
d
e
f
g
a
b
ce
f
g
d
5V
DAELT ● Nikolas Libert ● 24
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 ● 25
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 ● 26
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 ● 27
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 1dos botões (Y)
12F
675
Vcc
GP5
GP4
MCLR
Gnd
GP0
GP1
GP2
1
4
3
2
8
5
6
7
5V
10k
DAELT ● Nikolas Libert ● 28
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 corretamentecomo 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 doscanais (I0 a I3).
DAELT ● Nikolas Libert ● 29
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.