Hallo,
ich habe ein Problem mit dem Timer1 bei einem CC1110-Mikroprozessor.
Ich möchte ein am P1_1-Pin angeschlossenes Servo mit dem Timer1 per PWM
(20ms dutycycle, 1-2ms pwm-Länge) ansteuern. Dazu habe ich, dem
Datenblatt Abschnitt 12.6.5 folgend angenommen, dass das wohl ohne
selbstgeschriebene Interrupt-Routine funktioniert, sofern man den
Anweisungen auf Seite 114 nach dem fettgedruckten "Edge Aligned" folgt
und T1CCTL1.CMP auf 110 setzt.
Aus irgendeinem Grund funktioniert mein Code jedoch nicht, ich befürchte
dass ich irgendeinen notwendigen Schritt übersehen habe.
Hier mein Code:
1 | // Pinbelegung konfigurieren:
|
2 | // -> USART 0 auf Alternative 1 (P0)
|
3 | // -> USART 1 auf Alternative 2 (P1)
|
4 | // -> Timer1 auf Alternative 2 (P1)
|
5 |
|
6 | PERCFG = (PERCFG & ~PERCFG_U0CFG) | PERCFG_U1CFG | PERCFG_T1CFG;
|
7 |
|
8 | P1SEL |= BIT2 | BIT1 | BIT0;
|
9 |
|
10 |
|
11 | // TIMER SETUP
|
12 |
|
13 | // Channel 0 Compare Register setzen (nur zum Testen auf 3fff, wird später die gewünschte PWM-Impulslänge)
|
14 | T1CC0L = 0xFF;
|
15 | T1CC0H = 0x3F;
|
16 |
|
17 | // Channel 1 Compare Register setzen (wird später die 50Hz des PWM-Signals für das Servo)
|
18 | T1CC1L = 0xFF;
|
19 | T1CC1H = 0x7F;
|
20 |
|
21 | // Channel Control: CMP auf 110 setzen; Mode auf "Compare"
|
22 | T1CCTL1 |= ((1<<BIT4) | (1<<BIT5));
|
23 | T1CCTL1 &=~ (1<<BIT3);
|
24 |
|
25 | T1CCTL1 |= (1<<BIT2);
|
26 |
|
27 | // Interrupts aktivieren
|
28 | IEN1 |= (1<<BIT1);
|
29 | EA = 1;
|
30 |
|
31 | // T1 Control: "Module Mode" setzen (10)
|
32 | T1CTL |= (1<<BIT1);
|
33 | T1CTL &=~ (1<<BIT0);
|
Am Pin P1_1 ist das Signal einfach dauerhaft auf "Low". Leider habe ich
mit Timern bei diesem Mikrocontroller keine Erfahrung, deswegen kann es
gut sein, dass ich irgendetwas ganz einfaches übersehen habe.
Ich würde mich sehr freuen, wenn mir da jemand weiterhelfen kann :-)
- Raoul
Datenblatt zum CC1110f8:
http://www.ti.com/lit/gpn/cc1110f8 (PDF ca. 3,7 MB)