Forum: Mikrocontroller und Digitale Elektronik MSP430F248 verschiedene Timer benutzen


von Mathias K. (underworldgamer)


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
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"lichtsteuerung" ist nicht volatile, wird aber sowohl im Interrupt als 
auch in von main() aufgerufenem Code verwendet, ebenso "auswahl".

von Mathias K. (underworldgamer)


Lesenswert?

Wurde soweit oben bei der Definintion geändert , leider bewirkt dies 
keinen Unterschied.

lg Mathias

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.