transformar uma variavel de 32bits em 4 int

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

transformar uma variavel de 32bits em 4 int

Mensagempor cristian » 23 Abr 2008 16:12

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
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Re: transformar uma variavel de 32bits em 4 int

Mensagempor Rodrigo_P_A » 23 Abr 2008 16:44

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

}
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor tcpipchip » 23 Abr 2008 17:07

Tambem podes usar UNION.
TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor ze » 23 Abr 2008 17:20

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor EDSONCAN » 23 Abr 2008 18:53

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
EDSONCAN
Word
 
Mensagens: 876
Registrado em: 11 Out 2006 14:11

Mensagempor phophollety » 23 Abr 2008 19:16

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
"3 minutes of boring code review means 3 hours less fixing LSD (Little Stupid Detail)" Dr. Mike Smith
"Dê-me um ponto de apoio e uma alavanca e moverei o mundo" Arquimedes
"Quando vejo um Alfa Romeo passar eu tiro o meu chapéu" Henry FORD.
Avatar do usuário
phophollety
Dword
 
Mensagens: 1511
Registrado em: 15 Out 2006 13:00
Localização: Santo André São Paulo, Brasil

Mensagempor msamsoniuk » 23 Abr 2008 21:09

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.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor ze » 24 Abr 2008 07:32

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor cristian » 24 Abr 2008 07:52

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;
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor helton » 24 Abr 2008 07:57

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]
Helton Marques
"Priorize as Prioridades"
helton
Byte
 
Mensagens: 146
Registrado em: 16 Out 2006 09:18
Localização: São José-SC

Mensagempor ze » 24 Abr 2008 08:06

kêKéíço CCS?? rs
tks helton
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 24 Abr 2008 08:12

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor tcpipchip » 24 Abr 2008 10:36

lellis
mentalizou agora ?
Abs
TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor guest2003 » 24 Abr 2008 10:46

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.)
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor Rodrigo_P_A » 24 Abr 2008 12:14

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.
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Próximo

Voltar para PIC

Quem está online

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

cron

x