Forum: Mikrocontroller und Digitale Elektronik PWM Fehler im code aber wo?


von gast (Gast)


Lesenswert?

Hallo zusammen

ich finde den Fehler oder die Fehler nicht. Es soll das getan werden was 
jeder machen will mit einer PWM eine LED dimmen per Tastedruck.

LED RB0
Taster RA4
1
void main( void )
2
{  
3
char richtung=0;
4
char x=0;
5
char null=0;
6
7
   
8
PR2=0xFF;                    // Frequenz der PWM jetzt maximal  
9
CCPR1L=PR2>>1;              // Setzen Duty Cycle 50:50
10
TRISB=0b00000001;              // Port B0 = PWM Ausgang
11
T2CON=0b01111111;              // Bit 7 immer 0 ,Postscale Bit 6-3, Timer 2 an aus Bit 2
12
                    //          ,Prescale Bit 1-0
13
CCP1CON = 0b1100;              // Erweiterung auf 10bit Mode PWM mode; 
14
                    // P1A, P1C active-high; P1B, P1D active-high  
15
16
 while(1)
17
  {
18
    if(PORTAbits.RA4)                 // Taste RA4 gedrückt
19
    {
20
      if(richtung)              // Richtung 
21
      {
22
        if( ++CCPR1L == 0xFF)          // Ist die niedrigste  PW ereicht
23
        {
24
          richtung=0;                // wenn ja dann Richtungsänderung
25
        }  
26
      }
27
      else
28
      {
29
        if( --CCPR1L == 0x00 )        // Ist die oberste Erreicht PW erreicht?
30
        {
31
          richtung=1;                 // wenn ja dann Richtungsänderung
32
        }
33
      }
34
    }
35
    for( x=0; x<MAX_DELAY; x++)       // MAX_DEL * 65 ms warten, 
36
    {                                 
37
      null = 0;
38
      while( ! null );            // endlos
39
    }
40
  }
41
}

von Zip (Gast)


Lesenswert?

Der Standardweg ist einen freien Pin zu nehmen und einen puls 
rauszugeben wenn der code ausgfuehrt wird. Damit kann man rausfinden 
welcher code ausgefuehrt wird.

von gast (Gast)


Lesenswert?

er bleibt bei if(PORTAbits.RA4) hängen und schaltet eine led ein weiter 
geht es dann nicht mehr

von Karl H. (kbuchegg)


Lesenswert?

Und wie gedenkst du, dass der µC aus
dieser Endlosschleife

      null = 0;
      while( ! null );

jemals wieder herauskommen soll?

von gast (Gast)


Lesenswert?

mh wenn Sie weg ist geht auch wenig

von Karl H. (kbuchegg)


Lesenswert?

gast wrote:
> mh wenn Sie weg ist geht auch wenig


Das mag sein.
Aber mit einer Endlosschleife macht der µC dann nur noch
genau das: endlos in einer Schleife hängen und deine
Tasten sind ihm egal.
Die Endlosschleife ist als mit SIcherheit nicht das
richtige Werkzeug (frag dich mal: Werkzeug wofür?)

Funktioniert den die PWM, wenn du sie mal
ohne Tasten machst? (Damit wir mal abklären ob
dein Setup für die PWM überhaupt stimmt).


von gast (Gast)


Lesenswert?

Mh was muss ich auskommentieren das die PWM ohne Tasten funktionieren 
sollte. ?!

von Johannes S. (johanness)


Lesenswert?

Ersetze mal testweise
if(PORTAbits.RA4)
durch
if(1)

(und sorge dafür, dass die Warteschleife wirklich funktioniert, sonst 
ist es so schnell, dass du nichts siehst und wieder denkst, dass nix 
geht)

von gast (Gast)


Lesenswert?

Danke

ich bin jetzt aber übergangen die von C18 angebotenen Routinen zu 
verwenden

Jedoch wie bringt ich jetzt den Pic dazu eine LED damit
1
#pragma code 
2
3
void main(void)   
4
{    
5
TIMER_INT_ON;
6
T2_PS_1_4;
7
OpenPWM1(0xff);
8
SetDCPWM1(0);
9
}

einzuschalten

von Karl H. (kbuchegg)


Lesenswert?

gast wrote:
> Mh was muss ich auskommentieren das die PWM ohne Tasten funktionieren
> sollte. ?!


Ah. Du versucht sich schon wieder wer am 5. Schritt noch bevor
er den ersten Schritt beherrscht :-)

Na so halt:
1
void main( void )
2
{  
3
  PR2=0xFF;                   // Frequenz der PWM jetzt maximal  
4
  CCPR1L=PR2>>1;              // Setzen Duty Cycle 50:50
5
  TRISB=0b00000001;           // Port B0 = PWM Ausgang
6
  T2CON=0b01111111;           // Bit 7 immer 0 ,Postscale Bit 6-3, Timer 2 an aus Bit 2
7
                              //          ,Prescale Bit 1-0
8
  CCP1CON = 0b1100;           // Erweiterung auf 10bit Mode PWM mode; 
9
                              // P1A, P1C active-high; P1B, P1D active-high  
10
11
  CCPR1L = 128;
12
13
  while( 1 )
14
    ;
15
}

und dann tauscht du mal in der Zeile
  CCPR1L = 128;
die Zahl 128 gegen andere Zahlen von 0 bis 255 aus.


von gast (Gast)


Lesenswert?

Also RB3 springt an egal welcher Wert immer gleich hell.?!

von gast (Gast)


Lesenswert?

Jetzt würde ich gerne am Port RB0 die LED leuchtne lassen mit diesem 
code.

was muss noch geändert werden=

void main (void)
{

  OpenPWM1(255);
  OpenTimer2(TIMER_INT_OFF &
         T2_PS_1_1 &
         T2_POST_1_1);

  SetDCPWM2(50);
}

von glab (Gast)


Lesenswert?

habe ein ähnliches Problem wie realisiert man eine Software PWM ?!

Ein C beispielscode wäre Klasse

Vielen Dank

von Philipp B. (philipp_burch)


Lesenswert?

Du lässt eine Variable mit einer bestimmten Frequenz hochzählen. Wenn 
sie einen bestimmten Wert erreicht schaltest du deinen Ausgang aus, 
tritt ein Überlauf ein, schaltest du wieder ein. Alles ganz einfach.

von Peter D. (peda)


Lesenswert?

glab wrote:
> habe ein ähnliches Problem wie realisiert man eine Software PWM ?!
>
> Ein C beispielscode wäre Klasse


z.B.:

Beitrag "PWM-Lauflicht"


Peter

von glab (Gast)


Lesenswert?

@phil

sa dahingeschrieben ja aber wie realisier ich das in C?

von Peter D. (peda)


Lesenswert?

gast wrote:
> Hallo zusammen
>
> ich finde den Fehler oder die Fehler nicht. Es soll das getan werden was
> jeder machen will mit einer PWM eine LED dimmen per Tastedruck.

Dann würde ich erstmal die Aufgaben voneinander trennen.

Entprellen einer Taste, Kurzdruck, Langdruck, Repeatfunktion würde ich 
so machen:

Beitrag "Universelle Tastenabfrage"


Der Rest (PWM ändern) ist dann nur noch ein Klacks.
Dabei würde ich aber die PWM per Tabelle logarithmisch ändern.
Lineare Lichstärkeänderungen sieht das Auge sehr schlecht.


Peter

P.S.:
Auch in der Softwareentwicklung gilt: "Teile und herrsche."

Die richtige Aufgabenteilung ist schon mindestens 50% der Lösung.

von glab (Gast)


Lesenswert?

bräuchte ein Beispiel! pwm

von Holla D. (schlucke)


Angehängte Dateien:

Lesenswert?

glab wrote:
> bräuchte ein Beispiel! pwm



Arbeite zur zeit mit dem mechatronics demoboard von microchip

im anhang ist ein c code mit dem ich zwei dioden und einen DC-motor per 
pwm ansteuere. habs aber noch nicht ganz entmüllt musst du mal schaun.

von glab (Gast)


Lesenswert?

ich schaue es mir bis heute Abend mal an und poste dann mein Ergebniss 
sodas ich an einem Pin eine LED per Software dimmen kann.

Ganz interessant wäre auch wie ich eine Spannung per PWM einstellen kann 
( per HArdware PWM.

Ich sollte die Spannung an einem Bauteile immer wieder ändern wie 
funktioniert das mit der Hardware PWM. ( wenn ich mein Programm nehme 
mit diesem ich per Hardware pwm eine LED dimmen und das umbaue geht es 
einfach nicht )

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.