Forum: Mikrocontroller und Digitale Elektronik Verstehe meine Variablen nicht mehr...


von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

Auch wenn es kein prägnanter Betreff ist, passen tut es irgendwie
schon...

Ich versuche seit längerem eine Schleifen-Funktion mit dem
Output-Compare-Mode des Atmega16 mit GCC zu realisieren. Nach jeweils
einer Millisekunde wird ein Output-Compare-Match-Interrupt ausgelöst,
der eine Variable "n" hochzählt. In der delay-Schleife wird die
Variable mit der Anzahl (abgespeichert in der Variablen "timer") der
zu durchlaufenden Schleifen verglichen und wenn beide gleich sind, der
Timer wieder gestoppt. Dieser Vergleich klappt jedoch nicht in der
delay-Routine, allerdings gelingt er in der Interrupt-Routine schon.
Zur Anzeige dienen mir PB0 (in der delay-Routine) und PB1 (in der
Interupt-Routine), die jeweils gesetzt werden, wenn der Vergleichswert
erreicht wurde.

"n" ist als globale Variable definiert, warum scheitert dann also der
Vergleich in der delay-Routine?

Ich hoffe, es weiß jemand Rat.

Gruß
Christoph

PS: Benutze ich keine Interrupts und frage des
Output-Compare-Match-Flag direkt in der delay-Routine ab und zähle
dabei "timer" einfach runter, funktioniert es wunderbar (Dieser
Code-Teil ist auskommentiert.).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ist Deine Variable "n" auch als "volatile" deklariert?

von Unbekannter (Gast)


Lesenswert?

Wie Rufus schon anmerkte, Du musst "n" als "volatile" deklarieren.

Der Grund dafür ist der OPtimierer des Compilers. Wenn Du "volatile"
angibst, weiß der Compiler, dass er "n" immer aus der entsprechenden
RAM-Zelle lesen oder schreiben soll. Wenn "volatile" nicht angegeben
ist, kann der Compiler die definierten Zugriffe auf die entsprechende
RAM-Zelle wegoptimieren, z.B. "n" in einem Register halten oder so.

Der Optimierer des Compilers weiß ja nichts von den Interrupts und auch
nicht wann und wo die auftreten können.

von Christoph (Gast)


Lesenswert?

Jetzt ist sie als volatile deklariert und es geht. Bin ich vorher noch
nie in Konflikt mit geraten, daher danke für den hilfreichen Hinweis.

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.