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