Forum: Mikrocontroller und Digitale Elektronik Array in Struktur


von Günter G. (Gast)


Lesenswert?

Hallo Forum,

in einer Struktur habe ich ein paar Arrays:
1
struct LEDstruct {
2
  uint8_t Rot[61];
3
  uint8_t Gruen[61];
4
  uint8_t Blau[61];
5
};

in einer Funktion sollen nun Werte der Arrays verändert werden:
1
for(i = 1;i<64;i++){
2
      h = Helligkeit[i];
3
      LEDPointer->Rot[g] = h;
4
      LEDPointer->Gruen[g] = h;
5
      LEDPointer->Blau[g] = h;
6
      LEDPointer->Rot[j] = h;
7
      LEDPointer->Gruen[j] = h;
8
      LEDPointer->Blau[j] = h;
9
      updateAll(LEDPointer);
10
        }
Komischerweise werden alle nicht in der Schleife gesetzten LEDs 
gelöscht. Warum?

von Peter II (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Günter G. (Gast)


Lesenswert?

Hallo Peter,

das wird es vermutlich sein:
1
void updateAll(struct LEDstruct* LEDPointer){
2
  Write1(LEDPointer);
3
  Write2(LEDPointer);
4
  Write3(LEDPointer);
5
  Write4(LEDPointer);
6
  Write5(LEDPointer);
7
  Write6(LEDPointer);
8
  Write7(LEDPointer);
9
  Write8(LEDPointer);
10
  Write9(LEDPointer);
11
  Write10(LEDPointer);
12
  Write11(LEDPointer);
13
  Write12(LEDPointer);
14
}

von Peter II (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Mehr Code!

Aber:

Das hier
1
struct LEDstruct {
2
  uint8_t Rot[61];
3
  uint8_t Gruen[61];
4
  uint8_t Blau[61];
5
};

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
struct LEDstruct {
2
  uint8_t Rot;
3
  uint8_t Gruen;
4
  uint8_t Blau;
5
};
Diese Struktur beschreibt 1 RGB-Led. Und davon, also von den RGB-Leds, 
hast du 61 Stück.
1
struct LEDstruct myLeds[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.

von Karl H. (kbuchegg)


Lesenswert?

Günter G. schrieb:
> Hallo Peter,
>
> das wird es vermutlich sein:

Nein.

Hör mit deiner Salamitaktik auf und zeig alles.

von Günter G. (Gast)


Lesenswert?

In main():
1
struct LEDstruct LEDs;
2
while(1)
3
    {
4
        loading(&LEDs);
5
    }
1
void loading(struct LEDstruct* LEDPointer){
2
  uint8_t sm;
3
  uint8_t sn;
4
  uint8_t j;
5
  uint8_t i;
6
7
  for(i = 1;i<61;i++){
8
    LEDPointer->Rot[i] = 0;
9
    LEDPointer->Gruen[i] = 0;
10
    LEDPointer->Blau[i] = 0;
11
  }
12
  updateAll(LEDPointer);
13
14
  j = 31;
15
  for(sn=30;sn>0;sn--){
16
    for(i = 1;i<64;i++){
17
      sm = Helligkeit[i];
18
      LEDPointer->Rot[sn] = sm;
19
      LEDPointer->Gruen[sn] = sm;
20
      LEDPointer->Blau[sn] = sm;
21
      LEDPointer->Rot[j] = sm;
22
      LEDPointer->Gruen[j] = sm;
23
      LEDPointer->Blau[j] = sm;
24
      updateAll(LEDPointer);
25
    }
26
   j++;
27
    updateAll(LEDPointer);
28
  }
29
  clearAll(LEDPointer);
30
31
}

Wird durch struct LEDstruct* LEDPointer eine neue Kopie erzeugt?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Malte S. (maltest)


Lesenswert?

Günter G. schrieb:
> for(i = 1;i<61;i++){
>     LEDPointer->Rot[i] = 0;
>     LEDPointer->Gruen[i] = 0;
>     LEDPointer->Blau[i] = 0;
>   }

Macht also was du ihm sagst?

von Karl H. (kbuchegg)


Lesenswert?

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'?

von Stefan E. (sternst)


Lesenswert?

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?

von PittyJ (Gast)


Lesenswert?

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?

von Günter G. (Gast)


Lesenswert?

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.

von Malte S. (maltest)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Günter G. (Gast)


Lesenswert?

Ich gebe auch auf.

Danke für die sachliche und geduldige Hilfe.

von Stefan E. (sternst)


Lesenswert?

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.

von Malte S. (maltest)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.