Datum: 28.06.2008 13:32
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
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?
Datum: 28.06.2008 13:41
Anstatt
(1<<16) |
schreibst du
(1UL<<16) |
und schon wirds bis << 32 möglich.
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