Verstehe meine Variablen nicht mehr...

Gast #223013
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.).
Angehängte Dateien:
Gast #223015
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.

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.