Página 1 de 1

Tamanho de variáveis no PIC18f452

MensagemEnviado: 01 Abr 2011 14:57
por paivadaniel
int a = 20;
int b = 20;
double c;

c = a*b;
printf ("%lf\n", c);


Copiei um trecho de código que estou implementando no pic18f452, compilando no ccs. Afinal, não consigo representar esse número no PIC e consigo no Dev C++ devido ao mcu ser de 8 bits?

Qual a saída para isso?

MensagemEnviado: 02 Abr 2011 04:22
por marquim
Dá uma olhada na página 44 do manual de referência do compilador. O tipo double não existe no CCS, embora a palavra seja reservada. Experimente usar o tipo float.

Esquece o lance dos 8 bits. O tipo float, por exemplo, tem 32 bits e é suportado pelo compilador. Se você estivesse trabalhando em assembly, sim, isso talvez fosse motivo para esquentar a cuca.

PS: Lembre-se de usar %f ou %g no printf. A diferença entre os dois você vai encontrar no manual de referência também.

Abraçolis!

MensagemEnviado: 03 Abr 2011 09:27
por Leo Kenobi
Outro conselho: algumas vezes o CCS não consegue fazer um cálculo sem explicitar o formato.

No seu caso a multiplicação 20*20=400 não caberá numa variável int (8 bits = 255 máx.), mas o resultado ainda é um inteiro, só que de 16 bits (16 bits = 65.535 máx).

Sendo assim você pode usar uma variável tipo int16 ou long (os dois funcionam no CCS).

Entetanto, devido a essa necessidade de explicitar o tipo para o CCS, seu programa ficaria assim:

int a = 20;
int b = 20;
int16 c;

c = (int16)a * (int16)b;

O (int16) indica para o compilador para tratar as variáveis no cálculo como se fosse variáveis de 16 bits, embora elas continuem sendo variáveis de 8 bits.

O porque isso ocorre no CCS não sei ao certo, mas depois de muito penar com cálculos nele uso sempre essa técnica.

E aproveitando, usar ponto flutuante nos 18F toma muita memória e é lento pra calcular, só usa se não tiver jeito mesmo.

Abraço a todos.
Leo