Convierta dos números binarios en un solo número

-1

Estoy leyendo un valor de sensor y lo paso a TX para verlo en mi computadora. Tengo el siguiente fragmento de código:

    while(1)
    {
        unsigned int reading = ADCW;

        UDR0 = ADCL; // Low value
        UDR0 = ADCH; // High value

        if (reading > 512 )
        {
            // It's bright
        } else {
            // It's dark
        }

        _delay_ms(30);
    }

Estoy obteniendo el siguiente resultado:

00000674: 00010010 00000010  ..
00000676: 00011111 00000010  ..
00000678: 00010100 00000010  ..
0000067a: 00010101 00000010  ..
0000067c: 00011111 00000010  ..
0000067e: 00000010 00011001  ..
00000680: 00000010 00011110  ..
00000682: 00000010 00010010  ..
00000684: 00000010 00011100  ..
00000686: 00000010 00011100  ..
00000688: 00000010 00010010  ..
0000068a: 00000010 00011111  ..
0000068c: 00000010 00011010  ..
0000068e: 00000010 00010100  ..
00000690: 00000010 00100001  .!
00000692: 00000010 00010111  ..
00000694: 00000010 00010110  ..
00000696: 00000010 00100001  .!
00000698: 00000010 00010101  ..
0000069a: 00000010 00011000  ..
0000069c: 00000010 00011111  ..
0000069e: 00000010 00000010  ..
000006a0: 00011001 00000010  ..
000006a2: 00011011 00000010  ..
000006a4: 00001111 00000010  ..

Ahora el problema es que no entiendo cómo poner estos dos números binarios juntos. Debería obtener un decimal en un rango de 0 a 1023. ¿Qué operaciones de bits necesito realizar para convertir esto en un número normal legible por humanos? Gracias!

    
pregunta K666

2 respuestas

0

Resulta que, el número no es un corto sin firmar después de todo, sino dos valores separados, uno que indica el valor antes y otro después de la coma. Pude convertir cada uno de los números en números enteros y juntarlos como una cadena

3.248
3.250
3.249
3.249
3.249
3.250
3.249
3.249
3.249
3.233
1.213
1.171
1.215
1.232
1.223
3.212
2.219
3.220
3.219
1.217
    
respondido por el K666
0

Normalmente, un "int" es de 16 bits, excepto cuando es de 32 bits. Un valor de 8 bits sería un "char", o posiblemente un "corto". Depende de tu compilador. En cualquier caso, la forma más eficiente de combinar los dos sería:

ADCresult = (ADCH < < 8) + ADCL;

Un buen compilador de optimización podría interpretar (ADCH * 256) como la multiplicación por una potencia de dos, pero dudo que su compilador lo haga. Una multiplicación en una MCU de 8 bits suele ser costosa, mientras que un desplazamiento es rápido y barato.

Observo que tienes un problema de sincronización. Comienza con ADCL en el byte bajo, y luego pierden la sincronización, y ADCH está en el byte bajo. 17 lecturas más tarde, se vuelven a sincronizar.

    
respondido por el Mark

Lea otras preguntas en las etiquetas