Forum: Mikrocontroller und Digitale Elektronik MSP430 - Globale Variable in ISR inkrementieren geht nicht trotz volatile


von Elminjo A. (elminjo)


Lesenswert?

Ich verwende einen M430G2553 in einem Launchpad.

Obwohl ich die zu inkrementierende variable als volatile deklariert habe 
wird sie in der ISR nicht erhöht. Das Ergebnis und beobachten beim 
debuggen weisen darauf hin.

1. Wieso wird die Variable nicht um eins erhöht?
2. define funktioniert nicht
Das geht:
1
P1DIR |= BIT0|BIT6;

Das geht nicht:
1
#define LED1 BIT6;
2
#define LED2 BIT0;
3
  
4
P1DIR |= LED1|LED2      //Fehler: #29 expected an expression


Ähnlicher Fehler:
1
#define zyklen 10000;
...
1
zeit = zyklen/10*modus;    //Fehler: #29 expected an expression

Edit: 3. Wie setze ich den Filter (MSP430) hier im Forum für das 
richtige Unterforum?

mein Code:
1
#include<msp430.h>
2
#include<stdint.h>
3
4
volatile int modus = 1;
5
volatile unsigned int zyklen = 10000;
6
7
void spause(uint16_t zeit) {
8
  volatile unsigned int i;
9
  for (i = 0; i <= zeit; i++) {
10
  }
11
}
12
13
uint16_t an(uint8_t modus) {
14
  uint32_t zeit;
15
  zeit = zyklen / 10 * modus;
16
  return zeit;
17
}
18
19
int main(void) {
20
  WDTCTL = WDTPW | WDTHOLD; // Stopwatchdogtimer
21
22
  //Konfiguration P1.3 als Taster, inkl. Interrupt
23
  P1DIR &= ~BIT3;           // Taster an P1.3 ist Eingang
24
  P1REN |= BIT3;             // Pull-Widerstand ein
25
  P1OUT |= BIT3;             // Pull up
26
  
27
  P1IES &= ~BIT3;           // Interrupt bei fallender Flanke
28
  P1IE |= BIT3;             // Interrupt ein
29
30
  //Konfiguration LEDs
31
  P1DIR |= BIT0 | BIT6;        //P1.0 und P1.6 als Ausgang
32
//  P1OUT &= ~(0x1|BIT6);        //LED auschalten
33
34
  _bis_SR_register(GIE);        // Interrupts global ein
35
36
  for (;;) {
37
    uint16_t aus;
38
    uint16_t ans;
39
40
    P1OUT |= BIT6;          //LED anschalten
41
    ans = an(modus);        //Berechnung: Wie lange bleibt LED an
42
    spause(ans);          //Übergabe der Pausezyklen an spause
43
44
    P1OUT &= ~BIT6;          //LED ausschalten
45
    aus = zyklen - an(modus);    //Berechnung: Wie lange bleibt LED aus
46
    spause(aus);          // Übergabe der Pausezyklen an spause
47
48
  }
49
}
50
#pragma vector=PORT1_VECTOR
51
__interruptvoidPort_1(void) {
52
  P1OUT ^= BIT0;            //P1.0 LED toggeln, Check ob ISR auslöst
53
  modus++;               // modus erhöhen
54
  if (modus > 9) {          //Modus ab 10 auf 1 zurücksetzen
55
    modus = 1;
56
  }
57
  P1IFG &= ~BIT3;           // Interrupt-Flaglöschen
58
}

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
 #define LED1 BIT6;

Hinter ein #define gehört niemals ein Semikolon.


Warum?

Mach mal den Textersatz selbst:
1
P1DIR |= LED1|LED2

Das wird zu
1
P1DIR |= LED1;|LED2;

von Max G. (l0wside) Benutzerseite


Lesenswert?

Zum #define hat sich Rufus schon geäußert.

Wird deine ISR überhauot ausgeführt? Der Funktionsheader ist ein 
bisschen sehr leerzeichenoptimiert. Mach mal daraus
1
#pragma vector=PORT1_VECTOR
2
void Port_1(void) {


Ansonsten ist MSP430 besser bei e2e.ti.com aufgehoben, die reden aber 
Englisch. Hier wird zu 90% AVR verwendet.

Max

von Elminjo A. (elminjo)


Lesenswert?

Rufus Τ. F. schrieb:
> #define LED1 BIT6;
> Hinter ein #define gehört niemals ein Semikolon.

Vielen Dank, ich sollte mich schämen, mein C ist etwas eingerostet.

Max G. schrieb:
> Wird deine ISR überhauot ausgeführt? Der Funktionsheader ist ein
> bisschen sehr leerzeichenoptimiert. Mach mal daraus
> #pragma vector=PORT1_VECTOR
> void Port_1(void) {

Ja, die ISR wird ausgeführt. Ich bringe in der ISR eine LED zum toggeln. 
Das tut sie auch wenn ich die Taste drücke.
Die Lücken sollten kein Problem sein und sind durch eine 
CodeComposerStudio Format-Funktion entstanden. Werde sie mal wieder 
rausnehmen.

Wenn es hier keine anderen Vorschläge gibt, dann werde ich Deinen 
Vorschlag beherzigen und es in einem anderen Forum probieren.

Wie setze ich den Filter für das Unterforum (MSP430)?

von Clemens L. (c_l)


Lesenswert?

Der Interrupt für den Taster ist nicht entprellt.

Woraus genau schließt du, dass modus nicht erhöht wird?

Es gibt hier keinen Filter für MSP430.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Clemens L. schrieb:
> Es gibt hier keinen Filter für MSP430.

Doch, und er funktioniert auch.

https://www.mikrocontroller.net/forum/mikrocontroller-elektronik/msp430

von Elminjo A. (elminjo)


Lesenswert?

Max G. schrieb:
> Zum #define hat sich Rufus schon geäußert.
>
> Wird deine ISR überhauot ausgeführt? Der Funktionsheader ist ein
> bisschen sehr leerzeichenoptimiert. Mach mal daraus
>
>
1
> #pragma vector=PORT1_VECTOR
2
> void Port_1(void) {
3
>


Du hattest Recht, jetzt geht es. Ich hatte ert nicht ganz verstanden was 
Du meintest.

Jetzt wird die Variable erhöht und die LED getoggelt.
Komisch dass vorher das LED toggeln funktioniert hat.

VIELEN DANK.

Clemens L. schrieb:
> Der Interrupt für den Taster ist nicht entprellt.
Das stört nicht sehr.

Clemens L. schrieb:
> Woraus genau schließt du, dass modus nicht erhöht wird?
Einmal dass es nicht das tut was es soll und im Debugger kann man sich 
die Variable ankucken.

Clemens L. schrieb:
> Es gibt hier keinen Filter für MSP430.
Und was ist mit: 
https://www.mikrocontroller.net/forum/mikrocontroller-elektronik/msp430

von Elminjo A. (elminjo)


Lesenswert?

Rufus Τ. F. schrieb:
> Clemens L. schrieb:
>> Es gibt hier keinen Filter für MSP430.
>
> Doch, und er funktioniert auch.
>
> https://www.mikrocontroller.net/forum/mikrocontroller-elektronik/msp430

Wie? Alleine dadurch, dass ich MSP430 im Titel habe? Hatte direkt nach 
dem erstellen gekuckt und nichts im Unterforum gesehen.

von Clemens L. (c_l)


Lesenswert?

Was passiert, wenn du die erste Zeile des Interrupt-Handlers mit
1
P1OUT = (P1OUT & ~1) | (modus & 1);
ersetzt?

: Bearbeitet durch User
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.