Forum: Mikrocontroller und Digitale Elektronik Globale Variable in ISR immer 0


von Korbinian (Gast)


Lesenswert?

Hallo,

ich beschäftige mich seit kurzem mit dem TI MSP430. Dazu habe ich mir 
ein Launchpad gekauft und versuche mich gerade mit einem kleinem 
Programm, das über Interrupts gesteuert LED's ansteuert.

Leider wird die globale Variable wahl zwar in der Routine erhöht, 
allerdings ist sie beim nächsten Einsprung in die ISR wieder den Wert 0.
Ich sehe da keine Ursache, wer weiß eine Lösung.

gruß
Korbinian
1
#include "msp430.h"
2
unsigned char wahl; /* global variable */
3
4
#pragma vector = TIMERA1_VECTOR
5
__interrupt void TIMERA_OVF(void)
6
{
7
  TACTL = 0x02E0; /* Timer counts to 0xFFFF, Divider 8, INT disabled , INTFLAG disabled */
8
  if(wahl < 0x80) 
9
  {
10
    P1OUT ^= BIT0;
11
  }
12
  else if (wahl >= 0x80)
13
  {
14
    P1OUT ^= BIT6;
15
  }
16
  else if (wahl == 0xFF)
17
  {
18
    wahl = 0;
19
  }
20
  wahl++;
21
  __delay_cycles(10000);
22
  TACTL = 0x02E2; // Timer counts to 0xFFFF, Divider 8, INT enabled , INTFLAG disabled
23
}
24
25
int main( void )
26
{
27
  P1DIR = 0xFF; /* PORT1 direction: output */
28
  P1OUT = 0x00; /* Init PORT1 */
29
  __enable_interrupt(); /* enable global interrupt */
30
  TACTL = 0x02E2; /* Timer counts to 0xFFFF, Divider 8, INT enabled , INTFLAG disabled */
31
  for(;;)
32
  {
33
    /* do nothing */
34
  }
35
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das Stichwort lautet volatile.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das Stichwort lautet volatile.
Auch bei dieser Frage? Wie kommt der Compiler da drauf?

Wenn die Variable in der ISR geändert wird, dann sollte sie beim 
nächsten Interruptaufruf doch den geänderten Wert haben. Mag sein, dass 
ein volatile hier hilft, aber wo ist dieses Verhalten von globalen 
Variablen dokumentiert?


Aber das gibt mir in einer Interruptroutine doch sehr zu denken:
  __delay_cycles(10000);

von Korbinian (Gast)


Lesenswert?

Hab ich schon probiert, es hilft nichts.
1
volatile unsigned char wahl;

von codehamster (Gast)


Lesenswert?

Wo wird das Interrupt Flag des Timers gelöscht?

oder hab ich das übersehen?

von Korbinian (Gast)


Lesenswert?

1
TACTL = 0x02E0; /* Timer counts to 0xFFFF, Divider 8, INT disabled , INTFLAG disabled */

Das INT Flag ist Bit0 laut User Manual des MSP430.

von Sascha (Gast)


Lesenswert?

Hast du den Watchdog des MSP430 deaktiviert? Soweit ich das noch weiß, 
muss man den explizit deaktivieren, sonst zwingt er den uC dauernd in 
den Reset!

von Sascha (Gast)


Lesenswert?

Sorry für den Doppelpost.

Sascha schrieb:
> Hast du den Watchdog des MSP430 deaktiviert? Soweit ich das noch weiß,
> muss man den explizit deaktivieren, sonst zwingt er den uC dauernd in
> den Reset!

Den Watchdog kannst du so deaktivieren:
1
// Stop watchdog timer to prevent time out reset
2
WDTCTL = WDTPW + WDTHOLD;

von Korbinian (Gast)


Lesenswert?

AHHHHHH... jetzt wird mir auch klar warum in den Beispiel Projekten als 
erstes im Hauptprogramm steht:

[c]WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer[c]

Vielen Dank für den Hinweis, jetzt funktioniert es und ich hab schon 
fast an meinen Kenntnissen gezweifelt ;).

von Korbinian (Gast)


Lesenswert?

AHHHHHH... jetzt wird mir auch klar warum in den Beispiel Projekten als 
erstes im Hauptprogramm steht:
1
WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer

Vielen Dank für den Hinweis, jetzt funktioniert es und ich hab schon 
fast an meinen Kenntnissen gezweifelt ;).

von Sascha (Gast)


Lesenswert?

Aber die Zeile hier solltest du auch aus der ISR killen! Wartezeiten in 
der ISR = böse ;-)
1
 __delay_cycles(10000);

von Korbinian (Gast)


Lesenswert?

Die ist schon lange wieder rausgeflogen ;) Sollte auch nur eine 
Notlösung sein. Nun funktioniert auch alles wie es soll.

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
Noch kein Account? Hier anmelden.