PWM Dimmer.....

The_Scientist

Neues Mitglied
26 Feb 2011
91
1
0
Country Club Legetafo in Ethiopia
Sprachen
BascomAVR, C, Assembler
Also, dass ich in meinem Alter noch mal was jungfraeuliches bekomme....naja zumindest das Forum fuer die 430er :rolleyes:

Ich wollte einen kleinen PWM-Dimmer meine 12V Halogen Beleuchtung in der Galarie bauen.

Lange, lange, habe ich diese LaunchPads hier rumfliegen sowie rund 3 Dutzend der kleinsten der MSP430er (MSP430G2001).

Hier mal mein Erguss (ein Schelm wer boeses dabei denkt) fuer das Programm....

Code:
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055] 
[/COLOR][/SIZE][/COLOR][/SIZE][/B]
#include <msp430.h> 
int pw, old;
void pulsewidth(int pw);
int checkbutton(void);
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;
    BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
    DCOCTL = 0x00;
    __delay_cycles(100000);
    DCOCTL = DCO0 + DCO1;
    BCSCTL1 = XT2OFF + DIVA_0 + RSEL0 + RSEL1 + RSEL2 + RSEL3;
    BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1;
    P1OUT = BIT3 + BIT7;
    P1SEL = BIT1 + BIT4 + BIT6;
    P1DIR = BIT1 + BIT4 + BIT6;
    P1REN = BIT3 + BIT7;
    P1IES = 0;
    P1IFG = 0;
    P2OUT = 0;
    P2DIR = 0;
    P2IES = 0;
    P2IFG = 0;
    pw=25;
    for(;;)
    {
        old = pw;
        while(old==pw)
        {
            pw=checkbutton();
        }
        pulsewidth(pw);
    }
}
void pulsewidth(int pw)
{
     TACCTL0 = CM_0 + CCIS_0 + OUTMOD_0 + OUT;
     TACCTL1 = CM_0 + CCIS_0 + OUTMOD_7;
     TACCR0 = 50;
     TACCR1 = pw;
     TACTL = TASSEL_2 + ID_0 + MC_1;
}
int checkbutton(void)
{
    int math1, math2;
    unsigned long z;
    math1 = P1IN;
    math2 = math1 |= 247;
    if(math2 == 247)
        {
        pw++;
        }
    math1 = P1IN;
    math2 = math1 |=127;
    if(math2 == 127)
        {
        pw--;
        }
    if(pw>50)
        {
        pw=50;
        }
    if(pw<1)
        {
        pw=1;
        }
    for(z=0;z<1000000;z++)
                {
                }
    return(pw);
}
An P1.3 und P1.7 haengen die beiden Taster (Up / Down)
und an P1.1 liegt das PWM Signal an, welches ich dann entsprechend einem Leistungs FET zugefuehrt habe...

Geht sicherlich auch besser...aber funktioniert...und sehr preiswert....der Controller liegt bei run 0,30 EUR !!!

LG

Klaus
 

The_Scientist

Neues Mitglied
26 Feb 2011
91
1
0
Country Club Legetafo in Ethiopia
Sprachen
BascomAVR, C, Assembler
Irgendwie mag er den Code nicht!

Also irgendwas habe ich falsch gemacht beim einfuegen des Codes...

hier mal ohne CODE-Tags


#include​

<msp430.h>
int​
pw, old;
void​
pulsewidth(int pw);
int​
checkbutton(void);
int​
main(void){WDTCTL = WDTPW | WDTHOLD;BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;DCOCTL = 0x00;__delay_cycles(100000);DCOCTL = DCO0 + DCO1;BCSCTL1 = XT2OFF + DIVA_0 + RSEL0 + RSEL1 + RSEL2 + RSEL3;BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1;P1OUT = BIT3 + BIT7;P1SEL = BIT1 + BIT4 + BIT6;P1DIR = BIT1 + BIT4 + BIT6;P1REN = BIT3 + BIT7;P1IES = 0;P1IFG = 0;P2OUT = 0;P2DIR = 0;P2IES = 0;P2IFG = 0;pw=25;for(;;){old = pw;while(old==pw){pw=checkbutton();}pulsewidth(pw);}}
void​
pulsewidth(int pw){TACCTL0 = CM_0 + CCIS_0 + OUTMOD_0 + OUT;TACCTL1 = CM_0 + CCIS_0 + OUTMOD_7;TACCR0 = 50;TACCR1 = pw;TACTL = TASSEL_2 + ID_0 + MC_1;}
int​
checkbutton(void){int math1, math2;unsigned long z;math1 = P1IN;math2 = math1 |= 247;if(math2 == 247){pw++;}math1 = P1IN;math2 = math1 |=127;if(math2 == 127){pw--;}if(pw>50){pw=50;}if(pw<1){pw=1;}for(z=0;z<1000000;z++){}return(pw);}
 

The_Scientist

Neues Mitglied
26 Feb 2011
91
1
0
Country Club Legetafo in Ethiopia
Sprachen
BascomAVR, C, Assembler
Und wieder keine Zeilenumbrueche....

Der Editror mag mich nicht!

Wenn ich unten Enter druecke lande ich oben in der 3 Zeile :-(
Und die Umbrueche mag er auch nicht.....

Also als File...


Anhang anzeigen main.c
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.271
135
63
Mittelhessen, Giessen
Sprachen
C, C++, C#, Pascal, Assembler, PHP, Java
Hallo Klaus,

versuche einmal den Code zuerst in einen anderen Editor zu kopieren, dann davon wieder in die Zwischenablage und danach hier ins Forum. Den Umweg muss ich selber auch manchmal gehen, je nachdem wo der Code herkommt. Du kannst übrigens auch deine Beiträge editieren ("bearbeiten").

Dirk :ciao:

EDIT: ich habe den Code im ersten Beitrag noch einmal eingefügt, jetzt ist er richtig formatiert.
 

The_Scientist

Neues Mitglied
26 Feb 2011
91
1
0
Country Club Legetafo in Ethiopia
Sprachen
BascomAVR, C, Assembler
Vielen Dank

Hallo Dirk,vielen Dank fuer die Hilfe. Bearbeiten funktioniert bei mir nicht, dann springt der Cursor nicht in die naechste Zeile wenn ich Enter druecke...Jetzt auch wieder nicht?!(10x Enter und nix geht)...Ab und zu bekomme ich graue Haare mit dem Editor hier(10x Enter wieder nix)....Ich habe Windows 7 x64 Ultimate, IE 10.0.9200.16576 und Java auch in der letzten Version...Manchmal klappt alles und dann wieder wie jetzt....LG Klaus
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.271
135
63
Mittelhessen, Giessen
Sprachen
C, C++, C#, Pascal, Assembler, PHP, Java
Hallo Klaus,
...Ich habe Windows 7 x64 Ultimate, IE 10.0.9200.16576 und Java auch in der letzten Version...Manchmal klappt alles und dann wieder wie jetzt...
meine Konfiguration ist ähnlich, nur dass ich grundsätzlich keinen MS IE nutze (nur zum Testen. Webentwickler hätten es einfacher, wenn es den nicht geben würde :)). Vielleicht liegt es an irgendeiner Konfiguration bei dir, Plugin oder sonstwas.

Dirk :ciao:
 

The_Scientist

Neues Mitglied
26 Feb 2011
91
1
0
Country Club Legetafo in Ethiopia
Sprachen
BascomAVR, C, Assembler
Komisch

Es ist halt komisch...

mal klappte es (wie jetzt - ohne Neustart des Browsers seit dem letztem Beitrag)

und manchmal nicht...

Eigentlich habe ich ALLE PlugIns deaktiviert! Mag den kram...macht den eh schon langsamen IE nur noch lahmer...

Habe oefter das Problem. Manchmal gebe ich einfach auf und machen eine Re-Login ins Forum und dann klappts...ist aber halt nervig....

LG

Klaus
 

The_Scientist

Neues Mitglied
26 Feb 2011
91
1
0
Country Club Legetafo in Ethiopia
Sprachen
BascomAVR, C, Assembler
Der Fehlerteufel

Also da hat doch der Fehlerteufel zugeschlagen....:mad:

Das PWM Signal liegt natuerlich an Pin 1.6 an!!!!

Ich habe jetzt 12 Stueck davon in meinem Haus verbaut und die funktionieren super!

ABER ACHTUNG! Die I/O Ports der TI's sind nicht so kraeftig wie die der AVR's!
Ich habe mir einen halbwegs zerschossen! Funktioniert immernoch, verbraucht jetzt aber mehr Strom und wird warm.....
Also eigentlich nicht mehr wirklich zuverlaessig..daher auch ausgemustert!

Aber bei einem Preis von 0.30USD/Stueck kann kein Tiny mithalten - zumal das PWM super einfach funktioniert durch die zwei Compare Register.....

Werde da Programm aber noch erweitern, so dass beim erreichen des unteren Ende, die Lampe ausgeschaltet wird......
Kommt in den naechsten Tagen dann online....

LG

Klaus
 

The_Scientist

Neues Mitglied
26 Feb 2011
91
1
0
Country Club Legetafo in Ethiopia
Sprachen
BascomAVR, C, Assembler
Ich habe fertig....

Hier nun der neue Code....

PWM Ausgang : P1.6
On/Off Ausgang : P1.0
PWM-Frequenz : ca. 300kHz

Jetzt ist der kleine Kerl aber auch randvoll.....musste den alten Code etwas aufraeumen....

Code:
#include <msp430.h> 
unsigned char pw, old, math1;
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;
    BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
    DCOCTL = 0x00;
    DCOCTL = DCO0 + DCO1;
    BCSCTL1 = XT2OFF + DIVA_0 + RSEL0 + RSEL1 + RSEL2 + RSEL3;
    BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1;
    P1OUT = BIT0 + BIT3 + BIT7;
 P1SEL = BIT1 + BIT4 + BIT6;
 P1DIR = BIT0 + BIT1 + BIT4 + BIT6;
 P1REN = BIT3 + BIT7;
 P1IES = 0;
 P1IFG = 0;
    pw=25;
    for(;;)
    {
     old = pw;
     while(old==pw)
     {
      math1 = P1IN;
      math1 |= 247;
      if(math1 == 247)
       {
       pw++;
       }
      math1 = P1IN;
      math1 |=127;
      if(math1 == 127)
       {
       pw--;
       }
      if(pw>50)
       {
       pw=50;
       }
      if(pw<1)
       {
       pw=1;
       math1 = P1IN;
       math1 &= 1;
       if(math1 == 1)
       {
       P1OUT ^=1;
       }
       }
      if(pw==1)
          {
       math1 = P1IN;
       math1 &= 1;
       if(math1==1)
           {
        P1OUT ^= 1;
        }
          }
      if(pw >=2)
          {
       math1 = P1IN;
       math1 &= 1;
       if(math1==0)
           {
        P1OUT ^= 1;
           }
          }
      __delay_cycles(1000000);
     }
     TACCTL0 = CM_0 + CCIS_0 + OUTMOD_0 + OUT;
     TACCTL1 = CM_0 + CCIS_0 + OUTMOD_7;
     TACCR0 = 50;
     TACCR1 = pw;
     TACTL = TASSEL_2 + ID_0 + MC_1;
    }
}
Als Compiler habe ich CodeComposerStudio von TI in der Version 5.3.0.00090 verwendet...

Sobald das untere Ende erreicht ist (PW=1), wird der Ausgang P1.0 auf low gesetzt...alles PW => 2 ... P1.0 = high...


LG

Klaus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)