Spielerei mit 8x8 WS2812 ohne Lib

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    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!

    • Spielerei mit 8x8 WS2812 ohne Lib

      Hallo zusammen.
      Seit einiger Zeit habe ich die 8x8 LED Matix mit dem Max1219 laufen.
      (Danke nochmals an tschoeatsch)
      Jetzt gibt es eine 8x8 Matrix WS2812 für ca 2 Euro pro Panel.
      Davon habe ich gestern gleich drei zusammengelötet und lasse mir die Einspeisung(grün) meines Balkonkraftwerkes und den Strombezug(rot) anzeigen.

      Der Code ist etwas zusammengewürfelt, funktioniert aber gut.
      Der ATmega muss mit 16MHz getraktet sein, sonst stimmen die Timings nicht.
      An der Ausgabe vom "Bildspeicher" sollte möglichst nichts verändert werden.

      Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 32
      6. Const Anzahl_module = 3
      7. Const Anzahl_spalten = Anzahl_module * 8
      8. Dim Display_array(anzahl_spalten) As Byte '8 Spalten für jedes Modul
      9. Dim Temp As Byte , Temp1 As Byte
      10. Dim Modul As Byte
      11. Dim Spalte As Word
      12. Dim Zeile As Byte , Bit_nr As Byte
      13. Dim Loesch As Byte
      14. Dim Display_daten As Byte , Display_digit As Byte
      15. Dim Spalten_nummer As Word , X As Word
      16. Dim Test As String * 6
      17. Dim M As Dword
      18. Dim Z As Byte
      19. Dim Posled As Integer
      20. Declare Sub Schreiben(byval Ausgabetext As String , Byval Farbe As Byte , Byval Helligkeit As Byte)
      21. Dim Zahler_farbe As Byte
      22. Dim Helligkeit As Byte
      23. Const N_led = 64 * Anzahl_module
      24. Dim N As Integer
      25. Dim G(n_led) As Byte 'Grün-Anteil
      26. Dim R(n_led) As Byte 'Rot-Anteil
      27. Dim B(n_led) As Byte 'Blau-Anteil
      28. Dim Zaehler As Integer
      29. Config Pinb.2 = Output
      30. Reset Portb.2 'T_RST = Lo = RESET = 10000 ns
      31. Waitus 10
      32. Do
      33. Incr Zaehler
      34. If Zaehler = 9999 Then
      35. Zaehler = 0
      36. End If
      37. ' Incr Zahler_farbe
      38. ' If Zahler_farbe = 4 Then
      39. ' Zahler_farbe = 1
      40. ' End If
      41. ' Incr Helligkeit
      42. ' If Helligkeit = 255 Then
      43. ' Helligkeit = 1
      44. ' End If
      45. Test = Str(zaehler)
      46. ' Call Schreiben(test , Zahler_farbe , Helligkeit)
      47. Call Schreiben(test , 2 , 10)
      48. Waitms 100
      49. Loop
      50. Sub Schreiben(ausgabetext As String , Farbe As Byte , Helligkeit As Byte)
      51. Local Lang As Byte
      52. Local Count As Byte
      53. Local Text As String * 1
      54. Local Tabelleneinsprung As Word
      55. Posled = 1
      56. Lang = Len(ausgabetext)
      57. Spalten_nummer = 1
      58. For Count = 1 To Lang 'nacheinander die einzelnen Buchstaben durchgehen
      59. Text = Mid(ausgabetext , Count , 1) 'Einzelbuchstaben herauspicken
      60. Tabelleneinsprung = Asc(text) 'Tabelle berechnen minus 32 zeichen.
      61. Select Case Text
      62. Case "Ä" : Tabelleneinsprung = &H8E
      63. Case "Ö" : Tabelleneinsprung = &H99
      64. Case "Ü" : Tabelleneinsprung = &H9A
      65. Case "ä" : Tabelleneinsprung = &H84
      66. Case "ü" : Tabelleneinsprung = &H81
      67. Case "ö" : Tabelleneinsprung = &H94
      68. Case "ß" : Tabelleneinsprung = &HE1
      69. End Select
      70. Tabelleneinsprung = Tabelleneinsprung - 32
      71. Tabelleneinsprung = Tabelleneinsprung * 6
      72. For X = 1 To 6 'das bitmuster spaltenweise in den Speicher schreiben (6 Spalten)
      73. Display_array(spalten_nummer) = Lookup(tabelleneinsprung , Font_6x8)
      74. Incr Spalten_nummer : Incr Tabelleneinsprung
      75. For N = 7 To 0 Step -1
      76. If Display_array(spalten_nummer).n = 1 And Farbe = 1 Then
      77. G(posled) = 0
      78. R(posled) = Helligkeit
      79. B(posled) = 0
      80. End If
      81. If Display_array(spalten_nummer).n = 1 And Farbe = 2 Then
      82. G(posled) = Helligkeit
      83. R(posled) = 0
      84. B(posled) = 0
      85. End If
      86. If Display_array(spalten_nummer).n = 1 And Farbe = 3 Then
      87. G(posled) = 0
      88. R(posled) = 0
      89. B(posled) = Helligkeit
      90. End If
      91. If Display_array(spalten_nummer).n = 0 Then
      92. G(posled) = 0
      93. R(posled) = 0
      94. B(posled) = 0
      95. End If
      96. Incr Posled
      97. Next N
      98. Next X
      99. Next Count
      100. '__________________________________________________________LED-Array RESET erzeugen:
      101. Reset Portb.2 'T_RST = Lo = RESET = 10000 ns
      102. Waitus 30
      103. '__________________________________________________Das ganze LED-Array mit den neuen Farben beschreiben:
      104. For N = 1 To N_led
      105. If G(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      106. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      107. If G(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      108. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      109. If G(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      110. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      111. If G(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      112. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      113. If G(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      114. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      115. If G(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      116. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      117. If G(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      118. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      119. If G(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      120. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      121. If R(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      122. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      123. If R(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      124. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      125. If R(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      126. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      127. If R(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      128. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      129. If R(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      130. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      131. If R(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      132. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      133. If R(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      134. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      135. If R(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      136. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      137. If B(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      138. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      139. If B(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      140. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      141. If B(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      142. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      143. If B(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      144. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      145. If B(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      146. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      147. If B(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      148. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      149. If B(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      150. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      151. If B(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Nop : Reset Portb.2
      152. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      153. Next N
      154. End Sub
      Display All
    • Dazu natürlich die ASCII-Datenbank

      Source Code

      1. Font_6x8: '6x8font
      2. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &H20
      3. Data &H00 , &H00 , &H06 , &H5F , &H06 , &H00 ' &H21
      4. Data &H00 , &H07 , &H03 , &H00 , &H07 , &H03 ' &H22
      5. Data &H00 , &H24 , &H7E , &H24 , &H7E , &H24 ' &H23
      6. Data &H00 , &H24 , &H2B , &H6A , &H12 , &H00 ' &H24
      7. Data &H00 , &H63 , &H13 , &H08 , &H64 , &H63 ' &H25
      8. Data &H00 , &H36 , &H49 , &H56 , &H20 , &H50 ' &H26
      9. Data &H00 , &H00 , &H07 , &H03 , &H00 , &H00 ' &H27
      10. Data &H00 , &H00 , &H3E , &H41 , &H00 , &H00 ' &H28
      11. Data &H00 , &H00 , &H41 , &H3E , &H00 , &H00 ' &H29
      12. Data &H00 , &H08 , &H3E , &H1C , &H3E , &H08 ' &H2A
      13. Data &H00 , &H08 , &H08 , &H3E , &H08 , &H08 ' &H2B
      14. Data &H00 , &H00 , &HE0 , &H60 , &H00 , &H00 ' &H2C
      15. Data &H00 , &H08 , &H08 , &H08 , &H08 , &H08 ' &H2D
      16. Data &H00 , &H00 , &H60 , &H60 , &H00 , &H00 ' &H2E
      17. Data &H00 , &H20 , &H10 , &H08 , &H04 , &H02 ' &H2F
      18. Data &H00 , &H3E , &H51 , &H49 , &H45 , &H3E ' &H30
      19. Data &H00 , &H00 , &H42 , &H7F , &H40 , &H00 ' &H31
      20. Data &H00 , &H62 , &H51 , &H49 , &H49 , &H46 ' &H32
      21. Data &H00 , &H22 , &H49 , &H49 , &H49 , &H36 ' &H33
      22. Data &H00 , &H18 , &H14 , &H12 , &H7F , &H10 ' &H34
      23. Data &H00 , &H2F , &H49 , &H49 , &H49 , &H31 ' &H35
      24. Data &H00 , &H3C , &H4A , &H49 , &H49 , &H30 ' &H36
      25. Data &H00 , &H01 , &H71 , &H09 , &H05 , &H03 ' &H37
      26. Data &H00 , &H36 , &H49 , &H49 , &H49 , &H36 ' &H38
      27. Data &H00 , &H06 , &H49 , &H49 , &H29 , &H1E ' &H39
      28. Data &H00 , &H00 , &H6C , &H6C , &H00 , &H00 ' &H3A
      29. Data &H00 , &H00 , &HEC , &H6C , &H00 , &H00 ' &H3B
      30. Data &H00 , &H08 , &H14 , &H22 , &H41 , &H00 ' &H3C
      31. Data &H00 , &H24 , &H24 , &H24 , &H24 , &H24 ' &H3D
      32. Data &H00 , &H00 , &H41 , &H22 , &H14 , &H08 ' &H3E
      33. Data &H00 , &H02 , &H01 , &H59 , &H09 , &H06 ' &H3F
      34. Data &H00 , &H3E , &H41 , &H5D , &H55 , &H1E ' &H40
      35. Data &H00 , &H7E , &H11 , &H11 , &H11 , &H7E ' &H41
      36. Data &H00 , &H7F , &H49 , &H49 , &H49 , &H36 ' &H42
      37. Data &H00 , &H3E , &H41 , &H41 , &H41 , &H22 ' &H43
      38. Data &H00 , &H7F , &H41 , &H41 , &H41 , &H3E ' &H44
      39. Data &H00 , &H7F , &H49 , &H49 , &H49 , &H41 ' &H45
      40. Data &H00 , &H7F , &H09 , &H09 , &H09 , &H01 ' &H46
      41. Data &H00 , &H3E , &H41 , &H49 , &H49 , &H7A ' &H47
      42. Data &H00 , &H7F , &H08 , &H08 , &H08 , &H7F ' &H48
      43. Data &H00 , &H00 , &H41 , &H7F , &H41 , &H00 ' &H49
      44. Data &H00 , &H30 , &H40 , &H40 , &H40 , &H3F ' &H4A
      45. Data &H00 , &H7F , &H08 , &H14 , &H22 , &H41 ' &H4B
      46. Data &H00 , &H7F , &H40 , &H40 , &H40 , &H40 ' &H4C
      47. Data &H00 , &H7F , &H02 , &H04 , &H02 , &H7F ' &H4D
      48. Data &H00 , &H7F , &H02 , &H04 , &H08 , &H7F ' &H4E
      49. Data &H00 , &H3E , &H41 , &H41 , &H41 , &H3E ' &H4F
      50. Data &H00 , &H7F , &H09 , &H09 , &H09 , &H06 ' &H50
      51. Data &H00 , &H3E , &H41 , &H51 , &H21 , &H5E ' &H51
      52. Data &H00 , &H7F , &H09 , &H09 , &H19 , &H66 ' &H52
      53. Data &H00 , &H26 , &H49 , &H49 , &H49 , &H32 ' &H53
      54. Data &H00 , &H01 , &H01 , &H7F , &H01 , &H01 ' &H54
      55. Data &H00 , &H3F , &H40 , &H40 , &H40 , &H3F ' &H55
      56. Data &H00 , &H1F , &H20 , &H40 , &H20 , &H1F ' &H56
      57. Data &H00 , &H3F , &H40 , &H3C , &H40 , &H3F ' &H57
      58. Data &H00 , &H63 , &H14 , &H08 , &H14 , &H63 ' &H58
      59. Data &H00 , &H07 , &H08 , &H70 , &H08 , &H07 ' &H59
      60. Data &H00 , &H71 , &H49 , &H45 , &H43 , &H00 ' &H5A
      61. Data &H00 , &H00 , &H7F , &H41 , &H41 , &H00 ' &H5B
      62. Data &H00 , &H02 , &H04 , &H08 , &H10 , &H20 ' &H5C
      63. Data &H00 , &H00 , &H41 , &H41 , &H7F , &H00 ' &H5D
      64. Data &H00 , &H04 , &H02 , &H01 , &H02 , &H04 ' &H5E
      65. Data &H80 , &H80 , &H80 , &H80 , &H80 , &H80 ' &H5F
      66. Data &H00 , &H00 , &H03 , &H07 , &H00 , &H00 ' &H60
      67. Data &H00 , &H20 , &H54 , &H54 , &H54 , &H78 ' &H61
      68. Data &H00 , &H7F , &H44 , &H44 , &H44 , &H38 ' &H62
      69. Data &H00 , &H38 , &H44 , &H44 , &H44 , &H28 ' &H63
      70. Data &H00 , &H38 , &H44 , &H44 , &H44 , &H7F ' &H64
      71. Data &H00 , &H38 , &H54 , &H54 , &H54 , &H08 ' &H65
      72. Data &H00 , &H08 , &H7E , &H09 , &H09 , &H00 ' &H66
      73. Data &H00 , &H18 , &HA4 , &HA4 , &HA4 , &H7C ' &H67
      74. Data &H00 , &H7F , &H04 , &H04 , &H78 , &H00 ' &H68
      75. Data &H00 , &H00 , &H00 , &H7D , &H00 , &H00 ' &H69
      76. Data &H00 , &H40 , &H80 , &H84 , &H7D , &H00 ' &H6A
      77. Data &H00 , &H7F , &H10 , &H28 , &H44 , &H00 ' &H6B
      78. Data &H00 , &H00 , &H00 , &H7F , &H40 , &H00 ' &H6C
      79. Data &H00 , &H7C , &H04 , &H18 , &H04 , &H78 ' &H6D
      80. Data &H00 , &H7C , &H04 , &H04 , &H78 , &H00 ' &H6E
      81. Data &H00 , &H38 , &H44 , &H44 , &H44 , &H38 ' &H6F
      82. Data &H00 , &HFC , &H44 , &H44 , &H44 , &H38 ' &H70
      83. Data &H00 , &H38 , &H44 , &H44 , &H44 , &HFC ' &H71
      84. Data &H00 , &H44 , &H78 , &H44 , &H04 , &H08 ' &H72
      85. Data &H00 , &H08 , &H54 , &H54 , &H54 , &H20 ' &H73
      86. Data &H00 , &H04 , &H3E , &H44 , &H24 , &H00 ' &H74
      87. Data &H00 , &H3C , &H40 , &H20 , &H7C , &H00 ' &H75
      88. Data &H00 , &H1C , &H20 , &H40 , &H20 , &H1C ' &H76
      89. Data &H00 , &H3C , &H60 , &H30 , &H60 , &H3C ' &H77
      90. Data &H00 , &H6C , &H10 , &H10 , &H6C , &H00 ' &H78
      91. Data &H00 , &H9C , &HA0 , &H60 , &H3C , &H00 ' &H79
      92. Data &H00 , &H64 , &H54 , &H54 , &H4C , &H00 ' &H7A
      93. Data &H00 , &H08 , &H3E , &H41 , &H41 , &H00 ' &H7B
      94. Data &H00 , &H00 , &H00 , &H77 , &H00 , &H00 ' &H7C
      95. Data &H00 , &H00 , &H41 , &H41 , &H3E , &H08 ' &H7D
      96. Data &H00 , &H02 , &H01 , &H02 , &H01 , &H00 ' &H7E
      97. Data &H00 , &H3C , &H26 , &H23 , &H26 , &H3C ' &H7F
      98. Data &H00 , &H1E , &HA1 , &HE1 , &H21 , &H12 ' &H80
      99. Data &H00 , &H3D , &H40 , &H20 , &H7D , &H00 ' &H81
      100. Data &H00 , &H38 , &H54 , &H54 , &H55 , &H09 ' &H82
      101. Data &H00 , &H20 , &H55 , &H55 , &H55 , &H78 ' &H83
      102. Data &H00 , &H20 , &H55 , &H54 , &H55 , &H78 ' &H84
      103. Data &H00 , &H20 , &H55 , &H55 , &H54 , &H78 ' &H85
      104. Data &H00 , &H20 , &H57 , &H55 , &H57 , &H78 ' &H86
      105. Data &H00 , &H1C , &HA2 , &HE2 , &H22 , &H14 ' &H87
      106. Data &H00 , &H38 , &H55 , &H55 , &H55 , &H08 ' &H88
      107. Data &H00 , &H38 , &H55 , &H54 , &H55 , &H08 ' &H89
      108. Data &H00 , &H38 , &H55 , &H55 , &H54 , &H08 ' &H8A
      109. Data &H00 , &H00 , &H01 , &H7C , &H41 , &H00 ' &H8B
      110. Data &H00 , &H00 , &H01 , &H7D , &H41 , &H00 ' &H8C
      111. Data &H00 , &H00 , &H01 , &H7C , &H40 , &H00 ' &H8D
      112. Data &H00 , &H70 , &H29 , &H24 , &H29 , &H70 ' &H8E
      113. Data &H00 , &H78 , &H2F , &H25 , &H2F , &H78 ' &H8F
      114. Data &H00 , &H7C , &H54 , &H54 , &H55 , &H45 ' &H90
      Display All
    • Source Code

      1. Data &H00 , &H34 , &H54 , &H7C , &H54 , &H58 ' &H91
      2. Data &H00 , &H7E , &H09 , &H7F , &H49 , &H49 ' &H92
      3. Data &H00 , &H38 , &H45 , &H45 , &H39 , &H00 ' &H93
      4. Data &H00 , &H38 , &H45 , &H44 , &H39 , &H00 ' &H94
      5. Data &H00 , &H39 , &H45 , &H44 , &H38 , &H00 ' &H95
      6. Data &H00 , &H3C , &H41 , &H21 , &H7D , &H00 ' &H96
      7. Data &H00 , &H3D , &H41 , &H20 , &H7C , &H00 ' &H97
      8. Data &H00 , &H9C , &HA1 , &H60 , &H3D , &H00 ' &H98
      9. Data &H00 , &H3D , &H42 , &H42 , &H3D , &H00 ' &H99
      10. Data &H00 , &H3C , &H41 , &H40 , &H3D , &H00 ' &H9A
      11. Data &H80 , &H70 , &H68 , &H58 , &H38 , &H04 ' &H9B
      12. Data &H00 , &H48 , &H3E , &H49 , &H49 , &H62 ' &H9C
      13. Data &H00 , &H7E , &H61 , &H5D , &H43 , &H3F ' &H9D
      14. Data &H00 , &H22 , &H14 , &H08 , &H14 , &H22 ' &H9E
      15. Data &H00 , &H40 , &H88 , &H7E , &H09 , &H02 ' &H9F
      16. Data &H00 , &H20 , &H54 , &H55 , &H55 , &H78 ' &HA0
      17. Data &H00 , &H00 , &H00 , &H7D , &H41 , &H00 ' &HA1
      18. Data &H00 , &H38 , &H44 , &H45 , &H39 , &H00 ' &HA2
      19. Data &H00 , &H3C , &H40 , &H21 , &H7D , &H00 ' &HA3
      20. Data &H00 , &H7A , &H09 , &H0A , &H71 , &H00 ' &HA4
      21. Data &H00 , &H7A , &H11 , &H22 , &H79 , &H00 ' &HA5
      22. Data &H00 , &H08 , &H55 , &H55 , &H55 , &H5E ' &HA6
      23. Data &H00 , &H4E , &H51 , &H51 , &H4E , &H00 ' &HA7
      24. Data &H00 , &H30 , &H48 , &H4D , &H40 , &H20 ' &HA8
      25. Data &H3E , &H41 , &H5D , &H4B , &H55 , &H3E ' &HA9
      26. Data &H04 , &H04 , &H04 , &H04 , &H04 , &H1C ' &HAA
      27. Data &H00 , &H17 , &H08 , &H4C , &H6A , &H50 ' &HAB
      28. Data &H00 , &H17 , &H08 , &H34 , &H2A , &H78 ' &HAC
      29. Data &H00 , &H00 , &H30 , &H7D , &H30 , &H00 ' &HAD
      30. Data &H00 , &H08 , &H14 , &H00 , &H08 , &H14 ' &HAE
      31. Data &H00 , &H14 , &H08 , &H00 , &H14 , &H08 ' &HAF
      32. Data &H44 , &H11 , &H44 , &H11 , &H44 , &H11 ' &HB0
      33. Data &HAA , &H55 , &HAA , &H55 , &HAA , &H55 ' &HB1
      34. Data &HBB , &HEE , &HBB , &HEE , &HBB , &HEE ' &HB2
      35. Data &H00 , &H00 , &H00 , &HFF , &H00 , &H00 ' &HB3
      36. Data &H08 , &H08 , &H08 , &HFF , &H00 , &H00 ' &HB4
      37. Data &H00 , &H70 , &H28 , &H25 , &H29 , &H70 ' &HB5
      38. Data &H00 , &H70 , &H29 , &H25 , &H29 , &H70 ' &HB6
      39. Data &H00 , &H70 , &H29 , &H25 , &H28 , &H70 ' &HB7
      40. Data &H3E , &H41 , &H5D , &H55 , &H41 , &H3E ' &HB8
      41. Data &H0A , &HFB , &H00 , &HFF , &H00 , &H00 ' &HB9
      42. Data &H00 , &HFF , &H00 , &HFF , &H00 , &H00 ' &HBA
      43. Data &H0A , &HFA , &H02 , &HFE , &H00 , &H00 ' &HBB
      44. Data &H0A , &H0B , &H08 , &H0F , &H00 , &H00 ' &HBC
      45. Data &H00 , &H18 , &H24 , &H66 , &H24 , &H00 ' &HBD
      46. Data &H00 , &H29 , &H2A , &H7C , &H2A , &H29 ' &HBE
      47. Data &H08 , &H08 , &H08 , &HF8 , &H00 , &H00 ' &HBF
      48. Data &H00 , &H00 , &H00 , &H0F , &H08 , &H08 ' &HC0
      49. Data &H08 , &H08 , &H08 , &H0F , &H08 , &H08 ' &HC1
      50. Data &H08 , &H08 , &H08 , &HF8 , &H08 , &H08 ' &HC2
      51. Data &H00 , &H00 , &H00 , &HFF , &H08 , &H08 ' &HC3
      52. Data &H08 , &H08 , &H08 , &H08 , &H08 , &H08 ' &HC4
      53. Data &H08 , &H08 , &H08 , &HFF , &H08 , &H08 ' &HC5
      54. Data &H00 , &H20 , &H56 , &H55 , &H56 , &H79 ' &HC6
      55. Data &H00 , &H70 , &H2A , &H25 , &H2A , &H71 ' &HC7
      56. Data &H00 , &H0F , &H08 , &H0B , &H0A , &H0A ' &HC8
      57. Data &H00 , &HFE , &H02 , &HFA , &H0A , &H0A ' &HC9
      58. Data &H0A , &H0B , &H08 , &H0B , &H0A , &H0A ' &HCA
      59. Data &H0A , &HFA , &H02 , &HFA , &H0A , &H0A ' &HCB
      60. Data &H00 , &HFF , &H00 , &HFB , &H0A , &H0A ' &HCC
      61. Data &H0A , &H0A , &H0A , &H0A , &H0A , &H0A ' &HCD
      62. Data &H0A , &HFB , &H00 , &HFB , &H0A , &H0A ' &HCE
      63. Data &H00 , &H5D , &H22 , &H22 , &H22 , &H5D ' &HCF
      64. Data &H00 , &H22 , &H55 , &H59 , &H30 , &H00 ' &HD0
      65. Data &H00 , &H08 , &H7F , &H49 , &H41 , &H3E ' &HD1
      66. Data &H00 , &H7C , &H55 , &H55 , &H55 , &H44 ' &HD2
      67. Data &H00 , &H7C , &H55 , &H54 , &H55 , &H44 ' &HD3
      68. Data &H00 , &H7C , &H55 , &H55 , &H54 , &H44 ' &HD4
      69. Data &H00 , &H00 , &H00 , &H07 , &H00 , &H00 ' &HD5
      70. Data &H00 , &H00 , &H44 , &H7D , &H45 , &H00 ' &HD6
      71. Data &H00 , &H00 , &H45 , &H7D , &H45 , &H00 ' &HD7
      72. Data &H00 , &H00 , &H45 , &H7C , &H45 , &H00 ' &HD8
      73. Data &H08 , &H08 , &H08 , &H0F , &H00 , &H00 ' &HD9
      74. Data &H00 , &H00 , &H00 , &HF8 , &H08 , &H08 ' &HDA
      75. Data &HFF , &HFF , &HFF , &HFF , &HFF , &HFF ' &HDB
      76. Data &HF0 , &HF0 , &HF0 , &HF0 , &HF0 , &HF0 ' &HDC
      77. Data &H00 , &H00 , &H00 , &H77 , &H00 , &H00 ' &HDD
      78. Data &H00 , &H00 , &H45 , &H7D , &H44 , &H00 ' &HDE
      79. Data &H0F , &H0F , &H0F , &H0F , &H0F , &H0F ' &HDF
      80. Data &H00 , &H3C , &H42 , &H43 , &H3D , &H00 ' &HE0
      81. Data &H00 , &HFE , &H4A , &H4A , &H34 , &H00 ' &HE1
      82. Data &H00 , &H3C , &H43 , &H43 , &H3D , &H00 ' &HE2
      83. Data &H00 , &H3D , &H43 , &H42 , &H3C , &H00 ' &HE3
      84. Data &H00 , &H32 , &H49 , &H4A , &H31 , &H00 ' &HE4
      85. Data &H00 , &H3A , &H45 , &H46 , &H39 , &H00 ' &HE5
      86. Data &H00 , &HFC , &H20 , &H20 , &H1C , &H00 ' &HE6
      87. Data &H00 , &HFE , &HAA , &H28 , &H10 , &H00 ' &HE7
      88. Data &H00 , &HFF , &HA5 , &H24 , &H18 , &H00 ' &HE8
      89. Data &H00 , &H3C , &H40 , &H41 , &H3D , &H00 ' &HE9
      90. Data &H00 , &H3C , &H41 , &H41 , &H3D , &H00 ' &HEA
      91. Data &H00 , &H3D , &H41 , &H40 , &H3C , &H00 ' &HEB
      92. Data &H00 , &H9C , &HA0 , &H61 , &H3D , &H00 ' &HEC
      93. Data &H00 , &H04 , &H08 , &H71 , &H09 , &H04 ' &HED
      94. Data &H00 , &H00 , &H02 , &H02 , &H02 , &H00 ' &HEE
      95. Data &H00 , &H00 , &H07 , &H03 , &H00 , &H00 ' &HEF
      96. Data &H00 , &H00 , &H08 , &H08 , &H08 , &H00 ' &HF0
      97. Data &H00 , &H00 , &H24 , &H2E , &H24 , &H00 ' &HF1
      98. Data &H00 , &H24 , &H24 , &H24 , &H24 , &H24 ' &HF2
      99. Data &H05 , &H17 , &H0A , &H34 , &H2A , &H78 ' &HF3
      100. Data &H00 , &H06 , &H09 , &H7F , &H01 , &H7F ' &HF4
      101. Data &H00 , &H22 , &H4D , &H55 , &H59 , &H22 ' &HF5
      102. Data &H00 , &H08 , &H08 , &H2A , &H08 , &H08 ' &HF6
      103. Data &H00 , &H00 , &H08 , &H18 , &H18 , &H00 ' &HF7
      104. Data &H00 , &H06 , &H09 , &H09 , &H06 , &H00 ' &HF8
      105. Data &H00 , &H00 , &H08 , &H00 , &H08 , &H00 ' &HF9
      106. Data &H00 , &H00 , &H08 , &H00 , &H00 , &H00 ' &HFA
      107. Data &H00 , &H02 , &H0F , &H00 , &H00 , &H00 ' &HFB
      108. Data &H00 , &H09 , &H0F , &H05 , &H00 , &H00 ' &HFC
      109. Data &H00 , &H09 , &H0D , &H0A , &H00 , &H00 ' &HFD
      110. Data &H00 , &H3C , &H3C , &H3C , &H3C , &H00 ' &HFE
      111. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' &HFF
      Display All
    • schönes Projekt.
      Über diese Hinweise mit dem Timing bin ich auch schon mal gestolpert.

      Hatte länger nicht ins Forum geschaut und für Bascom muss ich schon fast neu anfangen ;)
      Klar habe ich versucht,
      diesen Code-Teil für die Ausgabe an die LED-Streifen in Unterfunktionen zu packen.
      Fehler im Timing traten oft auf / aber immer nur bei der ersten LED in der Kette.

      Vorerst habe ich physisch eine (im Bild unsichtbare) "Opfer-LED" an den Anfang gesetzt.
      So komme ich erst mal weiter und der Fehler ist nicht im sichtbaren Bereich.
      Meine Datenbank hat somit immer 82 Einträge für ein Bild (nicht 9x9=81),
      bis ich einen anderen Weg gefunden habe.

      2 Bits für eine Farbe waren nach einigen Experimenten/in meinem Fall mehr als genug.
      Größere Werte brachten viel zu viel Helligkeit für die LEDs.
      Die übrigen 2 Bits kann man ja evtl später beim Ausbau des Programms gebrauchen.

      Der code mit den dummy daten funktionierte auch ganz gut - die erste LED (Opfer-LED) mal ausgenommen.

      Bild2.jpg

      Source Code

      1. $regfile = "m128def.dat"
      2. $Crystal = 16000000
      3. $framesize = 32
      4. $swstack = 32
      5. $hwstack = 64
      6. Const Anzahl_neopixel = 82 'Anzahl der LEDs im Array (anpassen)
      7. Dim N As Byte
      8. Dim A As Byte
      9. Dim G(anzahl_neopixel) As Byte 'Grün-Anteil
      10. Dim R(anzahl_neopixel) As Byte 'Rot-Anteil
      11. Dim B(anzahl_neopixel) As Byte 'Blau-Anteil
      12. Dim K As Byte
      13. Dim bild_nummer As Byte
      14. Dim start_daten_adresse as Word
      15. Dim punkt_daten_adresse as Word
      16. Dim end_daten_adresse as Word
      17. Declare Sub daten_vorlegen (byval punkt_daten_adresse As Word , byval A As Byte)
      18. Declare Sub show
      19. Dim Wert As Byte
      20. Dim G_wert As Byte
      21. Dim R_wert As Byte
      22. Dim B_wert As Byte
      23. Ddrb.2 = 1 ' PortB.2 als Ausgang zur Steuerung von DI
      24. DDRA.0 = 1 'LED
      25. Reset Portb.2
      26. wait 1
      27. '***
      28. Do
      29. for bild_nummer = 0 to 7
      30. A = 1
      31. start_daten_adresse = bild_nummer * Anzahl_neopixel
      32. end_daten_adresse = start_daten_adresse + Anzahl_neopixel
      33. for punkt_daten_adresse = start_daten_adresse to end_daten_adresse
      34. call daten_vorlegen (punkt_daten_adresse,A)
      35. incr A
      36. next punkt_daten_adresse
      37. call show
      38. waitms 500
      39. if bild_nummer > 5 then waitms 350
      40. next bild_nummer
      41. loop
      42. '***
      43. sub daten_vorlegen (punkt_daten_adresse,A)
      44. Wert = LOOKUP (punkt_daten_adresse , pixels)
      45. G_Wert = 0
      46. R_Wert = 0
      47. B_Wert = 0
      48. If Wert.0 = 1 then G_Wert = 1
      49. If Wert.1 = 1 then
      50. G_Wert = G_Wert + 2
      51. end if
      52. If Wert.2 = 1 then
      53. R_Wert = 1
      54. end if
      55. If Wert.3 = 1 then
      56. R_Wert = R_Wert + 2
      57. end if
      58. If Wert.4 = 1 then
      59. B_Wert = 1
      60. end if
      61. If Wert.5 = 1 then
      62. B_Wert = B_Wert + 2
      63. end if
      64. G(A) = G_Wert
      65. R(A) = R_Wert
      66. B(A) = B_Wert
      67. end sub
      68. '***
      69. sub show
      70. For N = 1 To Anzahl_neopixel
      71. If G(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      72. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      73. If G(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      74. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      75. If G(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      76. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      77. If G(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      78. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      79. If G(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      80. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      81. If G(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      82. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      83. If G(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      84. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      85. If G(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      86. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      87. If R(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      88. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      89. If R(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      90. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      91. If R(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      92. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      93. If R(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      94. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      95. If R(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      96. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      97. If R(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      98. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      99. If R(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      100. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      101. If R(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      102. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      103. If B(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      104. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      105. If B(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      106. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      107. If B(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      108. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      109. If B(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      110. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      111. If B(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      112. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      113. If B(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      114. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      115. If B(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      116. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      117. If B(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      118. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      119. Next n
      120. reset portB.2 'T_RST = Lo = RESET = 10000 ns
      121. waitus 50
      122. end sub
      123. End
      124. '***
      Display All


      port
      -------------
    • Daten im angehängten Text

      Auszug:
      ----
      pixels:


      Data &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 'Bild 0
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00

      Data &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 'Bild 1
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_01 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00
      Data &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00 , &B00_00_00_00

      ....

      ------

      hat noch gefehlt a_45_132ca9f5
      ---
      port
      Files
      • daten.txt

        (11.19 kB, downloaded 4 times, last: )
    • Wie es der Zufall will - hatte ich für den 3D-Drucker einige STL-Dateien gebastelt.
      Es sind STL-Dateien für den Druck eines Gehäuses für einen Art LED-Monitor
      (WS2812b-LED-Streifen und einem Atmega128-Board vielleicht passt es jemanden gerade).
      Etwas Zubehör ist zum Teil optional oder kann man sich besorgen.
      Ich hänge es mal an (Gebrauch nur für nicht kommerzielle Zwecke).


      Bild3.jpg

      ws2812b.zip

      port
    • Das Beispiel von oben etwas aufgeräumter und auf das Wesentliche reduziert...
      Nach wenigen Änderung sollte man schauen, ob die Anzeige noch funktioniert.
      Witzigerweise kann es davon abhängen,
      ob z.B. die ansich unbenutzte Variable "k" in der Quelle mitführt oder nicht.


      Ich denke, ich schaue mir bei Gelegenheit die Geschichte
      mit der Rainbow.lib mal an.

      port


      Source Code

      1. $regfile = "m128def.dat"
      2. $Crystal = 16000000
      3. $framesize = 16
      4. $swstack = 16
      5. $hwstack = 32
      6. Const Anzahl_neopixel = 82 'Anzahl der LEDs im Array (anpassen)
      7. Dim N As Byte
      8. Dim A As Byte
      9. Dim G(anzahl_neopixel) As Byte 'Grün-Anteil
      10. Dim R(anzahl_neopixel) As Byte 'Rot-Anteil
      11. Dim B(anzahl_neopixel) As Byte 'Blau-Anteil
      12. Dim K As Byte
      13. Dim bild_nummer As Byte
      14. Dim start_daten_adresse as Word
      15. Dim punkt_daten_adresse as Word
      16. Dim end_daten_adresse as Word
      17. Declare Sub daten_vorlegen ()
      18. Declare Sub show ()
      19. Dim Wert As Byte
      20. Dim G_wert As Byte
      21. Dim R_wert As Byte
      22. Dim B_wert As Byte
      23. Ddrb.2 = 1 ' PortB.2 als Ausgang zur Steuerung von DI
      24. Reset Portb.2
      25. wait 1
      26. Do
      27. for bild_nummer = 0 to 5
      28. A = 1
      29. start_daten_adresse = bild_nummer * Anzahl_neopixel
      30. end_daten_adresse = start_daten_adresse + Anzahl_neopixel
      31. for punkt_daten_adresse = start_daten_adresse to end_daten_adresse
      32. call daten_vorlegen
      33. incr A
      34. next punkt_daten_adresse
      35. call show
      36. waitms 300
      37. next bild_nummer
      38. loop
      39. sub daten_vorlegen
      40. Wert = LOOKUP (punkt_daten_adresse , pixels)
      41. G_Wert = 0
      42. R_Wert = 0
      43. B_Wert = 0
      44. If Wert.0 = 1 then G_Wert = 1
      45. If Wert.1 = 1 then G_Wert = G_Wert + 2
      46. If Wert.2 = 1 then R_Wert = 1
      47. If Wert.3 = 1 then R_Wert = R_Wert + 2
      48. If Wert.4 = 1 then B_Wert = 1
      49. If Wert.5 = 1 then B_Wert = B_Wert + 2
      50. G(A) = G_Wert
      51. R(A) = R_Wert
      52. B(A) = B_Wert
      53. end sub
      54. sub show
      55. For N = 1 To Anzahl_neopixel
      56. If G(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      57. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      58. If G(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      59. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      60. If G(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      61. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      62. If G(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      63. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      64. If G(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      65. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      66. If G(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      67. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      68. If G(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      69. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      70. If G(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      71. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      72. If R(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      73. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      74. If R(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      75. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      76. If R(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      77. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      78. If R(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      79. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      80. If R(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      81. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      82. If R(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      83. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      84. If R(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      85. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      86. If R(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      87. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      88. If B(n).7 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      89. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      90. If B(n).6 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      91. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      92. If B(n).5 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      93. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      94. If B(n).4 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      95. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      96. If B(n).3 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      97. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      98. If B(n).2 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      99. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      100. If B(n).1 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      101. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      102. If B(n).0 = 0 Then : Set Portb.2 : Nop : Nop : Nop : Reset Portb.2
      103. Else : Set Portb.2 : Nop : Nop : Nop : Nop : Nop : Nop : Reset Portb.2 : End If
      104. Next n
      105. reset portB.2 'T_RST = Lo = RESET = 10000 ns
      106. waitus 100
      107. end sub
      108. End
      109. pixels:
      110. Data &H00
      111. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 'Bild 0
      112. Data &H00 , &H00 , &H00 , &H01 , &H01 , &H01 , &H00 , &H00 , &H00
      113. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      114. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      115. Data &H00 , &H00 , &H01 , &H01 , &H01 , &H01 , &H01 , &H00 , &H00
      116. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      117. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      118. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      119. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      120. Data &H00
      121. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 'Bild 1
      122. Data &H00 , &H00 , &H01 , &H01 , &H01 , &H01 , &H00 , &H00 , &H00
      123. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      124. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      125. Data &H00 , &H00 , &H01 , &H01 , &H01 , &H01 , &H00 , &H00 , &H00
      126. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      127. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      128. Data &H00 , &H00 , &H01 , &H01 , &H01 , &H01 , &H00 , &H00 , &H00
      129. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      130. Data &H00
      131. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 'Bild 2
      132. Data &H00 , &H00 , &H00 , &H01 , &H01 , &H01 , &H00 , &H00 , &H00
      133. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      134. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      135. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      136. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      137. Data &H00 , &H00 , &H01 , &H00 , &H00 , &H00 , &H01 , &H00 , &H00
      138. Data &H00 , &H00 , &H00 , &H01 , &H01 , &H01 , &H00 , &H00 , &H00
      139. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      140. Data &H00
      141. Data &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 'Bild 3
      142. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      143. Data &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01
      144. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      145. Data &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01
      146. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      147. Data &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01
      148. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      149. Data &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01 , &H01
      150. Data &H00
      151. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11 'Bild 4
      152. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11
      153. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11
      154. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11
      155. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11
      156. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11
      157. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11
      158. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11
      159. Data &H15 , &H04 , &H10 , &H01 , &H14 , &H10 , &H04 , &H01 , &H11
      160. Data &H00
      161. Data &H05 , &H05 , &H05 , &H05 , &H05 , &H05 , &H05 , &H05 , &H05 'Bild 5
      162. Data &H05 , &H05 , &H05 , &H05 , &H05 , &H05 , &H05 , &H05 , &H05
      163. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      164. Data &H00 , &H15 , &H15 , &H15 , &H00 , &H10 , &H10 , &H10 , &H00
      165. Data &H00 , &H15 , &H15 , &H15 , &H00 , &H10 , &H10 , &H10 , &H00
      166. Data &H00 , &H15 , &H15 , &H15 , &H00 , &H10 , &H10 , &H10 , &H00
      167. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      168. Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
      169. Data &H10 , &H10 , &H10 , &H04 , &H04 , &H04 , &H01 , &H01 , &H01
      Display All
    • Vielleicht wäre es für mich ein schönes "Hello World project" ...
      mal ein ganz klein wenig Assembler selber zu probieren.
      Damit ich auch ein erreichbares Ziel für mich habe,
      soll ein separater AVR die am PortC angelegten Bytes (ein Byte dann pro LED)
      in einem guten Timing an die WS2812b- Kette weitergeben.
      Ich denke, dass man das mal irgendwie hinbekommen kann.

      Source Code

      1. ' R16, R17, R18, R19
      2. '-----------------------------
      3. $Regfile="m328pdef.dat"
      4. $Crystal=10000000
      5. $hwstack=10
      6. $swstack=10
      7. $framesize=10
      8. '-----------------------------
      9. $ASM
      10. init:
      11. SBI DDRB,2 ' B2 als Ausgang fuer Bitstream WS2812b
      12. CBI DDRB,0 ' B0 als Eingang (neues Byte liegt an)
      13. SBI DDRB,1 ' B1 als Ausgang
      14. SBI PORTB,1 ' Signal an anderen AVR -> Byte bitte an PORTC legen
      15. 'ges. PORC als Input -> die unteren 6 Pins nur verwertet
      16. loop:
      17. SBIS PIND,0 ' ueberspringe das naechste /
      18. ' so lange zu loop bis PINB.0 = 1 / Start Uebertragung
      19. rjmp loop
      20. CBI PORTB,1 ' erstmal nicht bereit fuer naechstes Byte (2 Takte)
      21. in R16,PINC ' Pins an PortC einlesen in Register 16 (1 Takt)
      22. '------------------------------------------------------
      23. SBI PORTB, 2 ' schon mal ein "High" ausgeben in Richtung WS2812b fuer
      24. ' das 8.Bit vom ersten Farbbyte -> fuer ab jetzt vier Takte (400ns)
      25. BST R16, 0 ' das Bit 0 als T- Flag (1. Takt)
      26. BLD R17, 0 ' das T-Flag als Bit 0 in R17 (2. Takt)
      27. CBI PORTB, 2 ' gleich wieder "low" in Richtung WS2812b -> (3.und 4.Takt)
      28. ' -> die oberen Bits pro Farbe sollen ohnehin "0" bleiben (viel zu hell)
      29. ' -> fuer 8 Takte Zeit (800ns)
      30. BST R16, 1 ' das Bit 1 als T- Flag (1.Takt)
      31. BLD R17, 1 ' das T-Flag als Bit 1 in R17 (2.Takt)
      32. BST R16, 2 ' das Bit 2 als T- Flag (3.Takt)
      33. BLD R18, 0 ' das T-Flag als Bit 0 in R18 (4.Takt)
      34. BST R16, 3 ' das Bit 3 als T- Flag (5.Takt)
      35. BLD R18, 1 ' das T-Flag als Bit 1 in R18 (6.Takt)
      36. '-----------------------------------------------------
      37. SBI PORTB, 2 ' wieder ein "High" ausgeben in Richtung WS2812b fuer das
      38. ' 7.Bit vom ersten Farbbyte -> fuer wieder vier Takte (400ns)
      39. BST R16, 4 ' das Bit 4 als T- Flag (1. Takt)
      40. BLD R19, 0 ' das T-Flag als Bit 0 in R19 (2. Takt)
      41. CBI PORTB, 2 ' gleich wieder "low" in Richtung WS2812b -> (3.und 4.Takt)
      42. ' -> die oberen Bits pro Farbe sollen ohnehin "0" bleiben (viel zu hell)
      43. ' -> fuer 8 Takte Zeit (800ns)
      44. BST R16, 5 ' das Bit 5 als T- Flag (1. Takt)
      45. BLD R19, 1 ' das T-Flag als Bit 1 in R19 (2. Takt)
      46. SBI PORTB,1 ' Signal an ersten/anderen AVR -> neues Byte koennte
      47. ' ausgesucht/angelegt werden (3. und 4.Takt)
      48. '......
      49. '......
      50. '......
      51. '-------------------------------------------------------
      52. rjmp loop 'alles wieder von Loop an
      53. $End ASM
      54. end
      Display All


      Aller erste Schritte haben gezeigt, dass schon mit der Ausgabe der ersten (2 von 24) Bits
      ein paar wichtige Schritte erledigt werden konnten (für meinen Fall)...
      Die relevanten Teile des Eingangs-Bytes wurden auf die Register R17-R19 aufgeteilt
      und ein Signal ging an den ersten AVR, dass das nächste Byte schon mal vorbereitet und
      angelegt werden könnte.

      Grüße
      Port
    • Das Strickmuster noch für die reellen Bits (gewonnen aus R17,R18 und R19) exemplarisch hier für Bit1 und Bit0 eines Bytes. a_217_27b18bee

      Source Code

      1. '-----
      2. '------------------------
      3. SBI PORTB, 2 ' high für das Bit1 des ersten Eingangs-Bytes (2 Takte)
      4. NOP ' níx (1. Takt nach "high")
      5. sbrS R17,1 ' ueberspringe wenn Bit1 von R17 = 1 (2. Takt)
      6. CBI PORTB, 2 ' low (3. und 4.Takt) -> wenn Bit1 von R17=0
      7. nop ' 3. oder 5.Takt
      8. SBRC R17,1 ' ueberspringe wenn Bit1 von R17 = 0 (4.oder 6.Takt)
      9. CBI PORTB, 2 ' low (5. und 6.Takt) -> wenn Bit1 von R17=1
      10. NOP ' 7. Takt
      11. NOP ' 8. Takt
      12. NOP 9. Takt
      13. NOP 10.Takt
      14. '------------------------
      15. SBI PORTB, 2 ' high für das Bit0 des ersten Eingangs-Bytes (2 Takte)
      16. NOP ' níx (1. Takt nach "high" )
      17. sbrS R17,0 ' ueberspringe wenn Bit0 von R17 = 1 (2. Takt)
      18. CBI PORTB, 2 ' low (3. und 4.Takt) -> wenn Bit0 von R17=0
      19. nop ' 3. oder 5.Takt
      20. SBRC R17,0 ' ueberspringe wenn Bit0 von R17 = 0 (4.oder 6.Takt)
      21. CBI PORTB, 2 ' low (5. und 6.Takt) -> wenn Bit0 von R17=1
      22. NOP ' 7. Takt
      23. NOP ' 8. Takt
      24. NOP 9. Takt
      25. NOP 10.Takt
      26. '------------------------
      27. '-----
      Display All



      SBIS PIND,0 sollte "SBIS PINB,0" werden (zeile 23 im vorherigen Beitrag)
      war für ein 10MHz- Quarz a_38_b45e201d

      Grüße
      port
    • Nicht der schnellste gewinnt.
      Ein paar NOPs habe ich noch hineingepackt (siehe Oszi-Bild).
      1300ns ges. (400+900 bzw. 900+400) pro Bit.

      Bild5.jpg

      Die Zählweise für die Takte ist nicht ganz ok (bei "CBI PORTB, 2" und "SBI PORTB, 2"),
      da offenbar der Signalwechsel bei diesen 2 Taktanweisungen zwischen den beiden Takten liegt.
      Der Code ist nur auszugsweise - ist ja ohnehin zu speziell.
      Evtl. muss geprüft werden, ob beim Sprung vom 24.Bit zum ersten Bit die zus. 7 Takte stören

      Source Code

      1. ' R16, R17, R18, R19
      2. '-----------------------------
      3. $Regfile="m328pdef.dat"
      4. $Crystal=10000000
      5. $hwstack=10
      6. $swstack=10
      7. $framesize=10
      8. '-----------------------------
      9. $ASM
      10. init:
      11. SBI DDRB,2 ' B2 als Ausgang fuer Bitstream WS2812b
      12. CBI DDRB,0 ' B0 als Eingang (neues Byte liegt an)
      13. SBI DDRB,1 ' B1 als Ausgang
      14. SBI PORTB,1 ' Signal an anderen AVR -> Byte bitte an PORTC legen
      15. 'ges. PORC als Input -> die unteren 6 Pins nur verwertet
      16. loop:
      17. SBIS PINB,0 ' ueberspringe das naechste /
      18. ' so lange zu loop bis PINB.0 = 1 / Start Uebertragung (2 Takte)
      19. rjmp loop
      20. CBI PORTB,1 ' erstmal nicht bereit fuer naechstes Byte (2 Takte)
      21. in R16,PINC ' Pins an PortC einlesen in Register 16 (1 Takt)
      22. '------------------------------------------------------
      23. SBI PORTB, 2 ' schon mal ein "High" ausgeben in Richtung WS2812b fuer
      24. ' das 8.Bit vom ersten Farbbyte -> fuer ab jetzt vier Takte (400ns)
      25. BST R16, 0 ' das Bit 0 als T- Flag (1. Takt)
      26. BLD R17, 0 ' das T-Flag als Bit 0 in R17 (2. Takt)
      27. CBI PORTB, 2 ' gleich wieder "low" in Richtung WS2812b -> (3.und 4.Takt)
      28. ' -> die oberen Bits pro Farbe sollen ohnehin "0" bleiben (viel zu hell)
      29. ' -> fuer 9 Takte Zeit (900ns)
      30. BST R16, 1 ' das Bit 1 als T- Flag (1.Takt)
      31. BLD R17, 1 ' das T-Flag als Bit 1 in R17 (2.Takt)
      32. BST R16, 2 ' das Bit 2 als T- Flag (3.Takt)
      33. BLD R18, 0 ' das T-Flag als Bit 0 in R18 (4.Takt)
      34. BST R16, 3 ' das Bit 3 als T- Flag (5.Takt)
      35. BLD R18, 1 ' das T-Flag als Bit 1 in R18 (6.Takt)
      36. NOP ' 7.Takt
      37. '-----------------------------------------------------
      38. SBI PORTB, 2 ' wieder ein "High" ausgeben in Richtung WS2812b fuer das
      39. ' 7.Bit vom ersten Farbbyte -> fuer wieder vier Takte (400ns)
      40. BST R16, 4 ' das Bit 4 als T- Flag (1. Takt)
      41. BLD R19, 0 ' das T-Flag als Bit 0 in R19 (2. Takt)
      42. CBI PORTB, 2 ' gleich wieder "low" in Richtung WS2812b -> (3.und 4.Takt)
      43. ' -> die oberen Bits pro Farbe sollen ohnehin "0" bleiben (viel zu hell)
      44. ' -> fuer 9 Takte Zeit (900ns)
      45. BST R16, 5 ' das Bit 5 als T- Flag (1. Takt)
      46. BLD R19, 1 ' das T-Flag als Bit 1 in R19 (2. Takt)
      47. SBI PORTB,1 ' Signal an ersten/anderen AVR -> neues Byte koennte
      48. ' ausgesucht/angelegt werden (3. und 4.Takt)
      49. NOP ' ...... 5.
      50. NOP ' ...... 6.
      51. NOP ' 7.
      52. '-----------------------------------------------------
      53. '....
      54. '.....
      55. 'zum senden einer "null" (evtl fuer die oberen Bits)
      56. SBI PORTB, 2
      57. NOP
      58. NOP
      59. CBI PORTB, 2
      60. NOP
      61. NOP
      62. NOP
      63. NOP
      64. NOP
      65. NOP
      66. NOP
      67. '......................
      68. ' zum senden einer "eins" wenn gebraucht
      69. SBI PORTB, 2
      70. NOP
      71. NOP
      72. NOP
      73. NOP
      74. NOP
      75. NOP
      76. NOP
      77. CBI PORTB, 2
      78. NOP
      79. NOP
      80. '___________________________________________________
      81. ' ein aus den Registern (R17,R18,R19) gelesenes Bit
      82. ' hier das Bit0 aus R18 als Beispiel
      83. SBI PORTB, 2
      84. NOP
      85. sbrS R18,0
      86. CBI PORTB, 2
      87. NOP
      88. nop
      89. NOP
      90. SBRC R18,0
      91. CBI PORTB, 2
      92. NOP
      93. NOP
      94. '___________________________________________________
      95. ' ein zweites aus den Registern (R17,R18,R19) gelesenes Bit
      96. ' hier das Bit1 aus R19 als Beispiel
      97. SBI PORTB, 2
      98. NOP
      99. sbrS R19,1
      100. CBI PORTB, 2
      101. NOP
      102. nop
      103. NOP
      104. SBRC R19,1
      105. CBI PORTB, 2
      106. NOP
      107. NOP
      108. ' beim Uebergang vom 24.Bit zum 1. sind es zus. 7 Low-Takte - stoeren hoffentlich nirgendwo
      109. rjmp loop ' nach Loop
      110. $End ASM
      111. end
      Display All



      Grüße
      port
    • zu guter Letzt ...

      die zusätzlichen Takte (zwischen 24. und 1. Bit) konnte ich noch auf "2" drücken...

      Bild4.jpg

      .. und ja ...im Nachhinein:
      Der Code für den separaten "Controller" wäre so auch ohne die Register (R17-R19) ausgekommen.
      Ursprünglich war es wohl der Gedanke, dass weitere (innere) Schleifen abgearbeitet werden sollten.
      Aber ich lasse es jetzt mal so.

      Der Code ges.


      Source Code

      1. ' R16, R17, R18, R19, R20
      2. '-----------------------------
      3. $Regfile="m328pdef.dat"
      4. $Crystal=10000000
      5. $hwstack=10
      6. $swstack=10
      7. $framesize=10
      8. '-----------------------------
      9. $ASM
      10. init:
      11. SBI DDRB,2 ' B2 als Ausgang fuer Bitstream WS2812b
      12. CBI DDRB,0 ' B0 als Eingang (neues Byte liegt an)
      13. SBI DDRB,1 ' B1 als Ausgang
      14. SBI PORTB,1 ' Signal an anderen AVR -> Byte bitte an PORTC legen
      15. 'ges. PORC als Input -> die unteren 6 Pins nur verwertet
      16. loop:
      17. SBIS PINB,0 ' ueberspringe das naechste oder
      18. ' so lange zu loop bis PINB.0 = 1 / Start Uebertragung
      19. rjmp loop
      20. SBI PORTB, 2 ' schon mal ein "High" ausgeben in Richtung WS2812b
      21. CBI PORTB, 1 ' erstmal nicht bereit fuer naechstes Byte (2 Takte) an ersten AVR
      22. CBI PORTB, 2 ' gleich wieder "low" in Richtung WS2812b
      23. in R16,PINC ' Pins an PortC einlesen in Register 16 (1 Takt)
      24. BST R16, 0 ' das Bit 0 als T- Flag (1 Takt)
      25. BLD R17, 0 ' das T-Flag als Bit 0 in R17 (1 Takt)
      26. BST R16, 1 ' das Bit 1 als T- Flag (1 Takt)
      27. BLD R17, 1 ' das T-Flag als Bit 1 in R17 (1 Takt)
      28. BST R16, 2 ' das Bit 2 als T- Flag (1 Takt)
      29. BLD R18, 0 ' das T-Flag als Bit 0 in R18 (1 Takt)
      30. SBI PORTB, 2 ' wieder ein "High" ausgeben in Richtung WS2812b fuer das
      31. ' das 7.Bit vom ersten Farbbyte
      32. BST R16, 3 ' das Bit 3 als T- Flag (1 Takt)
      33. BLD R18, 1 ' das T-Flag als Bit 1 in R18 (1 Takt)
      34. CBI PORTB, 2 ' gleich wieder "low" in Richtung WS2812b
      35. BST R16, 4 ' das Bit 4 als T- Flag (1 Takt)
      36. BLD R19, 0 ' das T-Flag als Bit 0 in R19 (1 Takt)
      37. BST R16, 5 ' das Bit 5 als T- Flag (1 Takt)
      38. BLD R19, 1 ' das T-Flag als Bit 1 in R19 (1 Takt)
      39. SBI PORTB, 1 ' Signal an ersten AVR - das naechste Byte koennte bereitgestellt werden
      40. NOP
      41. 'NOP
      42. clr R20 'R20 -> clear '(1 Takt)
      43. '----------
      44. Nullen_senden_01:
      45. SBI PORTB, 2
      46. NOP
      47. NOP
      48. CBI PORTB, 2
      49. NOP '
      50. NOP
      51. NOP
      52. 'NOP
      53. 'NOP
      54. 'NOP
      55. 'NOP
      56. INC R20 '(1 Takt)
      57. cpi R20, 4 ' vergleiche R20 mit 4 (1 Takt) --> 4 x Senden einer "Null"
      58. brne Nullen_senden_01 ' bleib in der Schleife wenn R20 nicht 4 (1 Takt)
      59. NOP ' ist richtig an der Stelle hier
      60. '--
      61. 'Bit1 aus R17 gelesenes Bit
      62. SBI PORTB, 2
      63. NOP
      64. sbrS R17,1
      65. CBI PORTB, 2
      66. NOP
      67. nop
      68. NOP
      69. SBRC R17,1
      70. CBI PORTB, 2
      71. NOP
      72. NOP
      73. 'Bit0 aus R17 gelesenes Bit
      74. SBI PORTB, 2
      75. NOP
      76. sbrS R17,0
      77. CBI PORTB, 2
      78. NOP
      79. nop
      80. NOP
      81. SBRC R17,0
      82. CBI PORTB, 2
      83. NOP
      84. 'NOP -> um im Takt zu bleiben
      85. '------------- erstes Farbbyte Ende --------------------------------
      86. clr R20 'R20 -> clear '(1 Takt)
      87. '----------
      88. Nullen_senden_02:
      89. SBI PORTB, 2
      90. NOP
      91. NOP
      92. CBI PORTB, 2
      93. NOP
      94. NOP
      95. NOP
      96. 'NOP
      97. 'NOP
      98. 'NOP
      99. 'NOP
      100. INC R20 ' (1 Takt)
      101. cpi R20, 6 ' vergleiche R20 mit 6 (1 Takt) -->
      102. ' 6 x Senden einer "Null"
      103. brne Nullen_senden_02 ' bleib in der Schleife wenn R20 nicht 6 (1 Takt)
      104. NOP ' ist richtig an der Stelle hier
      105. '--
      106. SBI PORTB, 2
      107. NOP
      108. sbrS R18,1
      109. CBI PORTB, 2
      110. NOP
      111. nop
      112. NOP
      113. SBRC R18,1
      114. CBI PORTB, 2
      115. NOP
      116. NOP
      117. '--
      118. SBI PORTB, 2
      119. NOP
      120. sbrS R18,0
      121. CBI PORTB, 2
      122. NOP
      123. nop
      124. NOP
      125. SBRC R18,0
      126. CBI PORTB, 2
      127. NOP
      128. 'NOP -> um im Takt zu bleiben
      129. '--
      130. '------------- zweites Farbbyte Ende --------------------------------
      131. clr R20 'R20 -> clear '(1 Takt)
      132. '----------
      133. Nullen_senden_03:
      134. SBI PORTB, 2
      135. NOP
      136. NOP
      137. CBI PORTB, 2
      138. NOP '
      139. NOP
      140. NOP
      141. 'NOP
      142. 'NOP
      143. 'NOP
      144. 'NOP
      145. INC R20 ' (1 Takt)
      146. cpi R20, 6 ' vergleiche R20 mit 6 (1 Takt) -->
      147. ' 6 x Senden einer "Null"
      148. brne Nullen_senden_03 ' bleib in der Schleife wenn R20 nicht 6 (1 Takt)
      149. NOP ' ist richtig an der Stelle hier
      150. '--
      151. ' fuer das letzte von 24 Bits
      152. ' zwei NOPs weniger
      153. SBI PORTB, 2
      154. NOP
      155. sbrS R19,1
      156. CBI PORTB, 2
      157. NOP
      158. nop
      159. NOP
      160. SBRC R19,1
      161. CBI PORTB, 2
      162. NOP
      163. NOP
      164. '--
      165. SBI PORTB, 2
      166. NOP
      167. sbrS R19,0
      168. CBI PORTB, 2
      169. NOP
      170. nop
      171. NOP
      172. SBRC R19,0
      173. CBI PORTB, 2
      174. 'NOP damit nur 2 Takte mehr zwischen Bit24 und Bit1
      175. 'NOP damit nur 2 Takte mehr zwischen Bit24 und Bit1
      176. '___________________________________________________
      177. rjmp loop ' nach Loop
      178. $End ASM
      179. end
      Display All

      Ich muss ja dann auch mal wieder
      Grüße
      port
    • Für den AVR, welcher die Bytes ja ohne Stress dann an den Controller senden soll,
      macht es Sinn, dass die Daten dafür schon fix und fertig im Speicher liegen.
      (Für jede LED ein Byte im "Format xxGGRRBB")
      64 mögliche Farben sind eine klare Einschränkung - für Buchstaben, Symbole wird es aber allemal langen.
      Für wenige Zeichen/Symbole haben meine normalen Bordmittel zunächst ausgereicht.

      Das 8-Bit-BMP (256 Farben) im angeh. Zip hat für diesen Fall ausgesuchte Farben in seiner Palette.
      Gemaltes oder hineinkopiertes nimmt aut. die Palettenfarben von dem BMP an.
      Beim speichern im TGA-Format (24Bit) dann werden exakt diese Farbwerte auf das 24Bit-RGB Format gezogen.
      Mein (Grafik-) Programm schreibt die Bilddaten von links n. rechts / unten n. oben.
      Habe gerade in einem Wiki zum Dateiformat auch andere Möglichkeiten gesehen.

      Bild1.jpg

      Mit einem Hexeditor (evtl. dafür eine komfortable Ansicht wählen - > z.B. 18 Byte in einer Reihe)
      kann man sich das Filetstück auf ein "Excel-Rechenblatt" übertragen.
      Mit ein paar gegoogelten Formeln kommt man (selbst mit Umsortierung der Farben RG->GR) zu den Endwerten.
      (siehe auch Anhang)

      port


      hex.zip
    • Anbei die fertige "Studie" -> macht Mut, das ganze mal auf größere Fläche zu ziehen

      doppeldecker.jpg


      - zwei Platinen gleicher Bauart im Doppelpack (siehe Bild)
      - beide sind jetzt mit einem 20MHz Quarz bestückt und sind steckbar miteinander verbunden

      Was ist 1:1 verbunden ?
      - Die Versorgungsspannung
      - die Pins PB0-PB3 (wobei hier nur PB0 und PB1 gerade verwendet werden)
      - PC0-PC5 (PC6 nicht verbinden!-> Reset)

      Die untere Platine - ab jetzt hier "Controller" genannt,
      liefert exakte Takte zu einer WS2812b- Kette im Schema (900ns/400ns für eine "1" oder 400ns/900s für eine "0")
      zum nahtlosen ansteuern von LEDs in einer Kette > theoretisch unendlich lang
      1300ns x 24 = 31,2 µs (mikrosekunden) pro LED
      Den Ausgang dafür habe ich jetzt auf PD0 gelegt - dort war ursprünglich die Bestückung einer LED vorgesehen
      (der Platz für den Vorwiderstand der LED ist gebrückt)

      ws2812b_copro_20MHz_forum_end.bas


      - Die obere Platine ist in dem Beispiel der "Sender" und liefert die Bytes
      an den Controller im Format xxBBRRGG also 6 Bit pro LED für 64 mögliche Farben
      Dabei hat der AVR für den Sender genügend Luft, sich die Bytes zu holen oder zu errechnen
      Der Code ist ein Beispiel und mein erster Stresstest ->
      20000 "Diawechsel" in ca.14 sec-> und dann mit geringen Tempo ein paar Diawechsel für einen Check,
      ob alles noch ok ist und die Kette noch funktioniert

      ws2812b_sender_20MHz_forum_lookup.bas

      '--------------

      - worüber bin ich gestolpert:

      Der Einschaltmoment: Die Situation beim Start der AVRs war nicht immer mit dem gleichen Ergebnis
      -> ein paar Wartemomente sind dazugekommen beim Start
      EMV, EMV, EMV -> aus Hilflosigkeit hier und da ein paar "Angstkondensatoren" hinzugefügt
      der Knackpunkt waren aber die hochohmigen Eingänge (PB0-PB1) und die rel. hohe Quarzfrequenz
      wahrscheinlich im Zusammenspiel auch mit den Hochfahrverhalten der AVRs.
      Zwei angelötete Widerstände in Richtung Masse (6,8K) an PB0 und PB1 haben dem Spuk ein Ende gesetzt
      (alles zwischen 2,7k und 50k hätte es bestimmt auch getan)
      Einfacher wäre es wohl gewesen, die internen Pull-ups zuzuschalten und auf ein "Low" (statt "High")
      zu lauern in der Software a_67_e210de67

      port