Forum: Mikrocontroller und Digitale Elektronik MSP430G2553 Timer A - Interrupt bei TA0CCR1 - funktioniert nicht


von Horst (Gast)


Lesenswert?

Hi Leute!

Ich bin langsam ratlos...

Ich möchte beim MSP430G2553 den TA0CCR1 für die Compare-Funktion 
benutzen (1s), also habe ich:
1
void mcu_configure_timer_a( void )
2
{
3
  TA0CCTL1 = CCIE;
4
  TA0CCR1  = 32767;
5
  TA0CTL   = ( TASSEL_1 | MC_1 );         // ACLK, up-mode
6
}
und dann die ISR:
1
#pragma vector = TIMER0_A1_VECTOR
2
__interrupt void TIMER0_A1_ISR( void )
3
{
4
  switch( TA0IV )
5
  {
6
    case 2:
7
    {
8
      P2OUT ^= 0x08; // Toggle LED
9
10
      break;
11
    }
12
13
    case 4:
14
    {
15
      break;
16
    }
17
18
    case 10:
19
    {
20
      break;
21
    }
22
  }
23
}

Aber die Geschichte tut nichts...es passiert einfach garnichts - es wird 
kein Flag gesetzt, es kommt kein Interrupt, nichts. Also ehe die Frage 
gleich kommt: Der Rest drum herum passt, Interrupts sind freigegeben und 
so weiter, denn wenn ich:
1
void mcu_configure_timer_a( void )
2
{
3
  TA0CCTL0 = CCIE;
4
  TA0CCR0  = 32767;
5
  TA0CTL   = ( TASSEL_1 | MC_1 );         // ACLK, up-mode
6
}
und die ISR:
1
#pragma vector = TIMER0_A0_VECTOR
2
__interrupt void TIMER0_A0_ISR( void )
3
{
4
  P2OUT ^= 0x08; // Toggle LED
5
}
dann geht alles problemlos. Nur der TA0CCR1 will nicht. Ebenso wenig der 
TA0CCR2, der TA1CCR1 und der TA1CCR2. Aber der TA1CCR0 geht dann wieder. 
Es gehen also nur die CCR0-Interrupts.

Was mache ich falsch? Ich komme langsam nicht mehr weiter und bin am 
verzweifeln...habe bereits alles mögliche probiert. Bin auch die 
msp430g2553.h durchgegangen, sowie das Datenblatt und den User's Guide. 
Aber ich komm' nicht drauf. Habe ich da was übersehen bei den CCR1 und 
CCR2?

Kann jemand helfen?

von Christian L. (cyan)


Lesenswert?

Horst schrieb:
> TA0CCR1  = 32767;

Könnte an dieser Zeile liegen. Laut Beschreibung des MC_1 up-modes:
> Up mode: the timer counts up to TACCR0.

In deinem zweiten Programm gibst du TA0CCTL0 vor aber im ersten nicht, 
sondern TA0CCTL1.

von Horst (Gast)


Lesenswert?

Mhh...

Mit dem continous-mode anstatt dem up-mode geht es mit CCR1. Geht der 
up-mode generell nur für CCR0?

von Horst (Gast)


Lesenswert?

OK, Erkenntnis und Erklärung kamen gleichzeitig...dann liegt es 
definitiv daran. Danke!

von Christian L. (cyan)


Lesenswert?

Es könnte daran liegen, dass TA0CCTL0 mit 0 eingestellt wird. Damit kann 
der Wert von TA0CCTL1 niemals erreicht werden, da der Zähler nicht hoch 
zählt, sondern bei null stehen bleibt.

von Horst (Gast)


Lesenswert?

Dann geht up nur mit CCR0.

Danke

von Blub (Gast)


Lesenswert?

Horst schrieb:
> TA0CTL   = ( TASSEL_1 | MC_1 );         // ACLK, up-mode
> }

Versuch es doch mal mit TASSEL_2

von f u g (Gast)


Lesenswert?

Horst schrieb:
> Dann geht up nur mit CCR0.

Warum machst du dir es so schwer? Wirf einen Blick in den family user 
guide. Dort sind Bildchen mit den unterschiedlichen Timer Mode und den 
Zählgrenzen abgebildet. Und da steht genau, wann wohin gezählt. Da 
braucht man nicht raten oder probieren.

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.