CC430 - Timer im Compare Modus

Gast #3081296
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?
Gast #3081378
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.
Gast #3081995
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.