Upload
nando
View
545
Download
3
Embed Size (px)
DESCRIPTION
Famílias de 8 e 14 pinosMicrochip MCUs de Alto desempenhoDC a 20 MHz (em breve até 32MHz!!) 8 níveis de pilhaMemó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 escritaem EEPROM em todo o range (2V-5.5V
Citation preview
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 1
Dicas & Truques de otimização de Pinos e Software com MCUs
Microchip
(TPS)
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 2
O que esperar desta aula...
InteratividadeInteratividade!!!!!!
IdIdééiasias
TruquesTruques
DicasDicas
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 3
Agenda
� Dicas e Truques de Hardware
� Dicas e Truques de Software emAssembly
� Dicas e Truques de Software em C (Hi-Tech)
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 4
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 5
Dicas e Truques com Hardware
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 6
Multiplexação de I/Os
1 2
3 4
3V
GP0
GP1
GP2
PIC12F6XX
5 6
GPIO LEDs0 1 2 1 2 3 4 5 6
0 0 0 0 0 0 0 0 00 1 Z 1 0 0 0 0 01 0 Z 0 1 0 0 0 0Z 0 1 0 0 1 0 0 0Z 1 0 0 0 0 1 0 00 Z 1 0 0 0 0 1 01 Z 0 0 0 0 0 0 10 0 1 0 0 1 0 1 00 1 0 1 0 0 1 0 00 1 1 1 0 0 0 1 01 0 0 0 1 0 0 0 11 0 1 0 1 1 0 0 01 1 0 0 0 0 1 0 11 1 1 0 0 0 0 0 0
Exemplo - 6 LEDs em 3 pinos de I/O
Nº LEDs = nº I/Os * (nº I/Os - 1) (1)
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 7
PIC® MCUI/O
Ler 3 estados em 1 pino
� Lendo estado Z� Pino como saída em 1� Muda para entrada� Lê 1� Muda para saída em 0� Muda para entrada� Lê 0
� Lendo estado 0� Lê 0 na entrada
� Lendo estado 1� Lê 1 na entrada
estado Pino 0 Pino 1
0 curto aberto1 aberto curtoZ aberto aberto
5v
0v
Pin 1
Pin 0
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 8
Teclado 4x4 em uma entrada
GP0/AN0
PIC12F6XX
VDD
Resistores configurados para tensões únicas
Usar o A/D para medir a tensão do botão
Obs.: necessário tolerâncias 1%
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 9
Multiplexando teclas e DIP SwitchesMultiplexando teclas e DIP Switches
� quando GP4=1 e não há teclas pressionadas, lê DIP Switch (p.Ex.: ID de placa)
� Quando GP4=0, lê teclas
GP0
GP4
GP1
GP2
GP3
VDD
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 10
Lendo 4 chaves com um comparador e dois pinos
� Configurar CVref para verificar cada nível válido
� Chavear entrada para ler segundo par
CVref
PIC16F630
COUT
VDD
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 11
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:
SaídaEntrada
R1
R2
C1C2
R3
Fcorte = 12*pi*R3*C2
Fcorte = 12*pi*(R1 || R2)*C1
Ganho = R1+R2
R2
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 12
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:
Saída
Entrada
Vdd
RR
R1
R2R3
C1C2
Fcorte = 12*pi*R3*C2
Fcorte = 12*pi*(R1 || R2)*C1
Ganho = R1
R2
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 13
Criando histerese entre entradas do comparador
� Realimentação (R3) cria histerese� Evita de comparador “oscilar”
SaídaEntrada
R1
R2
R3
Vmed = Vdd*VtlVdd–Vth+Vtl
Vmed = Vdd*R2R1+R2
R3 = Req* Vdd -1Vth-Vtl
Req = R1*R2R1+R2
[( ) ]
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 14
Amostrando sinais muito rápidos
� Circuito “one-shot”� Transforma glitches
e sinais curtos, em sinais mais longos para amostragem
� Calcular histerese para ficar pouco abaixo de 0.7V
� Com glitch, saida do comparador =1 e carrega C1
Entrada
R1
R2
R4
Tpulse = R2*C1*ln(Vth/Vtl)4
Vdd
Vdd
R5
R3
C1
C2
Saída
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 15
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
GP0 GP0
TransmissorReceptor
VDD VDD
VDD - 0.7V
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 16
Gerando tensões mais altas que VddGerando tensões mais altas que Vdd
�� CLKOUT gera frequência para o charge CLKOUT gera frequência para o charge pumppump
�� Baixo custoBaixo custo�� NNúúmero mmero míínimo de componentesnimo de componentes
PIC12F6XXw/ RCCLKOUT
CLKOUTVout max = (2 * VDD) - (2 * Vdiodo)
CpumpCfiltro
VDD
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 17
Circuito de Auto-Desligamento(vulgo “PIC suicida”)
Funcionamento: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
PIC12F6XX
CLKOUT
VDD
VDD
VDD VBATVDD
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 18
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 19
Usando o A/D do PICmicro®
MCU A/D para limitador de corrente inteligente
� Detecta corrente em Rsense
� Capacitor de filtro opcional
� Diversos níveis de resposta de sobre-corrente podem ser criados por software
Rsense
10K Carga ou Motor
PIC12F6XX
AN0
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 20
1. Método de temporização RC com resistor de referência
2. Criando A/D delta-sigma
Lendo sensor analógico sem ter A/D (vulgo “A/D de
pobre”)
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 21
1. Método de temporização RC:
Resposta ao degrau simples em RC
Vc(t) = VDD * (1 - e -t/(RC))
t = -RC ln(1 - Vth/VDD)
Vth/VDD é constante
R2 = (t2/t1) * R1t = 0 t = t1
Vth
Vc(t)
Timet = t2
R1 R2
“A/D de pobre”
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 22
Do Data Sheet do PIC12F508:Qual pino deve ser escolhido? TTL ou Schmitt Trigger?
“A/D de pobre”
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 23
alternativa: comparador de tensão no PIC12F6XX
1. configura GP1 e GP2 como entradas, e
GP0 para saída em 0 para descarregar C.2. configura GP0 como entrada e GP1 para saída em 1.3. Medir tRsen (GP0 muda para 1).4. Repetir passo 1.5. Configura GP0 para entrada e GP2 para saída em nível 1.6. Medir tRref (GP0 muda para 1).7. Capacitor de filme de propileno!8. Rsen = x RreftRsen
tRref
Rref
RsenGP2
GP1
GP0
PIC12F6XX
1. Método de temporização RC
“A/D de pobre”
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 24
1. Tensão média em GP1 = CVref2. Base de tempo será taxa de amostragem3. No fim de cada período:
-Se GP1 > CVref, GP2 =0.- Se GP1 < CVref, GP2=1.
4. Acumula as saídas de GP2 em diversas amostras.5. Número de amostras determina a resolução do A/D.
PIC12F6XX
Vin
CVref
GP2
GP1COUT
Softwarefecha o circuito
Conversor Delta-Sigma
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 25
Conversor Delta-Sigma
� Pros:� Alta resolução� Boa imunidade a ruído� Facilmente escalonável
e offset configurável, mesmo muito acima de VDD e abaixo do VSS
� Linear e monotônico por natureza
� Requer poucos componentes externos (2 R’s & 1 C)
� Contras:� Requer bloco de
firmware� Conversão lenta� Quanto mais bits, mais
lenta� Precisão absoluta
requer fonte estável
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 26
10K
Rsen
GP2
GP1
AN0 (A/D)
PIC12F6XX100K
1. Resistores de 10K e 100K usados para ajustar o range2. Configura pino para resistor escolhido como saída em ‘1’, outros como entradas.3. Vref para A/D = VDD.4. Calculo de Rsen independente de VDD.5. Count = Rsen/(Rsen+Rref) x 2556. Não esqueça de configurar o tempo de aquisição do A/D
Usado para ajustar dinamicamente o range de leitura.
Ler sensor com resolução maior
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 27
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 28
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 29
Dicas Gerais de otimização de consumo
Modo Tempo em modo CorrenteSleepMcu sleepSensor desligadoEeprom desligada
1990 ms 50uA00
Amostra sensorMCU ligadoSensor ligadoEEPROM desligada
1 ms48uA16,5 uA0
ProcessandoMCU ligadoSensor desligado EEPROM desligada
1ms48uA00
ArmazenandoMCU ligadoSensor desligadoEEPROM ligada
8ms48uA01mA
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 30
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 31
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 32
Oscilador RC dual-speed
PIC12F6XX
GP0
OSC1
+5V
R1 R2
C
1. Ap1. Apóós Reset, os pinos de I/O estão em s Reset, os pinos de I/O estão em Alta impedância (a baixa frequência)Alta impedância (a baixa frequência)2. configurar o pino em sa2. configurar o pino em saíída alta no I/Oda alta no I/O3. R1, R2 e C determinam Fosc3. R1, R2 e C determinam Fosc4. Funciona tamb4. Funciona tambéém com capacitores m com capacitores adicionaisadicionais
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 33
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 34
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 35
Dicas e truques com software
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 36
NOPNOP ;2 instructions, 2 cycles
CALL Rtrn ;1 instruction, 4 cycles. . .
Rtrn RETURN
GOTO $+1 ;1 instruction, 2 cycles
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).
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 37
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 B,WADDWF A,F
2 instruções
MOVF A,WADDWF B,WMOVWF A
3 instruções
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 38
Otimizando chamadas de funções
Subroutine . . . ; Faz algoRETURN
. . .CALL Subroutine ; 2 instruções, 4 ciclosRETURN
. . .GOTO Subroutine ; 1 instrução, 2 ciclos
� Substitua uma instrução CALL seguida imediatamente por um RETURN por uma instrução GOTO
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 39
Trocar dados entre W e F
A macro abaixo troca os valores de W com REG sem usar um segundo registrador
SWAP MACRO REGXORWF REG,FXORWF REG,WXORWF REG,FENDM
Usa: 0 registradores TEMP3 Instruções3 Tcy
0x55inicialmenteW = 1010 1010REG = 0101 0101
0101 01011111 1111 (REG)1010 10100101 0101 (W)1111 11111010 1010 (REG)
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 40
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.
Rotação de bits usando Carry
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 41
Rotação de bits usando Carry
1
C
Z = 1
2ª Rotação
1ª Rotação
Rotação final
1 0 1 0 1 0 1 0
7 0
1 0 1 0 1 0 1 0
10 0 1 0 1 0 1 0
01 0 0 0 0 0 0 0
1
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 42
Dicas para otimização em C –Compilador Hi-Tech PICC10/12/16
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 43
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;
• *p = valor;
• p++;
• Obs: Válido para grandes loops apenas!!
• Melhor do que• array[i]=valor;
• i++;• Melhor do que
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 44
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 45
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 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 */
• 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 47
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 0x381618 260F call 0x60F1619 0AB8 incf 0x38161A 3008 movlw 0xFA161B 0238 subwf 0x38,W161C 1C03 btfss 0x3,0x0161D 2E18 goto 0x618
• for(i=250;i!=0;i--) do_func(); /* executa do_func() 250 vezes , em 2.5 ms*/
• 1621 3008 movlw 0xFA 1622 00B8 movwf 0x38 1623 260F call 0x60F 1624 0BB8 decfsz 0x381625 2E23 goto 0x623
• Certa a resposta!!
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 48
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 49
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 50
Dicas Gerais de otimização em C
• Switch-Case://lento e ineficientec=getch();switch(c){
case 'A':{
do_something();break;
} case 'H':{
do_something();break;
}case 'Z':{
do_something();break;
}}
//rápido e eficientec=getch();switch(c){
case 0:{
do something();break;
} case 1:{
do something();break;
}case 2:{
do something();break;
}}
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 51
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 de ROM / flash
Correção
Qualquer multiplicação matemática usando variáveis ‘long’, mesmo que nem todas estejam no banco 0.
23 bytes no banco zero 0large, tem que incluir rotinas ldiv
Usar combinação de bit shifts, ex: x=x*6 substituido por x1=x;x2=x;
x=x1<<2 + x2<<1
Qualquer multiplicação matemática usando variáveis unsigned int’, mesmo que nem todas estejam no banco 0.
13 bytes no banco 0, tem que incluir rotinas ldiv
Usar combinação de bit shifts
Qualquer divisão envolvendo potências de 2, ex: x=x/64;
Pouco uso de recursos
Usar combinação de bit shifts
Qualquer divisão envolvendo divisores que não são potência de 2, ex: x=x/65;
Alto uso de recursos Procurar fazer com que o divisor seja potência de 2, ex: 2^5=32.
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 52
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 53
BREAKDúvidas?
© 2009 Microchip Technology Incorporated. All Rights Reserved. Slide 54
A Equipe Microchip Brasil agradece a sua presença!