introdução ao microcontrolador pic

30
Introdução ao Microcontrolador PIC Introdução ao Microcontrolador PIC Nikolas Libert Aula 11 Eletrônica Digital ET52C Tecnologia em Automação Industrial

Upload: khangminh22

Post on 17-Jan-2023

1 views

Category:

Documents


0 download

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 ● 10

PIC12F675

Parte da tabela de instruções.

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 ● 13

PIC12F675

Estrutura Interna

DAELT ● Nikolas Libert ● 14

PIC12F675

Memória

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.

DAELT ● Nikolas Libert ● 30

Referências

WILMSHURST, TIM Designing Embedded Systems with PIC Microcontrollers, 2nd ed., Newnes, Oxford.

MICROCHIP Datasheet PIC 12F675.