Ir ao conteúdo

Posts recomendados

Postado

Olá, gente. Estou tentando ler um valor inteiro que ocupa 2 registradores (32 bits) com o arduino. O manual do produto informa que o padrão para variáveis de 32 bits é Lo-Hi.

 

Desde já, agradeço.

 

Postado

A placa de desenvolvimento Arduino mais comum é o modelo Uno. Os 32 registradores de uso geral do ATMega 328 são todos de 8 bits e no máximo há como usar os seis últimos como registradores virtuais de 16 bits para acesso a memória.

Postado

@Davi Silva Santos  Obrigada por responder! Mas acho que não expliquei direito...estou realizando a comunicação Modbus entre o arduino e um inversor solar..na memória do inversor um determinado valor que quero ler ocupa 2 registradores (32bits) de 16 bits cada (registradores de holding) . A variável é do tipo inteiro, só que,segundo o manual, a ordem das palavras é Lo-Hi. Eu queria saber como faço pra obter  o valor inteiro..

Postado

você lê o Lo e depois o Hi e armazena cada valor em uma variável inteira separada. Para juntar as duas, basta soma Lo + (Hi << 16) ou Lo + (Hi * 65536);

int Lo;
int Hi;

int LoHi = Lo + (Hi << 16);
//ou
int LoHi = Lo + (Hi * 65536);

 

Postado

Como o @Flávio Pedroza mostrou, você pode ser o lo e depois o hi e juntar

 

uint32_t parse_lo_hi(uint16_t lo, uint16_t hi)
{
    return (uint32_t)lo + ((uint32_t)hi << 16);
}

 

Agora se não é possível ler as partes separadas, somente os 32 bits use:

 

uint32_t lohi_to_hilo(uint32_t lohi)
{
    uint32_t lo = lohi >> 16;
    uint32_t hi = lohi << 16;
    return lo + hi;
}

 

Postado

@Matheus Maldi e @Flávio Pedroza obrigada por responderem. Tentei da forma como vocês sugeriram e não deu certo. Fiz um outro teste obtendo a leitura de registradores com um SCADA e vi que obtenho valor correto lendo a variável como inteiro trocado de 4 bytes sem sinal, que teoricamente é a forma como vocês estão sugerindo, certo? Mas o valor que obtenho ao tentar com o Arduino não corresponde ao esperado...

Postado

Bom, então deve ser este o caso: https://pt.wikipedia.org/wiki/Extremidade_(ordenação)

 

Acredito então que deve ser assim a leitura:

 

uint32_t be_to_le(uint32_t be)
{
    union
    {
        uint32_t u;
        uint8_t u8[4];
    } src, dst;

    src.u = be;
    for (int i = 0, e = 3; i < 4; i++, e--)
        dst.u8[i] = src.u8[e];
    
    return dst.u;
}

 

Se puder mandar os exemplos de inteiros lidos e seus reais valores

  • Curtir 1
Postado
7 minutos atrás, Wyara Souza disse:

@Matheus Maldi Pronto..pelo Modbus Poll eu tenho os 2 valores dos regs em inteiro que é 50938 e 1, o valor total pelo medidor é 116474

 

Bom, verifique este codigo:

 

    union
    {
        uint32_t u;
        uint16_t u16[2];
    } dst;

    dst.u16[0] = 50938;
    dst.u16[1] = 1;

    printf("dst u16[0]: %u\n", dst.u16[0]); // 50938
    printf("dst u16[1]: %u\n", dst.u16[1]); // 1
    printf("dst: %u\n", dst.u);             // 116474

 

Faz funcionar conforme disse

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!