Hallo,
Es geht um eine eher simple Funktion: LED soll ein- und wieder ausfaden.
Zugriff auf die PWM-Werte 0..255 über ein Array mit 100 Elementen.
Das Einfaden hat funktioniert. Dann habe ich das Ausfaden noch
integriert und den Code noch etwas optimiert aber nun hab ich das
Problem, dass für "count"-Werte größer 49 die LED komisch flackert. Beim
Ausfaden reagiert sie wieder normal sobald "count" kleiner 50 ist(das
konnte ich nur durch eingrenzen der Werte in der letzten "if"-Anweisung
herausfinden...)
Ich sitze jetzt hier bestimmt schon 1,5h dran, aber kriege das nicht
gelöst.
Bitte helft mir.
Hannes
(Dieser Code ist Teil einer separaten c-Datei und wird aus der main
)aufgerufen.
1
#include"includes/light_ws2812.h"
2
#include"includes/config.h"
3
#include<util/delay.h>
4
#include<math.h>
5
#include<stdlib.h>
6
7
#define PWM_MAX 255
8
#define RESOLUTION 50 //number of steps to increment the brightness value
COLORS[13].r=PWM_MAX;COLORS[13].g=PWM_MAX;COLORS[13].b=PWM_MAX;// white
57
}
58
59
structcRGBcolorPulse(uint8_tindex){
60
if(count==0){
61
62
pwm_difference_red=pwmDifference(LED_COLOR_new[0].r,0);// Either 0, 127.5 or 255
63
pwm_difference_green=pwmDifference(LED_COLOR_new[0].g,0);// Either 0, 127.5 or 255
64
pwm_difference_blue=pwmDifference(LED_COLOR_new[0].b,0);// Either 0, 127.5 or 255
65
66
brightness_step_red=brighnessStep(pwm_difference_red);// Speed is 0 for same, 1/2 for 127 and 1 for 255 as difference each in positive or negative direction.
67
brightness_step_green=brighnessStep(pwm_difference_green);// Speed is 0 for same, 1/2 for 127 and 1 for 255 as difference each in positive or negative direction.
68
brightness_step_blue=brighnessStep(pwm_difference_blue);// Speed is 0 for same, 1/2 for 127 and 1 for 255 as difference each in positive or negative direction.
Das sieht alles ein bisschen wirr aus. Du hast viele globale Variablen,
was nicht gerade der Übersichtlichkeit zugute kommt, sogar solche, die
von Funktionen zurückgegeben werden (z.B. LED_COLOR).
Johannes H. schrieb:> struct cRGB LED_COLOR[1];
Es ist nicht nötig, diese Variable als Array anzulegen, die Grösse ist
ja 1.
Johannes H. schrieb:> LED_COLOR[0].r = brightnesstable[brightnesstable_index_red];> LED_COLOR[0].g = brightnesstable[brightnesstable_index_green];> LED_COLOR[0].b = brightnesstable[brightnesstable_index_blue];
Bist du sicher, dass die Indizes von brightnesstable alle kleiner als
100 sind? Das wäre das erste, was ich in deinem Programm prüfen würde.
Hallo Stucki,
Die ws2812_setleds (Die Funktion, die die Daten an die LED sendet)
erwartet aber einen Pointer auf ein Array. Ich hatte es schon mal so
gemacht, wie Du sagtest, da hatte ich aber mangels C-Kenntnissen
Probleme, dass ich das falsch übergeben habe, deswegen lasse
ich das jetzt so mit dem LED_COLOR[1].
Aber ich glaube Dein Hinweis ist die Lösung, da ich diesen
"brightness_index" für eine LED um 1 erhöhe und bei der anderen um 2. Da
leuchtet ein, dass der nach 50 counts schon bei 100 ist.
Warum ich das nicht selbst gesehen habe...?
Und die Werte müssen global sein, erstens, da sie auch von anderen
Funktionen verwendet werden und 2. weil die Werte bei jedem
Funktionsaufruf sonst neu berechnet werden müssten.
> 2. weil die Werte bei jedem> Funktionsaufruf sonst neu berechnet werden müssten.
Schau Dir mal an, was "static" Variablen innerhalb von Funktionen
machen. Könnte in deinem Fall hilfreich sein.
Johannes H. schrieb:> Die ws2812_setleds (Die Funktion, die die Daten an die LED sendet)> erwartet aber einen Pointer auf ein Array. Ich hatte es schon mal so> gemacht, wie Du sagtest, da hatte ich aber mangels C-Kenntnissen> Probleme, dass ich das falsch übergeben habe, deswegen lasse> ich das jetzt so mit dem LED_COLOR[1].
Dann wirst du wahrscheinlich auch die Arraygrösse übergeben müssen? Dann
könntest du auch einfach einen Zeiger auf eine Variable übergeben und
die Grösse auf 1 setzen, macht keinen Unterschied.
Johannes H. schrieb:> Und die Werte müssen global sein, erstens, da sie auch von anderen> Funktionen verwendet werden und 2. weil die Werte bei jedem> Funktionsaufruf sonst neu berechnet werden müssten.
Könnte man bestimmt anders machen, ausser die Werte werden in einem
Interrupt benötigt. Bei globalen Variablen läuft man immer in die
Gefahr, dass viele verstreute Funktionen darauf zugreifen und man im
Fehlerfall nicht nachvollziehen kann, welche Funktion nun den falschen
Wert geschrieben hat.
Warum legst Du COLORS[14] nicht im Flash an, sondern umständlich zur
Laufzeit?
Warum muß ein Index auf 100 Werte 16-bittig sein?
Wie wird gesichert, daß der Index innerhalb 0..99 liegt?
Johannes H. schrieb:> @Stefan:> Aber die Variablen werden ja auch noch in anderen Funktionen benutzt.
Ja dann werden sie oder pointer auf diese Variablen im Funktionsaufruf
mit übergeben. So ist das nur ein Haufen unübersichtlicher Mist. Sorry.