Problem mit Interrup1

OP #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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.