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
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
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.