Msp430F5438 PWM

Gast #1834073
Lesenswert?

Guten Tag
Ich bin´s wieder
ich habe einen Code hier im Forum gefunden, der für 
MSP430F149/MSP430F1611 geschrieben ist, und ich habe den umgeändert für 
MSP4305438 .Leider kommt er nicht raus beim Debuggen.Bleibt die ganze 
Zeit hier
(XT1->32khz und XT2->12MHz)
1
do
2
  {
3
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
4
                                            // Clear XT2,XT1,DCO fault flags
5
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
6
  } while (SFRIFG1&OFIFG);


Hier ist der Code
1
#include <msp430x54x.h>
2

3

4

5
#define PWM_PERIOD_STEPS 512
6
unsigned int led_value = 0;            //value for counting trough pwmtable
7
unsigned int Key_debounce_FLAG;
8

9
unsigned int pwmtable_16[PWM_PERIOD_STEPS]={0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
10
2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
11
4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6,
12
6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11,
13
12, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 21,
14
22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 35, 36, 38,
15
40, 41, 43, 45, 47, 49, 52, 54, 56, 59, 61, 64, 67, 70,
16
73, 76, 79, 83, 87, 91, 95, 99, 103, 108, 112, 117, 123, 128,
17
134, 140, 146, 152, 159, 166, 173, 181, 189, 197, 206, 215, 225, 235,
18
245, 256, 267, 279, 292, 304, 318, 332, 347, 362, 378, 395, 412, 431,
19
450, 470, 490, 512, 535, 558, 583, 609, 636, 664, 693, 724, 756, 790,
20
825, 861, 899, 939, 981, 1024, 1069, 1117, 1166, 1218, 1272, 1328, 1387, 1448,
21
1512, 1579, 1649, 1722, 1798, 1878, 1961, 2048, 2139, 2233, 2332, 2435, 2543, 2656,
22
2773, 2896, 3025, 3158, 3298, 3444, 3597, 3756, 3922, 4096, 4277, 4467, 4664, 4871,
23
5087, 5312, 5547, 5793, 6049, 6317, 6596, 6889, 7194, 7512, 7845, 8192};
24

25
 
26
 
27
void init_OSZ(void)
28
{
29
  
30
  P5SEL |= 0x0C;                            // Port select XT2
31
    P7SEL |= 0x03;                            // Port select XT1
32

33
  
34
  UCSCTL6 &= ~(XT1OFF + XT2OFF);            // Set XT1 & XT2 On
35

36
do
37
  {
38
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
39
                                            // Clear XT2,XT1,DCO fault flags
40
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
41
  } while (SFRIFG1&OFIFG);                  // OSCFault flag still set?
42
  
43
     UCSCTL6 &= ~XT2DRIVE0; 
44
   UCSCTL4 |= SELS0 + SELM_2; 
45
 
46
  
47
                                                              
48
}
49

50
void init_Timer_A(void)
51
{
52
    TA1CCTL0 = CCIE;                                   // CCR0 interrupt enabled
53
    TA1CCR0 = 30000;
54
    TA1CTL = TASSEL_2 + MC_1 + ID_2;                  // SMCLK, up mode, Div auf /4
55
    //über MOD0 ausschalten!!
56

57
}
58
/*********************************************************************************************/
59

60

61
//Generate PWM
62
/********************************************************************************************/
63
void init_Timer_B(void)
64
{
65
    
66
    TBCCR0  = 65535;                           // PWM Periode
67
    TBCCTL1 = OUTMOD_7;                         //Set Reset Mode
68
    TBCCR1 = 100;
69
    
70
    TBCCTL2 = OUTMOD_7;
71
    TBCCR2 = 50;
72
    
73
    TBCCTL3 = OUTMOD_7;
74
    TBCCR3 = 125;
75
    
76
    TBCCTL4 = OUTMOD_7;
77
    TBCCR4 = 125;
78
    
79
    TBCCTL5 = OUTMOD_7;
80
    TBCCR5 = 125;
81
    
82
    TBCCTL6 = OUTMOD_7;
83
    TBCCR6 = 125;    
84
    
85
    TBCTL = TBSSEL_2 + MC_1 + ID_0;             //clocksource MCLK, up Mode, no div
86
    TBCCTL0 = CCIE;                 // enable CCR0 interrupt
87

88
}
89
/*********************************************************************************************/
90

91

92

93
/**********************************************************************************/
94
// Timer B0 interrupt service routine
95
#pragma vector=TIMERB0_VECTOR
96
__interrupt void Timer_B (void)
97
{   
98
   
99
}
100
/**********************************************************************************/
101

102
/**********************************************************************************/
103
// Timer A0 interrupt service routine
104
#pragma vector=TIMER1_A0_VECTOR
105
__interrupt void Timer_A (void)            
106
{ 
107
      if (led_value < PWM_PERIOD_STEPS - 1)
108
      {
109
          TBCCR1 = pwmtable_16[led_value];    //reload PWM Values
110
          TBCCR2 = pwmtable_16[led_value];
111
          TBCCR3 = pwmtable_16[led_value];
112
          TBCCR4 = pwmtable_16[led_value];
113
          TBCCR5 = pwmtable_16[led_value];
114
          TBCCR6 = pwmtable_16[led_value];
115
      
116
       led_value++;
117
      
118
      }  
119
if(led_value >= PWM_PERIOD_STEPS -2)
120
{
121
   led_value=0;
122
} 
123
    
124
}
125
/**********************************************************************************/
126

127
void init_PORTS(void)
128
{
129
       
130
    P1DIR |= BIT0;  
131
    P1OUT |= BIT0;             
132
}
133
/*********************************************************************************************/
134

135
void main(void)
136
{
137
  
138
     
139

140
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
141

142
  init_OSZ();
143
    init_PORTS();
144
    init_Timer_A();
145
    init_Timer_B();
146
    
147
     __bis_SR_register(LPM0_bits + GIE);
148
           
149

150

151
  while(1)
152
  {
153
    P1OUT ^= BIT0;                          // Toggle P1.0
154
    
155
  }  
156

157

158
}
#1834113
Lesenswert?

Für die 5-er Serie vom MSP430 solltest Du keine Beispiele von so alten 
Controllern aus der 1-er Serie heranziehen. Zwar sieht schon alles noch 
ähnlich aus, aber praktisch alles wurde überarbeitet und unterscheidet 
sich in den Details.
Ich empfehle Dir daher, Dir die Codebeispiele für die 5-er Serie von der 
TI-Homepage runterzuladen. Dort ist alles enthalten was Du brauchst 
(Clock init, Timer, PWM, ...).
Die hier sollten passen:
http://www.ti.com/lit/zip/slac166

Übersicht zu MSP430 Beispielcode ist übrigens hier:
http://focus.ti.com/mcu/docs/mcuprodcodeexamples.tsp?sectionId=96&tabId=1468
Gast #1834570
Lesenswert?

Hallo
ich habe jetzt
1
UCSCTL6 &= ~(XT1OFF + XT2OFF); // XT1 und XT2 on

auf
1
 UCSCTL6 &= ~XT1OFF ; geändert
und ich habe bemerkt im bebugging er bleibt nicht mehr hier
1
do
2
{
3
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
4
// Clear XT2,XT1,DCO fault flags
5
SFRIFG1 &= ~OFIFG; // Clear fault flags
6
} while (SFRIFG1&OFIFG);
hängen.

Bedeutet das jetzt , dass der XT2 Kaput ist?
Das ist eigentlich MSP-EXP430F5438 board.
#1834680
Lesenswert?

Eigentlich sieht Dein Code ganz gut aus, fast gleich wie das 
Codebeispiel msp430x54x_UCS_7.c

Das einzige was mir auffällt ist, dass Du die folgende Zeile
1
UCSCTL6 |= XCAP_3;                        // Internal load cap
...nach dem Einschalten von den Quarzen weggelassen hast. Sind denn auf 
dem Board bereits Kondensatoren für den Quarz verbaut?

Irgendwie scheint es schon so zu sein, dass der Quarz nicht anschwingt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren