"if(globaleVariable==0)" funktioniert nicht

Gast #1224560
Lesenswert?

Hallo

ich habe hier eine selbst gebaute 3x3 LED-Matrix und eine 3x3 
Tastermatrix.

Die LEDs und Taster werden mit ca 100 Hz durch Interrupt angesteuert.

Wenn ein Taster gedrückt wird, wird die globale Variable inputEnable im 
Interrupt auf 0 gesetzt und die zum Taster entsprechende LED leuchtet.

Komischerweise erkennt er if(inputEnable==0) nicht in der while 
Schleife. Hier der Code:
1
int inputEnable=1;
2

3
int main(void)
4
{
5
  int temp;
6
  init();
7
  while(1)
8
  {
9
    if(inputEnable==0)    // Spieler hat einen Stein gesetzt
10
    {
11
      feld[0][0]=1;    
12
    }
13
  }
14
  return 0;
15
}


Zum Testen soll also einfach die LED in der Ecke [0][0] angehen. Tut sie 
aber nicht.
Gast #1224570
Lesenswert?

Oh, tut mir Leid hab ich vergessen:

Ich weiß, dass interruptEnable==0 ist da das anschalten der anderen LEDs 
gesperrt ist. Ich häng mal das File an. Gleich oben ist der Interrupt. 
Egal welchen Taster man drückt, die entsprechende LED geht an. Danach 
sind die anderen gesperrt und trotzdem leuchtet die LED in der Ecke 
nicht.
Angehängte Dateien:
Gast #1224584
Lesenswert?

Ja. Der Timer wird alle 0,01/3 s neu gestartet und dabei der Interrupt 
ausgelöst. Das Programm ist ja schon sehr reduziert. Die ganzen 
Funktionen unten werden garnicht benutzt. Durch den Interrupt weiß ich 
ja, dass darin inputEnable!=1. In der while Schleife kapiert er das 
nicht.
#1224589
Lesenswert?

feld[0][0] muss hier auch volatile sein, um ein Zurückschreiben der 
geänderten Variable in der Schleife zu erzwingen. Ein lokaler Cast wäre 
hier das Beste:
1
    if(inputEnable==0)    // Spieler hat einen Stein gesetzt
2
    {
3
      (volatile int)feld[0][0]=1;    
4
    }

PS: Und mache dir mal Gedanken über die Größe der Variablen. Die sind 
alle größer als nötig, was eine schlechte Idee ist.
Gast #1224595
Lesenswert?

(volatile int)feld[0][0]=1;

main.c:188: error: lvalue required as left operand of assignment



Ich hatte neulich Probleme mit chars, da hab ich jetzt erstmal int 
genommen. Der Platz reicht schon aus.



Alternative stimmt auch nicht. Ich kann überall wo er sonst durchgeht 
feld[0][0]=1 setzten und die LED leuchtet. Das geht mit allen LEDs.
Gast #1225023
Lesenswert?

So, da dies nur ein kleiner Test war und ich das Feld ziemlich oft 
brauche kommt es immer wieder zu Fehlern.


Wie schafft man es also ein Feld sowohl in einem Interrupt als auch in 
der main Funktion schreiben/lesen zu können.


Reicht es wenn ich das Feld ebenfalls

volatile

definiere?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren