mikrocontroller.net

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


Autor: Christoph (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.).

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist Deine Variable "n" auch als "volatile" deklariert?

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.