You are on page 1of 54

Dicas & Truques de

otimização de Pinos e
Software com MCUs
Microchip
(TPS)

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 1


O que esperar desta aula...

Idéias

Dicas

Truques
Interatividade!!!
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 2
Agenda

Dicas e Truques de
Hardware
Dicas e Truques de
Software em
Assembly
Dicas e Truques de
Software em C (Hi-
Tech)
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 3
Famílias de 8 e 14 pinos
Microchip
MCUs de Alto desempenho
DC a 20 MHz (em breve até 32MHz!!)
8 níveis de pilha

Memória de programa FLASH


Reprogramáveis
Capacidade de gravação In-Circuit (ICSP™)
Breve – Self-Programming!!

Baixo consumo de corrente


Operação em baixa tensão com capacidade de escrita
em EEPROM em todo o range (2V-5.5V)
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 4
Dicas e Truques com Hardware

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 5


Multiplexação de I/Os
Exemplo - 6 LEDs em 3 pinos de I/O
GPIO LEDs
0 1 2 1 2 3 4 5 6
Nº LEDs = nº I/Os * (nº I/Os - 1) (1)
0 0 0 0 0 0 0 0 0
3V 0 1 Z 1 0 0 0 0 0
1 0 Z 0 1 0 0 0 0
Z 0 1 0 0 1 0 0 0
GP0 Z 1 0 0 0 0 1 0 0
5 6 0 Z 1 0 0 0 0 1 0
1 2 1 Z 0 0 0 0 0 0 1
GP1 0 0 1 0 0 1 0 1 0
0 1 0 1 0 0 1 0 0
GP2 3 4 0 1 1 1 0 0 0 1 0
1 0 0 0 1 0 0 0 1
1 0 1 0 1 1 0 0 0
PIC12F6XX
1 1 0 0 0 0 1 0 1
1 1 1 0 0 0 0 0 0
Nota 1: nº LEDs também limitado pelo IOL, IOH de cada pino e
máxima corrente do item.
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 6
Ler 3 estados em 1 pino

5v
Lendo estado Z
Pino como saída em 1 Pin 1
PIC® MCU
Muda para entrada I/O
Lê 1
Pin 0
Muda para saída em 0
Muda para entrada 0v
Lê 0
Lendo estado 0 estado Pino 0 Pino 1
Lê 0 na entrada 0 curto aberto
1 aberto curto
Lendo estado 1 Z aberto aberto
Lê 1 na entrada

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 7


Teclado 4x4 em uma
entrada
Resistores configurados para tensões únicas
VDD
Usar o A/D para medir a tensão do botão

Obs.: necessário tolerâncias 1%

PIC12F6XX

GP0/AN0

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 8


Multiplexando teclas e DIP Switches
GP0
GP1
quando GP4=1 e
não há teclas GP2
pressionadas, lê GP3
DIP Switch GP4
(p.Ex.: ID de
placa)
VDD
Quando GP4=0,
lê teclas

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 9


Lendo 4 chaves com um
comparador e dois pinos
Configurar CVref para verificar cada nível
válido
Chavear entrada para ler segundo par

VDD
PIC16F630

COUT

CVref

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 10


Usando o comparador interno
como Amp Op
R3 e C2 – filtro passa baixa. Fcorte = 2*Fsinal
R1 e R2 – circuito de ganho
Para calcular C1 e C2: Fcorte = 1
2*pi*R3*C2

Fcorte = 1
Entrada R3 Saída
2*pi*(R1 || R2)*C1
R2

R1
C2 Ganho = R1+R2
C1 R2

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 11


Usando o comparador interno
como Amp Op
Pode ser configurado como inversor
R1 e R2 – circuito de ganho
Cálculo de C1 e C2 é o mesmo:
Fcorte = 1 Fcorte = 1
Vdd
2*pi*R3*C2
2*pi*(R1 || R2)*C1
R
R Saída
R2
R3
Entrada
Ganho = R1
R1 C2 R2
C1

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 12


Criando histerese entre
entradas do comparador
Realimentação (R3) cria histerese
Evita de comparador “oscilar”

Vmed = Vdd*Vtl Vmed = Vdd*R2


Vdd–Vth+Vtl
R1+R2
Entrada Saída
Req = R1*R2
R2
R1+R2

R3
R3 = Req* [( Vth-Vtl
Vdd ) -1 ]
R1

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 13


Amostrando sinais muito
rápidos
Circuito “one-shot”
Tpulse = R2*C1*ln(Vth/Vtl)
Transforma glitches 4
e sinais curtos, em
sinais mais longos C1 Vdd
para amostragem R1
R2
Calcular histerese Vdd
para ficar pouco Saída
abaixo de 0.7V R3

Com glitch, saida Entrada


R4
do comparador =1 e C2
carrega C1 R5

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 14


Alimentação e dados em 1 pino
Dados em uma única direção
Transistor “puxa” linha de dados para 0 com
GPIO do transmissor
Capacitor estabiliza VDD quando linha de
dados está em 0 VDD - 0.7V
VDD VDD

Receptor Transmissor

GP0 GP0

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 15


Gerando tensões mais altas que Vdd

CLKOUT gera frequência para o charge


pump
Baixo custo
Número mínimo de componentes

VDD

Vout max = (2 * VDD) - (2 * Vdiodo)


CLKOUT

Cpump
Cfiltro
PIC12F6XX
w/ RC
CLKOUT

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 16


Circuito de Auto-Desligamento
(vulgo “PIC suicida”)
Funcionamento:
Pressionando botão liga PIC® MCU
Ao executar SLEEP desliga PIC MCU (se suicida…)
Baixo custo(usa FET canal N)
Confiável
Nenhum I/O adicional requerido

VDD VBAT
VDD

VDD

CLKOUT

PIC12F6XX
VDD

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 17


Limitador de corrente inteligente
usando A/D
Controle de motor e fontes podem
precisar de limitadores de corrente
Controle inteligente pode ser usado
para:
Corrente In-rush
Limitação de corrente
Proteção de sobre-corrente
circuit breaker inteligente
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 18
Usando o A/D do PICmicro®
MCU A/D para limitador de
corrente inteligente

Detecta corrente em
Rsense PIC12F6XX

Capacitor de filtro Carga ou Motor


10K
opcional AN0
Diversos níveis de
Rsense
resposta de sobre-
corrente podem ser
criados por software

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 19


Lendo sensor analógico
sem ter A/D (vulgo “A/D de
pobre”)

1. Método de temporização RC com resistor


de referência

2. Criando A/D delta-sigma

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 20


“A/D de pobre”

1. Método de temporização RC:


Vc(t)
R1
Resposta ao degrau simples em RC R2

Vc(t) = VDD * (1 - e -t/(RC))


Vth

t = -RC ln(1 - Vth/VDD)

Vth/VDD é constante
t=0 t = t1 t = t2
R2 = (t2/t1) * R1 Time

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 21


“A/D de pobre”

Do Data Sheet do PIC12F508:


Qual pino deve ser escolhido? TTL ou Schmitt
Trigger?

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 22


“A/D de pobre”
1. Método de temporização RC
1. configura GP1 e GP2 como
entradas, e
GP0 para saída em 0 para
PIC12F6XX
descarregar C.
Rref 2. configura GP0 como entrada e
GP2 GP1 para saída em 1.
Rsen 3. Medir tRsen (GP0 muda para 1).
GP1 4. Repetir passo 1.
5. Configura GP0 para entrada e
GP0
GP2 para saída em nível 1.
6. Medir tRref (GP0 muda para 1).
7. Capacitor de filme de propileno!
8. Rsen = tRsen x Rref
tRref

alternativa: comparador de tensão no PIC12F6XX


© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 23
Conversor Delta-Sigma

1. Tensão média em GP1 = CVref


2. Base de tempo será taxa de
amostragem PIC12F6XX
3. No fim de cada período: Software
CVref fecha o
-Se GP1 > CVref, GP2 =0. circuito
- Se GP1 < CVref, GP2=1. COUT
GP1
Vin

GP2

4. Acumula as saídas de GP2 em diversas


amostras.
5. Número de amostras determina a
resolução do A/D.
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 24
Conversor Delta-Sigma

Pros: Contras:
Alta resolução Requer bloco de
Boa imunidade a ruído firmware
Facilmente escalonável Conversão lenta
e offset configurável, Quanto mais bits, mais
mesmo muito acima de lenta
VDD e abaixo do VSS Precisão absoluta
Linear e monotônico requer fonte estável
por natureza
Requer poucos
componentes externos
(2 R’s & 1 C)

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 25


Ler sensor com resolução
maior
Usado para ajustar dinamicamente o range de
leitura.
PIC12F6XX
100K
GP2 1. Resistores de 10K e 100K usados
10K
para ajustar o range
2. Configura pino para resistor
GP1
escolhido como saída em ‘1’, outros
AN0 (A/D) como entradas.
3. Vref para A/D = VDD.
Rsen
4. Calculo de Rsen independente de
VDD.
5. Count = Rsen/(Rsen+Rref) x 255
6. Não esqueça de configurar o
tempo de aquisição do A/D
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 26
Dicas Gerais de otimização de
consumo

• Controlar desligamento de circuitos externos


• Se tiver disponibilidade de pinos, alimentar circuitos externos
pelos I/Os
• Quando não estiver em uso, desligar circuitos externos para
minimizar consumo

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 27


Dicas Gerais de otimização de
consumo

• Calcular consumo mínimo


• Permite fazer estimativa de vida útil de bateria
• Informações necessárias no Data Sheet
• Basta multiplicar o tempo que passa em cada estado de
consumo a cada loop de aplicação. Ex: para o circuito anterior:

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 28


Dicas Gerais de otimização de
consumo
Modo Tempo em modo Corrente
Sleep 1990 ms 50uA
Mcu sleep 0
Sensor desligado 0
Eeprom desligada
Amostra sensor 1 ms
MCU ligado 48uA
Sensor ligado 16,5 uA
EEPROM desligada 0
Processando 1ms
MCU ligado 48uA
Sensor desligado 0
EEPROM desligada 0
Armazenando 8ms
MCU ligado 48uA
Sensor desligado 0
EEPROM ligada 1mA

Imed = [(0.199*50u)+(0.001
*64.5u)+(0.001*48u)+(0.008*1048u)]/2 = 9.22uA
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 29
Dicas Gerais de otimização de
consumo

• Pinos não usados:


• se flutuante, deixar como saída alta ou baixa.
• Senão, deixar como entrada, com pull-up de alto
valor (+/- 10k) para terra ou Vdd
• Modo de menor consumo: entrada analógica
• Buffers de corrente estão desligados
• Usar, sempre que possível, níveis mais baixos de Vdd
• Perda nos transistores é menor
• Chaveamento de clock
• Itens mais novos (ex: PIC12F635) permitem chaveamento de
clock em operação
• Registrador OSCCON
• Manter em frequência alta apenas quando desempenho é
necessário
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 30
Dicas Gerais de otimização de
consumo

• Chaveamento de clock
• Itens mais novos (ex: PIC12F635) permitem chaveamento de
clock em operação
• Registrador OSCCON
• Manter em frequência alta apenas quando desempenho é
necessário
• Em micros que não tenham esse recurso:

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 31


Oscilador RC dual-speed
1. Após Reset, os pinos de I/O estão em
Alta impedância (a baixa frequência)
2. configurar o pino em saída alta no I/O
3. R1, R2 e C determinam Fosc
4. Funciona também com capacitores
adicionais
+5V PIC12F6XX
R1 R2
GP0

OSC1
C

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 32


Oscilador RC dual-speed

Freq = 2.1 MHz


Duty Cycle = 91%

Freq = 4.3 MHz


Duty Cycle = 90%

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 33


Dicas Gerais de otimização de
consumo

• Ultra Low Power Wake Up


• Micros mais novos (ex PIC12F635) possuem ULPWU
• Fonte de corrente e comparador permitem que um simples
capacitor externo acorde o micro de tempos em tempos
• Consome menos do que WDT

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 34


Dicas e truques com software

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 35


Técnicas de Delay

Usar GOTO “next instruction” ao invés de 2 NOPs.


Usar CALL Rtrn no lugar de 4 NOPs (aonde “Rtrn” é
o label de saída de subrotina).

NOP
NOP ;2 instructions, 2 cycles

GOTO $+1 ;1 instruction, 2 cycles

CALL Rtrn ;1 instruction, 4 cycles


...
Rtrn RETURN

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 36


Otimizando o Destino

Bit de destino define W ou F para resultado


observe a movimentação dos dados e
reestruture
Exemplo: A + B => A

MOVF A,W MOVF B,W


ADDWF B,W ADDWF A,F
MOVWF A

3 instruções 2 instruções

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 37


Otimizando chamadas de funções

Substitua uma instrução CALL seguida imediatamente por um


RETURN por uma instrução GOTO

...
CALL Subroutine ; 2 instruções, 4 ciclos
RETURN

...
GOTO Subroutine ; 1 instrução, 2 ciclos

Subroutine ... ; Faz algo


RETURN

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 38


Trocar dados entre W e F

A macro abaixo troca os valores de W com REG


sem usar um segundo registrador
0x55
SWAP MACRO REG inicialmente
XORWF REG,F W = 1010 1010
XORWF REG,W REG = 0101 0101
XORWF REG,F
0101 0101
ENDM
1111 1111 (REG)
1010 1010
0101 0101 (W)
Usa: 0 registradores TEMP 1111 1111
3 Instruções 1010 1010 (REG)
3 Tcy
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 39
Rotação de bits usando Carry

Rotacione um byte pelo Carry sem usar RAM para


contagem de loop:

Facilmente adaptado para protocolos seriais.


O bit de carry é setado uma vez no início da
rotação
Bit de carry é limpo(exceto no último ciclo) e
o ciclo se repete até o bit zero indicar o fim.

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 40


Rotação de bits usando Carry
C 7 0
1 1 0 1 0 1 0 1 0

1 0 1 0 1 0 1 0 1
1ª Rotação

0 1 0 1 0 1 0 1 0
2ª Rotação

Rotação final
1 0 0 0 0 0 0 0 0
Z=1

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 41


Dicas para otimização em C –
Compilador Hi-Tech PICC10/12/16

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 42


Dicas Gerais de otimização em C

• Movimentar variáveis do mesmo banco juntos


• Verificar ordem da declaração das variáveis – o compilador tenta
alocar as variáveis em ordem (banco0, banco1, banco 2...)
• Sempre tentar usar aritmética com bytes em
vez de words
• Uso de ponteiros para os elementos de um
array é mais eficiente do que usar o índice
• Considerando char *p e char array[100]
• p = array;
• array[i]=valor;
• *p = valor; • Melhor do que
• i++;
• p++; • Melhor do que
• Obs: Válido para grandes loops apenas!!

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 43


Dicas Gerais de otimização em C

• Em alguns casos, uma série de if- else if


gera código mais otimizado do que um
switch-case
• Procurar sempre usar constantes sequenciais
(sem saltos) em switch-case
• Sempre dar preferência a incrementar,
decrementar e limpar variáveis (atribuir valores
usam 2 instruções assembly)

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 44


Dicas Gerais de otimização em C
• Existe um overhead para chamadas de
funções
• Vale mais a pena trocar chamadas a
funções pequenas por macros
• Por outro lado, blocos grandes de código
duplicado devem ser trocados por funções
• Evitar variáveis Signed!!
Sempre revisar o código já escrito
• muitas vezes, o código já foi tão modificado
que as otimizações anteriores não valem
mais a pena

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 45


Dicas de otimização em C

• Dois modos diferentes de executar loops:


• for(i=0;i<250;i++) do_func(); /* executa do_func()
250 vezes */
• for(i=250;i!=0;i--) do_func(); /* executa do_func()
250 vezes */

• Qual dos dois trechos


gera menos código, e é
executado mais rápido?
E porque?

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 46


Dicas de otimização em C
• Dois modos diferentes de executar loops:
• for(i=0;i<250;i++) do_func(); /* executa do_func() 250
vezes, em 3.25 ms */
• 1617 01B8 clrf 0x38
1618 260F call 0x60F
1619 0AB8 incf 0x38
161A 3008 movlw 0xFA
161B 0238 subwf 0x38,W
161C 1C03 btfss 0x3,0x0
161D 2E18 goto 0x618

• for(i=250;i!=0;i--) do_func(); /* executa do_func() 250


vezes , em 2.5 ms*/
• 1621 3008 movlw 0xFA• Certa a resposta!!
1622 00B8 movwf 0x38
1623 260F call 0x60F
1624 0BB8 decfsz 0x38
1625 2E23 goto 0x623

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 47


Dicas Gerais de otimização em C
• Loops de timeout
• Para loops longos (>256 repetições):
• unsigned int timeout;
#define hibyte(x) ((unsigned char)(x>>8))
#define lobyte(x) ((unsigned char)(x&0xff))

• //modo mais lento e “gordo”


• for(timeout=20000;timeout!=0;timeout--) do_func(); //320011
ciclos |

• //modo mais “enxuto”


• timeout=(20000/0x100)*0x100; /* mantém lobyte(timeout)==0,
mais rápido de atribuir valor */
for(;hibyte(timeout)!=0;timeout--) do_func(); //295704 ciclos

• Conclusão:
• Teste apenas o Byte mais significativo de um loop
com contador de 16 bits
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 48
Dicas Gerais de otimização em C
• Loops de timeout
• Mas sempre que possível, usar os timers do pic para
timeout:

• //set up tmr0 to set flag T0IF high when it rolls over


• while(RA0==0 && !T0IF); //wait until port goes high

• Rápido, enxuto e preciso!!


© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 49
Dicas Gerais de otimização em C
• Switch-Case:
//lento e ineficiente //rápido e eficiente
c=getch(); c=getch();
switch(c) switch(c)
{ {
case 'A': case 0:
{ {
do_something(); do something();
break; break;
} case 'H': } case 1:
{ {
do_something(); do something();
break; break;
} }
case 'Z': case 2:
{ {
do_something(); do something();
break; break;
} }
} }

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 50


Dicas Gerais de otimização em C
• Multiplicação em C:
• No Hi-Tech, qualquer divisão matemática usa de 13 a 23 bytes do banco
0, além de bom trecho de código
Occorrência Uso de RAM/ Uso Correção
de ROM / flash
Qualquer multiplicação matemática 23 bytes no banco Usar combinação de bit shifts,
usando variáveis ‘long’, mesmo que zero 0large, tem que ex:
nem todas estejam no banco 0. incluir rotinas ldiv x=x*6 substituido por
x1=x;
x2=x;
x=x1<<2 + x2<<1

Qualquer multiplicação matemática 13 bytes no banco 0, Usar combinação de bit shifts


usando variáveis unsigned int’, mesmo tem que incluir
que nem todas estejam no banco 0. rotinas ldiv

Qualquer divisão envolvendo potências Pouco uso de Usar combinação de bit shifts
de 2, ex: x=x/64; recursos

Qualquer divisão envolvendo divisores Alto uso de recursos Procurar fazer com que o
que não são potência de 2, ex: x=x/65; divisor seja potência de 2, ex:
2^5=32.
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 51
Referências
AN512 - Implementing
Ohmmeter/Temperature Sensor
AN611 - Resistance and Capacitance Meter
Using a PIC16C622
AN683 - A Comparator Based Slope ADC
AN700 – Make a Delta-Sigma Converter
Using a Microcontroller'
s Analog
Comparator Module
Tips and Tricks Booklet
LCD PICmicro MCU Tips 'n Tricks

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 52


BREAK
Dúvidas?

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 53


A Equipe Microchip Brasil
agradece a sua presença!

© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 54

You might also like