www.mikrocontroller.net

Forum: GCC (1 << b) geht nur wenn b < 16?

Autor: Paul Hamacher (powl)
Datum: 28.06.2008 13:32
Dateianhang: Charlieplexing_5x.c (2,1 KB, 33 Downloads) | formatierter Code

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 Kaiser (a-k)
Datum: 28.06.2008 13:35

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: 28.06.2008 13:41

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

und schon wirds bis << 32 möglich.
Autor: I_ H. (i_h)
Datum: 29.06.2008 20:16

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net