Forum: Mikrocontroller und Digitale Elektronik MSP430 Interruptproblem


von Chris H. (hergi)


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?

von Chris H. (hergi)


Lesenswert?

Ok, hat sich scheinbar erledigt. Hab das
1
TACTL |= TAIE;
 rausgenommen. Ich darf wohl nicht in TACTL den Timer Interrupt 
aktivieren?!
Warum versteh ich allerdings nicht so ganz...

von Oliver J. (skriptkiddy)


Lesenswert?

Chris Herch schrieb:
> 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?
Denke nein. Kann mich wage erinnern, dass man die USB-Verbindung kurz 
trennen musste, um den Mikrocontroller nach einer Debugsession zum 
Arbeiten zu bewegen.

von Roland H. (batchman)


Lesenswert?

> 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.

von Chris H. (hergi)


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...

von Stefan (Gast)


Lesenswert?

Chris Herch schrieb:
> Komisch aber, dass das Teil total
> spinnt, wenn ich beide aktiviert habe.

Das ist nicht komisch, das ist ganz normal wenn du einen Interrupt 
aktivierst aber die dazugehörige ISR nicht im Code hast.

von Chris H. (hergi)


Lesenswert?

So wie ich das sehe gibt es aber nur die eine ISR für alle Interrupts 
vom TimerA ?!

von Stefan (Gast)


Lesenswert?

Nein, es gibt zwei Interruptvektoren. Einen für TACCR0 Interrupts 
(TIMERA0_VECTOR) und einen weiteren (TIMERA1_VECTOR) für alle anderen 
Interrupts von TimerA.

von Chris H. (hergi)


Lesenswert?

Ah ok, danke.

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.