mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik "Tacho" mit ATMega16 produziert seltsame Ergebnisse


Autor: Florian Beer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich von meiner Hauptroutine tacho_get_km() aufrufe, wechseln die
Werte ständig, auch wenn ich das ticks++ auskommentiere. Die Abfrage
von time funktioniert aber tadellos. Ich hab schon probiert, den
Rückgabewert von tacho_get_km() als char zu nehmen, die Variablen und
Funktionen als volatile zu kennzeichnen, alles ohne Erfolg. Hat jemand
eine Idee? Im Simulator klappts doch auch :-/

Autor: Florian Beer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler gefunden. ticks gabs schon in nem anderen Modul als Variable.
schäm
Gibts ne Möglichkeit, die Gültigkeitsbereiche für die Namen zu trennen?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Gibts ne Möglichkeit, die Gültigkeitsbereiche für die Namen zu
trennen?

Würdest du den relevanten Codeausschnitt bitte mal posten? Ich kann mir
gerade etwas schlecht vorstellen, was du meinst. :/


Wenn in C eine (statische) Variable mehrfach definiert ist, gibt es
Linkerfehler. Eine lokale Variable überdeckt aber eine globale, daher
ist folgender Code korrekt:

// globales foo
int foo = 1;

void bar()
{
  // lokales foo, überdeckt globales foo
  int foo = 0;
  // globales foo ist immer noch 1
}

gcc produziert da aber AFAIK zumindest eine Warnung, weil so ein
Verbergen von Variablen selten beabsichtigt ist.

Deine Variable ticks war ja global; ich vermute, du hast in einem
anderen Modul ticks unbeabsichtigt verändert. Genau deswegen sind in
C++ globale Variablen böse. Man überblickt die möglichen Änderungen
nicht.
Eine pragmatische Möglichkeit für dein Problem wäre folgende:

static unsigned int ticks;

Wenn man das Schlüsselwort static bei globalen Variablen angibt, hat es
eine andere Bedeutung als "statisch" (das sind globale Variablen ja
per se). Es bewirkt einfach, dass die Variable nur in der aktuellen ÜE
gültig ist. Das heißt, versehentliche Änderungen der Variable in einer
anderen .c-Datei sind nicht mehr so einfach möglich.

Autor: Florian Beer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, dann muss ich mal wieder meine C++-Kenntnisse ausgraben.
In einer Lib hatte ich ein unsigned char ticks, in der anderen ein
unsigned int ticks. Zugegriffen hat er auf die int-Variable, aber ohne
einen Fehler. Dann mach ich meine Variablen jetzt static...

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.