msp430f5529 Timer-ISR wird nicht aufgerufen

Gast #6172664
Lesenswert?
• ▲
▼
Hallo
folgender Code funktioniert nicht (vgl. 
Beitrag "Rote LED an Port 1.0 will nicht")
1
 
2
#include "msp430f5529.h"            // Einbinden der Definitionen
3
#define  LED_X     0x01     // LED (rot) an P1.0
4

5

6

7
int main( void )
8
{
9
   WDTCTL = WDTPW + WDTHOLD;   // WatchDogTimer abschalten
10
   
11
 // -- INIT_Port1
12
  P1SEL &= ~(LED_X);            // Beide sind BIN-IO       
13
  P1DIR |= LED_X;               // LED    = BIN-OUT
14
  P1OUT &=~ (LED_X);            // LED_X = AUS (weil H-aktiv)
15
  
16
  
17
  
18
 //-- TimerB0
19

20
  TB0CTL = TBCLR;
21
  TB0CTL = TBSSEL_2 + ID_0 + MC_1;
22
  TB0CCR0 = 1048;  // entspricht 1000 Hz, Freq [18]
23
  TB0CCR2 = 2096;  // entspricht 2*10^-3 s, also CCR0/2 (Pulsbreite halb so groß wie Freq)
24
  TB0CCTL2 = OUTMOD_7;
25
 // TB0CCTL0 = CLLD_1;          // Änderung der Frequenz wird erst übernommen, wenn 
26
                            // CCR0 erreicht ist
27
 // TB0CCTL2 = CLLD_1;
28
_BIS_SR(GIE);
29
  while(1) {_NOP();} 
30
}
31

32

33
#pragma vector = TIMER0_B0_VECTOR
34
__interrupt void TB0_ISR ()
35
{
36
 P1OUT ^= (LED_X);
37
}
38

39

40
#pragma vector = TIMER0_B1_VECTOR
41
 __interrupt void TIMERB0_1_ISR ()
42
{
43
  switch (TB0IV)
44
  {
45
  case TB0IV_TBCCR2:       // TB0CCR2, da LED nur so lange wie PBreite [i] andauert leuchten soll
46
    {
47
      P1OUT ^= (LED_X);
48
      break;
49
    } 
50
  }
51
}





Die LED geht problemlos außerhalb der ISR an.

Grüße
Gast #6172751
Lesenswert?
• ▲
▼
Ich kann die Verstrickung der beiden ISR im Moment nicht nachvollziehen,
liegt aber auch daran, dass ich Zweck und Hintergrundinfos nicht habe.

Commer schrieb:
> TB0CTL = TBSSEL_2 + ID_0 + MC_1;
Z.B. kann ich dies nicht auflösen.

Grundsätzliche Frage:
Beide ISR schalten ja die Led "um".
Kann es sein, dass die Feuerbedingungen der beiden ISR so ungünstig 
sind,
dass die LED zwar an geht, aber SO SCHNELL wieder aus, dass Du es nicht 
sehen kannst?

Probiere doch die beiden ISR mal EINZELN aus, auch bei schneller 
Feuerrate kannst Du dann Flimmern sehen oder messen und daran ermitteln 
ob die ISR überhaupt auslösen.
#6173793
Lesenswert?
• ▲
▼
Commer schrieb:
> TB0CTL = TBSSEL_2 + ID_0 + MC_1;

Magische Zahlen erschweren das Verständnis. Bitte benutze:
1
TB0CTL = TBSSEL__SMCLK + UD__1 + MC__UP;

> TB0CCR0 = 1048;
> TB0CCR2 = 2096;
> TB0CCTL2 = OUTMOD_7;

Der Interrupt für CCR2 wird genau dann ausgeführt, wenn CCIE in CCTL2 
gesetzt ist (was nicht der Fall ist) und wenn der Timer 2096 erreicht 
(was nie passiert, weil der Timer im Up-Modus nur bis CCR0 zählt).
Gast #6173920
Lesenswert?
• ▲
▼
Ich hab mit der Addition ein Verständnisproblem :
 TB0CTL = TBSSEL_2 + ID_0 + MC_1;

Müsste den die Zeile nicht  so aussehen?
 TB0CTL = ( TBSSEL_2 | ID_0 | MC_1 );

Es sollen doch nur die entsprechenden Bits gesetzt werden in TB0CTL.

Bei der Addtion könnte es in die Hose gehen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.