Ansteuerung von APA102 (intelligente RGB-Leds) in einer isr

    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!

    • Ist das Programm aus # 11 noch aktuell?
      Dort klemmst du an V_0 fest (was eigentlich A_0 heißen müsste (V=velocity, A = accelerate))
      Deine zu erwartende Kurve entspricht ja einem gleichförmig langsam steigendem (fallenden) Wert mit ausgeprägten Peaks an den Umkehrpunkten. Die Mitte der Kurve muss auch nicht mit V_0 zusammenfallen. Im Video (Beitrag#11) überschreitet der Stab gar nicht diesen Punkt.

      Ich würde hier dauernd in einer Schleife messen und wenn 3 mal hintereinander (oder 20 mal ->Entprellung)) der Wert steigt (oder fällt) dann ist der Umkehrpunkt gerade überschritten.
    • V_0 war bei mir V für Spannung, Spannung in neutraler Position. Das Programm ist so wie in #11. Diese case-Unterscheidung bräuchte man eigentlich nicht, ich müsste nur aktuellen Wert mit vorherigen Wert vergleichen um Umkehrpunkte in der Spannung zu erkennen.
      Aber warum sollte so ein Spannungsmax/min mit den Umkehrpunkten der Bewegung zusammen fallen? Parabelflug - irgendwo ist die max Flughöhe erreicht und es geht von vorher aufwärts auf abwärts. Im Flugzeug merkt man nix, g=0 bezüglich des Flugzeugs (ich war nicht dabei, aber ich hab' noch nicht davon gehört, das die Leutchen plötzlich wo dagegen knallen). Da kann man innerhalb des Flugzeugs auch nicht den Scheitelpunkt der Kurve ermitteln.
      Raum für Notizen

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

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

      Aber warum sollte so ein Spannungsmax/min mit den Umkehrpunkten der Bewegung zusammen fallen?
      weil es eine gleichförmige Bewegung mit ausgeprägten Umkehrpeaks ist. Die maximale Beschleunigung gibt es bei Umkehr der Richtung.
      Du hast doch eine Anzeige. Programmier dir doch einfach mal den Spannungswert der X-Achse auf den Lichtbalken. Wenn du das dann abfilmst, weißt du, welcher Wert an welcher Stelle des Bogens auftritt.
    • Nachdem ich den verbliebenen Bodensatz meiner Erinnerung an meine Schulzeit aufgerührt hab', bin ich deiner Meinung mit dem peak am Umkehrpunkt (es heißt ja immer, man soll nicht immer alles blind glauben ;) . Ich werde die Amplitude mal programmieren, evtl ist die Bewegung doch bisschen inhomogen und hat Zwischenhochs durch Vibrationen im hw-Aufbau, die als erstes detektiert wird. Dann fällt der peak am Umkehrpnkt unter den Tisch :/
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Setze dir doch ein "Delta", also eine maximale Abweichung im Umkehrfall.
      Dann prüfst du immer, ob der neue Wert des ADC der Steigung folgt, oder in Umkehrrichtung ist. Wenn die Umkehr erfasst wurde, muss mindestens "Delta" Unterschied entstanden sein.

      Wenn also die Werte des ADC steigen, ist alles ok, der alte Wert wird zwischengespeichert. Ist der folgende Wert kleiner, ist die Richtungsumkehr erfolgt.
      Natürlich ist EIN Wert zu wenig, darum das "Delta".
      Fällt die Spannung fällt, muss eben auf eine Erhöhung geprüft werden...
      Code first, think later - Natural programmer :D
    • Das werd' ich auch mal verfolgen. Wenn ich, wie @Michael schrieb, die Amplitude anzeigen lasse, sehe ich ja eigentlich zum ersten mal, um welche Werte es sich überhaupt handelt. Vielleicht kann man einen Bereich komplett ausblenden.
      Raum für Notizen

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

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


    • Das zugrunde liegende Programm

      BASCOM-Quellcode

      1. 'Schwenktexter mit 19 APA102 Leds
      2. $regfile = "m32def.dat"
      3. $crystal = 16000000
      4. $hwstack = 40
      5. $swstack = 16
      6. $framesize = 64
      7. 'ports
      8. Ddra = &B0000_0000 'inputs
      9. Porta = &B1111_1110 'pullups
      10. Ddrb = &B0000_0000 'inputs
      11. Portb = &B1111_1111 'pullups
      12. Ddrc = &B0000_0000 'inputs
      13. Portc = 255 'pullups
      14. Ddrd = &B0000_0000 'inputs
      15. Portd = 255 'pullups
      16. 'SPI
      17. Config Spi = Hard , Interrupt = Off , Data_order = Msb , Master = Yes , Polarity = High , Phase = 1 ' Clockrate = 4
      18. Spiinit 'belegt portb.5 bis portb.7
      19. 'Timer Configuration
      20. 'Config Timer1 = Timer , Prescale = 1024 , Clear_timer = 1 '
      21. 'On Timer1 Timer1_isr 'timer1-Überlauf erfassen
      22. 'Enable Timer1
      23. 'On Compare1a Anzeige 'Ansteuerung der Leds für jede Spalte
      24. 'Enable Compare1a
      25. 'Interrupts
      26. Enable Interrupts
      27. Config Adc = Single , Prescaler = Auto , Reference = Internal
      28. Start Adc
      29. 'Variablen
      30. Const Max_nutz_spalten = 120 'Spalten bei l=70cm und Pixelabstand von 6mm
      31. Const Vorlauf = 0
      32. Const Nachlauf = 100
      33. Const Spalten_schwenk_1 = Max_nutz_spalten + Vorlauf + Nachlauf
      34. Dim Spalten_schwenk As Word
      35. Spalten_schwenk = Spalten_schwenk_1
      36. Dim T1_alt As Word
      37. Dim T1_ueberlauf As Word
      38. Dim 1_schwenk As Word '=Anzahl der timer/Systemtakte pro Schwenk
      39. Dim 1_sp As Word
      40. Dim Comp As Word
      41. Dim N As Word
      42. Dim Anfang As Word , Ende As Word
      43. Dim Tab_start As Word 'Tabellenstart in der font-Tabelle
      44. Dim Bildspeicher_high(spalten_schwenk_1) As Byte 'Bildspeicher
      45. Dim Bildspeicher_low(spalten_schwenk_1) As Byte 'Bildspeicher
      46. Dim Spalten_farbe(spalten_schwenk_1)as Byte 'enthält welche Farbe für die Spalte verwendet wird
      47. Dim Sp_f As Byte
      48. Dim Speicher_spalte As Byte 'Spaltennummer im Bildspeicher
      49. Dim Z As Byte 'Zähler
      50. Dim Farbe_19(3) As Byte 'Farbe der Led#19
      51. Dim Farbe_18(3) As Byte 'Farbe der Led#18
      52. Dim Farbe_1(3) As Byte 'Farbe der Led#1
      53. Dim Bild As Byte 'Spalte des Bildspeichers, wird an Leds ausgegeben
      54. Dim X As Byte : Dim X1 As Word
      55. Dim Spalte As Byte : Dim Spalte_ As Byte
      56. Dim Ausgabe(84) As Byte 'max 19 Leds
      57. Dim R As Byte : Dim G As Byte : Dim B As Byte
      58. Dim Lang As Byte
      59. Dim Count As Byte
      60. Dim Buchstabe As String * 1
      61. Dim Sp_ As Byte
      62. Dim Tabellen_stelle As Word
      63. Dim Text As String * 256
      64. Dim Rot As Byte : Dim Gruen As Byte : Dim Blau As Byte : Dim Gelb As Byte : Dim Zyan As Byte : Dim Magenta As Byte , Weiss As Byte
      65. Rot = 1 : Gruen = 2 : Blau = 4 : Gelb = 3 : Zyan = 6 : Magenta = 5 : Weiss = 7
      66. Dim Bi As Byte
      67. Dim V_x As Word , V_0 As Word , V As Word
      68. Dim Start_enable As Byte , Stop_enable As Byte
      69. Dim Xx As Byte , Led_r As Byte , Led_g As Byte
      70. 'main
      71. Wait 1
      72. Gosub Array_fuellen: 'Ausgabearray mit unveränderlichen Werten füllen
      73. Ausgabe(80) = 100 : Ausgabe(7) = 100
      74. V_0 = Getadc(0)
      75. Start_enable = 1
      76. Do
      77. V_x = Getadc(0) 'Spannung senkrechter Stab=1,6V, waagrecht links=1,3V, waagrecht rechts=1,9V
      78. Select Case V_x 'Aref_intern=2,56V V_x=640 bei 1,6V Bereich 1,0V bis 2,2V
      79. Case Is > V_0 'Wert über der senkrechten Stellung
      80. V = V_0 : Led_r = 76 : Led_g = 75 'Startwerte unterste Led
      81. For Xx = 1 To 17
      82. If V_x > V Then
      83. Ausgabe(led_r) = 255 : Ausgabe(led_g) = 0
      84. Else
      85. Ausgabe(led_r) = 0 : Ausgabe(led_g) = 0
      86. End If
      87. Led_r = Led_r -4 : Led_g = Led_g -4
      88. V = V + 30
      89. Next Xx
      90. Case Is < V_0 'Wert unter der senkrechten Stellung
      91. V = V_0 : Led_r = 12 : Led_g = 11 'Startwerte unterste Led
      92. For Xx = 1 To 17
      93. If V_x < V Then
      94. Ausgabe(led_r) = 0 : Ausgabe(led_g) = 255
      95. Else
      96. Ausgabe(led_r) = 0 : Ausgabe(led_g) = 0
      97. End If
      98. Led_r = Led_r + 4 : Led_g = Led_g + 4
      99. V = V - 30
      100. Next Xx
      101. End Select
      102. Spiout Ausgabe(1) , 84 'bytes werden an die Leds gesendet
      103. Loop
      104. End
      105. '-------------------------------------------------------------------
      106. 'sub
      107. '-------------------------------------------------------------------
      108. Array_fuellen:
      109. 'Startbyte
      110. Ausgabe(1) = 0
      111. Ausgabe(2) = 0
      112. Ausgabe(3) = 0
      113. Ausgabe(4) = 0
      114. '1. von 4 byte für jede Led , brightness
      115. Ausgabe(5) = 255
      116. Ausgabe(9) = 255
      117. Ausgabe(13) = 255
      118. Ausgabe(17) = 255
      119. Ausgabe(21) = 255
      120. Ausgabe(25) = 255
      121. Ausgabe(29) = 255
      122. Ausgabe(33) = 255
      123. Ausgabe(37) = 255
      124. Ausgabe(41) = 255
      125. Ausgabe(45) = 255
      126. Ausgabe(49) = 255
      127. Ausgabe(53) = 255
      128. Ausgabe(57) = 255
      129. Ausgabe(61) = 255
      130. Ausgabe(65) = 255
      131. Ausgabe(69) = 255
      132. Ausgabe(73) = 255
      133. Ausgabe(77) = 255
      134. '4xEndebyte
      135. Ausgabe(81) = 255
      136. Ausgabe(82) = 255
      137. Ausgabe(83) = 255
      138. Ausgabe(84) = 255
      139. Return
      Alles anzeigen
      Ich befürchte, es wird ein harter Knorpel für mich, nur die peaks am Umkehrpunkt zu finden, zumal sich dort der Pegel am langsamsten ändert.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Wäre es vielleicht doch einfacher, den 'Nulldurchgang' zu finden, also die senkrechte Stellung, die Zeit zwischen 2 Stellungen zu messen (timer0 mit mitzählen des Überlaufs), mit dem 1/4 Wert den timer1 zu laden CTC, (dann ist man am Umkehrpunkt) und jetzt mit 1/2 des Wertes/Spalten mit der Ausgabe beginnen?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ja, schon. vielleicht habe ich einen Traum...
      am Umkehrpunkt ist halt der Pegelverlauf sehr flach, die Schwenkehand/Arm nicht genau wie eine Maschine a_31_4f4a3ad8 da kommt alles z'samm
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Michael schrieb:

      (du stellst dich heute aber auch an )
      lag's am 'Küstennebel' im chat?

      aber das mache ich doch schon. Wenn die Spannung in eine Richtung geht (Vergleich mit der 'Ruheposition' in der Senkrechten) wird beim 1. Richtungswechsel das als peak erkannt, vorher müssen, oder sind einfach alle Werte in der selben Richtung.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Wie wäre es, wenn ich das Ergebnis der Abfrage, ob die 'Richtung des Spannungsverlaufs' gleich ist, in ein Hilfsbyte schiebe: wenn Richtung dieselbe then bit0=1 shift hilfsbyte, left,1. Wenn in Folge 8 Messungen passen ist Hilfsbyte=255, einzelne Aussetzter verringern den Wert, aber erst wenn 8x in Folge die Richtung umgekehrt ist, ist das Hilfbyte=0 und das ist dann der Zeitpunkt für den peak.
      Raum für Notizen

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

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