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
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
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.
>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
Effektiver ist es natürlich, gar keine Interrupts erst auslösen zu lassen, für die man keine Behandlung hat. :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.