mikrocontroller.net

Forum: Compiler & IDEs globale Variable initialisiert mehrfach


Autor: Roland Röck (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

angehängt habe ein abgespecktes Programm, das timer-gesteuert den Wert
der globalen
Variablen Nrbg über die UART ausgibt.


/* globale Variablen */
volatile unsigned char Nrbg = 2;


SIGNAL(SIG_OVERFLOW0)
/* signal handler for Timer 0 overflow */
{
          // FEHLER: Nrbg wird in der ISR immer neu mit
          // dem Wert aus der global-Deklaration initialisiert !!!
  Nrbg++;        // also 2++ = 3
     Tx_wert = Nrbg + 0xf1;    // 3 + 0xf1 = 0xf4
  uart_send_byte( &Tx_wert);  // 0xf4 wird vom Terminalprogramm
empfangen
}


Folgender Fehler tritt auf:
Die global deklarierte Variable "Nrbg" wird bei der Verwendung in der
Timer-ISR
jedesmal neu initialisiert - verhält sich also überhaupt nicht
statisch, wie gewünscht !
Compiler Version WinAVR-20030424.

Was habe ich übersehen?

Vielen Dank
Gruß Roland

Autor: Roland Röck (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

anbei noch das verwendete Makefile

Autor: Klaus Sperlich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte so ein Problem auch mal. Da hatte ich vergessen, den
Watchdog auszuschalten, so dass mein Programm immer wieder
neu gestartet wurde und die Variablen immer neu initialisiert
wurden.
Bin zwar eignetlich mehr MSP430er, ab Dein Programm sieht so
aus, als wenn am Watchdog nicht's eingestellt wird.

Gruß
Klaus

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auslösen eines Interrupts, für den kein Handler registriert ist,
hätte einen ähnlichen Effekt.  Beispielsweise sind RXCIE und TXCIE
eingeschaltet, aber ich finde in dem Schnipsel keine Handler dafür.
Damit würde jedes zufällig empfangene Zeichen genauso wie das
vollständige Absenden des ersten Zeichens effektiv zu einem Reset
führen.  Letzteres ist ja praktisch garantiert...

Übrigens ist TXCIE weit weniger sinnvoll als gemeinhin angenommen
wird.  Sinnvoller ist die Benutzung von UDRIE, so daß nach dem
Entleeren des transmit holding registers (also während das aktuelle
Zeichen gesendet wird) bereits das nächste zu sendende Zeichen
nachgeschoben werden kann.

Autor: Roland Röck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Auslösen eines Interrupts, für den kein Handler registriert ist,
>hätte einen ähnlichen Effekt.

Bereits das Einfügen eines:
a global "catch-all" interrupt handler that gets all unassigned
interrupt vectors can be installed using the name __vector_default.

INTERRUPT(__vector_default)
{
}

zeigte, woher der Fehler kam.


Danke für die rasche Hilfe

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Effektiver ist es natürlich, gar keine Interrupts erst auslösen zu
lassen, für die man keine Behandlung hat. :-)

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.