Forum: Mikrocontroller und Digitale Elektronik Msp430F5438 PWM


von Ausländer (Gast)


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
}

von Johnny B. (johnnyb)


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

von Ausländer (Gast)


Lesenswert?

Danke für Deine Antwort
genau das habe ich auch gemacht mit Hilfe von Exampels von Ti

von Ausländer (Gast)


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.

von Johnny B. (johnnyb)


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.

von Ausländer (Gast)


Lesenswert?

Danke für deine Antwort.

Johnny B. schrieb:
&gt; Sind denn auf dem Board bereits Kondensatoren für den Quarz 
verbaut?

ja 33pF ,
ich habe noch einen hier liegen (ohne Datenblatt).Ich hoffe, dass er mit 
C-33pF in Ordnung schwingt sonst muss ich die auch ausweichen

von Ausländer (Gast)


Lesenswert?

müssen die auch ausweichen :-)

von Ausländer (Gast)


Lesenswert?

Ich bin s wieder und Sory für  die Störung .
ich habe raus gefunden ,dass ich keine XT2  habe .der Quarz was ich das 
habe  ist füt UBS-IC :-( .
wird es gehen mit XT1 und DCO ?

von doofi (Gast)


Lesenswert?

Ohne jetzt alles gelesen zu haben:

Ist nicht XT1 für den hochfrequenten Quarz und XT2 für den Uhrenquarz?

von Ausländer (Gast)


Lesenswert?

doofi schrieb:
> Ohne jetzt alles gelesen zu haben:
> Ist nicht XT1 für den hochfrequenten Quarz und XT2 für den Uhrenquarz?

So in der Richtung  :-) XT1 Uhrenquarz und XT2 hochfrequenten

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.