Forum: Mikrocontroller und Digitale Elektronik msp430f5529 Timer-ISR wird nicht aufgerufen


von Commer (Gast)


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

von der nixwois (Gast)


Lesenswert?

Bleib doch beimn alten Tread und mach kein neues auf.
Und nimm doch endlich die Bretter von deinem Kopf weg.

von Herman Kokoschka (Gast)


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.

von Der müde Joe (Gast)


Lesenswert?

Dir ist schon klar, dass

... = ... + ...

etwas anderes ist als

... = ... +| ...

Im ersten Fall uberschreibst du den Wert, im zweiten Fall veroderst du. 
Ich denke, du willst verodern.

von MaWin (Gast)


Lesenswert?

der nixwois schrieb:
> Bleib doch beimn alten Tread und mach kein neues auf.

Das wollte doch der Oberforumshirte Stefan so. (???)

von Commer (Gast)


Lesenswert?

Herman Kokoschka schrieb:
> 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.

guter Gedanke, auch das habe ich schon probiert. Bei beiden (jeweils 
einzeln getestet) leuchtet sie nicht

von Commer (Gast)


Lesenswert?

MaWin schrieb:
> Das wollte doch der Oberforumshirte Stefan so. (???)

hahahha genau so ist es. soll doch nicht so beratungsresistent sein

von Commer (Gast)


Lesenswert?

Der müde Joe schrieb:
> Dir ist schon klar, dass
>
> ... = ... + ...
>
> etwas anderes ist als
>
> ... = ... +| ...
>
> Im ersten Fall uberschreibst du den Wert, im zweiten Fall veroderst du.
> Ich denke, du willst verodern.

absoluter bullshit. bei der initialisierung ist + oder | gleichbedeutend

von Commer (Gast)


Lesenswert?

habe die ISR von CCR0 zum laufen benkommen (CCIE). die von CCR2 
funktioniert immernoch nicht

von Commer (Gast)


Lesenswert?

also habe die isr für ccr2 noch immer nicht zum laufen gebracht. stimmt 
etwas mit dem syntax nicht?

von Clemens L. (c_l)


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

: Bearbeitet durch User
von der nixwois (Gast)


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.

von Commer (Gast)


Lesenswert?

Clemens L. schrieb:
> wenn CCIE in CCTL2
> gesetzt ist (was nicht der Fall ist)

das habe ich getan, habe ich oben mitgeteilt.

Clemens L. schrieb:
> wenn der Timer 2096 erreicht
> (was nie passiert, weil der Timer im Up-Modus nur bis CCR0 zählt)

d.h. ich muss die Werte der beiden CCRn-Register tauschen?

von Commer (Gast)


Lesenswert?

Commer schrieb:
> d.h. ich muss die Werte der beiden CCRn-Register tauschen?

P.S es funktioniert tatsächlich haha

von MaWin (Gast)


Lesenswert?

der nixwois schrieb:
> Bei der Addtion könnte es in die Hose gehen.

Ja, bei Überdeckung oder Überlappung von Werten/Wertebereiche der Bits. 
Die Schreibweise ist daher nicht zu empfehlen und besser | zu verwenden.

Ganz Sch... ist (1 << BIT4711)!

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.