Forum: Mikrocontroller und Digitale Elektronik MSP430 Pin auf high + PWM


von gems (Gast)


Lesenswert?

Guten Tag,
ich brauche mal eure Hilfe bei einem MSP430.
Ich möchte an einen Ausgang(Pin 1.2) ein PWM Signal ausgeben, welche 
aber nur ab und zu benötigt wird.
PWM an sich ist auch kein Problem, aber der Pin muss standardmäßig, wenn 
keine PWM benötigt wird, auf high sein.
Ich habe zwar eine Lösung, in der ich jedesmal den Pin sofort wieder auf 
high setze, wenn keine PWM ist, jedoch frage ich mich, ob es da nicht 
auch eine, sagen wir mal elegantere, Lösung für gibt.
Ich habe es schon probiert mit P1REN |= BIT2, jedoch funktioniert dann 
die PWM nicht mehr.
Danke :)
1
void main(void) {
2
3
  WDTCTL = WDTPW | WDTHOLD;
4
5
  P1DIR |= BIT2;
6
  P1SEL = 0x00;
7
  P1SEL = BIT2;              //PWM
8
  P1OUT |= BIT2;             //Ausgang
9
  //P1REN |= BIT2;
10
  P1OUT &=~ BIT1;      
11
  P1REN |= BIT1;             //Pull down
12
13
  BCSCTL1 = CALBC1_8MHZ;
14
  DCOCTL = CALDCO_8MHZ;
15
16
  TA0CCTL1 = OUTMOD_4;       //Toggle
17
  TA0CTL = TASSEL_2 + MC_0;  //SMCLK & Stop
18
  TA0CCR1 = 32000;
19
20
  while(1){
21
    if(P1IN & BIT1)
22
      TA0CTL |= MC_2;        //Cont. mode
23
    else{
24
      //P1OUT |= BIT2;
25
      P1OUT |= BIT2;
26
      TA0CTL &=~ MC_2;       //Stop
27
    }
28
  }
29
}

von Bronco (Gast)


Lesenswert?

Setz doch in den "Pausen" den Dutycycle der PWM auf 100%, dann ist der 
PIN high. Dann mußt Du hardwareseitig nichts umschalten.

von Mode (Gast)


Lesenswert?

Man kann den Outputmode andern.

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

>auf high sein.
Und es muss per Pull-Up sein? Ansonsten würde ich P1OUT einfach auf high 
setzen und dann per P1SEL umschalten.

von gems (Gast)


Lesenswert?

guten morgen,
Stimmt, mit dem DutyCycle ist ne gute Idee gewesen.
Habe jetzt einen Mix aus beiden Antworten, es funktioniert Bestens und 
meiner Meinung nach ne bessere Lösung als vorher. Danke!!

Jörg S. schrieb:
> Und es muss per Pull-Up sein?

Nein, muss nicht, war nur eine Überlegung von mir, die ja leider nicht 
so ganz funktioniert hat.

So funktioniert es jetzt genau wie es soll:
1
  while(1){
2
    if(P1IN & BIT1){
3
      TA0CTL |= MC_2;    //Cont. mode
4
      TA0CCR1 = 32000;
5
      TA0CCTL1 = OUTMOD_4;
6
    }
7
    else{
8
      TA0CCR1 = 65535;
9
      TA0CCTL1 = OUTMOD_1;
10
    }

von Mode (Gast)


Lesenswert?

Warum beides? Outputmode 0 sollte reichen.

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.