Forum: Compiler & IDEs Problem mit volatile


von Stefan (Gast)


Lesenswert?

Hallo,

es gibt eine globale volatile int Variable namens kiSpalte. In einer 
Funktion die von der main aufgerufen wird gibt es eine int variable 
namens j die den Wert 0 hat.

kiSpalte=j;

Ich habe in der Funktion beide Variablen überprüft...

if(kiSpalte==0) setPixel(7,7,rot);

und

if(j==0) setPixel(7,7,rot);


In beiden Fällen leuchtet die LED rot.


Dieser kleine "Testbefehl" wird wieder rausgenommen und OCR1A aktiviert.

TIMSK|=(1<<OCIE1A); (Taktfrequenz ca. 2 Hz)


Jetzt wird die Testfunktion im ISR aufgerufen....

if(kiSpalte==0) setPixel(7,7,rot);


Die LED leuchtet nicht.



Kann mir jemand sagen wo der Fehler ist?


Vielen Dank.

von Karl H. (kbuchegg)


Lesenswert?

Stefan schrieb:

> Kann mir jemand sagen wo der Fehler ist?
>

Es wäre so unendlich einfacher, wenn du einfach nur den nicht 
funktionierenden Code möglichst vollständig zeigen würdest anstatt ihn 
zu beschreiben.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hmm, der ist n bisschen länger. Hab schon nach logischen Fehlern gesucht 
und es ist denke ich keiner da.


Hab schon alles probiert zu (volatile int) zu casten...


Es handelt sich um eine 8x8 RGB Matrix. Diese wird durch einen ATmega8 
und 4 Schieberegistern angesteuert.


Ein weiteres Schieberegister liest die Tasten des "Gamepads" ein.

4 Gewinnt mit einem KI Gegner ist das Ziel.



Die entsprechenden Zeilen befinden sich unter

ISR(TIMER1_COMPA_vect)  // Fallender Stein
    if(modus==2)  // KI bewegt Stein in die Richtung wo er ihn fallen 
lassen will



und die Funktion

kiTurn



Der Code ist aber recht lang und ich schätze, dass mein erster Beitrag 
ausreicht um den Fehler zu finden... es hat irgendwas mit dem volatile 
Kram zu tun. Hab schon logische Fehler gesucht... alles so wie es sein 
soll, nur dass der Wert nicht übernommen wird.

von Stefan (Gast)


Lesenswert?

... kurze Erklärung was die Zeilen bedeuten.

kiSpalte=j;

Hier wird abgespeichert in welcher Spalte der KI den Stein fallen lassen 
soll.


if(modus==2)  // KI bewegt Stein in die Richtung wo er ihn fallen lassen 
will
  {
    if(kiSpalte==0) setPixel(7,7,rot);
    if(position>kiSpalte)
    {
      setPixel(0,position,schwarz);
      position--;
      setPixel(0,position,gelb);
    } else
    if(position<kiSpalte)
    {
      setPixel(0,position,schwarz);
      position++;
      setPixel(0,position,gelb);
    }
  } else
  {
    modus=0;  // KI lässt den Stein fallen
  }


In der obersten Zeile befindet sich ein "gelber Stein" des KI

Er soll diesen Stein in die Richtung bewegen wo er ihn fallen lassen 
soll.
Die Variable position gibt an in welcher Spalte er sich zur Zeit 
befindet.


Wenn ich das Programm starte bewegt sich der Stein aber nicht zur Spalte 
0 sondern in die andere Richtung. Daher die Testfunktionen

if(kiSpalte==0) setPixel(7,7,rot);


kiSpalte hat den Wert 0 nicht übernommen.

von Stefan E. (sternst)


Lesenswert?

Fast direkt nach "kiSpalte=j;" steht "modus=0;".
Deine Testzeile steht aber in einem "if(modus==2)"-Block.
Wie soll das zusammenpassen?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Es genügt nicht, mit der Schrotflinte alles volatile zu machen. Du musst 
auf Daten, die sich ISR und Programm teilen, dann auch atomare Zugriffe 
machen. Sonst werden die Daten nämlich hin und wieder inkonsistent, weil 
während des Zugriffs eine IRQ auslösen kann.

Johann

von Stefan (Gast)


Lesenswert?

Jop, das mit dem Modus war falsch.


Hab das jetzt ein bisschen mehr geordnet und es funktioniert.


Vielen Dank an euch.

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.