Página 1 de 2

transformar uma variavel de 32bits em 4 int

MensagemEnviado: 23 Abr 2008 16:12
por cristian
quero gravar um variavel na e2prom

mas nao consigo separar os bytes da variavel de 32bits

como devo fazer ja vi uns exemplos no forum mas nao resolveu

vou gravar e depois ler entao tenho q juntar o 4 bytes novamente o make32 ja sei pra juntar

agora separar nao

Re: transformar uma variavel de 32bits em 4 int

MensagemEnviado: 23 Abr 2008 16:44
por Rodrigo_P_A
cristian escreveu:quero gravar um variavel na e2prom

mas nao consigo separar os bytes da variavel de 32bits

como devo fazer ja vi uns exemplos no forum mas nao resolveu

vou gravar e depois ler entao tenho q juntar o 4 bytes novamente o make32 ja sei pra juntar

agora separar nao



Assim:


void main ( void ) {

UINT32 i32,montado32;
char d0,d1,d2,d3;
char *ponteiro8bits;

i32=0x01234567;
ponteiro8bits=(char*)&i32;
d3=ponteiro8bits[3]; // msb
d2=ponteiro8bits[2]; // msb
d1=ponteiro8bits[1]; // msb
d0=ponteiro8bits[0]; // msb

// pronto, bytes separados em d0,d1,d2,d3\


// caminho inveso:

// montar um dado de 32 bits à partir dos 4 bytes:
// dados que eu quero que sejam colocados na variavel de 32 bits:
d0=0x12;
d1=0x34;
d2=0x57;
d3=0x78;
ponteiro8bits=(char*)&montado32;
ponteiro8bits[3]=d3; // msb
ponteiro8bits[2]=d2; //
ponteiro8bits[1]=d1; //
ponteiro8bits[0]=d0; // lsb

// pronto a variável montado32 deverá conter: 0x78573412

}

MensagemEnviado: 23 Abr 2008 17:07
por tcpipchip
Tambem podes usar UNION.
TCPIPCHIP

MensagemEnviado: 23 Abr 2008 17:20
por ze
boa tc!! uma das primeiras utilidades práticas que vejo pra UNION.
mas, exemplifique pra ele a "estrutura" da sua idéia...também estou curioso. consigo mentalizar mas não consigo passar pro papel...
abrç

MensagemEnviado: 23 Abr 2008 18:53
por EDSONCAN
struct { unsigned char BMSB;
unsigned char BMDH;
unsigned char BMDL;
unsigned char BLSB;
} SPI_RET;

use SPI_RET para 32 bits e SPI_RET.BMSB para 8 bits por exemplo

MensagemEnviado: 23 Abr 2008 19:16
por phophollety
int de 32 bits? mas um int são 16 bits...

você quer passar de um int (16bits) para um char(8bits)

int valor = 0xABBC;
char high;
char low;

low = valor; // deve pegar os 8 bits mais baixos ou pode fazer um casting

low = char (valor);

hight = (valor >> 8); // rotacione oito vezes temporariamente, assim na
// parte baixa vai ter a parte alta e você salva, pronto

MensagemEnviado: 23 Abr 2008 21:09
por msamsoniuk
lellis escreveu:boa tc!! uma das primeiras utilidades práticas que vejo pra UNION.
mas, exemplifique pra ele a "estrutura" da sua idéia...também estou curioso. consigo mentalizar mas não consigo passar pro papel...
abrç


uai:

Código: Selecionar todos
union {

    int a;
    char b[4];
} c;


c.a = 0x1234; // tanam! c.b[0] a c.b[3] contem os bytes


eh meio que equivalente ao lance dos ponteiros neh, soh q mais automatico.

MensagemEnviado: 24 Abr 2008 07:32
por ze
dentro da lei!! (legal). + automático + inteligível e talvez o cód fique mais menor de pequeno.
mas pelo que eu saiba (sabia) int era só 16 bits. talvez um long, word, float, 2 int´s?? kêkéíço UINT32?
abrç

MensagemEnviado: 24 Abr 2008 07:52
por cristian
int32 valor;

C standard type (long long) default type ( int32 )

esta no help da CCS


pra q tanta polemica nao da no mesmo ?

int32 valor;
ou
long long valor;

MensagemEnviado: 24 Abr 2008 07:57
por helton
o int varia para cada arquitetura...e compilador por assim dizer...

nos arm por exemplo (gcce e keil ):

- int: 32 bits
- short: 16 bits
- char: 8 bits

qualquer dúvida sobre tamanho de variável:

Código: Selecionar todos

  unsigned int foo;
  unsigned short bar;

  printf("int: %d bits\n", sizeof(foo) * 8 );
  printf("short: %d bits\n", sizeof(bar) * 8 );
 

[/code]

MensagemEnviado: 24 Abr 2008 08:06
por ze
kêKéíço CCS?? rs
tks helton

MensagemEnviado: 24 Abr 2008 08:12
por fabim
pascal.rsrs
valor := real.

a,b,c,d : byte;

begin
valor := $FE EF AA 10;

c := lo(valor); = $10
d := hi(valor); = $AA
b := lowest(valor); = = $EF
a := highest(valor); = $FE

MensagemEnviado: 24 Abr 2008 10:36
por tcpipchip
lellis
mentalizou agora ?
Abs
TCPIPCHIP

MensagemEnviado: 24 Abr 2008 10:46
por guest2003
Bom Cristian,

Ja que você esta usando CCS sejamos mais praticos...

O que vc quer eh isso:

Código: Selecionar todos
//aqui vc escreve na eeprom nas posicoes EEN1 a 4 (defines) os 4 bytes que formam a variavel numero.
  escreve_eeprom (EEN1,make8 (numero , 3));
  escreve_eeprom (EEN2,make8 (numero , 2));
  escreve_eeprom (EEN3,make8 (numero , 1));
  escreve_eeprom (EEN4,make8 (numero , 0));

//aqui vc recupera da eeprom a variavel de 32bits numero
numero = make32 (le_eeprom(EEN1),le_eeprom(EEN2),le_eeprom(EEN3),le_eeprom(EEN4));



Pronto, viu não doeu nada :)

[]'s

PS.: eita velhos tempos de forum... pessoal sejamos mais diretos, hj em dia tenho observado no forum muita filosofia e pouca pratica. (como sempre digo, eh somente minha humilde opnião.)

MensagemEnviado: 24 Abr 2008 12:14
por Rodrigo_P_A
PS.: eita velhos tempos de forum... pessoal sejamos mais diretos, hj em dia tenho observado no forum muita filosofia e pouca pratica. (como sempre digo, eh somente minha humilde opnião.)


Guest, eu respondi de forma "genérica" usando ponteiros. Não gosto de usar funções prontas, e no "Enunciado" o nosso amigo num disse que estava usando o CCS. Mas essa discussão foi boa, pois o nosso amigo poderá escolher a opção que ele achar melhor.