Was passiert denn ich HEX-Werte als GPIO.output parameter uebergebe?

  • Hi,


    Ich arbeite gerade das tutorial hier durch


    https://docs.sunfounder.com/pr…gment_display_python.html


    Am Ende funktioniert alles wie es soll, aber ich verstehe offen gestanden nicht genau, was ich hier mache:


    Code
    GPIO.output(SDI, 0x80 & (dat << bit))

    Bisher habe ich den output immer entweder auf HIGH oder LOW gesetzt. Woher weiss ich denn, welcher HEX wert am Ende einem HIGH oder LOW entspricht?

    Danke!


    Max

  • 0x80 ist ein Bitmuster, nämlich 1000000

    Im Code sind die Muster für die 7-Segment-Zeichen von 0 bis F hinterlegt, z. B.für die "1" 0x06 = 00000110


    Der Code schiebt nun in einer Schleife nacheinander die Bits nach links und führt jeweils ein bitweises UND mit dem Bitmuster oben aus (erster Schritt noch ohne Verschiebung).

    10000000

    & 00000110 (nicht verschoben)

    = 00000000 = 0 => LED-Segemnt 7 aus


    10000000

    & 00001100 (eins nach links verschoben)

    = 00000000 = 0 => LED-Segemnt 6 aus


    ...


    im sechsten Schritt sind die Bits so weit nach links verschoben, dass es erstmals ein "Ein" gibt

    10000000

    & 11000000 (fünf nach links verschoben)

    = 10000000 = >0 => LED-Segemnt 2 ein.


    Wenn der Wert 00000000 = 0 = LOW (FALSE) ist, wird der GPIO ausgeschaltet. Jeder andere Wert (nicht nur 1, sondern jede andere Zahl) entspricht HIGH (TRUE) und schaltet den GPIO ein. Ob das ein Dezimal-, Hexadezimal- oder Binärwert ist, ist dabei egal.


    Diese ein/aus-Signale werden also nacheinander an das Schieberegister geschickt und stellen dann an den Ausgängen des Schieberegisters (Q7-Q0) die entsprechende Ziffer auf dem 7-Segment-Display dar.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Edited once, last by Gnom ().

  • Du nutzt doch Python und kannst ausprobieren.

    Vielleicht trägt das zur Erklärung bei:



    Die gleiche Methode wird auch verwendet, um die GPIO-Register zu beschreiben.

    Den Code sieht man nur nicht, da er in C implementiert ist.

  • Wenn der Wert 00000000 = 0 = LOW (FALSE) ist, wird der GPIO ausgeschaltet. Jeder andere Wert (nicht nur 1, sondern jede andere Zahl) entspricht HIGH (TRUE) und schaltet den GPIO ein. Ob das ein Dezimal-, Hexadezimal- oder Binärwert ist, ist dabei egal.

    Danke, das ist genau der Teil, der mir gefehlt hat (dachte, es muesste entweder 1 oder 0 sein)! :)

  • Code
    MAX_VALUE : 0010000000
    Data VALUE : 0000000101
    bit=0 shifted_data=0000000101 masked_value=0000000000, bool_result=False
    bit=1 shifted_data=0000001010 masked_value=0000000000, bool_result=False
    bit=2 shifted_data=0000010100 masked_value=0000000000, bool_result=False
    bit=3 shifted_data=0000101000 masked_value=0000000000, bool_result=False
    bit=4 shifted_data=0001010000 masked_value=0000000000, bool_result=False
    bit=5 shifted_data=0010100000 masked_value=0010000000, bool_result=True
    bit=6 shifted_data=0101000000 masked_value=0000000000, bool_result=False
    bit=7 shifted_data=1010000000 masked_value=0010000000, bool_result=True

    Danke fuer das Beispiel, das hilft!

  • Man könnte statt 0x80 im Quelltext auch 0b10000000 oder 0b1000_0000 schreiben. Auch wenn alten Hasen natürlich sofort klar ist, dass 0x80 ein gesetztes Bit 7 ist, macht es die Binärdarstellung der literalen Konstante deutlicher. Insbesondere auch Lesern die das nicht schon im Schlaf aufsagen könnten.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra