MSP430 Interruptproblem

#2400033
Lesenswert?

Guten Abend,


Sitze jetzt schon ein paar Stunden an diesem (eigentlich) simplen Code 
aber verstehe nicht was falsch ist. Um ein Gefühl für den für mich neuen 
Controller und die IDE etc zu bekommen wollte ich zwei LEDs auf dem TI 
Launchpad blinken lassen.

Hier erstmal mein Code:
1
#include "msp430g2211.h"
2

3
volatile unsigned char flag = 0;
4

5
void main( void )
6
{
7
  // Stop watchdog timer to prevent time out reset
8
  WDTCTL = WDTPW + WDTHOLD;
9
  
10
  // Port1 Ausgang
11
  P1DIR = 0xFF;
12
  
13
  // Interrups global aktivieren
14
  __enable_interrupt();
15
  
16
  // Timer einstellen
17
  TACTL |= TASSEL1; // Clock Source SMCLK
18
  TACTL |= ID1 | ID0;   // Divider 8
19
  TACTL |= TAIE;   // Interrupt aktivieren
20
  TACCR0 = 0xF424;      // Bis hierhin zählt der Counter  (100 Hz ~ 0x04E2, 2Hz ~ F424)
21
  
22
  TACCTL0 &= ~CAP;  // Compare Mode
23
  TACCTL0 |= CCIE;  // Compare Interrupt aktivieren
24
  TACTL |= MC0;     // Modus: Up -> Ab hier läuft der Counter
25
  
26
  P1OUT = 0;   // LEDs aus
27
  
28
  while(1)
29
  {
30
    if (flag == 1)
31
    {
32
      P1OUT ^= BIT6;
33
      flag = 0;
34
    }
35
  }
36
}
37

38
#pragma vector = TIMERA0_VECTOR
39
__interrupt void TIMERA0_ISR(void)
40
{
41
  P1OUT ^= BIT0;
42
  flag = 1;
43
}

Eine LED wird direkt in der ISR getoggelt, die andere sollte über das 
Setzen des flags in der Hauptschleife getoggelt werden. Ja, sollte, denn 
das funktioniert nicht. Die LED an P1.0 toggelt fröhlich vor sich hin, 
die an P1.6 macht nichts.
Wenn ich in die ISR allerdings einen Breakpoint mache, toggelt auch die 
andere LED. Das wiederum jedoch nur, wenn ich nach Erreichen des 
Breakpoints mit Einzelschritten weitermache. Wenn ich einfach immer 
wieder auf "Go" klicke toggelt nur P1.0...

Jemand ne Ahnung was da schief läuft? Achja, als IDE verwende ich IAR 
Kickstart.

Was ich auch noch komisch finde, wenn ich auf "Stop Debugging" klicke, 
hört ich die eine LED auf zu toggeln, sollte das Programm nicht auch 
nach dem Ende des Debuggens weiterlaufen?
#2400271
Lesenswert?

Roland H. schrieb:
>> TACTL |= TAIE
>
> Das aktiviert m. W. den "overflow interrupt". Würde somit hier nicht
> benötigt.
>
>> TACCTL0 |= CCIE
>
> Das sollte den gewünschten "compare interrupt" aktivieren.

Ja, genau so scheint es zu sein. Komisch aber, dass das Teil total 
spinnt, wenn ich beide aktiviert habe.

Übrigens läuft das Programm jetzt auch nach dem Debuggen weiter, seit 
ich nur den Compate Interrupt drin hab...

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