Página 1 de 1

encolher codigo no ccs

MensagemEnviado: 24 Abr 2008 21:47
por cristian
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); //

MensagemEnviado: 24 Abr 2008 22:48
por RobL
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 ?!!!

MensagemEnviado: 25 Abr 2008 05:58
por wmtorres
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

MensagemEnviado: 25 Abr 2008 07:18
por cristian
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 ?

MensagemEnviado: 25 Abr 2008 07:39
por andre_luis
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.

+++

MensagemEnviado: 25 Abr 2008 08:44
por xultz
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).

MensagemEnviado: 25 Abr 2008 09:23
por ze
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ç

MensagemEnviado: 25 Abr 2008 09:47
por andre_luis
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().

+++