mikrocontroller.net

Forum: Compiler & IDEs Flag gesetzt, aber nicht erkannt


Autor: Johannes F. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile vergessen.

Autor: Johannes F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> volatile vergessen.
Nein, volatile ist dabei.

mfg
jonny

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes F. schrieb:
> Nein, volatile ist dabei.

Nein, ist es nicht.

Autor: mano (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bissl wenig code den Du herzeigst.

Autor: Johannes F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
signalInputCompleteFlag

Autor: Johannes F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Laszlo H. (mobius)
Datum:

Bewertung
0 lesenswert
nicht 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:
  if(PINB & (1<<PINB2))
    signal[index] = 1;
  else
    signal[index] = 0;
  index++;
oder noch ein wenig kürzer
  signal[index] = (PINB & (1<<PINB2)) ? 1 : 0;
  index++;

lg
Mobius

Autor: Werner B. (werner-b)
Datum:

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

Autor: Johannes F. (Gast)
Datum:

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

mfg
jonny

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.