Problem in Timer ISR

OP #2824311
Lesenswert?

Hallo,

ich bin immer noch an meiner RGBW-Lampe. Sie nimmt langsam gestalt an 
:). Aber ein Problem gibt es. Und zwar läuft die PWM aus dem Artikel 
hier ohne Probleme. Aber nur solange ich in der ISR, die mit der PWM 
nichts zu tun hat wie folgt stehen habe:
1
volatile uint16_t fader_max[FADER_CHANNELS];
2
volatile uint8_t fader_state;
3
volatile uint8_t fader_ovf;        /* wenn mehr als 8 Kanäle benötigt werden vergrößern */
4

5
ISR(TIMER0_COMP_vect)
6
{  /* Überprüfen der Fader - Zähler, wenn Zeit erreicht entsprechendes Flag für Kanal in fader_ch_ovf setzen*/
7
  uint8_t i, tmp;
8
  uint8_t m1 = 1;
9
  tmp = fader_ovf;
10
  for(i = 0; i < FADER_CHANNELS; i++){
11
    fader_cnt[i]++;
12
    if(fader_cnt[i] >= fader_max[i]){
13
      fader_cnt[i] = 0;
14
      //tmp |= m1;    /* Wenn mehr als 8 Kanäle benötigt werden fader_ch_ovf vergrößern */
15
      m1 <<= 1;
16
    }
17
  }
18
  fader_ovf = tmp;
19
}

Wenn ich die folgende Zeile einkommentiere:
1
 tmp |= m1;
Dann bringt das meine PWM durcheinander (Soft-PWM intelligente Lösung 
hier aus den Artikeln) obowhl dort definitiv nicht auf die Variable 
fader_ovf zugegriffen wird. Auf die Variable wird auch nirgends sonst im 
Programm zugegriffen, nur am Anfanf bei der Initialisierung auf 0 
gesetzt.

Habe ich hier irgend einen fatalen Fehler in der ISR gemacht, oder woran 
kann das liegen.

Ja ich weiß, ohne ganzen Code wirds schwierig, aber das sind gleich 
einige Dateien. Das wollte ich euch erstmal ersparen, vllt. ist ja der 
Fehler so schon offensochtlich, nur ich sehe es nicht.

Oder liegt es daran, das die Variable sonst nirgends verwendet wird? 
(Ich hatte jetzt den Fader, der sie verwendet ausgeschaltet)

Lg

Edit:

habe gerade nochmal die Zeilen eingebunden, das die Variable auch 
außerhalb von der ISR genutzt wird. Trotzdem genau der gleiche Effekt.
OP #2824467
Lesenswert?

FADER_CHANNELS hat den Wert 5.
fader_ovf wird außerhalb der ISR nicht benutzt. Wenn es außerhalb 
benutzt wird (Löschen der einzelnen Bits) dann passiert aber trotzdem 
das Gleiche. Meine Vermutung ist, das durch die Zeile irgendwie für eine 
kurze Zeit die Interrupts blockiert werden. Dadurch hängt sich dann 
gewissermaßen die PWM für eine kurze Zeit auf.

Aber eigentlich baue ich ja mit der Zeile keine Möglichkeit ein, das 
irgend eine Variable überläuft und der µc länger in der ISR hängt als 
geplant.

Edit:

Also ich habe jetzt mal die Interrupts frei gegeben in der ISR. Und 
siehe da - das Blitzen ist weg. Also stimmt meine obige Vermtung doch, 
aber wie soll es durch die eine Zeile zu so einem  Überlauf kommen, das 
die ganze Sache dann so lange dauert?
Ich weiß nicht mehr wo ich noch suchen soll.
OP #2824484
Lesenswert?

oh, fader_cnt habe ich nicht mehr mit kopiert.
steht einfach oben drüber als
1
volatile uint16_t fader_cnt[FADER_CHANNELS];

Habe noch folgendes ausprobiert:

1) Umweg über tmp nicht gehen und direkt in fader_ovf schreiben
 > gleicher Effekt

2) fader_ovf bzw. tmp einen festen Wert zuordnen
 > das geht, ich vermute das wird sicherlich einfach weg optimiert

Und wie gesagt, sobald ich die Zeile auskommentiere geht es. fader_ovf 
wird sonst nirgends benutzt. Habe die Suchmaschine durchlaufen lassen. 
Das kann doch nicht sein ...

Nochetwas:

Das Blinken ist ganz regelmäßig. Ca. im Sekundentakt. Die ISR läuft 
übrigens mit 100Hz.
OP #2824501
Lesenswert?

Sorry, das ich eure Nerven strapaziert habe, es liegt wohl doch an einem 
anderen Stück Code. Habe einfach mal die PWM geändert (also 
Tastverhältnis) und es ist weg. Da muss ich doch wohl wo anders noch 
schauen. Sorry, tut mir echt leid, aber ich suche nun schon seit 2 Tagen 
...

Nein, es stimmt schon so. Bits sollen nicht getoggelt werden sondern nur 
wieder gesetzt. Und auch nicht wieder gelöscht.
OP #2824627
Lesenswert?

Naja, also ich hatte sie ja nur zur Fehlersuche nicht weiter verwendet, 
im normalen Programm verwende ich fader_ovf natürlich. Nur habe ich eben 
jetzt festgestellt, das die SoftPWM aus dem Artikel intelligente Lösung 
keine 255 als pwm_setting verkraftet. Warum auch immer, ich habe da den 
Fehler noch nicht gefunden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren