@mega-hz: Das erste C-Code-Schnippsel nahezu 1:1 in Python-Syntax:
Code: Alles auswählen
def shiftOut32(val):
digitalWrite(OUT_latchPin, LOW) # Latch-Output disablen, während übertragen wird
shiftNo = 0
Sbyte = val
for i1 in range(4):
for i in range(8):
digitalWrite(OUT_dataPin, not not (Sbyte & (1 << i)))
digitalWrite(OUT_clockPin, HIGH)
digitalWrite(OUT_clockPin, LOW)
shiftNo += 8
Sbyte = val >> shiftNo
digitalWrite(OUT_latchPin, HIGH) # Latch-Output enablen, nach der Übertragung
digitalWrite(OUT_clockPin, LOW)
Das war im Grunde nur die ``for``-Schleifen anpassen, die ganzen Semikolons, geschweiften Klammern, und Typdeklarationen rauswerfen, und ``!`` durch ``not`` ersetzen. Und man muss einen Fehler in der Funktion beheben. Es sei denn `byte` im Original ist irgendein Makro-Voodoo, denn `shiftNo` wird im C-Code nirgends initialisiert, kann also irgendeinen Wert haben. Der Code geht aber von 0 aus.
Wenn man die passenden Konstanten und eine `digitalWrite()`-Funktion definiert, sollte das so schon lauffähig sein. Allerdings sind die Namen nicht pythonkonform und teilweise auch schlecht gewählt. Also Namen anpassen:
Code: Alles auswählen
def shift_out_32_bits(value):
#
# Latch-Output deaktivieren, während übertragen wird.
#
digital_write(OUT_LATCH_PIN, LOW)
shift_count = 0
byte_value = value
for _ in range(4):
for i in range(8):
digital_write(OUT_DATA_PIN, not not (byte_value & (1 << i)))
digital_write(OUT_CLOCK_PIN, HIGH)
digital_write(OUT_CLOCK_PIN, LOW)
shift_count += 8
byte_value = value >> shift_count
#
# Latch-Output aktivieren, nach der Übertragung.
#
digital_write(OUT_LATCH_PIN, HIGH)
digital_write(OUT_CLOCK_PIN, LOW)
Jetzt gibt es hier Sachen die in Python so keinen Sinn machen oder komisch sind. Es gibt ganze Zahlen und keinen Unterschied zwischen 32-Bit- und 8-Bit-Variablen, also kann man sich `byte_value`, die äussere Schleife, und damit dann auch `shift_count` sparen. Und ``not not`` wäre in Python besser mit `bool()` ausgedrückt, denn das macht der C-Hack mit der doppelten Negierung in C ja letztendlich:
Code: Alles auswählen
def shift_out_32_bits(value):
#
# Latch-Output deaktivieren, während übertragen wird.
#
digital_write(OUT_LATCH_PIN, LOW)
for i in range(32):
digital_write(OUT_DATA_PIN, bool(value & (1 << i)))
digital_write(OUT_CLOCK_PIN, HIGH)
digital_write(OUT_CLOCK_PIN, LOW)
#
# Latch-Output aktivieren, nach der Übertragung.
#
digital_write(OUT_LATCH_PIN, HIGH)
digital_write(OUT_CLOCK_PIN, LOW)
Man kann das noch ein bisschen mehr vereinfachen wenn man `value` in jedem Schleifendurchlauf um ein Bit verschiebt, dann braucht man den Wert von `i` nicht mehr und auch den `bool()` aufruf nicht:
Code: Alles auswählen
def shift_out_32_bits(value):
#
# Latch-Output deaktivieren, während übertragen wird.
#
digital_write(OUT_LATCH_PIN, LOW)
for _ in range(32):
digital_write(OUT_DATA_PIN, value & 1)
value >>= 1
digital_write(OUT_CLOCK_PIN, HIGH)
digital_write(OUT_CLOCK_PIN, LOW)
#
# Latch-Output aktivieren, nach der Übertragung.
#
digital_write(OUT_LATCH_PIN, HIGH)
digital_write(OUT_CLOCK_PIN, LOW)
Und zuguterletzt würde ich `gpiozero` verwenden, womit man keine Funktion zum Schreiben braucht sondern direkt auf den Objekten die die Pins repräsentieren Attribute zuweisen und Methoden aufrufen kann:
Code: Alles auswählen
def shift_out_32_bits(value):
#
# Latch-Output deaktivieren, während übertragen wird.
#
OUT_LATCH_PIN.off()
for _ in range(32):
OUT_DATA_PIN.value = value & 1
value >>= 1
OUT_CLOCK_PIN.on()
OUT_CLOCK_PIN.off()
#
# Latch-Output aktivieren, nach der Übertragung.
#
OUT_LATCH_PIN.on()
OUT_CLOCK_PIN.off()