Flag gesetzt, aber nicht erkannt

Gast #1679289
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
Angehängte Dateien:
Gast #1679342
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
#1679376
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

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