MSP430 Interruptproblem

OP #2400033
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?
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.
OP
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...
Gast
Nein, es gibt zwei Interruptvektoren. Einen für TACCR0 Interrupts 
(TIMERA0_VECTOR) und einen weiteren (TIMERA1_VECTOR) für alle anderen 
Interrupts von TimerA.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.