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.).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.