MSP430, Programm stoppt nach Interrupt Enable

OP Persönliche Seite #2254411
Lesenswert?

Hallo zusammen,

folgender Code auf dem MSP430F5310 führt zu seltsamen Ergebnissen. Die 
ISR des Timers A0 wird bedient, aber der Code in main() nach Interrupt 
Enable wird nach dem ersten Aufruf der ISR nicht mehr ausgeführt.
1
#include "msp430.h"
2

3
volatile int x = 0, z=0, y=0;
4

5
int main(void) {
6
  WDTCTL = WDTPW + WDTHOLD;
7
  
8
  TA0CCR0 = 100;
9
  TA0CCTL0 = CCIE | OUTMOD_2;
10
  TA0CTL = TASSEL_1 + ID_0 + MC_1 + TAIE;
11
  _BIS_SR(GIE);
12
  
13
  while(1) {
14
    x=y;
15
    z++;
16
  }
17
}
18

19
#pragma vector=TIMER0_A0_VECTOR
20
__interrupt void A1(void) {
21
  y++;
22
}  
23

24
#pragma vector=TIMER0_A1_VECTOR
25
__interrupt void A2(void) {
26
}

Wenn ich nach einer Weile anhalte, bekomme ich im Debugger folgende 
Werte:
y = 1066 (zählt im Laufe der Zeit auch noch weiter hoch)
z = 272 (was auch immer dieser Wert sagen soll - er erhöht sich bei 
längerem Laufen nicht weiter)
x = 1 (also der Stand von y, als die while(1)-Schleife zum letzten Mal 
bedient wurde - sprich nach dem esten Aufruf der ISR ist Schluss für die 
while(1)-Schleife).

100 Zyklen sollten für die ISR locker reichen, ein größerer Wert für 
TA0CCR0 macht auch keinen Unterschied. Es ist also noch genug Zeit für 
die while(1)-Schleife da. Low Power Mode ist auch nicht aktiviert, der 
Watchdog ist es auch nicht.
Wenn ich die Zeile mit BIS_SR auskommentiere, zählt die 
while(1)-Schleife anstandslos hoch, nur die ISR wird nicht mehr bedient. 
TAIE auskommentieren hat den gleichen Effekt.
Was mache ich falsch?

Gruß,

Max
Gast #2255152
Lesenswert?

Beim TIMER0_A0 Interrupt wird das Interrupt Flag automatisch gelöscht.
Beim TIMER0_A1 Interrupt geschieht dies nicht. Hier wird das Flag erst 
beim Zugriff auf das Timer Interrupt Vector Register zurückgesetzt. Wenn 
klar ist, dass nur ein Timer Overflow zum TIMER0_A1 Interrupt geführt 
haben kann, kann man natürlich auch das TAIFG Flag direkt zurücksetzen.
OP Persönliche Seite #2255190
Lesenswert?

Stefan schrieb:
> Beim TIMER0_A0 Interrupt wird das Interrupt Flag automatisch gelöscht.
> Beim TIMER0_A1 Interrupt geschieht dies nicht. Hier wird das Flag erst
> beim Zugriff auf das Timer Interrupt Vector Register zurückgesetzt. Wenn
> klar ist, dass nur ein Timer Overflow zum TIMER0_A1 Interrupt geführt
> haben kann, kann man natürlich auch das TAIFG Flag direkt zurücksetzen.

Stefan, danke Dir. Ich denke, das war der Punkt, leider kann ich es erst 
nächste Woche ausprobieren.

Max

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