Problem mit Interrup1

#3354033
Lesenswert?

Hallo, websurfer1111 hier,

ich habe ein Problem mit meinem ATmega16.

Ich möchte einen LED-Cube programmieren und mit Hilfe des Interrupt 1 
eine globale Variable hochzählen um zwischen verschiedenen Modies zu 
schalten.


Mein Problem:

Der Interrupt funktioniert, aber die globale Variable wird nicht 
hochgezählt... egal was ich ausprobiere. beim atmega8 hat´s 
funktioniert...
Die Ursache entzieht sich meinem Verständnis...


Der Code ist im angehängten C-File.
Angehängte Dateien:
Gast #3354049
Lesenswert?

VORNAME N. schrieb:
> Der Interrupt funktioniert, aber die globale Variable wird nicht
> hochgezählt... egal was ich ausprobiere. beim atmega8 hat´s
> funktioniert...

Das kann ich mir kaum vorstellen...

> Die Ursache entzieht sich meinem Verständnis...
>
> Der Code ist im angehängten C-File.

...denn in dem angehängten C-Code wird dein Programm nur einmal den Wert 
von a verwenden ( switch(a) ), um zu entscheiden, in welche 
Endlosschleife ( while(1) ) es springt. Wenn sich a später nochmal 
ändert, bekommt dein Programm das nicht mit.

MfG, Arno
Gast #3354084
Lesenswert?

VORNAME N. schrieb:
> Hab was ausgebessert... 10.10.  16:00

Und ich darf jetzt suchen, was du ausgebessert hast?

Hmm, damit dürfte der erste Fehler verschwunden sein.

Das hier sieht aber auch falsch aus:
1
if (a<=5)

Vermutlich wirst du zusätzlich noch Spaß mit dem Prellen des Tasters 
haben.

Ob in dem ganzen Code noch mehr Fehler versteckt sind, kann ich dir 
gerade nicht sagen. Bitte das Programm soweit einkürzen, dass der Fehler 
immer noch auftritt, aber diese vielen, vielen Zeilen Ein- und Ausgabe 
nicht mehr dabei sind.

MfG, Arno
#3354096
Lesenswert?

Das ist nicht sehr logisch
1
  if (a<=5)
2
  {
3
    a=0;
4
  }
5
  
6
  else
7
  {
8
    a=a+1;
9
  }

angenommen a hat gerade den Wert 0.
Was passiert.

if (a <= 5 )

Jep. ist der Fall. a hat ja den Wert 0.  Und 0 ist nun mal 
kleiner/gleich 5
-> der if Zweig wird genommen

  a = 0

Jetzt wird a wieder der Wert 0 zugewiesen.

Das ergibt nicht viel Sinn.

So was macht man so
1
  a++;
2
  if( a == 5 )
3
    a = 0;

dann versteht man das auch.
a wird um 1 erhöht. Und wenn man dann übers Ziel hinausgeschossen ist, 
dann wird a wieder auf 0 zurück gesetzt.
#3354119
Lesenswert?

Abgesehen davon wirst du so deinem Ziel, der Programmierung eines Cube 
sowieso nicht nahe kommen. Das ist der falsche Ansatz.
Die hardwaremässige Ansteuerung des Cube findet unabhängig davon statt, 
was angezeigt werden soll. In einem Timer-Interrupt. Der macht das 
Multiplexing.

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