Rainbow/WS2812

    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!

    • Rainbow/WS2812

      Hallo liebe Gemeinde.
      Ich bin schon etliche Jahre leser dieses Forums.
      Nun habe ich mal ein Problem mit dem Rainbow-Programm aus dem Lexikon.
      Ich will mich mit dem Leds WS2812 beschäftigen und das Programm verstehen.Leider lässt es sich nicht kompilieren
      Was mache ich falsch bzw wo liegt mein Fehler.
      als Fehlermeldung kommt dann:
      Error : 211 Line : 40 External routine not found [WS2812B] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas
      Error : 61 Line : 30 Label not found [SELECT_RAINBOWBSC] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas
      Error : 61 Line : 30 Label not found [SELECT_RAINBOWBSC] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas
      Error : 61 Line : 35 Label not found [SETCOLOR] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas
      Error : 61 Line : 35 Label not found [SETCOLOR] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas
      Error : 61 Line : 36 Label not found [SEND] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas
      Error : 61 Line : 36 Label not found [SEND] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas

      Source Code

      1. ' LED WS2812
      2. $regfile = "m88def.dat"
      3. $crystal = 16000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. '----[IMPLEMENT RAINBOW]--------------------------------------------------------
      8. $lib "Rainbowbsc.lib"
      9. $external Ws2812b
      10. Declare Sub Select_rainbowbsc(byval Channel As Byte)
      11. Declare Sub Setcolor(byval Lednr As Word , Color() As Byte)
      12. Declare Sub Send()
      13. '#Rainbow0
      14. Const Rainbowbsc0_len = 1 'just 1 Led
      15. Const Rainbowbsc0_port = Portb
      16. Const Rainbowbsc0_pin = Pb0
      17. 'Global Color-variables
      18. Dim Color(3) As Byte
      19. R Alias Color(_base) : G Alias Color(_base + 1) : B Alias Color(_base + 2)
      20. '----[MAIN]--------------------------------------------------------------------
      21. Call Select_rainbowbsc(0) 'select Rainbow
      22. Do
      23. R = not R'alternately red and dark
      24. Call Setcolor(0 , Color())
      25. Call Send()
      26. Waitms 500
      27. Loop
      28. End
      Display All
    • Hallo, Du deklarierst sub's und rufst sie auf, aber keine sub ist vorhanden.
      Sub Select_rainbowbsc(byval Channel As Byte)
      mach was
      End Sub
      Sub Setcolor(byval Lednr As Word , Color() As Byte)
      mach was
      End Sub
      Sub Send()
      mach was
      End Sub
      und
      $external Ws2812b
      ist ein Zugriff auf externes Programm, was wahrscheinlich nicht da ist.
      mfg
    • Hallo Walter.
      Das programm ist hier aus dem lexikon.sollte also funktionieren.
      Habe jetzt auf 2085 upgedatet.
      Jetzt ist nur noch eine Meldung da.

      Error : 211 Line : 40 External routine not found [WS2812B] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas
      So,jetzt weiß ich nicht wo ich nach Led-ws2812 suchen soll bzw.wie ich das teil von irgendwo dort hin kriege.
    • Andreas.Stortz wrote:

      Das programm ist hier aus dem lexikon.sollte also funktionieren.

      Error : 211 Line : 40 External routine not found [WS2812B] , in File : C:\Users\Andreas\Documents\LED-WS2812.bas
      So,jetzt weiß ich nicht wo ich nach Led-ws2812 suchen soll bzw.wie ich das teil von irgendwo dort hin kriege.

      Das tut es bestimmt auch (wenn man die alte Lib verwendet)!
      Wie dir aber vielleicht entgangen ist, hieß die damalige Lib anders wie die aktuellen!
      Das bedeutet, es gab Änderungen bezüglich der Lib.

      Bei mir funktioniert das Beispiel auch nicht mit der neuen Lib. (Gleiche Fehlermeldung wie bei dir.)

      Wie gesagt, die neue Lib hat sich geändert, besser gesagt weiter entwickelt.

      Die neue Lib musst du z.B. nicht mehr explizit mit $Lib "" einbinden.
      Statt dessen solltest du die Anweisung "Config Rainbow ..." nutzen. Da werden dann auch die notwendigen Konstanten für die Pins und Anzahl LED's gleich mit festgelegt.

      Dann wurden die Rainbow-Anweisungen alle umbenannt und haben jetzt das Prefix "RB_" wie z.B. RB_Send oder RB_ClearStripe.

      Da muss auch nichts mit $External deklariert werden.

      Du solltest einen Blick in die Bascom-Hilfe riskieren. Dort findest du alle alle Anweisungen aufgelistet (RB_...).

      Verwende die Beispiele in der Bascom-Hilfe oder die aus dem Samples-Verzeichnis im Unter-Ordner "WS2812".
      Dann sollte es auch klappen.
    • Danke erstmal.Werde ich mir anschauen und probieren.
      Da stellt sich mir aber jetzt mal die Frage,Warum macht man eine neue Lib?
      Ich als Neuling in der Beziehung,kann da ohne ein Beispiel gar nichts anfangen damit.Also wären solche Sachen rausa bei mir.Weil wenn ich es nicht nachvollziehen kann lass ich es sein.Und ich denke mal,das geht jedem Neuling und Anfänger so.
    • Andreas.Stortz wrote:

      Da stellt sich mir aber jetzt mal die Frage,Warum macht man eine neue Lib?
      Zum einen um Fehler zu beseitigen und zum anderen damit es nicht langweilig wird :)
      Am Anfang von der Rainbow.Lib musste man noch alles selber im Programm einfügen und jetzt geht es sehr komfortabel über das Config.
      Veränderungen haben auch was Gutes.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Andreas.Stortz wrote:

      Greift das dann automatisch auf die Lib zu ?
      Ja klar greift das Config auf die LIB zurück bzw. wird diese automatisch mit ins Programm eingebunden.
      Und der Unterschied der beiden LIBs, wenn ich es richtig gelesen hab, liegt in der LED. Die LIB BSCN ist auch für RGBW-LEDs.
      Aber am Ende spielt das ja nicht wirklich eine Rolle, welche LIB genommen wird.
      Wenn es damit einen Fehler geben sollte, zeigt dir Bascom in welcher LIB dieser ist.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Das ist einfach historisch gewachsen, zuerst war die lib halt eine von Galahat aus freien stücken erstelle lib welche wie jede selbst erstellte mehr manuelle einbindung brauchte. Da der zuspruch aber sehr gross war hat sich MCS entschieden diese in Bascom mit zu integrieren, und weil man schon dabei war gabs dann noch ein paar Features extra.
      Solche Änderungen sind recht selten, in der arduino welt ist da mal richtig was los, da hab ich oft das abends schon alles anders ist als morgends

      Daher ja auch in meinem vorigen post der link zur online Bascom hilfe, ist sogar ein sample dabei a_58_b54cfdb4

      Tobias
    • So,danke erstmal allen die mir geholfen habenHabe jetzt mal ein bischen probiert und es funktioniert auch einiges.
      Hier mal mein ganz kurzes Programm.

      Source Code

      1. 'WS2812-LED
      2. $regfile = "m88pdef.dat"
      3. $Crystal = 8000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 32
      7. Config Rainbow = 1 , Rb0_len = 16 , Rb0_port = Portb , Rb0_pin = 0
      8. ' ^ connected to pin 0
      9. ' ^------------ connected to portB
      10. ' ^-------------------------- 16 leds on stripe
      11. ' ^------------------------------------- 1 channel
      12. Dim Color(3) As Byte
      13. R Alias Color(_base) : G Alias Color(_base + 1) : B Alias Color(_base + 2)
      14. Rb_selectchannel 0
      15. Do
      16. R = 0 : G = 0 : B = 0 'Farbe auswählen (alle Aus)
      17. Rb_setcolor 0 , Color(1) 'LED auswählen
      18. Rb_setcolor 5 , Color(1)
      19. Rb_setcolor 8 , Color(1)
      20. Rb_setcolor 13 , Color(1)
      21. Rb_setcolor 2 , Color(1)
      22. Rb_setcolor 7 , Color(1)
      23. Rb_setcolor 10 , Color(1)
      24. Rb_setcolor 15 , Color(1)
      25. Rb_setcolor 3 , Color(1)
      26. Rb_setcolor 4 , Color(1)
      27. Rb_setcolor 11 , Color(1)
      28. Rb_setcolor 12 , Color(1)
      29. R = 0 : G = 255 : B = 50 'Farbe Türkis
      30. Rb_setcolor 1 , Color(1) 'LED 1/6/9/14
      31. Rb_setcolor 6 , Color(1)
      32. Rb_setcolor 9 , Color(1)
      33. Rb_setcolor 14 , Color(1)
      34. Rb_send
      35. Loop
      36. End
      Display All
      Habe jetzt blos noch nicht begriffen,warum bei Rb-setcolor.,color(1),ne 1 drin stehen muß.habe 0,2,3 probiert,da bleibt die jeweilige Led dunkel.
    • Color() ist ein Array, in diesem steht eine Farbe, repräsentiert durch die Farben RGB oder RGBW.
      Das Array ist also 3 oder 4 Byte groß.

      Wenn du ein Array als Parameter übergibst, nämlich der Routine RB_SetColor, muss diese wissen, an welcher Adresse im Speicher der 1. Wert steht.
      Der 1. Wert wäre R also Rot.

      Arrays sind in Bascom standard-mäßig ab 1 spezifiziert. Das kann man ändern mit Config Base=0.
      Deswegen muss da ne 1 drin stehen.

      Wenn dein Programm mit Config Base=0 konfiguriert wäre, müsstest du Color(0) übergeben. - der 1. Index eben im Array.

      Wenn du dir keine Gedanken machen willst, wie das Programm nun konfiguriert ist, kannst du auch die Systemvariable '_base' übergeben.

      RB_SetColor 14,color(_base)

      _base entspricht dann dem korrekten 1. index.