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.
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.
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.
... 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.
Fast direkt nach "kiSpalte=j;" steht "modus=0;". Deine Testzeile steht aber in einem "if(modus==2)"-Block. Wie soll das zusammenpassen?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.