globale Variable initialisiert mehrfach

Gast #74696
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
Angehängte Dateien:
Gast #74699
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
Gast #74700
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.
Gast #74701
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren