Rainbow LEDs WS2812b mit 432 Stück mal 4 Channels ansteuern - Problem

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

    • Rainbow LEDs WS2812b mit 432 Stück mal 4 Channels ansteuern - Problem

      Hallo,
      ich möchte 4 Rainbow Ws2812b LED Stripes mit je 432 LEDs ansteuern. (3Meter mit je 144 Stück)
      Also
      ___________________________________ Stripe1 432LED Chanal1
      ___________________________________ Stripe2 432LED Chanal2
      ___________________________________ Stripe3 432LED Chanal3

      ___________________________________ Stripe4 432LED Chanal4
      Ja, das sind eine Menge LEDs, die auch eine Menge Strom benötigen.

      Testweise habe ich derzeit 4 Stripes mit nur je 20 LEDs zum Programmieren der Anzeige
      Nach meiner Erfahrung speilt es keine Rolle, ob ich erst nur mit 20 LEDs test und dann später auf dei höhere Anzahl anpasse.
      Jedoch erhalte ich Leider "Out of SRAM" sobald ich die Anzahl der LEDs über 200 setze.

      Das Effektprogramm läuft SOWEIT wie gewünscht.

      DETAILS:
      Zur Steuerung habe ich mit einem ATMEAG8 angefangen (1K SRAM), da das Ablaufprogramm nicht viel macht, reicht 8K.
      Lichteffekt: Es sollen alle LEDs an einem Kanal hochgedimmt werden. Und das der Reihe nach über 4 Kanäle.

      Da ich nicht so tief in der Materie stecke, dachte ich das bis 1024 LEDs (Laut Beschreibungen) kein Problem sind.
      Nachdem mein mini Programm fertig war, wollte ich die Menge der LEDs erhöhen und erhielt ab 280 Stück "Out of SRAM".


      OK - Dachte ich, nehme ich eine µC mit mehr SRAM -> ATMEGA328-PB (sollte 2KB SRAM haben).

      Für m ich sehr verwirrend ist jetzt schon bei ca. 150 LEDs Schluß. Jetzt verstehe ich gar nichts mehr

      Wer kann mir bitte helfen? Welche Lösungsansätze gibt es?

      Danke
      tom

      Quellcode

      1. '(
      2. Rainbow Test
      3. 4 Linien mit 3x144LEDs = 432 LEds
      4. Dimmeffekt Reihe für Reihe
      5. ')
      6. $regfile = "M328def.dat" ' "M8adef.dat" '"attiny88.dat" ' "M328def.dat" ' "M8adef.dat"
      7. $crystal = 8000000 'Mini-Atmega 4-Platine (mit LCD)
      8. $hwstack = 32 ' 32
      9. $swstack = 32 ' 32
      10. $framesize = 32 ' 40
      11. ' Baud = 9600
      12. ' Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      13. ' Port Config -------
      14. Ddrb = &B1011_1000 ' 0= input / 1= output - data direction register
      15. Portb = &B0000_0111 ' Pullup einschalten = 1 - nur bei IN
      16. Ddrc = &B0011_1111 ' 0= input / 1= output - data direction register
      17. Portc = &B0011_0000 ' Pullup einschalten = 1 - nur bei IN
      18. Ddrd = &B1111_1111 ' 0= input / 1= output - data direction register
      19. Portd = &B0000_0000 ' Pullup einschalten = 1 - nur bei IN
      20. '=========================================================================================
      21. ' Hardware
      22. '=========================================================================================
      23. ' - Relais von oben nach unten --
      24. Relais1 alias portd.1
      25. ' Relais2 alias portd.0
      26. ' Relais3 alias portd.2
      27. ' Relais4 alias portd.3
      28. LED1 alias portD.0
      29. LED2 alias portD.1
      30. ' LED3 alias portD.2
      31. ' LED4 alias portD.3
      32. ' rainbow1 alias C0
      33. ' rainbow2 alias C1
      34. ' rainbow3 alias C2
      35. ' rainbow4 alias C3
      36. 'CONST
      37. const numLeds=161 ' max 280 at8 - max 161 at328 - 'soll 432
      38. const max_Helligkeit = 255
      39. const speed = 2
      40. Config RAINBOW=4, RB0_LEN=numLeds, RB0_PORT=PORTc,rb0_pin=3, RB1_LEN=numLeds, RB1_PORT=PORTc, RB1_pin=2, RB2_LEN=numLeds, RB2_PORT=PORTc,rb2_pin=1, RB3_LEN=numLeds, RB3_PORT=PORTc,rb3_pin=0
      41. 'Global Color-variables
      42. Dim Color(3) as Byte
      43. R alias Color(_base) : G alias Color(_base + 1) : B alias Color(_base + 2)
      44. '----[MAIN]---------------------------------------------------------------------
      45. Dim n as Byte
      46. dim ch as integer
      47. Do
      48. ' alle LEDs aus
      49. RB_SelectChannel 0 ' select first channel
      50. R = 0 : G = 0 : B = 0 ' define a color
      51. RB_FillColors Color()
      52. RB_Send
      53. RB_SelectChannel 1 ' select channel
      54. R = 0 : G = 0 : B = 0 ' define a color
      55. RB_FillColors Color()
      56. RB_Send
      57. RB_SelectChannel 2 ' select channel
      58. R = 0 : G = 0 : B = 0 ' define a color
      59. RB_FillColors Color()
      60. RB_Send
      61. RB_SelectChannel 3 ' select channel
      62. R = 0 : G = 0 : B = 0 ' define a color
      63. RB_FillColors Color()
      64. RB_Send
      65. waitms 100
      66. for b = 1 to max_Helligkeit
      67. RB_SelectChannel 0 ' select first channel
      68. RB_FillColors Color()
      69. RB_Send
      70. waitms speed
      71. next
      72. for b = 1 to max_Helligkeit
      73. RB_SelectChannel 1 ' select first channel
      74. RB_FillColors Color()
      75. RB_Send
      76. waitms speed
      77. next
      78. for b = 1 to max_Helligkeit
      79. RB_SelectChannel 2 ' select first channel
      80. RB_FillColors Color()
      81. RB_Send
      82. waitms speed
      83. next
      84. for b = 1 to max_Helligkeit
      85. RB_SelectChannel 3 ' select first channel
      86. RB_FillColors Color()
      87. RB_Send
      88. waitms speed
      89. next
      90. waitms 3000
      91. Loop
      92. end
      Alles anzeigen
    • Für jede! Led werden 3 bytes benötigt, das wird aber nirgends angezeigt. Jetzt kommt es drauf an, was du anzeigen lassen willst und in welcher Zeit. Du könntest die 3 bytes auch für mehrere Leds verwenden. Der Befehl send kopiert die Daten an den stripe. Sind die erst mal drin, dann kann man den Platz, wo diese Daten im ram waren neu beschreiben und mit send an den nächsten stripe schicken. Was nicht geht, wäre die Farbe einzelner Leds zu lesen. Was du jetzt von deinem Projekt geschrieben hast, dann sollte die Mehrfachnutzung gehen.

      Schau mal in der Hilfen nach rb_changepin avrhelp.mcselec.com/rb_changepin.htm
      Raum für Notizen

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

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

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

    • Hallo tschoeatsch, Danke.
      Theoretisch hört sich das gut an.
      Zum einen steuere ich ja nur Blau an!
      Aber Mein Problem beginnt ja bereits bei der Declaration der Anzahl der Ansteuerbaren LEDs.
      "RB1_LEN=numLeds"

      Leider bin ich mit den Rainbow LEDs unerfahren.
      Hast du (oder sie) mal einen Ansatz, wie ich das machen könnte.

      kann man die Stripes zwischendurch einfach neu mit config konfigurieren?

      gibt es einen grund, weswegen der AT8 mehr als der AT328 kann?

      tom
    • Die atmegs-chips sind halt unterschiedlich in Ausstattung und Größe, kosten auch unterschiedlich. Da muss man einfach den passenden aussuchen. Der atmega8 ist dafür jetzt einfach zu klein (ram).
      In deinem Programm legst du (alles klar?) einen stripe mit config an und der Anzahl der Leds darauf. 432 Leds. Die brauchen, äh, 1296 bytes im ram.
      Jetzt kannst du diesen stripe mit Farben füllen. Ist das gemacht, kannst du den pin umschalten, an dem der nächste stripe hängt. Jetzt kannst du den füllen usw. Was du nicht (oder nur sehr mühsam) mit dieser Methode kannst, eine beliebige Led in einem beliebigen stripe verändern. Aber ich denke, das willst du gar nicht. Auch Effekte, die über mehrere stripes gehen, gehen nicht, oder nur mühsam.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • a_64_3a718cae
      Vielen dank!!!
      die Abarbeitung ist nun zware extram laaaangsam. Aber KEINE Fehlermeldung mehr.

      Den Befehl hatte ich tatsächlich übersehen. Wieder was gelernt - danke

      Und es funktioniert, wie gewollt.

      Code - ist nun folgender:
      Klar, ist noch nicht perfekt optimiert, aber das gewünschte funktioniert.

      Quellcode

      1. ' attinny88 hat nur 2 timer Atmega8 hat 3 timer
      2. $regfile = "M328def.dat" ' "M8adef.dat" '"attiny88.dat" ' "M328def.dat" ' "M8adef.dat"
      3. $crystal = 8000000 'Mini-Atmega 4-Platine (mit LCD)
      4. $hwstack = 32 ' 32
      5. $swstack = 32 ' 32
      6. $framesize = 32 ' 40
      7. ' Baud = 9600
      8. ' Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      9. ' Port Config ------- - so ist es richtig!!! CONFIG ist gleich DDR!!
      10. Ddrb = &B1011_1000 ' 0= input / 1= output - data direction register
      11. Portb = &B0000_0111 ' Pullup einschalten = 1 - nur bei IN
      12. Ddrc = &B0011_1111 ' 0= input / 1= output - data direction register
      13. Portc = &B0011_0000 ' Pullup einschalten = 1 - nur bei IN
      14. Ddrd = &B1111_1111 ' 0= input / 1= output - data direction register
      15. Portd = &B0000_0000 ' Pullup einschalten = 1 - nur bei IN
      16. '=========================================================================================
      17. ' Hardware
      18. '=========================================================================================
      19. ' - Relais von oben nach unten --
      20. Relais1 alias portd.1
      21. ' Relais2 alias portd.0
      22. ' Relais3 alias portd.2
      23. ' Relais4 alias portd.3
      24. LED1 alias portD.0
      25. LED2 alias portD.1
      26. ' LED3 alias portD.2
      27. ' LED4 alias portD.3
      28. ' rainbow1 alias C0
      29. ' rainbow2 alias C1
      30. ' rainbow3 alias C2
      31. ' rainbow4 alias C3
      32. 'CONST
      33. const numLeds=432 ' max 280 at8 - max 161 at328 - 'soll 432
      34. const max_Helligkeit = 255
      35. const speed = 0
      36. Config RAINBOW=1, RB0_LEN=numLeds, RB0_PORT=PORTc,rb0_pin=3 ', RB1_LEN=numLeds, RB1_PORT=PORTc, RB1_pin=2, RB2_LEN=numLeds, RB2_PORT=PORTc,rb2_pin=1, RB3_LEN=numLeds, RB3_PORT=PORTc,rb3_pin=0
      37. 'Global Color-variables
      38. Dim Color(3) as Byte
      39. R alias Color(_base) : G alias Color(_base + 1) : B alias Color(_base + 2)
      40. '----[MAIN]---------------------------------------------------------------------
      41. Dim n as Byte
      42. dim ch as integer
      43. Const portNr=varptr(portc) + &H20
      44. RB_SelectChannel 0 ' select first channel
      45. Do
      46. ' alle LEDs aus
      47. RB_CHANGEPIN portNr, 3
      48. R = 0 : G = 0 : B = 0 ' define a color
      49. RB_FillColors Color()
      50. RB_Send
      51. RB_CHANGEPIN portNr, 2
      52. R = 0 : G = 0 : B = 0 ' define a color
      53. RB_FillColors Color()
      54. RB_Send
      55. RB_CHANGEPIN portNr, 1
      56. R = 0 : G = 0 : B = 0 ' define a color
      57. RB_FillColors Color()
      58. RB_Send
      59. RB_CHANGEPIN portNr, 0
      60. R = 0 : G = 0 : B = 0 ' define a color
      61. RB_FillColors Color()
      62. RB_Send
      63. waitms 1000
      64. RB_CHANGEPIN portNr, 3
      65. for b = 1 to max_Helligkeit
      66. ' RB_SelectChannel 0 ' select first channel
      67. RB_FillColors Color()
      68. RB_Send
      69. waitms speed
      70. next
      71. RB_CHANGEPIN portNr, 2
      72. for b = 1 to max_Helligkeit
      73. RB_FillColors Color()
      74. RB_Send
      75. waitms speed
      76. next
      77. RB_CHANGEPIN portNr, 1
      78. for b = 1 to max_Helligkeit
      79. RB_FillColors Color()
      80. RB_Send
      81. waitms speed
      82. next
      83. RB_CHANGEPIN portNr, 0
      84. for b = 1 to max_Helligkeit
      85. RB_FillColors Color()
      86. RB_Send
      87. waitms speed
      88. next
      89. waitms 3000
      90. Loop
      91. end
      Alles anzeigen
    • Ist es dir zu laaannggsamm? Da du derzeit alle Leds eines stripes mit gleichen Daten versorgst, kannst du es schneller machen, wenn du statt 3m stripe-Länge 3x1m nimmst. Also die nunmehr 3 din der einzel Meterstücke parallel an den portpin hängen. Dann musst du nur noch für 144 Leds Platz im ram vorhalten und du musst auch nur Daten für 144 Leds senden. Dann kann auch ein stmega8 wieder ausreichen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Einen Tuck mehr speed bekommst du bei verwenden von rb_fillstripe. Damit umgehst du das Vorbereiten des ram-Speichers, der dann mit send zu den Leds geschickt wird. Wird nicht viel sein, aber warum nicht, erfüllt den gleichen Zweck.
      Raum für Notizen

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

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