Forum: Compiler & IDEs Problem in Timer ISR


von Martin K. (spyro07)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Welchen Wert hat FADER_CHANNELS?
Wird fader_ovf außerhalb der ISR benutzt? Wenn ja, wie?

von Martin K. (spyro07)


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.

von Konrad S. (maybee)


Lesenswert?

Wie/wo ist denn fader_cnt definiert?

von Martin K. (spyro07)


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.

von Michi (Gast)


Lesenswert?

Kann es sein, dass du meinst tmp ^= m1, um die einzelnen Bits zu 
toggeln?

von Martin K. (spyro07)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin K. schrieb:
> FADER_CHANNELS hat den Wert 5.

Okay.

> fader_ovf wird außerhalb der ISR nicht benutzt.

Dann kannst Du sie aus dem Source komplett löschen, ebenso die 
tmp-Variable. fader_ovf wird zwar in der ISR mitgeschleppt (und 
zwischenzeitlich nach tmp und wieder zurück kopiert), aber inhaltlich 
nicht ausgewertet.

von Martin K. (spyro07)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.