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?