Pointer auf Port.Outputs?

Gast #3374747
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
}
#3374787
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.

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