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

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