Hey zusammen,
ich habe ein paar Schwierigkeiten Bit Angle Modulation zu
implementieren. Erstens ist die niedrigste Helligkeitsstufe schon recht
hell, viel heller als erwartet. Zweitens ist z.B. bei vier Bit BAM die
LED mit Wert 0100 dunkler als wenn ich sie auf 0011 einstelle, und
Helligkeitsstufen 0100, 0010 und 0001 sind vergleichbar. Dieses
Verhalten zeigt sich jedenfalls bei höheren Stufen immer weniger. Ich
vermute, dass wenn ich den Timer mit dem neuen Wert "counts =
(0x00000200 << iteration)" lade, wird der Interrupt erst nach "counts' =
counts + x" aufgerufen, wobei x ein konstanter Wert ist. Dadurch könnte
ich das Verhalten erklären.
Ich arbeite mit einem Stellaris Launchpad (LF4M120) und mein Timer ISR
enhält folgendes:
1 | void Timer0IntHandler(void)
|
2 | {
|
3 | static unsigned char iteration = 0;
|
4 | ...
|
5 | ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT );
|
6 | ROM_TimerLoadSet( TIMER0_BASE, TIMER_A, (0x00000200 << iteration));
|
7 | ROM_TimerEnable( TIMER0_BASE, TIMER_A );
|
8 |
|
9 | iteration++; // schematisch...
|
10 | if (iteration > 7) iteration = 0; // ...
|
11 | ...
|
12 | AlteLEDsAusschalten();
|
13 | NeueLEDsEinschalten();
|
14 | ...
|
15 | }
|
und der Timer wird konfiguriert mit
1 | TimerConfigure( TIMER0_BASE, TIMER_CFG_ONE_SHOT );
|
2 | TimerLoadSet( TIMER0_BASE, TIMER_A, 0x00000400 ); // Wert egal
|
3 |
|
4 | IntEnable( INT_TIMER0A );
|
5 |
|
6 | TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT );
|
7 | TimerEnable( TIMER0_BASE, TIMER_A);
|
Der interrupt braucht deutlich weniger als die ~500 Zyklen für die
kürzeste Dauer.
Kann es sein, dass, obwohl ich den Timer direkt am Anfang des Interrupts
wieder einschalte, er erst nach beenden des Interrupts wieder anfängt zu
Zählen? Ich konnte jedenfalls durch einfaches abziehen einer konstante x
im TimerLoadSet für ein paar verschiedene Werte von x nicht das
gewünschte Verhalten erzielen.
Hat jemand eine Ahnung woran es liegen könnte bzw. was ich falsch
gemacht habe?
Schöne Grüße,
Max