Introdução ao Microcontrolador PIC Nikolas Libert Aula 11 Eletrônica Digital ET52C Tecnologia em Automação Industrial
Memórias Memórias Memória de dados Núcleo do μc Memória 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 de dados Núcleo do μc Memória de código DAELT Nikolas Libert 3
Arquiteturas de Acesso à Memória Arquiteturas de Acesso à Memória Memória de dados DATA ADDR Memória de dados Núcleo do μc ADDR DATA Núcleo do μc Memória de código ADDR DATA Memória de código Von Neumman Barramentos compartilhados para todas as memórias. Harvard Barramentos separados para 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 Periféricos Memória Núcleo B Memória Periféricos Núcleo C Memória Periféricos Núcleo A Periféricos Memória Núcleo B Memória Periféricos Núcleo C Memória Periféricos Núcleo A Periféricos Memória Núcleo B Memória Periféricos Núcleo C Memória 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. Família Exemplos de modelos Tamanho das instruções Tamanho da pilha Número de instruções Vetores de interrupção Base line 10F200, 12F508, 16F57 12 bits 2 33 nenhum Mid Range 12F675, 16F84A 16F631, 16F873A 14 bits 8 35 1 High Performance 18F242, 18F2420 16 bits 32 75 2, com 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 V DD ). 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 Posição Conteúdo (...) (...) Word N 0b11 0000 1010 1010 Word N+1 0b11 1001 0000 1111 (...) (...) Operação (...) W = 0b1010 1010 W = W. 0b0000 1111 (...) Estado de W (após instrução) 0b???????? 0b1010 1010 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 74HC595 12F675 Controlando um display de 7 segmentos. e f 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 d g a c b a b c d e f g Q 6 Q 5 Q 4 Q 3 Q 2 Q 1 Q 0 6 5 4 3 2 1 15 16 10 14 11 12 13 8 Vcc MR DS SHCP STCP OE Gnd 5V 5V 10k Vcc GP5 GP4 MCLR 1 2 3 4 8 7 6 5 Gnd GP0 GP1 GP2 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 12F675 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 10k Vcc GP5 GP4 MCLR 1 2 3 4 8 7 6 5 Gnd GP0 GP1 GP2 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