encolher codigo no ccs

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

encolher codigo no ccs

Mensagempor cristian » 24 Abr 2008 21:47

sera que so eu uso ccs????


fiz um codigo no ccs para o pic 16f877 mas o danado ja vai em 65% e nao estou nem na metade

estou usando muitos calculos pois faço leituras analogicas e comversoes de temperatura e posiçao de boias

valor=read_adc();
valor+=1;
val32=valor*4+((int32)valor*113)/128;

val32=(100-(val32/5))*130/10; //transforma em litros
auxval=val32;
aux1=(auxval*100/13)/100; //transforma em procentagem
autonomia=(val32*40)/100;

um dos calculos

tempo=60000000/tempo;
val32=tempo;
val32=val32/4;
val32=val32/2;

alguem teria uma dica pra reduzir o codigo ???

percebi q o q esta gastando muito sao as escritas no display

printf(nokia_printchar,"%LuKm\n\r",autonomia); //exibe autonomia
printf(nokia_printchar,"%2.2wV\n\r",val32); //
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor RobL » 24 Abr 2008 22:48

O assunto é amplo.
1- Depende do código.
2- Depende do compilador e setagem
3- C em PIC é um problema.
4- Conhecimento profundo do compilador
5- Muita prática em C.
6- Evitar usar funções prontas, sem seu conhecimento.

O melhor caminho em 8 bits para C são os AVRs. Nestes o C trabalha com excelente performance e só neles com melhor custo / benefício.
Aliás é um boa para ASM também.

Outra sugestão, é usar chamadas em asm para funções simples.
Mas o que a maioria faz é pegar um chip colossal e pronto.
Não há como, em um pgm com ADC, display em C não torrar mais de 50% sobre um ASM mesmo mal feito.

Conselho:
Quem quer competir no mercado, para produção em massa, em 8 bits, dificilmente poderá trabalhar em C.

Em muitas circustâncias, porém, C e ASM darão o melhor resultado em 8 bits e até em 32 bits, quando se necessitar maior eficiência de código.

Para trabalhos rápidos, poucas peças, sem ver custo, vai de C.

Em outras palavras, já imaginou desenvolver um programa para 1 milhão de relógios de pulso, de baixo preço, em um micro de 8 bits em C ?!!!
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor wmtorres » 25 Abr 2008 05:58

Porque vc não acessa os registradores do A/D diretamente no software, por exemplo o registrador ADRESH (A/D Result High Register) e o registrador ADRESL (A/D Result Low Register). Dessa forma vc não precisaria usar a função pronta do compilador.
Espero que isso lhe ajude
wmtorres
Bit
 
Mensagens: 13
Registrado em: 11 Out 2006 21:34
Localização: Brasil

Mensagempor cristian » 25 Abr 2008 07:18

estudando o codigo descobrir q nao sao as contas q consomen tanto assim mas as funçoes de escrever no lcd chegou a diminuir 25% do codigo

printf(nokia_printchar,"%LuKm\n\r",autonomia); //exibe autonomia


printf(nokia_printchar,"%2.2wV\n\r",val32); //

nesta ultima ele ja insere o ponto onde precisa entao pra mim é rapido alguem me diga como pegar o val32 é colocar o ponto no lugar certo e exibir no display sem gastar muito ?
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor andre_luis » 25 Abr 2008 07:39

Cristian,

Já dei essa dica em outro tópico...

Divisão por potencia de 2 economiza processamento.
Portanto, onde tiver :

40/100 , substitui por 51/128
13/100 , substitui por 17/128

Vai perder precisão ( precisamente 2,3% no pior caso ), mas vai aumentar a velocidade, uma vez que divisão por números potencia de 2, o compilador opera com deslocamento de bits.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor xultz » 25 Abr 2008 08:44

A função printf costuma ser meio monstruosa, porque ela é muito flexível. Eu sugeriria você fazer uma função semelhante, que faça somente do jeito que você precisa, tipo uma função para imprimir um texto passando um ponteiro e a quantidade de bytes, e outra para imprimir variáveis, e somente dos tipos que você usa (int8, int 32, etc).
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor ze » 25 Abr 2008 09:23

esqueça printf e ccs
+faça seu acesso ao hw customizado. printf é cavalar msm
+você não está setando 1 bit de porta com "função" sugerida pelo ccs, neah? pelamor!!
+tente hitech-c. Sem necessidade de chamar asm do c
=uso de mem. tende a ficar igual ao asm. (em minhas aventuras primordiais com asm, o hitech deixou até MENOR! desisti do asm)

ah, deixei algumas rotinas (99.99999% meu p.i.) de acesso a um display nokia aqui:
http://asm51.eng.br/phpBB/viewtopic.php?t=4975
se ainda estiver lá....
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor andre_luis » 25 Abr 2008 09:47

Outro problema da função printf(), é ela trabalha com um loop fechado, o que para textos longos e baud pequeno, acaba ´travando´ o uC enquanto a transmissão não for concluída.

O melhor a fazer é enviar caracter-por-caracter com putc().

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x