(1 << b) geht nur wenn b < 16?

#909925
Lesenswert?

Hi!

Nach 3 Stunden Diagnose bin ich nun auf folgende Fehlerquelle gestoßen:
1
uint8_t a;
2
  uint8_t b;
3

4
  a = 0;
5
  for(b=0; b<20; b++)
6
  {
7
    if(lights & (1 << b))
8
    {
9
      phase_DDR[map[a]] |= (1 << map[a+1]);
10
    }
11

12
    a += 2;
13
  }

Das ganze ist für ein Charlieplexing Projekt. In der Variable lights 
sind die Bits für die Lichter, die leuchten sollen, gesetzt. Das 
Charlieplexing erfolgt in 5 Phasen wobei immer 4 LEDs gleichzeitig 
leuchten können. Mit der map werden die einzelnen Leucht-Bits der 
richtigen Phase und dem richtigen I/O Port zugeteilt. Dabei ist mir 
aufgefallen, dass immer die hinteren 4 LEDs nicht leuchten.

Zunächst habe ich mal die komplizierte Verkabelung geprüft, dann alles 
per Hand ausprobiert => Schaltung stimmt. Dann habe ich mir noch 5 rote 
und 5 grüne LEDs dazuschaltet und mit den 5 I/O Ports verbunden um zu 
sehen welche Ports auf Masse, Vcc, oder Hochohmig liegen. Es ist 
tatsächlich so, dass die hinterhen 4 LEDs einfach nicht vom µC 
angesteuert werden und der Vogel liegt in diesem Codefragment begraben.

Und zwar scheint die Abfrage if(lights & (1 << b)) wenn b größer als 16 
ist nicht mehr true zu werden, obwohl am Anfang in lights jedes Bit 
gesetzt ist.

Kann mir das jemand erklären? Nimmt der GCC dafür automatisch nur eine 
16-Bit variable?

lg PoWl
Angehängte Dateien:
#909927
Lesenswert?

Paul Hamacher wrote:

> Kann mir das jemand erklären? Nimmt der GCC dafür automatisch nur eine
> 16-Bit variable?

Natürlich. Der Ausdruck "1" hat den Typ "int", und folglich "1<<b" 
ebenfalls.

Du meinst, er solle den Code darauf analysieren, welcher Wert maximal 
vorkommen kann, und deshalb was anderes nehmen?

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