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.
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
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
Hab wieder was verändert. Nach Wünschen von Arno. ps.: der Taster prellt nicht. es war nur zur Sicherheit.
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
hoppla. hab größer und kleiner vertauscht... Vielen herzlichen Dank meiner Seits, das programm funktioniert jetzt einwandfrei, bei mir zuhause!
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.