www.mikrocontroller.net

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


Autor: Paul H. (powl)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

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

  a = 0;
  for(b=0; b<20; b++)
  {
    if(lights & (1 << b))
    {
      phase_DDR[map[a]] |= (1 << map[a+1]);
    }

    a += 2;
  }

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anstatt
(1<<16)
schreibst du
(1UL<<16)

und schon wirds bis << 32 möglich.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.