www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variablen in C aus einer in die andere Datei übergeben?


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich schreibe gerade eine Routine in C (Codevision). Die Routine wird in
einer eigenen Datei gespeichert, die ich dann im Hauptprogramm einfüge
(#include des Headers und eingebunden im Projekt).

Die Routine beinhaltet ein Flag-Register. Da die Routine von einem
Interrupt aufgerufen werden soll (kein Rückgabewert möglich), möchte
ich auf den Zustand des Flag-Registers auch vom Hauptprogramm aus
zugreifen können. Das klappt aber nicht! Warum nicht?!

Ich habe den Eindruck, dass das Flag-Register (wie gesagt, in einer
anderen Datei angelegt) nicht im Hauptprogramm existiert. Kann das
sein? Fehlermeldungen gibt es aber keine!

Übrigens: Im Simulator funktioniert seltsamerweise alles!!

Ich hoffe, ich konnte mein Problem verständlich machen (ich kann auch
gerne Code posten). Weiß hier jemand Rat?

Grüsse,
Steffen


P.s.: Ich hab auch schon mit dem Schlüsselwort "extern" rumgespielt,
kam aber auch damit nicht weiter!

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal die Variable mit "volatile" anzulegen vielleicht klappt es
dann

Autor: Der Elektrische Reiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ein Stück Software im Simulator das tut was es soll, im richtigen
Leben aber nicht, ist oft ein Seiteneffekt der Grund.
Interrupt-Routinen, fremde Programmteile, Stacks usw. sind typische
Kandidaten, die das Flag unbeabsichtigt überschreiben oder ändern
könnten.

cu

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die beiden Tipps!

Volatile hat leider keine Veränderung gebracht. Der Code wird genau
gleich wie vorher übersetzt und das Problem bleibt logischerweise
auch.

Das mit den Seiteneffekten erscheint mir logisch. Es ist aber so, dass
ich in der Interrupt-Routine meine externe Routine aufrufe und nach dem
Aufruf wieder in der Interrupt-Routine zurücklande. Das Interessante
dabei ist folgendes:

Wenn ich in der vom Interrupt aufgerufenen Routine mein Flag-Register
teste, klappt alles. In der aufrufenden Interrupt-Routine, in der ich
dann hinterher ja lande, klappts mit einem Mal aber nicht mehr!
Dazwischen liegt nur der Rücksprung!! Können das trotzdem noch
Seiteneffekte sein?

Ich steh total auf dem Schlauch und komm ohne Hilfe nicht weiter :-(
Ich hoffe, ihr habt noch ein paar Tipps für mich!

Grüsse,
Steffen

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halt Kommando zurück! Ich hab den Fehler...

Der Fehler ist ein ganz anderer. Ich programmiere noch nicht so lange
in C. Ich dachte, man könne Bit-Variablen mit dem Schlüsselwort
"sfrb" deklarieren. In Wirklichkeit ist das jedoch nur für
IO-Register möglich, für alles andere mus man "bit" nehmen.

Sowas blödes, hat viel Zeit gekostet. Keine Ahnung, warum im Simulator
alles funktionierte.

Vielen Dank für Eure Ratschläge!
Grüsse,
Steffen

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.