mikrocontroller.net

Forum: Compiler & IDEs Problem mit volatile


Autor: Stefan (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Stefan (Gast)
Datum:
Angehängte Dateien:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jop, das mit dem Modus war falsch.


Hab das jetzt ein bisschen mehr geordnet und es funktioniert.


Vielen Dank an euch.

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.