Forum: Mikrocontroller und Digitale Elektronik Pointer auf Port.Outputs?


von Stefen (Gast)


Lesenswert?

Hallo,

ich habe 40 verschiedene Leds, die ich einem Timer setzen oder löschen 
muss, je nach was in einem Array ist.

Wie kann ich das in einer Schleife tun?

Kann man das irgendwie über Pinter auf "Port.Output" tun? somit kann man 
nachher auf die Ledpointer nur an einer Stelle ändern.
1
for(i=0; i<40;i++)
2
{
3
  if(LedData[i])
4
  {
5
    LedPtr[i] = 1;
6
  }
7
  else  
8
  {
9
    LedPtr[i] = 0;
10
  }
11
}

von Karl H. (kbuchegg)


Lesenswert?

Es geht zwar, aber es ist nicht optimal, weil es dem Compiler jegliche 
Chance auf Optimierung raubt.
1
struct Led
2
{
3
  volatile uint8_t* pPort;
4
  uint8_t           Bit;
5
};
6
7
struct Led myLeds[] =
8
{
9
 { &PORTA,  0 },
10
 { &PORTB,  5 },
11
 { &PORTA,  2 },
12
 ...
13
};
14
15
#define NR_LEDS  (sizeof(myLeds)/sizeof(myLeds[0]))
16
17
18
ISR( ... )
19
{
20
  ..
21
  for( i = 0; i < NR_LEDS; i++ )
22
  {
23
    if( LedData[i] )
24
      *(myLeds[i].pPort) |= ( 1 << myLeds[i].Bit );
25
    else
26
      *(myLeds[i].pPort) &= ~( 1 << myLeds[i].Bit );
27
  }
28
}

natürlich kannst du die Port und Bitangabe auch zu deinen Led-Daten noch 
mit dazunehmen, wenn das vernünftig ist, bzw. die LedData noch mit in 
die Struktur integrieren.

: Bearbeitet durch User
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.