Forum: Compiler & IDEs Flag gesetzt, aber nicht erkannt


von Johannes F. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

hab grad ein komisches Problem bei meinem Code und brauche deswegen 
bitte Hilfe.
Und zwar setze ich im Interrupt eine Flag, im main wird dies aber nich 
erkannt.
Im Anhang ist der betreffende Programmteil wo der Fehler auftritt.
Dass mein Programm in die Schleife springt, wo "signalInputCompleteFlag" 
gesetzt wird, weiß ich sicher. Aber im main bei der Abfrage der Flag 
wird sie nicht als gesetzt erkannt.

Wo liegt da das Problem?

mfg
jonny

von (prx) A. K. (prx)


Lesenswert?

volatile vergessen.

von Johannes F. (Gast)


Lesenswert?

A. K. schrieb:
> volatile vergessen.
Nein, volatile ist dabei.

mfg
jonny

von Grrrr (Gast)


Lesenswert?

Johannes F. schrieb:
> Nein, volatile ist dabei.

Nein, ist es nicht.

von mano (Gast)


Lesenswert?

Bissl wenig code den Du herzeigst.

von Johannes F. (Gast)


Lesenswert?

Grrrr schrieb:
> Nein, ist es nicht.
Gut, die Definition bei mir im Header- File schaut so aus: volatile char 
printFlag.
Wo soll ich denn noch was volatile setzen?

mfg
jonny

von (prx) A. K. (prx)


Lesenswert?

signalInputCompleteFlag

von Johannes F. (Gast)


Lesenswert?

A. K. schrieb:
> signalInputCompleteFlag

Hab das im vorigen Post sowieso verwechselt. Gemeint war natürlich 
signalInputCompleteFlag. Auch hier ist die Definition: volatile char 
signalInputCompleteFlag.
Hab extra noch mal geprüft.

mfg
jonny

von (prx) A. K. (prx)


Lesenswert?

Was soll eigentlich das cli() in der ISR? Ein langes Leben ist dem nicht 
beschieden, denn mit Ende der ISR wird es automatisch wieder gesetzt.

Mögliche Folge: index > 79 in der ISR.

Besser: Wenn Timer-Interrupt nicht mehr kommen soll, dann 
Timer-Interrupt abschalten.

von Johannes F. (Gast)


Lesenswert?

A. K. schrieb:
> Was soll eigentlich das cli() in der ISR? Ein langes Leben ist dem nicht
> beschieden, denn mit Ende der ISR wird es wieder gesetzt.

Hab zuerst versucht die Interrupts zu deaktivieren, weil das eventuell 
der Fehler sei. Hat aber auch nix geholfen.

mfg
jonny

von Laszlo H. (mobius)


Lesenswert?

Wo ist index definiert (volatile)? Wie groß ist index? Und setzt du es 
je wieder auf 0? Wie viele Elemente hat signal? Du machst in deinem 
timer keine Überprüfung, ob du nicht (versehentlich) über die Grenze 
deines Arrays hinausschießt.

Als Beispiel:
1. index = 78, interrupt kommt, index++ --> flag setzten
2. hauptroutine fangt zu arbeiten an (analyze)
3. interrupt bevor analyze index auf 0 setzt --> beschreiben des 81. 
elements = nicht gut.

Kannst du a) mit einer Überprüfung im Interrupt abfangen oder b) 
interrupts für die Abarbeitung von alanyze() deaktivieren oder c) 
analyze 100% schneller als den Timer machen. Ansonsten, zu wenig code, 
wie die anderen es schon gesagt haben (Glaskugel ist grad in Reperatur 
;) ).

btw, deine "if(PINB...." geht kürzer:
1
  if(PINB & (1<<PINB2))
2
    signal[index] = 1;
3
  else
4
    signal[index] = 0;
5
  index++;
oder noch ein wenig kürzer
1
  signal[index] = (PINB & (1<<PINB2)) ? 1 : 0;
2
  index++;

lg
Mobius

von Werner B. (werner-b)


Lesenswert?

1
signal[index] = (PINB & (1<<PINB2)) != 0;

von Johannes F. (Gast)


Lesenswert?

Hat sich erledigt, bin in einer Funktion in eine Endlosschleife und 
deswegen wirde dort die Flag nicht gesetzt.

mfg
jonny

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.