Günter G. schrieb:> for(i = 1;i<64;i++){> h = Helligkeit[i];> LEDPointer->Rot[g] = h;> LEDPointer->Gruen[g] = h;> LEDPointer->Blau[g] = h;> LEDPointer->Rot[j] = h;> LEDPointer->Gruen[j] = h;> LEDPointer->Blau[j] = h;> updateAll(LEDPointer);> }
woher sollen wir wissen was in g und j steht?
Und was macht updateAll? Ich befürchte fast, das hier eine kopie der
stuktur gemacht wird.
> Komischerweise werden alle nicht in der Schleife gesetzten LEDs> gelöscht. Warum?
das versteht niemand
Weil dein Programm fehlerhaft ist.
Nicht in dem gezeigten unvollständigen und nicht kompilierbaren
Aussschnitt, sondern irgendwo anders. Zeig mal das genze Programm, oder
zumindest den ganzen relevanten Abschnitt daraus.
Oliver
Günter G. schrieb:> Hallo Peter,> das wird es vermutlich sein:> void updateAll(struct LEDstruct* LEDPointer){
nein ist es nicht, du übergibst einen Zeiger das ist schon ok.
Aber ich(wir) verstehen das Problem immer noch nicht. Zeige den gesamten
code.
ist höchst wahrscheinlich verkehrt rum aufgezogen. Denn der logische
Zusammenhang zwischen Rot/Grün/Blau ist stärker als die Tatsache, dass
es 61 Stück davon gibt. D.h. das sollte so sein
1
structLEDstruct{
2
uint8_tRot;
3
uint8_tGruen;
4
uint8_tBlau;
5
};
Diese Struktur beschreibt 1 RGB-Led. Und davon, also von den RGB-Leds,
hast du 61 Stück.
1
structLEDstructmyLeds[61];
myLeds[5] wären dann zb die Daten der 6ten Led. Jede einzelne LED
besteht aus einer Rot-Komponente, einer Gruen Komponente und einer Blau
Komponente. Die Rot-Komponente der 6-ten LED ist dann myLeds[5].Rot
Jetzt liest sich das auch von links nach rechts in einer logisch
sinnvollen Art und Weise vom Groben zur Detailinformation.
myLeds das sind alle Leds
myLeds[5] das ist eine einzelne aus dem Pool aller Leds
myLeds[5].Blau das ist eine Farbe einer einzelnen Led aus
dem Pool aller Leds.
Stukturen muss man auch sinnvoll einsetzen. Sonst bringen sie nichts.
Günter G. schrieb:> Wird durch struct LEDstruct* LEDPointer eine neue Kopie erzeugt?
Nein. Du brauchst ganz dringend ein C-Buch
Und gewöhn dich daran, dass wir in C
for(i = 1;i<61;i++){
bei 0 anfangen zu zählen!
Ein Array mit 3 Elementen
int arr[3];
besteht aus den Elementen
arr[0]
arr[1]
arr[2]
zähl nach, sind genau 3 Stück.
Und dein gezeigter Code hilft immer noch nicht zu erklären, was du unter
> Komischerweise werden alle nicht in der Schleife gesetzten> LEDs gelöscht. Warum?
eigentlich genau verstehst, bzw. wie man dieses 'gelöscht' deuten soll.
Was sind 'nicht alle'?
Günter G. schrieb:> Komischerweise werden alle nicht in der Schleife gesetzten LEDs> gelöscht. Warum?
Weil du vor der "Setzen-Schleife" eine "Komplett-Löschen-Schleife" hast.
Was also erwartest du?
Also ich werde daraus nicht schlau.
Warum sind es mal 61, und mal 31?
Am besten, man definiert richtige Konstanten dafür.
Was soll die Variable sn? Kann man der nicht einen vernünftigen Namen
geben, damit auch Unbeteiligte wissen, was das bedeutet?
Kommentare wären auch ganz nützlich.
Schleifen, die mit 1 beginnen, sind auch immer suspekt. Was ist mit dem
0-Element?
Hallo,
ja, im Code werden alle LEDs erstmal auf 0 gesetzt.
Dann wird LED 30 und 31 hochgedimmt. Danach 29 und 32, da soll aber 30
und 31 anbleiben, geht aber wieder aus.
Bei 1 fange ich deshalb an, weil es bei den LEDs auch mit eins losgeht
und ich diese Stolperfalle weghaben wollte.
Das ergibt sich doch ganz klar alles aus dem Code. Vielleicht. Also aus
dem Teil des Codes, den es wohl nur nach Unterzeichnung eines NDA gibt.
Was schlecht ist, wenn man etwas will.
> Bei 1 fange ich deshalb an, weil es bei den LEDs auch mit eins> losgeht und ich diese Stolperfalle weghaben wollte.
Na wart mal ab.
Dieses 'bei 1 anfangen' ist die viel größere Stolperfalle.
Im übrigen bin ich raus. Ratespielchen kann ich mit meinem eigenen Code
auch veranstalten. Den seh ich wenigstens komplett, auch wenn ich mir
manchmal wünschen würde es wäre weniger.
Günter G. schrieb:> Dann wird LED 30 und 31 hochgedimmt. Danach 29 und 32, da soll aber 30> und 31 anbleiben, geht aber wieder aus.
Dann zeige die Definition von 'Helligkeit'. Vermutlich hast du da bei
der Initialisierung nicht an deinen "Index-Offset" gedacht.
Günter G. schrieb:> ja, im Code werden alle LEDs erstmal auf 0 gesetzt.
Okay, auch wenn ich die Verwendung von memset() erwägen würde. Oder
clearAll()? Zumindest klingt das so.
> Dann wird LED 30 und 31 hochgedimmt. Danach 29 und 32, da soll aber 30> und 31 anbleiben, geht aber wieder aus.
Und dafür soviel Rumgeschwätze im Code?
Hättest du wie Karl-Heinz schon sagte ein Array von Strukturen, könntest
du auch das mit memset() erledigen. Und anstatt zwei Variablen
unabhängig voneinander zu zählen, könnte dir auffallen, das etwas wie
1
for (i = 0; i < 30; ++i) {
2
LEDPointer->Rot[30 - i] = ...
3
LEDPointer->Rot[31 + i] = ...
4
}
dein Ansinnen ohne jeden weiteren Kommentar und zweiten Blick
dokumentiert hätte.
> Bei 1 fange ich deshalb an, weil es bei den LEDs auch mit eins losgeht> und ich diese Stolperfalle weghaben wollte.
Um dich nicht am Kaffee zu verbrennen, trinkst du ihn auch immer kalt?
Das ist doch Käse, mal davon abgesehen, dass du so pro Farbei ein Byte
(Index 0) verschwendest.
Apropos verschwenden: wieviel SRAM hat denn dein Controller? Passen da 3
mal 61 Byte plus Stack plus was noch alles im geheimen Restcode
verwendet wird rein? Oder wird vielleicht das Array durch eine der
unzähligen lokalen Variablen überschrieben - wobei die wegoptimiert
werden sollten, aber deine Compilerflags kennen wir ja auch nicht.