6fach shiftout gesucht

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • 6fach shiftout gesucht

      Für ein 16x32 RGB-Ledmatrix bräuchte ich ein paralleles 6fach shiftout. Das display hat 6 Eingänge von Schieberegistern, deren clocks alle miteinander verbunden sind. Der Kontroller mus also an 6 Ausgangspins bits bereit stellen, die mit einem Clockpuls in die Register übernommen werden. Derzeit hab' ich das so gelöst

      BASCOM-Quellcode

      1. 'Interrupt service
      2. Display_refresh: 'show the memory on the display
      3. Load Timer2 , Timer2reload
      4. Toggle Page_counter.0
      5. If Page_counter.0 = 0 Then
      6. Restore Byte_order_a
      7. Else
      8. Restore Byte_order_b
      9. End If
      10. For B_1 = 0 To 7
      11. Read Byte_num_1
      12. Read Byte_num_2
      13. For C_1 = 7 To 0 Step -1
      14. P_r1 = Memory_red(byte_num_2).c_1
      15. P_g1 = Memory_green(byte_num_2).c_1
      16. P_b1 = Memory_blue(byte_num_2).c_1
      17. P_r2 = Memory_red(byte_num_1).c_1
      18. P_g2 = Memory_green(byte_num_1).c_1
      19. P_b2 = Memory_blue(byte_num_1).c_1
      20. P_ckl = 1 : P_ckl = 0
      21. Next C_1
      22. Read Byte_num_1
      23. Read Byte_num_2
      24. For C_1 = 0 To 7
      25. P_r1 = Memory_red(byte_num_2).c_1
      26. P_g1 = Memory_green(byte_num_2).c_1
      27. P_b1 = Memory_blue(byte_num_2).c_1
      28. P_r2 = Memory_red(byte_num_1).c_1
      29. P_g2 = Memory_green(byte_num_1).c_1
      30. P_b2 = Memory_blue(byte_num_1).c_1
      31. P_ckl = 1 : P_ckl = 0
      32. Next C_1
      33. Next B_1
      34. Pwm0 = 0
      35. P_lat = 1 : P_lat = 0
      36. P_a = Page_counter.0
      37. P_b = 0
      38. Pwm0 = Brightness
      39. Trigger = 1
      40. Return
      41. Byte_order_a:
      42. Data 12 , 44 , 4 , 36 , 13 , 45 , 5 , 37 , 14 , 46 , 6 , 38 , 15 , 47 , 7 , 39 , 28 , 60 , 20 , 52 , 29 , 61 , 21 , 53 , 30 , 62 , 22 , 54 , 31 , 63 , 23 , 55
      43. Byte_order_b:
      44. Data 8 , 40 , 0 , 32 , 9 , 41 , 1 , 33 , 10 , 42 , 2 , 34 , 11 , 43 , 3 , 35 , 24 , 56 , 16 , 48 , 25 , 57 , 17 , 49 , 26 , 58 , 18 , 50 , 27 , 59 , 19 , 51
      Alles anzeigen
      Die bytes werden bitweise an die 6 pins gelegt und ein weiterer pin macht den clock. Verschärfend ist die Notwendigkeit nach einem ausgegebenen byte die bit Reihenfolge zu ändern. Das Ganze dauert recht lange. Die Alternative wäre alle 48 Schieberegister in Reihe zu schalten und mit einem shiftout die ganzen bytes auszugeben. Erfordert eine komplizierte Verkabelung, um die Ausgänge an die Eingänge der Register zu bringen, geht aber dann min. 2,5x so schnell. Hat man jetzt mit Assembler eine Chance da was hin zu bekommen? Vielleicht reizt die Aufgabenstellung einen Assemblercrack? Ich bin total überfordert.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Was für Schieberegister sind das denn?
      Im Grunde kannst du doch Shiftout für mehrere Pin's gleichzeitig benutzen und am Ende das Latch aller Register setzen (sofern diese auch zusammen geschaltet sind).

      Shiftout Pinx, CLK, Var, [Option]
      Shiftout Piny, CLK, Var, [Option]
      Shiftout Pinz, CLK, Var, [Option]
      Latch = 1
      Latch = 0
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Das geht eben nicht, weil jedes shiftout mehrere bits aus gibt und jedesmal den clock dazu bedient. Die clocks aller Schieberegister sind aber zusammengefasst, sodass die Register, die nicht gerade mit dem aktuell laufenden shiftout verbunden sind, mit Nullern gefüllt werden.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Du denkst falsch...ist nicht böse gemeint, hast ja bisher nur mit shiftout gearbeitet.
      Dein 6x shiftout ist doch nichts anderes als paralell 6bit.
      Hat der avr leider nicht zu bieten, de4 hat ja 8bit. Also musste nen ganzen port nehmen. D.h. jeden pin am port setzen, dann ein shift signal ausgeben,kann man ja zur not noch am gleichen port machen.
      Geschwindigkeit? Denk an meine Messergebnisse aus dem anderen thread, da kamen bei shiftout nicht mehr als 890khz ausm avr. Rechnerisch halbwegs plausibel, ein 16tel der freuquenz, 8mal ausgang setzen und 8x clock setzen sind( wenn jeder schritt nur einen takt benötigt) 16 takte.
      Schneller wirste seriell nur mit Hardware spi, der nutzt dir aber mit deinen 6 Bit nichts. Für so ein display wie du es benutzen willst mus etwas schnelleres her, da sind 20 Mhz zuwenig. Was kann ein x-mega?

      Tobias
    • Und wie soll ich das befehlsmäßig formulieren? Beim shiftout geb' ich Ausgangspin und Datenbyte an. Shiftout zerlegt das byte in bits und gibt diese, untermalt mit clockpulsen, an dem pin aus, solange, bis das byte draussen ist. Ich hab' ja 6 verschiedene bytes, die an 6 verschiedenen pins parallel bitweise ausgegeben werden sollen, immer wenn 6 neue bits anliegen mit einem clockpuls die Aufnahme in die 6 verschiedenen Schieberegister veranlassen. Mir fehlt da der bascom-code dazu.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Ich habe dir schon mal gesagt wie es mit begrenzten Resourcen am schnellsten geht, HW-SPI und alle Datenleitungen in Reihe schalten. Ich weiss ja nicht was da so kompliziert sein soll, einfach Ausgang auf Eingang am Display usw.
      Wenn es wirklich parallel sein soll dann muss schon der Bildspeicher passend organisiert sein um dann einfach Byteweise (aber nur 6 Bits genutzt) die Daten ausgeben. Die Zerlegung der Daten erst im Interrupt ist zeitraubend und eine Zeitverschwendung. Darum soll sich das Hauptprogramm kümmern. Das könnte dann wieder schneller als HW-SPI sein.
    • @Holli ja, das habe ich ja auch schon so gemacht, funktioniert und ich hab' das auch schon hier vorgestellt.
      Ansteuerung einer bestimmten RGB-Led-matrix 16x32
      Das unschöne ist die Verkabelung, weil man beim Kaskadieren von mehreren displays recht rumfädeln muss. Ich bin halt auf der Suche, wie man das mit software hinkriegen könnte. Den Bildspeicher entsprechend zu organisieren, dass wird lustig a_28_2c02f089 aber ich werd's mal durchdenken.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • Das es mit SPI schneller als mit shiftout geht, weiß ich schon. Ich bin jetzt mit shiftout-Geschwindigkeit erstmal zufrieden, das passt ja soweit. Ich bin jetzt nur auf der Suche, wie ich das Verkabelungs'problem' vermeiden kann. Nachdem dieses nicht soo schlimm ist, sollte eine sw-Lösung auch nicht so kompliziert werden.
      Mir ist auch erst jetzt bewusst geworden, dass sich das 'komplizierte' Verkabeln nur auf den ersten und letzten Stecker bezieht. Die Verbindungen zwischen den displays beim Kaskadieren sind ja schön zu machen. Ich dachte vorher viel komplizierter, als es eigentlich ist.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------