Assembler 4x8 Segment Portmapping

  • Sonstige

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von seh.

    Assembler 4x8 Segment Portmapping

    Heyhey,

    Ich habe mir vorgenommen in Assembler einen einfachen Counter zu bauen, der nix anderes tun soll als hochzählen. Als IDE nutze ich die MCU8051 IDE.
    Das Problem, ist dass ich keine Ahnung habe wie ich die Ports bei der Anzeige wählen muss:


    Ich verstehe nicht wie man an der Anzeige zwei Segment Teile unterschiedlich anschalten kann, wenn doch bei jedem die abcdefgp Bits dieselben sind?
    Sprich solche sachen wie:
    0092, 0235 usw.

    Wäre echt genial wenn mir da jemand von euch auf die Sprünge helfen würde.

    *Topic verschoben*

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Da brauchst Du "Multiplexing".
    Aus irgend einem Grund ist hier die Schaltung so aufgebaut, dass die Pins was einschalten, wenn sie logisch 0 sind (anstatt logisch 1). Leicht unangenehm, ist aber nicht so schlimm.
    Angenommen du möchtest "1234" anzeigen lassen: Schreibe dir in eine Tabelle, welche Segmente welcher Ziffer eingeschaltet sein müssen:
    Ziffer









    0

    X
    X


    X
    X


    1
    X
    X
    X
    X


    X


    2
    X
    X

    X
    X

    X


    3

    x
    X







    a
    b
    c
    d
    e
    f
    g
    p
    Segment

    Multiplexing macht jetzt folgendes. Als erstes schaltest Du nur Ziffer 0 ein und aktivierst die Segmente b, c, f und g. Dann wartest Du kurz, schaltest Ziffer 0 aus und stattdessen Ziffer 1 ein, mit den Segmenten a, b, c, d und g. Dann Ziffer 2 und dann 3.
    Dann wieder von vorne anfangen.
    Also der Code könnte dann so aussehen (Pseudocode):

    Quellcode

    1. P0 = 0b1111
    2. P2 = 0b11111111
    3. Loop:
    4. //Ziffer 0
    5. P2 = 0b10011001
    6. P0 = 0b1110
    7. Sleep(kurz)
    8. P0 = 0b1111
    9. //Ziffer 1
    10. P2 = 0b10110000
    11. P0 = 0b1101
    12. Sleep(kurz)
    13. P0 = 0b1111
    14. //Ziffer 2
    15. P2 = 0b01011011
    16. P0 = 0b1011
    17. Sleep(kurz)
    18. P0 = 0b1111
    19. //Ziffer 3
    20. P2 = 0b11111001
    21. P0 = 0b0111
    22. Sleep(kurz)
    23. P0 = 0b1111
    24. Goto Loop
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ob 1 oder 0 an ist lässt sich umschalten, das ist kein Problem.
    Das mit dem Multiplexing läuft, nur hast du ne Ahnung was eine angemessene Sleep Zeit ist?
    Denn zu viel aktives waiting ist auch irgendwie unnötig

    8-) faxe1008 8-)
    Das weiß ich leider nicht. Aus Sparsamkeitsgründen würde ich sagen: So langsam wie möglich, aber so, dass es noch ohne Flimmern sichtbar ist. Müsstest Du probieren.
    Beachte auch: Abhängig von der Architektur des verwenden Microcontrollers kannst Du einen Timer starten, der beim Ablauf einen Interrupt auslöst, welcher Code ausführt, welcher die nächste Ziffer anzeigen lässt. Dadurch kannst Du anderen Code ganz normal ausführen und zwischendurch wird dann immer wieder mal zur nächsten Ziffer geschaltet.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    seh schrieb:

    das ein Mensch nicht mehr als 24 Bilder pro Sekunde wahrnehmen kann

    Damit wäre ich vorsichtig. Man kann den Unterschied zwischen einem Video, das mit 30 fps abgespielt wird, und einem mit 60 fps durchaus erkennen. Was Du meinst, ist wahrscheinlich die Grenze, ab der das Gehirn einzelne Bilder als fließende Bewegung sieht. Aber auch da hab ich mal 16 Bilder pro Sekunde gehört.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ja ich weiß was du meinst, man merkt es auf jeden Fall ob man jetzt ein Spiel mit 30 FPS oder mit 60 FPS spielt. Das ist schon klar, aber dabei handelt es sich ja um etwas ganz anderes, dort verändert sich meistens das ganze Bild und für den Menschen dann ein sehr großer Teil der Sicht. Bei dieser Sache hier, ist das nur eine kleine minimale Veränderung. Ich weiß echt nicht ob es einen Unterschied macht, aber wie gesagt deshalb einfach mal ausprobieren. Mich würde aber wirklich interessieren wie oft du es nachher pro Sekunde aktualisierst.

    Ich kann mich aber auch irren und will daher jetzt niemanden anfechten also ich denke mir einfach nur meinen Teil dazu :)