da hex a dec

Forse mi sto perdendo in un bicchier d’acqua, però, come faccio a convertire in decimale un valore esadecimale salvato su due byte differenti, high e low byte?
Questo è il codice che vorrei sfruttare, che però mi fornisce il valore hex.

/
#include <Wire.h>
/

Setup
*******************************************************************************/
void setup()
{
Serial.begin(9600);
Wire.begin(); // join i2c bus (address optional for master)
delay(1000);
}

/*******************************************************************************
Main Loop
*******************************************************************************/
void loop()
{
const int I2C_address = 0x48; // I2C write address
const byte DAT[8] = {0x8C,0xCC,0x9C,0xDC,0xAC,0xEC,0xBC,0xFC};
// Constant configuration data

byte Adval_High, Adval_Low; // Store A/D value (high byte, low byte)
byte i; // Counter

delay(1000);

for (i=0; i<=7; i++)
{
Wire.beginTransmission(I2C_address);
Wire.send(DAT*); // Configure the device to read each CH *

  • Wire.endTransmission();*

  • delay(1);*

  • // Read A/D value*

  • Wire.requestFrom(I2C_address, 2);*

  • while(Wire.available()) // Checkf for data from slave*

  • {*

  • Adval_High = Wire.receive(); // Receive A/D high byte*

  • Adval_Low = Wire.receive(); // Receive A/D low byte*

  • }*

  • Serial.print(“A/D value CH”);*

  • Serial.print(i, DEC);*

  • Serial.print(" is ");*

  • Serial.print(Adval_High,HEX);*

  • if (Adval_Low <= 0x0F)*

  • Serial.print(“0”);*

  • Serial.println(Adval_Low,HEX);*

  • } *

  • Serial.println();*
    }

dovrebbe essere:
(int)((result[1]<<8)|result[2])

Non funziona.
Questo invece funziona:

int intero = Adval_Low;
intero |= Adval_High << 8;

Ciao alegiaco

oppure facendo una moltiplicazione ( che é piú intuitivo per l'uomo ma piú lento della versione precedentemente proposta):

unsigned int intero = Adval_Low + Adval_High * 256;

Ancora due parole riguardate dec e hex.

Il controller di arduino lavora internamente con valori binari a 8Bit. non sa niente di decimale, esadecimale o ottale. Puoi scegliere se per una variabili vengono usati 1 Byte (tipo byte), 2 Byte (tipo int) oppure 4 Byte ( long e float) hai pure la scelta se un bit viene usato per segnare il segno della cifra oppure no (unsigned).

vedi Data Types su http://arduino.cc/en/Reference/HomePage

Il hex oppure decimale é solo una visualizzazione diversa per l'uomo. Detto questo Tu non hai un valore Hex che devi convertire in decimale ma variabili Byte di diverso peso che devi convertire in una variabile unsigned int.

Ciao Uwe

uwefed: Detto questo Tu non hai un valore Hex che devi convertire in decimale ma variabili Byte di diverso peso che devi convertire in una variabile unsigned int.

Ciao Uwe

Hai ragion Uwe, è proprio così. Sono byte di diverso peso da convertire in una variabile int. Mi è venuto in mente di usare l'OR per 'fondere' i due byte, tuttavia la tua rappresentazione è molto più intuitiva e facile da capire. Grazie.

Ho fatto un errore mostruoso: Devo moltiplicare per 256!!! non per 8 !!!

é giusto "unsigned int intero = Adval_Low + Adval_High * 256;"

Scusami, ciao Uwe

che infatti corrisponde ad uno shift di 8 posizioni della parte alta XD

Puoi pure utilizzare le union ;) Così poi non ti incasini con le moltiplicazioni :D

typedef struct { byte High; byte Low; } DoubleByte;

typedef union { DoubleByte _double_byte; unsigend int _u16 } Conversion;

Leggi con :

Conversion._double_byte.High = Wire.receive(); Conversion._double_byte.Low= Wire.receive();

Usi : Conversion._u16

;)