Forum: Mikrocontroller und Digitale Elektronik CC430 - Timer im Compare Modus


von CC430 (Gast)


Lesenswert?

Hallo,

foglendes Problem:

ich möchte den Timer1_A3 vom CC430 nutzen, um eine LED mit 
unterschiedlich langem AN- zu AUS-Verhältnis´anzusteuern.

Die DCO-Frequenz wird als ACLK auf den Timer geführt. Sie liegt korrekt 
bei 1.015.808Hz.

Die Timer-Frequenz soll bei 2Khz liegen. Die ON-zeit 75%, die OFF-Zeit 
25% betragen.
Bei der gewählten taktfrequenz sind also 508 schritte nötig. davon sind 
~308 der ON-Zeit zu zu schreiben und der rest der OFF-Zeit.


Die Initialisierung des Timer sieht wie folgt aus:
1
void timer1_A3_init(void)    
2
{
3
4
 TA1CTL = TACLR;   // Timer1_A3 clear.
5
   
6
 TA1CCTL0 = CCIE; 
7
 TA1CCR0 = 380;   
8
9
 TA1CCTL1 = CCIE;  
10
 TA1CCR1 = 508;  
11
    
12
 TA1CTL = TASSEL__ACLK;    
13
14
 TA1CTL |= MC__CONTINUOUS;  
15
}


Die ISRs sehen wie folgt aus:
1
#pragma vector=TIMER1_A0_VECTOR
2
__interrupt void TIMER1_A0_Capture_Compare_ISR(void)
3
{
4
 TA1CCR0 = TA1CCR0 + 508;
5
 ROT_TOGGLE;
6
}
7
8
9
#pragma vector=TIMER1_A1_VECTOR
10
__interrupt void TIMER1_A1_Capture_Compare_ISR(void)
11
{
12
 TA1CCR1 = TA1CCR1 + 508;
13
 ROT_TOGGLE;
14
}



Die erwartete LED-Frequenz wäre ja nun bei ~1kHz mit 75% ON- und 25% 
OFF-Zeit. Dummerweise liegt sie bei 50% ON und 50% OFF und darüber 
hinaus bei einer LED-Frequenz von ca. 192kHz entspricht und somit einer 
Timer-Frequenz von ca. 380Khz zugehörig ist.

Wenn ich andere Zahlenverhältnisse in die TA1CCRx-Register schreibe, 
ändert sich übrigens an der Messung nichts. Daraus schließe ich, dass 
bei der Initialisierung irgendetwas schief läuft...

Wo ist der Fehler? Was habe ich vergessen / nicht beachtet?

von CC430 (Gast)


Lesenswert?

hab den Fehler gefunden.

Der Controller verlangt unbedingt, dass man eine Vektor-Sprungtabelle 
mit einer Switch-Anweisung nutzt. Sonst kann der Interruptvektor nicht 
richtig verarbeitet werden.

Echt besch..., dass das CCR0 von den CCR1 bis CCRx getrennt behandelt 
wird.

von TAIV (Gast)


Lesenswert?

CC430 schrieb:
> Der Controller verlangt unbedingt, dass man eine Vektor-Sprungtabelle
> mit einer Switch-Anweisung nutzt. Sonst kann der Interruptvektor nicht
> richtig verarbeitet werden.
>
> Echt besch..., dass das CCR0 von den CCR1 bis CCRx getrennt behandelt
> wird.

Wie, wo, was? Du brauchst keine Sprungtabelle. Beim shared interrupt 
musst du nur TAIV lesen oder schreiben.

Und das mit dem CCR0 ist gut, weil es auch für andere Dinge als nur CC 
gehutzt wird.

Ich empfehle Dir das Timer Kapitel im Family User Guide. Das wird Dich 
erleuchten. :-P

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.