Página 1 de 1

BUG no MAKE32?

MensagemEnviado: 05 Ago 2008 09:45
por ronnei
Ola Amigos do forum, estou desenvolvendo um projeto com PIC 16f628 e o compilador MPLAB 7.6 utilizando o CCS 4.013, vi um exemplo aqui no forum de como "quebrar" uma variavel de 32 bits em 4 variaveis de 8 bits utilizando o MAKE8 e depois juntar com o MAKE32, bati cabeca 1 dia todo fazendo testes e o valor depois de juntar estava errado, debugando pelo MBPLAB o valor ficava correto, quando passava para o PIC e imprimia na porta serial ele mostrava outro valor apos juntar as 4 variaveis, depois de muito me extressar, percebi que isso acontecia quando o valor enviado para ser quebrado nao utilizava os 32 bits, exemplo, eu mandei o valor 12000, quando percebi isso enviei o numero 4294967295 que seria o maximo que um 32 poderia suportar, ai a funcao passou a funcionar, troquei a variavel para um int16 e usei o make16 e funcionou com o numero 12000, alguem ja passou por isso? Isso é normal? OU seja, eu terei que verificar se o numero é 16 ou 32 e utilizar funcoes diferentes, ou eu que estou fazendo algo errado?

Obrigado pela atenção. Segue abaixo o codigo de teste

Código: Selecionar todos

 unsigned int temp1,temp2,temp3,temp4;
 int32 year;

       year=12000;
   temp4=make8(year,0);
    temp3=make8(year,1);
        temp2=make8(year,2);
        temp1=make8(year,3);

    year=0;
   year= make32 (temp1,temp2,temp3,temp4);
    printf("%Lu\r\n",year);

MensagemEnviado: 05 Ago 2008 10:27
por ze
oi, ouvi dizer que dá pra fazer faacim faacim (sotaque mineiro) com "union". Alguma alma caridosa poderá lhe (nos) ensinar.....

MensagemEnviado: 05 Ago 2008 10:43
por ronnei
Certo Lellis, mas eu ja fiz, utilizando o Mak16, a duvida em questao é se isso é um BUG da funcao make32 ou eu que nao entendi direito a funcao dela? rsrsrs. Pois mesmo sendo um numero menor que 32 bits ele foi armazenado em uma var de 32, portanto a funcao deveria funcionar. Correto?

Obrigado pela atenção

MensagemEnviado: 05 Ago 2008 17:41
por joao
Ola Ronnei,

Olha, Nunca usei o MAKEX, mas acho que isso pode ser problema de "little end" e "big end"

Isso varia de produto para produto, mas a idéia principal é que em ambos, se vc cria um int32, como:
int32 a;

Como é 32 bits, temos então 4 bytes:
Byte3 Byte2 Byte1 Byte0

Mas no little end, o valor menos significativo vai estar na posicao mais baixa da memoria
Byte0
Byte1
Byte2
Byte3

E intel usa assim.

Mas os big ends armazenam de outra maneira: o valor mais significativo é armazenado no começo dos bytes.
Byte3
Byte2
Byte1
Byte0

Notou a diferença?
O que pode estar acontecendo que vc está tentando montar de maneira errada com o make32.
tente fazer isso:
Código: Selecionar todos
year= make32 (temp4,temp3,temp2,temp1);


Quem sabe só isso já resolva o seu problema!
quanto a mais explicações sobre o assunto, nada melhor do que nosso querido wikipedia:
http://pt.wikipedia.org/wiki/Extremidade_(ordena%C3%A7%C3%A3o)

[]'s

MensagemEnviado: 05 Ago 2008 18:10
por B-EAGLE
olá ronnei, como o lellis falou, dá pra utilizar o UNION, funciona da seguinte forma:

typedef union u{
float ft;
unsigned char c[4];
}un;


quando você criar uma variável do tipo UN, ela poderá ser acessada como float, ou como um array de 4 char's.

exemplo:

un var;

var.ft > acesso por float nessa variável
var.c[0-3] > acesso aos bytes individiais do float ou do array de 4 chars..


o union serve para colocar dois ou mais tipos de dados no mesmo endereço de memória a grosso modo...


abraço!

MensagemEnviado: 06 Ago 2008 08:54
por ronnei
Ola B-eagle e Joao, agradeco as dicas, mas quanto a mandar errado nao é porque eu tentei inverter as variaveis na hora de montar e deu a mesma coisa, e no compilador com o DEBUG funciona, de qualquer forma eu resolvi usando um make16 ja que os valores nao iriam ultrapassar 8192 (estou endereçando memoria de uma eeprom de 64bytes), mas o topico vale caso alguem tenha tentado fazer a mesma coisa e ternha problemas, se vc puderem testar em algum PIC de vcs postem o resultado aqui. Obrigado pela atenção de todos.