MSP430F248 verschiedene Timer benutzen

OP #2226262
Lesenswert?

Im nachfolgenden Code funktioniert das zusammenspielen mit dem Timer B 
und Timer A nicht. Die Funktion setPWM erzeugt ein 2.7 k Signal der 
Timer A ein 1.6 Hz Signal. Werden beide Funktionen in eine while 
hineingepackt funktioniert nur noch Timer B.

Wo könnte der Grund liegen ?

mfg Mathias
1
#include  "msp430x24x.h"
2

3
unsigned int lichtsteuerung = 80;
4
unsigned int lichtmax = 85;
5
unsigned int lichtmin = 10;
6
unsigned int auswahl;
7

8

9
void setON()
10
{
11
  
12
  if(auswahl == 98){
13
    P1SEL &= ~BIT2;    // P5.0 is I/O
14
    P1DIR |= BIT2;    // P5.0 is Output
15
    P1DIR &= ~ BIT0;    // P5.0 is Output
16
    P1OUT |= BIT2;                //Output auf High
17
  }else{}
18
  
19
}
20

21
void setOFF(){
22
  
23
  if(auswahl == 99){
24
    P1SEL &= ~BIT2;    // P5.0 is I/O
25
    P1DIR |= BIT2;    // P5.0 is Output
26
    P1DIR &= ~ BIT0;    // P5.0 is Output
27
    P1OUT &= ~ BIT2;                //Output auf Low
28
}else{}
29

30

31
}
32

33
void setTimer(){
34
  
35
  WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
36
  P5DIR |= BIT7;                        // P1.0 output
37
  CCTL0 = CCIE;                         // CCR0 interrupt enabled
38
  CCR0 = 10000-1;
39
  //TACTL = TASSEL_2 + MC_1;              // SMCLK, upmode
40
  TACTL = TASSEL_1 + MC_1;                // ACLK, upmode
41
  //_BIS_SR(LPM3_bits + GIE);             // Enter LPM3 w/ interrupt 
42
  _BIS_SR(GIE);                         // Enter LPM3 w/ interrupt 
43
  //__bis_SR_register(GIE);
44
}
45

46

47
void setRS232(){
48
  
49
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
50
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
51
  DCOCTL = CALDCO_1MHZ;
52
  P3SEL = 0xf0;                             // P3.4,5,6,7 = USCI_A0 TXD/RXD
53
  //  P3DIR = 0xf0;                         // P3.4,5 = USCI_A0 TXD/RXD
54
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
55
  UCA0BR0 = 6;                              // 1MHz 9600
56
  UCA0BR1 = 0;                              // 1MHz 9600
57
  UCA0MCTL = UCBRF3 + UCOS16;               // Modln UCBRSx=1, over sampling
58
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
59
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
60
  
61
  ///////////////////////////////////////////////
62
  
63
  UCA1CTL1 |= UCSSEL_2;                     // SMCLK
64
  UCA1BR0 = 6;                              // 1MHz 9600
65
  UCA1BR1 = 0;                              // 1MHz 9600
66
  UCA1MCTL = UCBRF3 + UCOS16;               // Modln UCBRSx=1, over sampling
67
  UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
68
  UC1IE |= UCA1RXIE;                        // Enable USCI_A1 RX interrupt
69
  
70
  __bis_SR_register(GIE);                   // Enter LPM3 w/ int until Byte RXed
71
  
72
}
73

74

75

76
void setPWM(char val){
77
  
78
  if(val >= lichtmax)
79
  { 
80
    val = 84;
81
    lichtsteuerung = val;
82
  }
83
  if(val <= lichtmin)
84
  { 
85
    val = 15;
86
    lichtsteuerung = val;
87
  }
88
  
89
            P1DIR |= BIT3;                            // P1.2 and P1.3 output
90
            P1SEL |= BIT3;                            // P1.2 and P1.3 TA1/2 otions
91
            CCR0 = 128;                               // PWM Period/2
92
            CCTL2 = OUTMOD_6;                         // CCR2 toggle/set
93
            CCR2 = val;                               // CCR2 PWM duty cycle
94
            TACTL = TASSEL_2 + MC_3;                  // SMCLK, up-down mode
95
  
96
}
97

98

99

100
void main(void)
101
{
102
  
103

104
  //setRS232();
105
 // setTimer();
106
 auswahl = 98;
107
 setON();
108
 while(1){
109
   
110
   setTimer();
111
   //setPWM(lichtsteuerung);
112
 }
113
/*  
114
while(1){
115
      
116
      //setTimer();
117
      //setPWM(UCA1RXBUF);    //SET PWM RATE!
118
         
119
  
120
  
121
      switch(auswahl) {
122
      case 10:   //Licht Heller
123
            lichtsteuerung -= 10;
124
            setPWM(lichtsteuerung);
125
            auswahl = 100;
126
            break;
127
      case 20:  //Licht Dunkler
128
            lichtsteuerung += 10;
129
            setPWM(lichtsteuerung);
130
            auswahl = 100;
131
            break;
132
      case 30:  //lichtmodus Dimmung
133
            setTimer();    //machts solange bis case nicht mehr 30 ist!!
134
            //if((lichtsteuerung > lichtmax) || (lichtsteuerung < lichtmin)){
135
              //break;}
136
            break;
137
     case 99: //Licht Aus
138
            setOFF();             //EVG OFF
139
            auswahl = 100;
140
            break;     
141
     case 98: //Licht ein
142
            setON();              //EVG ON
143
            auswahl = 100;
144
            break;         
145
      
146
      }          
147
  }          
148
 */ 
149
  
150
}
151

152
//Für TX Interrupt RS232
153
 
154
#pragma vector=USCIAB0RX_VECTOR
155
__interrupt void USCI0RX_ISR(void)
156
{
157
  UCA0TXBUF = UCA0RXBUF;
158
}
159

160
//Für RX Interrupt RS232
161

162
#pragma vector=USCIAB1RX_VECTOR
163
__interrupt void USCI1RX_ISR(void)
164
{
165
  //UCA1TXBUF = UCA1RXBUF;                     // TX -> RXed character
166
  auswahl = UCA1RXBUF;
167
}
168

169
//Für Timer Dimmingmodus
170
#pragma vector=TIMERA0_VECTOR
171
__interrupt void Timer_A (void)
172
{
173
  //if((lichtsteuerung < lichtmin)){lichtsteuerung = 5;}
174
    lichtsteuerung = lichtsteuerung - 10;
175
    P5OUT ^= BIT7;                        // Toggle P5.7
176
    
177
   
178
}

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