Gnom67
30.09.2020, 20:19
Hallo!
Weiß jemand eine effiziente Methode, wie man die jeweils parallelen Bits der jeweils gleichen Stelle von 8 Bytes in ein Byte schreiben kann, um sie dann parallel in einen GPIO-Port zu schreiben? Es geht um die parallele Übertragung von 8 Bytes über 8 serielle GPIO outputs (nicht UART, sondern einfach GPIO Outputs - es geht mir hier auch nicht um Timings oder sowas... es geht sozusagen um das Drehen der Bitmatrix.)
Also 8 Bytes, z,B.
11111000
11111000
00000111
00000111
00000000
00000001
00000010
00000011
Ergibt für das erste Byte 00110101 -> damit werden sozusagen die 8 jeweils ersten Bits der 8 Ausgangsbytes zu einem Byte zusammengefasst und können parallel gesendet werden.
Ergibt für das erste Byte 00110011
Ergibt für das erste Byte 11000000
Ergibt für das erste Byte 11000000
usw. Die Matrix ist dann quasi gedreht oder transformiert.
Spontan würden mir nur Bitoperatoren einfallen.
- Erst alle Bytes mit der Position XORen
- Dann jeweils an die richtige Stelle schieben und mit OR ins Zielbyte kopieren.
OutByte = 0
OutByte = OutByte | (byte1 & 1 << i) << 0
OutByte = OutByte | (byte2 & 1 << i) << 1
OutByte = OutByte | (byte3 & 1 << i) << 2
Für i = 0 bis 7... erscheinen mir da etwas aufwändig. Gibts eine effizientere Lösung.
Wenns Hilfreich ist, könnte man auch 8 Output Bytes erstellen und dann erst ausgeben.
Erstmal würde mich eine generelle Lösung interessieren (für Tests auf einem Arduino/328P).
Am Ende will ich das mit 32-Bit-Werten in einem ESP32 machen. Wie sieht es da aus? Bietet der was handliches dafür.
Weiß jemand eine effiziente Methode, wie man die jeweils parallelen Bits der jeweils gleichen Stelle von 8 Bytes in ein Byte schreiben kann, um sie dann parallel in einen GPIO-Port zu schreiben? Es geht um die parallele Übertragung von 8 Bytes über 8 serielle GPIO outputs (nicht UART, sondern einfach GPIO Outputs - es geht mir hier auch nicht um Timings oder sowas... es geht sozusagen um das Drehen der Bitmatrix.)
Also 8 Bytes, z,B.
11111000
11111000
00000111
00000111
00000000
00000001
00000010
00000011
Ergibt für das erste Byte 00110101 -> damit werden sozusagen die 8 jeweils ersten Bits der 8 Ausgangsbytes zu einem Byte zusammengefasst und können parallel gesendet werden.
Ergibt für das erste Byte 00110011
Ergibt für das erste Byte 11000000
Ergibt für das erste Byte 11000000
usw. Die Matrix ist dann quasi gedreht oder transformiert.
Spontan würden mir nur Bitoperatoren einfallen.
- Erst alle Bytes mit der Position XORen
- Dann jeweils an die richtige Stelle schieben und mit OR ins Zielbyte kopieren.
OutByte = 0
OutByte = OutByte | (byte1 & 1 << i) << 0
OutByte = OutByte | (byte2 & 1 << i) << 1
OutByte = OutByte | (byte3 & 1 << i) << 2
Für i = 0 bis 7... erscheinen mir da etwas aufwändig. Gibts eine effizientere Lösung.
Wenns Hilfreich ist, könnte man auch 8 Output Bytes erstellen und dann erst ausgeben.
Erstmal würde mich eine generelle Lösung interessieren (für Tests auf einem Arduino/328P).
Am Ende will ich das mit 32-Bit-Werten in einem ESP32 machen. Wie sieht es da aus? Bietet der was handliches dafür.