2009-07-17 13 views
1

Ich versuche, eine 16-Bit-Ganzzahl ohne Vorzeichen aus einer Struktur zu nehmen, die ersten 8 Bits davon zu maskieren und sie als Index für ein Array mit der Funktion analogWrite zu verwenden nimmt den Ausgabe-Pin auf dem Arduino und das Ausgabe-Byte als Argumente. Der Code in Frage sieht in etwa so aus: analogWrite(outputPin, my_array[myStructure->data & 0xFF00 >> 8]);Bit maskiert einen Index zu einem Array, Arduino-Umgebung

Leider funktioniert dieser Code nicht. Ich bekomme immer Null als Ausgabe. Irgendwelche Ideen?

+1

immer Klammern Bit-Operationen verwenden & | ^, weil ihre Präzedenzfälle kontraintuitiv sind. – starblue

Antwort

3

Ich vermute Betreiber Vorrang. Versuchen:

analogWrite(outputPin, my_array[(myStructure->data & 0xFF00) >> 8]); 
0

bei einer Präzedenztabelle der Suche nach C gehen Sie wie folgt vor:

  1. Erhalten Sie Daten von MYSTRUCTURE
  2. Rechtsverschiebung 0xFF00 8 Schritte
  3. Bitweise und es mit Daten

    Verwenden Sie mehr Zeilen oder Klammern!

5

Operator precedence.

Dieses:

myStructure->data & 0xFF00 >> 8 

entspricht:

myStructure->data & (0xFF00 >> 8) 

Aber Sie wollen:

(myStructure->data & 0xFF00) >> 8 
+0

Es gibt auch die Frage von -> und &, wo -> hat Vorrang. – Key

+0

Meine Mikrocontroller-Ausgänge haben jetzt Spannung an den Pins! Vielen Dank! – Bitrex

+0

Der Vorrang von -> ist der höchstmögliche in C, also brauchst du keine Klammern um ihn herum. – starblue