globale Variable initialisiert mehrfach

Gast #74696
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
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
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
>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

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.