Hallo Leute!
Ich bin derzeit schwer am rätseln, da mir ein sehr mysteriöses Problem
auftritt. Es handelt sich um eine Binäre Uhr, bei der die LEDs
pulsierend betrieben werden.
Dazu habe ich mir folgendes gedacht:
#define LED_MASK 0b00000000111101111111011111110011
ich habe eine Maske, die aussagt, ob sich an der aktuellen Position
überhaupt eine LED befindet. Der Aufbau ist ja so:
x o | x o | x o <-- an PC2
x o | o o | o o <-- an PC3
o o | o o | o o <-- an PC4
o o | o o | o o <-- an PC5
trotzdem zähle ich die Positionen so:
3 7 | 11 15 | 19 23
2 6 | 10 14 | 18 22
1 5 | 9 13 | 17 21
0 4 | 8 12 | 16 20
also, egal ob eine LED da ist, oder nicht, da ist eine Fix-Position.
Dies mache ich, damit ich von einer einfachen Counter-Variable, die sich
in einem Bereich von 0-24 bewegt, einfach auf die Matrix umrechnen kann.
Wie man oben sieht sind die Zeilen von oben nach unten an PC2 - PC5
angeschlossen, die Spalten sind von links nach rechts an PB0 - PB5
PORTB ist für GND zuständig, PORTC für VCC.
Das heißt, wenn ich LED 14 einschalten will:
PORTC = 0x00; // Alles aus (in Sperrrichtung)
PORTB = 0xFF;
PORTC |= (1<<PC3);
PORTB &= ~(1<<PB3);
So, nun lasse ich das ganze über einen Timer pulsieren.
1 | #define LED_MASK 0b00000000111101111111011111110011
|
2 | #define LED_MAX 32 // 24 LEDS -> bei 25 wieder auf 0 setzen!
|
3 |
|
4 | ISR (TIMER0_OVF_vect)
|
5 | {
|
6 | PORTB = 0xFF; // Alles aus, Dioden in Sperrichtung
|
7 | PORTC = 0x00;
|
8 | PORTB &= ~(1<<(currentLed / 4)); // Hier sieht man nochmal, was ich mit dem Umrechnen meinte
|
9 | PORTC |= (1<<(5 - (currentLed % 4)));
|
10 | do
|
11 | {
|
12 | currentLed++;
|
13 | }
|
14 | while (~LED_MASK & (1<<currentLed));
|
15 | if (currentLed >= LED_MAX) { // Es gibt nur "24" (aufgrund der Löcher) LEDS
|
16 | currentLed = 0; // -> Wieder von vorne beginnen
|
17 | }
|
18 | }
|
Komischerweise leuchtet bei diesem Code aber nicht LED 15 auf.
Und wenn ich es nicht mehr pulsieren lasse, sondern auf CPU/1024 stelle
und die einzelnen aufleuchten sehe, fällt auch auf, dass der µc versucht
NACH der 15. LED jede LED auf. Man merkt das durch die zeitlichen
Abstände, z.B. ist zwischen 18 und 20 ein längerer Abstand und nach 24
dauert es auch 8 Schritte bis er wieder bei 0 beginnt.
Ich dachte mir, dass es etwas damit zu tun hat, dass es sich hier um 32
bit handelt, und der ATmega88PA das vllt. nicht verarbeiten kann.
Habt ihr eine Idee? Ich bin ja doch noch ein bisschen ein Frischling und
habe nicht sooo viel Erfahrung. Aber ich bin seit 5 Stunden am
experimentieren und bekomm es nicht hin =/
Vielen Dank im Vorhinein!
Lg Marc