Forum: Mikrocontroller und Digitale Elektronik Software-PWM auf dem MSP430G2211


von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Hallo,
ich versuche gerade auf dem MSP430G2211 vom Launchpad eine 8-bit PWM zu 
implementieren. Ich benutze ich die an Port1.0 angeschlossene LED zur 
Visualisierung des Ergebnisses.
Leider funktioniert mein Code nicht.
Wenn ich bei Code Composer Studio auf DEBUG gehe, dann geht nur LED1 an 
und blinkt fast nicht merklich alle 2-3 Sekunden.
Mein Oszilloskop zeigt an, dass ich 50% Duty-Cycle bei 25Hz habe (20ms 
on, 20 ms off).
Dazu kommt ein generelles Problem: Bei wie viel Hertz läuft der 
Prozessor denn? 1MHz, 4.8 Mhz, ...?
Hier ist mein Code:
1
#include  <msp430x20x3.h> //Chiparchitektur für Compiler
2
#define BUTTON BIT3;
3
#define LED1 BIT0;
4
#define LED2 BIT6;
5
6
  int counter;
7
  int counter2;
8
  int buttoncounter;
9
  int value;
10
  int direction;
11
  
12
  const int debounce = 5000;
13
  const int maximum = 255;
14
15
void main(void)
16
{
17
  WDTCTL = WDTPW + WDTHOLD;// Watchdog anhalten
18
  P1DIR |= BIT0 | BIT6;// P1.0 und P1.6 als Ausgang definieren
19
  counter = 0;
20
  counter2 = 0;
21
  value = 0;
22
  direction = 0;
23
  
24
  while(1)//Hauptschleife
25
  {
26
  counter ++;
27
  
28
  counter2++;
29
30
  if(counter2 == 2000){
31
    value = value + direction;
32
    counter2 = 0;
33
  }
34
  
35
  if(value == maximum){
36
    direction = -1;
37
  }
38
  
39
  if(value == 0){
40
    direction = 1;
41
  }
42
  
43
  if(counter == 0){
44
    P1OUT ^= LED1; //LED toggeln
45
        }
46
  
47
  if(counter == value){
48
    P1OUT ^= LED1;
49
  }
50
  
51
  if(counter == maximum){
52
    counter = 0;  
53
  }
54
  }
55
}

Ich würde mich freuen, wenn ihr mir helfen könnt.
Mit freundlichen Grüßen,
Valentin Buck

von Jörg S. (joerg-s)


Lesenswert?

Valentin Buck schrieb:
> Wenn ich bei Code Composer Studio auf DEBUG gehe, dann geht nur LED1 an
> und blinkt fast nicht merklich alle 2-3 Sekunden.
> Mein Oszilloskop zeigt an, dass ich 50% Duty-Cycle bei 25Hz habe (20ms
> on, 20 ms off).
Dein Auge sieht was anderes als das was tatsächlich rauskommt? Du 
solltest dir ernsthaft Sorgen machen ;)

Sind die 25Hz 50% jetzt richtig, oder was willst du haben?


> Bei wie viel Hertz läuft der Prozessor denn? 1MHz, 4.8 Mhz, ...?
Bei der F2xx Serie sind es ca. 1,1MHz. Siehe Kapitel "Basic Clock 
Module"

Am besten du verwendest eine von den Abgleichdaten:
1
BCSCTL1 = CALBC1_1MHZ;
2
DCOCTL = CALDCO_1MHZ;

von Stefan (Gast)


Lesenswert?

Beweg die Platine mal, dann solltest du auch direkt sehen können, dass 
die LED nicht dauernd an ist.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Danke, ich hab jetzt gesehen, wo mein Fehler lag...
Das mit dem Abgleichen des Oszillators ist ja echt cool!
Ich hab den Code geändert, und jetzt funktionierts.
Falls ihn noch jemand braucht:
1
 while(1)//Hauptschleife
2
  {
3
  counter ++;
4
  
5
  counter2++;
6
7
  if(counter2 == 5000){
8
    value = value -1;
9
    counter2 = 0;
10
  }
11
  
12
  if(counter < value){
13
    P1OUT = BIT0;
14
  }
15
  
16
  if(counter > value){
17
    P1OUT = 0;
18
  }
19
  
20
  if(counter == maximum){
21
    counter = 0;  
22
  }
23
  }

Mit freundlichen Grüßen,
Valentin Buck

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.