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

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.