Forum: Compiler & IDEs Problem mit Interrup1


von VORNAME N. (vorname_n28)


Angehängte Dateien:

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.

von Arno (Gast)


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

von VORNAME N. (vorname_n28)


Angehängte Dateien:

Lesenswert?

Hab was ausgebessert... 10.10.  16:00

von Arno (Gast)


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

von VORNAME N. (vorname_n28)


Angehängte Dateien:

Lesenswert?

Hab wieder was verändert. Nach Wünschen von Arno.

ps.: der Taster prellt nicht. es war nur zur Sicherheit.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von VORNAME N. (vorname_n28)


Lesenswert?

hoppla. hab größer und kleiner vertauscht...

Vielen herzlichen Dank meiner Seits, das programm funktioniert jetzt 
einwandfrei, bei mir zuhause!

von Karl H. (kbuchegg)


Lesenswert?

VORNAME N. schrieb:
> hoppla. hab größer und kleiner vertauscht...
>
> Vielen herzlichen Dank meiner Seits, das programm funktioniert jetzt
> einwandfrei, bei mir zuhause!

Aber teile es um Gottes Willen in ein paar Funktionen auf.
Eine derartige Wurscht an Code kann doch kein Mensch mehr überblicken!

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
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.