Frage zu Rb_ChangePIN

    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!

    • Frage zu Rb_ChangePIN

      Hallo zusammen,

      ich hätte eine Verständisfrage zu RB_CHANGEPIN.

      In der Hilfe zu RB_CHANGEPIN wird zunächst ein einzelner Strip konfiguriert:

      BASCOM-Quellcode

      1. Config RAINBOW=1, RB0_LEN=8, RB0_PORT=PORTB,rb0_pin=0
      2. ' ^ connected to pin 0
      3. ' ^------------ connected to portB
      4. ' ^-------------------------- 8 leds on stripe
      5. ' ^------------------------------------- 1 channel
      später im Programm wird der Ausgabepin dann getauscht

      BASCOM-Quellcode

      1. const nprt=varptr(portb) + &H20
      2. Rb_ChangePIN nprt, 1
      Wie genau kommt es zu stande, dass in "nprt" die Adresse von PB0 steht (&H20 bedeutet in dezimal ja nicht 0 sondern 32)?
      Wäre ursprünglich nicht PB0 sondern ein andere Pin als Ausgabepin konfiguriert worden, was müsste dann anstelle von &H20 eingetragen werden?


      Netten Gruß
      Robert
    • Also mal ganz vage und unter aller Vorsicht! Die Konstante nport enthält eine Adresse, die aus der Adresse von portb + &H20 errechnet wird. varptr könnte! Variablenpointer heißen, diese Funktion gibt die Adresse der Variablen zurück. Jetzt die &H20, hm, ich denke! mal, das ist der Abstand zum nächsten port, portc von portb aus kommend. Portd erreicht man dann nach meiner Theorie mit +&H40. Der '1' ist der pin vom port (glaub' ich).


      Edit: varptr liefert eine Adresse ab 0 beginnend, die Adressnummerierung beginnt bei &H20. Die &H20 sind also ein offset. Um portd zu wählen wäre nport=varptr(portd)+&H20.
      Raum für Notizen

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

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

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

    • Nee, ich würde sagen
      const nport=varptr(portb)+&H20
      rb_ChangePIN nport,2

      Die 'Grundadresse' vom port verändert sich ja nicht, nur der pin innerhalb des ports.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Der gag an der Sache ist ja, man kann Speicher sparen, wenn man einen Speicherbereich für alle stripes verwendet. Das heißt man manipuliert der Speicher mit rb_setcolor..., stellt auf den pin des gewünschten stripes und sendet den Speicherinhalt mit rb_send dort hin. Wenn die stripes sehr unterschiedliches anzeigen sollen, muss halt für jede Änderung der komplette Speicher neu berechnet/beschrieben werden, wo bei normaler Konfiguration ein gezielter Speicherzugriff vielleicht langen würde.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Der gag an der Sache ist ja, man kann Speicher sparen, wenn man einen Speicherbereich für alle stripes verwendet.
      Ja, dass ist der Grund, warum ich mich mit dem RB_ChangePin beschäftige (zu wenig SRAM auf dem Attiny85).

      Nachdem ich heute ein wenig testen konnte, funktioniert es nun, auch wenn ich das mit dem Datenblatt nicht verstanden habe ?(
      Im Datenblatt des Attiny85 finde ich die Notes bezüglich 0x20 gar nicht.

      Im folgenden kleinen Testprogramm hab ich mal mit 3 Strips experimentiert. Mit RB_ChangePin lässt sich der Ausgabepin nicht nur auf nichtkonfigurierte Pins legen, sondern auch auf bereits durch Config Rainbow belegte Pins. Ob es dafür mal eine Verwendung gibt (den Farbspeicher des einen Channel für einen anderen Channel zu verwenden) wird sich zeigen :whistling:
      Die wichtigste Erkenntnis für mich (sofern ich es richtig verstanden habe) ist, dass durch die Verwendung von RB_ChangePin immer auf den zuletzt verwendeten Channel bzw Pin zurückgegriffen wird.

      BASCOM-Quellcode

      1. 'Kleines Testprogramm zu RB_ChangePin
      2. 'Bascom Version 2.0.8.0
      3. '$sim
      4. $regfile = "attiny85.dat"
      5. $crystal = 8000000
      6. $hwstack = 32
      7. $swstack = 10
      8. $framesize = 40
      9. Config Rainbow = 3 , Rb0_len = Num_leds , Rb0_port = Portb , Rb0_pin = 3 , Rb1_len = Num_leds , Rb1_port = Portb , Rb1_pin = 2 , Rb2_len = Num_leds , Rb2_port = Portb , Rb2_pin = 1
      10. Do
      11. Rb_selectchannel 0 'PB3
      12. Rot = 100
      13. Gruen = 0
      14. Blau = 0
      15. Rb_setcolor 5 , Farbe()
      16. Rb_send
      17. Wait 1
      18. Rb_clearcolors
      19. Rb_send
      20. Wait 1
      21. Rb_selectchannel 1 'PB2
      22. Rot = 0
      23. Gruen = 100
      24. Blau = 0
      25. Rb_setcolor 10 , Farbe()
      26. Rb_send
      27. Wait 1
      28. Rb_clearcolors
      29. Rb_send
      30. Wait 1
      31. Rb_selectchannel 2 'PB1
      32. Rot = 0
      33. Gruen = 0
      34. Blau = 100
      35. Rb_setcolor 15 , Farbe()
      36. Rb_send
      37. Wait 1
      38. Rb_clearcolors
      39. Rb_send
      40. Wait 1
      41. Rb_setcolor 20 , Farbe() 'eine LED im Farbspeicher des zuletzt gewählten Channels (hier Channel 2) setzen
      42. Const Nprt = Varptr(portb) + &H20 'Ausgabepin/-adresse des zuletzt gewählten Channels (hier Channel 2) in die Konstante "nprt" schreiben
      43. Rb_changepin Nprt , 2 'zum Ausgabepin PB2 (=Channel 1) wechseln
      44. Rb_send
      45. Wait 1
      46. Rb_clearcolors
      47. Rb_send
      48. Wait 1
      49. Loop
      50. End
      Alles anzeigen
      Gruß
      Robert
    • Speicherersparnis hast du aber erst, wenn du nur einen channel anlegst und durch das Umschalten des pins mehrere stripes ansteuerst.
      Raum für Notizen

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

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