struct als array an funktion übergeben.

#4042568
Lesenswert?

hallo liebe Gemeinde,

ich möchte gerne ein struct an einer Funktion übergeben. Leider 
funktioniert das nicht so wie geplant
1
struct LED
2
{
3
  uint8_t gruen;
4
  uint8_t rot;
5
  uint8_t blau;
6
};
7

8
struct LED led[60];
1
void output_send_led(struct LED _led[], uint8_t _anzahl_led)
2
{
3
  uint8_t i;
4
  uint8_t a;
5
  
6
  for (a = 0; a < _anzahl_led; a++)
7
  {
8
    for (i = 0; i < 8; i++)
9
    {
10
      if(_led[a].gruen & 0x80)
11
      {
12
        output_eins();
13
      }
14
      else
15
      {
16
        output_null();
17
      }
18
      _led[a].gruen<<=1;
19
    }
20
    
21
    for (i = 0; i < 8; i++)
22
    {
23
      if(_led[a].rot & 0x80)
24
      {
25
        output_eins();
26
      }
27
      else
28
      {
29
        output_null();
30
      }
31
      _led[a].rot<<=1;
32
    }
33
    
34
    for (i = 0; i < 8; i++)
35
    {
36
      if(_led[a].blau & 0x80)
37
      {
38
        output_eins();
39
      }
40
      else
41
      {
42
        output_null();
43
      }
44
      _led[a].blau<<=1;
45
    }
46
  }
47
}
48

49
int main(void)
50
{
51
  DDRC |= (1<<PC0);
52
  
53
  led[2].blau = 0xFF;
54
  led[2].rot = 0xFF;
55
  led[2].gruen = 0xFF;
56
  
57
    while(1)
58
    {
59
    output_send_led(led, 10);
60
    output_reset();
61
    }
62
}

vielen dank für eure Hilfe.
#4042576
Lesenswert?

@ Mathias G. (motze)

>ich möchte gerne ein struct an einer Funktion übergeben. Leider
>funktioniert das nicht so wie geplant.

Kann man machen, ist aber eher unüblich. Solche großen Massen an Daten 
will man nicht kopieren, sondern übergibt Zeiger.

Da fehlt wohl ein typedef. Eher so.
1
typedef struct
2
{
3
  uint8_t gruen;
4
  uint8_t rot;
5
  uint8_t blau;
6
} LED_t;
7

8
LED_t led[60];
9

10
void output_send_led(LED_t *_led, uint8_t _anzahl_led)
11
{
12
  uint8_t i;
13
  uint8_t a;
14
  
15
  for (a = 0; a < _anzahl_led; a++)
16
  {
17
    for (i = 0; i < 8; i++)
18
    {
19
      if(_led[a].gruen & 0x80)
20
      {
21
        output_eins();
22
      }
23
      else
24
      {
25
        output_null();
26
      }
27
      _led[a].gruen<<=1;
28
    }
29
    
30
    for (i = 0; i < 8; i++)
31
    {
32
      if(_led[a].rot & 0x80)
33
      {
34
        output_eins();
35
      }
36
      else
37
      {
38
        output_null();
39
      }
40
      _led[a].rot<<=1;
41
    }
42
    
43
    for (i = 0; i < 8; i++)
44
    {
45
      if(_led[a].blau & 0x80)
46
      {
47
        output_eins();
48
      }
49
      else
50
      {
51
        output_null();
52
      }
53
      _led[a].blau<<=1;
54
    }
55
  }
56
}
57

58
int main(void)
59
{
60
  DDRC |= (1<<PC0);
61
  
62
  led[2].blau = 0xFF;
63
  led[2].rot = 0xFF;
64
  led[2].gruen = 0xFF;
65
  
66
    while(1)
67
    {
68
    output_send_led(led, 10);
69
    output_reset();
70
    }
71
}
#4042674
Lesenswert?

jetzt habe ich leider ein anderes Problem der folgende Code Funktioniert 
genau einmal danach nicht mehr woran kann das den liegen?
1
void output_reset()
2
{
3
  _delay_us(60);
4
}
5

6
void output_alle(uint8_t _led[])
7
{
8
  uint8_t i;
9
  uint8_t k;
10
  
11
  for (i = 0; i < 180; i++)
12
  {  
13
    for (k = 0; k < 8; k++)
14
    {
15
      if(_led[i] & 0x80)
16
      {
17
        output_eins();
18
      }
19
      else
20
      {
21
        output_null();
22
      }
23
      _led[i]<<=1;  
24
    }
25
  }
26
}
27

28
uint8_t Led_60[180] =
29
{
30
  0x00, 0xFF, 0xFF, //1
31
  0x00, 0xFF, 0xFF, //2
32
  0x00, 0xFF, 0xFF, //3
33
  0x00, 0xFF, 0xFF, //4
34
  0x00, 0xFF, 0xFF, //5
35
  0x00, 0xFF, 0xFF, //6
36
  0x00, 0xFF, 0xFF, //7
37
  0x00, 0xFF, 0xFF, //8
38
  0x00, 0xFF, 0xFF, //9
39
  0x00, 0xFF, 0xFF, //10
40
  
41
  0xFF, 0xFF, 0x00, //11
42
  0xFF, 0xFF, 0x00, //12
43
  0xFF, 0xFF, 0x00, //13
44
  0xFF, 0xFF, 0x00, //14
45
  0xFF, 0xFF, 0x00, //15
46
  0xFF, 0xFF, 0x00, //16
47
  0xFF, 0xFF, 0x00, //17
48
  0xFF, 0xFF, 0x00, //18
49
  0xFF, 0xFF, 0x00, //19
50
  0xFF, 0xFF, 0x00, //20
51
  
52
  0xFF, 0xFF, 0xFF, //21
53
  0xFF, 0xFF, 0xFF, //22
54
  0xFF, 0xFF, 0xFF, //23
55
  0xFF, 0xFF, 0xFF, //24
56
  0xFF, 0xFF, 0xFF, //25
57
  0xFF, 0xFF, 0xFF, //26
58
  0xFF, 0xFF, 0xFF, //27
59
  0xFF, 0xFF, 0xFF, //28
60
  0xFF, 0xFF, 0xFF, //29
61
  0xFF, 0xFF, 0xFF, //30
62
    
63
  0xFF, 0xFF, 0xFF, //31
64
  0xFF, 0xFF, 0xFF, //32
65
  0xFF, 0xFF, 0xFF, //33
66
  0xFF, 0xFF, 0xFF, //34
67
  0xFF, 0xFF, 0xFF, //35
68
  0xFF, 0xFF, 0xFF, //36
69
  0xFF, 0xFF, 0xFF, //37
70
  0xFF, 0xFF, 0xFF, //38
71
  0xFF, 0xFF, 0xFF, //39
72
  0xFF, 0xFF, 0xFF, //40
73
  
74
  0xFF, 0xFF, 0xFF, //41
75
  0xFF, 0xFF, 0xFF, //42
76
  0xFF, 0xFF, 0xFF, //43
77
  0xFF, 0xFF, 0xFF, //44
78
  0xFF, 0xFF, 0xFF, //45
79
  0xFF, 0xFF, 0xFF, //46
80
  0xFF, 0xFF, 0xFF, //47
81
  0xFF, 0xFF, 0xFF, //48
82
  0xFF, 0xFF, 0xFF, //49
83
  0xFF, 0xFF, 0xFF, //50
84
  
85
  0xFF, 0xFF, 0xFF, //51
86
  0xFF, 0xFF, 0xFF, //52
87
  0xFF, 0xFF, 0xFF, //53
88
  0xFF, 0xFF, 0xFF, //54
89
  0xFF, 0xFF, 0xFF, //55
90
  0xFF, 0xFF, 0xFF, //56
91
  0xFF, 0xFF, 0xFF, //57
92
  0xFF, 0xFF, 0xFF, //58
93
  0xFF, 0xFF, 0xFF, //59
94
  0x00, 0xFF, 0x00 //60  
95
};
96

97
int main(void)
98
{  
99
  DDRC |= (1<<PC0);
100
  
101
    while(1)
102
    {
103
    output_alle(Led_60);
104
    output_reset();
105
    _delay_ms(5000);
106
    }
107
}

ich weiß das mit den unterstrichen ist doof ich werde es mir auch 
abgewöhnen.

Also die Leds leuchten genau 5 Sekunden auf und danach geht nix mehr.
Output_reset hat bei anderen Sachen immer hingehauen mit Timing.

vielen dank schonmal
Gast #4042730
Lesenswert?

> Also die Leds leuchten genau 5 Sekunden auf und danach geht nix mehr.
1
>     _led[i]<<=1;

Kein Wunder, nach einem Durchlauf von output_alle sind alle Werte in 
deinem led-Array 0.

Wenn du die Werte erhalten möchtest:
1
void output_alle(uint8_t led[])
2
{
3
    uint8_t i, k;
4

5
    for (i = 0; i < 180; i++)
6
        for (k = 0x80; k; k >>= 1)
7
            if(led[i] & k)
8
                output_eins();
9
            else
10
                output_null();
11
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren