Forum: Compiler & IDEs (1 << b) geht nur wenn b < 16?


von Paul H. (powl)


Angehängte Dateien:

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

von Andreas K. (a-k)


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?

von Simon K. (simon) Benutzerseite


Lesenswert?

Anstatt
1
(1<<16)
schreibst du
1
(1UL<<16)

und schon wirds bis << 32 möglich.

von I_ H. (i_h)


Lesenswert?

Bei 1<<16 müsste der GCC beim Compilieren auch eine Warnung ausgeben ala 
value exceeds size of variable oder so.

Aber Warnungen sind ja keine Fehler und ausspucken tut er trotzdem was, 
können also ignoriert werden ;)

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.