Hallo,
ich möchte mit Mikrocontrollern experimentieren und habe mir deshalb das
TI Launchpad gekauft.
Für mein neustes Projekt will ich ein PWM Signal erzeugen und ich stell
mir das so vor:
- Timer A ist im “Continuous Mode” und der Pin an dem das PWM Signal
ausgegeben ist low
- wenn der Zähler den Wert von TACCR0 erreicht, wird der Pin high
- wenn der Zähler überläuft, der Timer Overflow Interrupt wird ausgelöst
und wird der Pin wieder auf low gesetzt
Hier ist der Quellcode von dem was ich bisher geschafft habe. Was noch
fehlt ist der Timer Overflow Interrupt und da komm ich nicht weiter.
Kann mir einer helfen und mir sagen wie ich das am besten Programmieren
kann?
MFG Paul
1 | #include <msp430g2553.h>
|
2 |
|
3 | #ifndef TIMER0_A1_VECTOR
|
4 | #define TIMER0_A1_VECTOR TIMERA1_VECTOR
|
5 | #define TIMER0_A0_VECTOR TIMERA0_VECTOR
|
6 | #endif
|
7 |
|
8 | void FaultRoutine(void);
|
9 | void ConfigWDT(void);
|
10 | void ConfigClocks(void);
|
11 | void ConfigPort1(void);
|
12 | void ConfigTimerA(void);
|
13 |
|
14 | void main(void)
|
15 | {
|
16 | ConfigWDT();
|
17 | ConfigClocks();
|
18 | ConfigPort1();
|
19 | ConfigTimerA();
|
20 |
|
21 | _BIS_SR(GIE); // global interrupt enable
|
22 |
|
23 | while(1);
|
24 | }
|
25 |
|
26 | void FaultRoutine(void)
|
27 | {
|
28 | P1DIR = BIT0; // Port 1.0 output (red LED)
|
29 | P1OUT = BIT0; // red LED on
|
30 | while(1);
|
31 | }
|
32 |
|
33 | void ConfigWDT(void)
|
34 | {
|
35 | WDTCTL = WDTPW + WDTHOLD; // watchdog timer setup
|
36 | }
|
37 |
|
38 | void ConfigPort1(void)
|
39 | {
|
40 | P1DIR = BIT6; // Port 1.6 output (green LED)
|
41 | P1OUT = 0; // LED off
|
42 | }
|
43 |
|
44 | void ConfigClocks(void)
|
45 | {
|
46 | if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
|
47 | {
|
48 | FaultRoutine(); // If cal constants erased, run FaultRoutine()
|
49 | }
|
50 |
|
51 | BCSCTL1 = CALBC1_1MHZ; // Set range
|
52 | DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
|
53 | BCSCTL3 |= LFXT1S_2; // clock system setup
|
54 | IFG1 &= ~OFIFG; // Clear OSCFault flag
|
55 | BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO/8
|
56 | }
|
57 |
|
58 | void ConfigTimerA(void)
|
59 | {
|
60 | CCTL0 = CCIE;
|
61 | CCR0 = 12000;
|
62 | TACTL = TASSEL_1 + MC_2;
|
63 | }
|
64 |
|
65 | #pragma vector=TIMER0_A0_VECTOR
|
66 | __interrupt void Timer_A (void)
|
67 | {
|
68 | P1OUT = BIT6;
|
69 | }
|